From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: jmp <jasonpenilla2@me.com>
Date: Tue, 17 Nov 2020 03:23:48 -0800
Subject: [PATCH] Apply display names from item forms of entities to entities
 and vice versa


diff --git a/src/main/java/net/minecraft/server/EntityArmorStand.java b/src/main/java/net/minecraft/server/EntityArmorStand.java
index 9e37bf25689691f9640b294c482978e8e3b6e627..759a8f95038778aead2f33a65a2d8f2d6b26a765 100644
--- a/src/main/java/net/minecraft/server/EntityArmorStand.java
+++ b/src/main/java/net/minecraft/server/EntityArmorStand.java
@@ -553,7 +553,13 @@ public class EntityArmorStand extends EntityLiving {
     }
 
     private void f(DamageSource damagesource) {
-        drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(new ItemStack(Items.ARMOR_STAND))); // CraftBukkit - add to drops
+        // Purpur start
+        final ItemStack armorStand = new ItemStack(Items.ARMOR_STAND);
+        if (this.world.purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) {
+            armorStand.setName(this.getCustomName());
+        }
+        drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(armorStand)); // CraftBukkit - add to drops
+        // Purpur end
         this.g(damagesource);
     }
 
diff --git a/src/main/java/net/minecraft/server/EntityBoat.java b/src/main/java/net/minecraft/server/EntityBoat.java
index 05c702bbdb8addea5c69faa0479609e8959945f1..fcb4936e78d56907b0e56d0aaf7f8361513d0a4e 100644
--- a/src/main/java/net/minecraft/server/EntityBoat.java
+++ b/src/main/java/net/minecraft/server/EntityBoat.java
@@ -155,7 +155,13 @@ public class EntityBoat extends Entity {
                 }
                 // CraftBukkit end
                 if (!flag && this.world.getGameRules().getBoolean(GameRules.DO_ENTITY_DROPS)) {
-                    this.a((IMaterial) this.g());
+                    // Purpur start
+                    final ItemStack boat = new ItemStack(this.getBoatItem());
+                    if (this.world.purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) {
+                        boat.setName(this.getCustomName());
+                    }
+                    this.dropItem(boat);
+                    // Purpur end
                 }
 
                 this.die();
diff --git a/src/main/java/net/minecraft/server/EntityItemFrame.java b/src/main/java/net/minecraft/server/EntityItemFrame.java
index 8a95e698d5caa3730954ce1135b0ec37a389dd70..372be937f1cf95775e37931f326f6a77836968f3 100644
--- a/src/main/java/net/minecraft/server/EntityItemFrame.java
+++ b/src/main/java/net/minecraft/server/EntityItemFrame.java
@@ -199,7 +199,13 @@ public class EntityItemFrame extends EntityHanging {
                 }
 
                 if (flag) {
-                    this.a((IMaterial) Items.ITEM_FRAME);
+                    // Purpur start
+                    final ItemStack itemFrame = new ItemStack(Items.ITEM_FRAME);
+                    if (this.world.purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) {
+                        itemFrame.setName(this.getCustomName());
+                    }
+                    this.dropItem(itemFrame);
+                    // Purpur end
                 }
 
                 if (!itemstack.isEmpty()) {
diff --git a/src/main/java/net/minecraft/server/EntityPainting.java b/src/main/java/net/minecraft/server/EntityPainting.java
index 4b7cd7c59fefbd56d38e0301b08d06ce92c9d8a2..d01fc8b11026536be30c8149aca253280524811f 100644
--- a/src/main/java/net/minecraft/server/EntityPainting.java
+++ b/src/main/java/net/minecraft/server/EntityPainting.java
@@ -92,7 +92,13 @@ public class EntityPainting extends EntityHanging {
                 }
             }
 
-            this.a((IMaterial) Items.PAINTING);
+            // Purpur start
+            final ItemStack painting = new ItemStack(Items.PAINTING);
+            if (this.world.purpurConfig.persistentDroppableEntityDisplayNames && this.hasCustomName()) {
+                painting.setName(this.getCustomName());
+            }
+            this.dropItem(painting);
+            // Purpur end
         }
     }
 
diff --git a/src/main/java/net/minecraft/server/ItemArmorStand.java b/src/main/java/net/minecraft/server/ItemArmorStand.java
index c9a5d3b583076cf8f2f32b12c142beb3f5e22dc0..315faee9e35d27071a62ea1d335dfbe5351582ca 100644
--- a/src/main/java/net/minecraft/server/ItemArmorStand.java
+++ b/src/main/java/net/minecraft/server/ItemArmorStand.java
@@ -43,6 +43,14 @@ public class ItemArmorStand extends Item {
                         return EnumInteractionResult.FAIL;
                     }
                     // CraftBukkit end
+                    // Purpur start
+                    if (itemactioncontext.getWorld().purpurConfig.persistentDroppableEntityDisplayNames && itemactioncontext.getItemStack().hasName()) {
+                        entityarmorstand.setCustomName(itemactioncontext.getItemStack().getName());
+                        if (itemactioncontext.getWorld().purpurConfig.armorstandSetNameVisible) {
+                            entityarmorstand.setCustomNameVisible(true);
+                        }
+                    }
+                    // Purpur end
                     worldserver.addAllEntities(entityarmorstand); // Paper - moved down
                     world.playSound((EntityHuman) null, entityarmorstand.locX(), entityarmorstand.locY(), entityarmorstand.locZ(), SoundEffects.ENTITY_ARMOR_STAND_PLACE, SoundCategory.BLOCKS, 0.75F, 0.8F);
                 }
diff --git a/src/main/java/net/minecraft/server/ItemBoat.java b/src/main/java/net/minecraft/server/ItemBoat.java
index 0580ce55ec945b5bc6ce8c5d0cee13b03ccc7d1a..6183da7ad2a458f4ada288ec82fdaf097d771122 100644
--- a/src/main/java/net/minecraft/server/ItemBoat.java
+++ b/src/main/java/net/minecraft/server/ItemBoat.java
@@ -52,6 +52,11 @@ public class ItemBoat extends Item {
 
                 entityboat.setType(this.b);
                 entityboat.yaw = entityhuman.yaw;
+                // Purpur start
+                if (world.purpurConfig.persistentDroppableEntityDisplayNames && itemstack.hasName()) {
+                    entityboat.setCustomName(itemstack.getName());
+                }
+                // Purpur end
                 if (!world.getCubes(entityboat, entityboat.getBoundingBox().g(-0.1D))) {
                     return InteractionResultWrapper.fail(itemstack);
                 } else {
diff --git a/src/main/java/net/minecraft/server/ItemHanging.java b/src/main/java/net/minecraft/server/ItemHanging.java
index a3eaeeda875d96fe4b047bd6bf993018722c96b9..f2f800087adb0238b4b672b9f6f4c8c4836f2891 100644
--- a/src/main/java/net/minecraft/server/ItemHanging.java
+++ b/src/main/java/net/minecraft/server/ItemHanging.java
@@ -26,7 +26,7 @@ public class ItemHanging extends Item {
             return EnumInteractionResult.FAIL;
         } else {
             World world = itemactioncontext.getWorld();
-            Object object;
+            Entity object; // Purpur
 
             if (this.a == EntityTypes.PAINTING) {
                 object = new EntityPainting(world, blockposition1, enumdirection);
@@ -42,6 +42,11 @@ public class ItemHanging extends Item {
 
             if (nbttagcompound != null) {
                 EntityTypes.a(world, entityhuman, (Entity) object, nbttagcompound);
+                // Purpur start
+                if (itemactioncontext.getWorld().purpurConfig.persistentDroppableEntityDisplayNames && itemactioncontext.getItemStack().hasName()) {
+                    object.setCustomName(itemactioncontext.getItemStack().getName());
+                }
+                // Purpur end
             }
 
             if (((EntityHanging) object).survives()) {
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
index a4edfb02fd350433020b0f3699726b6127ab9933..3f9062d8eca3ce53c0fb9e9e40330aa4e3296c9a 100644
--- a/src/main/java/net/minecraft/server/ItemStack.java
+++ b/src/main/java/net/minecraft/server/ItemStack.java
@@ -733,6 +733,7 @@ public final class ItemStack {
         return this.getItem().h(this);
     }
 
+    public ItemStack setName(@Nullable IChatBaseComponent component) { return this.a(component); } // Purpur - OBFHELPER
     public ItemStack a(@Nullable IChatBaseComponent ichatbasecomponent) {
         NBTTagCompound nbttagcompound = this.a("display");
 
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
index abc9b4fc27fdef37e3444cc3d885acab9f4d3f23..7915a0204597a3711c1f177cf504a1c3c603e91e 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -83,8 +83,10 @@ public class PurpurWorldConfig {
         return PurpurConfig.config.getString("world-settings." + worldName + "." + path, PurpurConfig.config.getString("world-settings.default." + path));
     }
 
+    public boolean armorstandSetNameVisible = false;
     public float armorstandStepHeight = 0.0F;
     private void armorstandSettings() {
+        armorstandSetNameVisible = getBoolean("gameplay-mechanics.armorstand.set-name-visible-when-placing-with-custom-name", armorstandSetNameVisible);
         armorstandStepHeight = (float) getDouble("gameplay-mechanics.armorstand.step-height", armorstandStepHeight);
     }
 
@@ -217,6 +219,7 @@ public class PurpurWorldConfig {
     public boolean entitiesCanUsePortals = true;
     public boolean milkCuresBadOmen = true;
     public boolean persistentTileEntityDisplayNames = false;
+    public boolean persistentDroppableEntityDisplayNames = false;
     public double tridentLoyaltyVoidReturnHeight = 0.0D;
     public double voidDamageHeight = -64.0D;
     public int raidCooldownSeconds = 0;
@@ -229,6 +232,7 @@ public class PurpurWorldConfig {
         entitiesCanUsePortals = getBoolean("gameplay-mechanics.entities-can-use-portals", entitiesCanUsePortals);
         milkCuresBadOmen = getBoolean("gameplay-mechanics.milk-cures-bad-omen", milkCuresBadOmen);
         persistentTileEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-tileentity-display-names-and-lore", persistentTileEntityDisplayNames);
+        persistentDroppableEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-droppable-entity-display-names", persistentDroppableEntityDisplayNames);
         tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight);
         voidDamageHeight = getDouble("gameplay-mechanics.void-damage-height", voidDamageHeight);
         raidCooldownSeconds = getInt("gameplay-mechanics.raid-cooldown-seconds", raidCooldownSeconds);
