mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-18 08:57:44 +01:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: 05af2837c [CI-SKIP] Improved the annotation test output 586966949 abstract custom set tags, add entity tags c7667378e Added PlayerLoomPatternSelectEvent 00972e80d Reimplement GS4QueryEvent 544c5c278 Re-add coral block tags (#4987) 7d56c8deb Added PlayerLecternPageChangeEvent c7cdf255b Add BlockFailedDispenseEvent c8a8d6fbe Added world settings for mobs picking up loot 91eda5bd3 Added ServerResourcesReloadedEvent be81b4f5c Add a Enchantable MaterialTag 975d18703 Add doors to material tags d075e748e colorful itemdump f3ba3dee0 Added WorldGameRuleChangeEvent 086d20118 Guardian beam workaround b63c890ec Support spawning item stacks d7d74c552 added height config for bamboo 7878e3bc2 Use setAmount for Recipe Amount 50e70697b Add EntityLoadCrossbowEvent f344e092c Add Anti-Xray bypass permission 9fd31e675 fix for nerfed slime mobs splitting 4a7962cd1 Zombie API - breaking doors 5650a41f5 Fix interact event not being called in adventure 2c9ed4335 Add PlayerFlowerPotManipulateEvent 1f32290b6 [Auto] Updated Upstream (CraftBukkit) d87694a20 Redact Velocity forwarding secret properly (#4980) 24a0b0206 [Auto] Updated Upstream (CraftBukkit) 7681042ef [Auto] Updated Upstream (Bukkit/CraftBukkit) 7dea3dba6 [Auto] Updated Upstream (CraftBukkit) 4b3792920 JavaDoc fixes f13b4727e Allow disabling mob spawner spawn egg transformation 525b50737 Cache burn durations 2c37d1077 Optimized tick ready check b4000b01a Add API to get the Material of Boats and Minecarts f1317386d Fix sign lazy initialisation 9f61759d9 Updated Upstream (CraftBukkit/Spigot) (#4972) aaff430b6 [CI-SKIP] Use GitHub Actions for build status 9f4055d99 Fix harming potion dupe 7bfb781ff Additional Block Material API's 0eaffd008 Micro Optimize DataBits Tuinity Changes: 9e5cabb6e Port starlight changes
187 lines
9.4 KiB
Diff
187 lines
9.4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: jmp <jasonpenilla2@me.com>
|
|
Date: Wed, 30 Sep 2020 14:32:46 -0700
|
|
Subject: [PATCH] Persistent TileEntity Lore and DisplayName
|
|
|
|
Makes it so that when a TileEntity is placed in the world and then broken,
|
|
the dropped ItemStack retains any original custom display name/lore.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java
|
|
index d621b11ba9029a732a819e0558d6f8a439990dbe..c276a2896ba73d86e7e18d656903b36d2970ac41 100644
|
|
--- a/src/main/java/net/minecraft/server/Block.java
|
|
+++ b/src/main/java/net/minecraft/server/Block.java
|
|
@@ -207,7 +207,7 @@ public class Block extends BlockBase implements IMaterial {
|
|
public static void a(IBlockData iblockdata, GeneratorAccess generatoraccess, BlockPosition blockposition, @Nullable TileEntity tileentity) {
|
|
if (generatoraccess instanceof WorldServer) {
|
|
a(iblockdata, (WorldServer) generatoraccess, blockposition, tileentity).forEach((itemstack) -> {
|
|
- a((World) ((WorldServer) generatoraccess), blockposition, itemstack);
|
|
+ dropItem((WorldServer) generatoraccess, blockposition, applyDisplayNameAndLoreFromTile(itemstack, tileentity)); // Purpur
|
|
});
|
|
iblockdata.dropNaturally((WorldServer) generatoraccess, blockposition, ItemStack.b);
|
|
}
|
|
@@ -216,14 +216,56 @@ public class Block extends BlockBase implements IMaterial {
|
|
|
|
public static void dropItems(IBlockData iblockdata, World world, BlockPosition blockposition, @Nullable TileEntity tileentity, Entity entity, ItemStack itemstack) {
|
|
if (world instanceof WorldServer) {
|
|
- getDrops(iblockdata, (WorldServer) world, blockposition, tileentity, entity, itemstack).forEach((itemstack1) -> {
|
|
- a(world, blockposition, itemstack1);
|
|
+ // Purpur start
|
|
+ getDrops(iblockdata, (WorldServer) world, blockposition, tileentity, entity, itemstack).forEach(stackToDrop -> {
|
|
+ dropItem(world, blockposition, applyDisplayNameAndLoreFromTile(stackToDrop, tileentity));
|
|
+ // Purpur end
|
|
});
|
|
iblockdata.dropNaturally((WorldServer) world, blockposition, itemstack);
|
|
}
|
|
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ private static ItemStack applyDisplayNameAndLoreFromTile(ItemStack itemStack, TileEntity tile) {
|
|
+ if (itemStack.getItem() instanceof ItemBlock) {
|
|
+ if (tile != null && tile.getWorld() instanceof WorldServer && tile.getWorld().purpurConfig.persistentTileEntityDisplayNames) {
|
|
+ String name = tile.getPersistentDisplayName();
|
|
+ NBTTagList lore = tile.getPersistentLore();
|
|
+ if (tile instanceof INamableTileEntity) {
|
|
+ INamableTileEntity namedTile = (INamableTileEntity) tile;
|
|
+ if (namedTile.hasCustomName()) {
|
|
+ name = IChatBaseComponent.ChatSerializer.componentToJson(namedTile.getCustomName());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (name != null || lore != null) {
|
|
+ NBTTagCompound display = itemStack.getSubTag("display");
|
|
+ if (display == null) {
|
|
+ display = new NBTTagCompound();
|
|
+ }
|
|
+
|
|
+ if (name != null) {
|
|
+ display.set("Name", NBTTagString.create(name));
|
|
+ }
|
|
+ if (lore != null) {
|
|
+ display.set("Lore", lore);
|
|
+ }
|
|
+
|
|
+ NBTTagCompound tag = itemStack.getTag();
|
|
+ if (tag == null) {
|
|
+ tag = new NBTTagCompound();
|
|
+ }
|
|
+ tag.set("display", display);
|
|
+
|
|
+ itemStack.setTag(tag);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return itemStack;
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
public static void a(World world, BlockPosition blockposition, ItemStack itemstack) { dropItem(world, blockposition, itemstack); } public static void dropItem(World world, BlockPosition blockposition, ItemStack itemstack) { // Paper - OBFHELPER
|
|
if (!world.isClientSide && !itemstack.isEmpty() && world.getGameRules().getBoolean(GameRules.DO_TILE_DROPS)) {
|
|
float f = 0.5F;
|
|
diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java
|
|
index bbb1de7d1adce6e986467db234b27518df4dd87f..d97efe3d4765dcae50afae49d252e710c056337f 100644
|
|
--- a/src/main/java/net/minecraft/server/ItemBlock.java
|
|
+++ b/src/main/java/net/minecraft/server/ItemBlock.java
|
|
@@ -96,7 +96,24 @@ public class ItemBlock extends Item {
|
|
}
|
|
|
|
protected boolean a(BlockPosition blockposition, World world, @Nullable EntityHuman entityhuman, ItemStack itemstack, IBlockData iblockdata) {
|
|
- return a(world, entityhuman, blockposition, itemstack);
|
|
+ // Purpur start
|
|
+ boolean handled = a(world, entityhuman, blockposition, itemstack);
|
|
+ if (world.purpurConfig.persistentTileEntityDisplayNames && itemstack.hasTag()) {
|
|
+ NBTTagCompound display = itemstack.getSubTag("display");
|
|
+ if (display != null) {
|
|
+ TileEntity tile = world.getTileEntity(blockposition);
|
|
+ if (tile != null) {
|
|
+ if (display.hasKeyOfType("Name", 8)) {
|
|
+ tile.setPersistentDisplayName(display.getString("Name"));
|
|
+ }
|
|
+ if (display.hasKeyOfType("Lore", 9)) {
|
|
+ tile.setPersistentLore(display.getList("Lore", 8));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return handled;
|
|
+ // Purpur end
|
|
}
|
|
|
|
@Nullable
|
|
diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java
|
|
index 58d958a88ac5af5b889d719d9f1ea90ce45cf184..8e8749095427b44e04582593114cae8cf6d00f42 100644
|
|
--- a/src/main/java/net/minecraft/server/TileEntity.java
|
|
+++ b/src/main/java/net/minecraft/server/TileEntity.java
|
|
@@ -90,9 +90,25 @@ public abstract class TileEntity implements KeyedObject { // Paper
|
|
this.persistentDataContainer.putAll((NBTTagCompound) persistentDataTag);
|
|
}
|
|
// CraftBukkit end
|
|
+ // Purpur start
|
|
+ if (nbttagcompound.hasKey("Purpur.persistentDisplayName")) {
|
|
+ this.persistentDisplayName = nbttagcompound.getString("Purpur.persistentDisplayName");
|
|
+ }
|
|
+ if (nbttagcompound.hasKey("Purpur.persistentLore")) {
|
|
+ this.persistentLore = nbttagcompound.getList("Purpur.persistentLore", 8);
|
|
+ }
|
|
+ // Purpur end
|
|
}
|
|
|
|
public NBTTagCompound save(NBTTagCompound nbttagcompound) {
|
|
+ // Purpur start
|
|
+ if (this.persistentDisplayName != null) {
|
|
+ nbttagcompound.set("Purpur.persistentDisplayName", NBTTagString.create(this.persistentDisplayName));
|
|
+ }
|
|
+ if (this.persistentLore != null) {
|
|
+ nbttagcompound.set("Purpur.persistentLore", this.persistentLore);
|
|
+ }
|
|
+ // Purpur end
|
|
return this.b(nbttagcompound);
|
|
}
|
|
|
|
@@ -253,4 +269,25 @@ public abstract class TileEntity implements KeyedObject { // Paper
|
|
return null;
|
|
}
|
|
// CraftBukkit end
|
|
+
|
|
+ // Purpur start
|
|
+ private String persistentDisplayName = null;
|
|
+ private NBTTagList persistentLore = null;
|
|
+
|
|
+ public void setPersistentDisplayName(String json) {
|
|
+ this.persistentDisplayName = json;
|
|
+ }
|
|
+
|
|
+ public void setPersistentLore(NBTTagList lore) {
|
|
+ this.persistentLore = lore;
|
|
+ }
|
|
+
|
|
+ public String getPersistentDisplayName() {
|
|
+ return this.persistentDisplayName;
|
|
+ }
|
|
+
|
|
+ public NBTTagList getPersistentLore() {
|
|
+ return this.persistentLore;
|
|
+ }
|
|
+ // Purpur end
|
|
}
|
|
diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
|
index c6a09b44b5f7289d81a2fd82f91135a8c2932e1f..9f26c73dc6685ede1681a6b2ede8c35ccb2580f4 100644
|
|
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
|
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
|
@@ -182,6 +182,7 @@ public class PurpurWorldConfig {
|
|
public boolean entitiesPickUpLootBypassMobGriefing = false;
|
|
public boolean entitiesCanUsePortals = true;
|
|
public boolean milkCuresBadOmen = true;
|
|
+ public boolean persistentTileEntityDisplayNames = false;
|
|
public double tridentLoyaltyVoidReturnHeight = 0.0D;
|
|
public double voidDamageHeight = -64.0D;
|
|
public int raidCooldownSeconds = 0;
|
|
@@ -192,6 +193,7 @@ public class PurpurWorldConfig {
|
|
entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing);
|
|
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);
|
|
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);
|