mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
216 lines
10 KiB
Diff
216 lines
10 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
|
|
Date: Wed, 30 Sep 2020 14:32:46 -0700
|
|
Subject: [PATCH] Purpur: Persistent BlockEntity Lore and DisplayName
|
|
|
|
Original license: MIT
|
|
Original project: https://github.com/PurpurMC/Purpur
|
|
|
|
Makes it so that when a BlockEntity 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/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java
|
|
index b0204af850ee182773ad458208cccd946ad148d5..f74e420b1791df528a30a1213bb0076b4d9d545d 100644
|
|
--- a/src/main/java/net/minecraft/world/item/BlockItem.java
|
|
+++ b/src/main/java/net/minecraft/world/item/BlockItem.java
|
|
@@ -153,7 +153,24 @@ public class BlockItem extends Item {
|
|
}
|
|
|
|
protected boolean updateCustomBlockEntityTag(BlockPos pos, Level world, @Nullable Player player, ItemStack stack, BlockState state) {
|
|
- return BlockItem.updateCustomBlockEntityTag(world, player, pos, stack);
|
|
+ // Purpur start
|
|
+ boolean handled = updateCustomBlockEntityTag(world, player, pos, stack);
|
|
+ if (org.dreeam.leaf.LeafConfig.persistentTileEntityDisplayNames && stack.hasTag()) {
|
|
+ CompoundTag display = stack.getTagElement("display");
|
|
+ if (display != null) {
|
|
+ BlockEntity blockEntity = world.getBlockEntity(pos);
|
|
+ if (blockEntity != null) {
|
|
+ if (display.contains("Name", 8)) {
|
|
+ blockEntity.setPersistentDisplayName(display.getString("Name"));
|
|
+ }
|
|
+ if (display.contains("Lore", 9)) {
|
|
+ blockEntity.setPersistentLore(display.getList("Lore", 8));
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return handled;
|
|
+ // Purpur end
|
|
}
|
|
|
|
@Nullable
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
|
|
index 52743a5865997506b5a53fdfd99cdbab67ae3d3f..7f46de07e117d33634ab3510ce16da0fd8770f84 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/Block.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
|
|
@@ -65,6 +65,13 @@ import net.minecraft.world.phys.shapes.Shapes;
|
|
import net.minecraft.world.phys.shapes.VoxelShape;
|
|
import org.slf4j.Logger;
|
|
|
|
+// Purpur start
|
|
+import net.minecraft.nbt.CompoundTag;
|
|
+import net.minecraft.nbt.ListTag;
|
|
+import net.minecraft.nbt.StringTag;
|
|
+import net.minecraft.world.Nameable;
|
|
+// Purpur end
|
|
+
|
|
public class Block extends BlockBehaviour implements ItemLike {
|
|
|
|
private static final Logger LOGGER = LogUtils.getLogger();
|
|
@@ -328,7 +335,7 @@ public class Block extends BlockBehaviour implements ItemLike {
|
|
public static void dropResources(BlockState state, LevelAccessor world, BlockPos pos, @Nullable BlockEntity blockEntity) {
|
|
if (world instanceof ServerLevel) {
|
|
Block.getDrops(state, (ServerLevel) world, pos, blockEntity).forEach((itemstack) -> {
|
|
- Block.popResource((ServerLevel) world, pos, itemstack);
|
|
+ Block.popResource((ServerLevel) world, pos, applyDisplayNameAndLoreFromTile(itemstack, blockEntity)); // Purpur
|
|
});
|
|
state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true);
|
|
}
|
|
@@ -344,7 +351,7 @@ public class Block extends BlockBehaviour implements ItemLike {
|
|
io.papermc.paper.event.block.BlockBreakBlockEvent event = new io.papermc.paper.event.block.BlockBreakBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(world, pos), org.bukkit.craftbukkit.block.CraftBlock.at(world, source), items);
|
|
event.callEvent();
|
|
for (var drop : event.getDrops()) {
|
|
- popResource(world.getMinecraftWorld(), pos, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop));
|
|
+ popResource(world.getMinecraftWorld(), pos, applyDisplayNameAndLoreFromTile(org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(drop), blockEntity)); // Purpur
|
|
}
|
|
state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY, true);
|
|
}
|
|
@@ -355,13 +362,53 @@ public class Block extends BlockBehaviour implements ItemLike {
|
|
public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, Entity entity, ItemStack tool) {
|
|
if (world instanceof ServerLevel) {
|
|
Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, tool).forEach((itemstack1) -> {
|
|
- Block.popResource(world, pos, itemstack1);
|
|
+ Block.popResource(world, pos, applyDisplayNameAndLoreFromTile(itemstack1, blockEntity)); // Purpur
|
|
});
|
|
state.spawnAfterBreak((ServerLevel) world, pos, tool, true);
|
|
}
|
|
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ private static ItemStack applyDisplayNameAndLoreFromTile(ItemStack stack, BlockEntity blockEntity) {
|
|
+ if (stack.getItem() instanceof BlockItem) {
|
|
+ if (blockEntity != null && blockEntity.getLevel() instanceof ServerLevel && org.dreeam.leaf.LeafConfig.persistentTileEntityDisplayNames) {
|
|
+ String name = blockEntity.getPersistentDisplayName();
|
|
+ ListTag lore = blockEntity.getPersistentLore();
|
|
+ if (blockEntity instanceof Nameable) {
|
|
+ Nameable namedTile = (Nameable) blockEntity;
|
|
+ if (namedTile.hasCustomName()) {
|
|
+ name = Component.Serializer.toJson(namedTile.getCustomName());
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (name != null || lore != null) {
|
|
+ CompoundTag display = stack.getTagElement("display");
|
|
+ if (display == null) {
|
|
+ display = new CompoundTag();
|
|
+ }
|
|
+
|
|
+ if (name != null) {
|
|
+ display.put("Name", StringTag.valueOf(name));
|
|
+ }
|
|
+ if (lore != null) {
|
|
+ display.put("Lore", lore);
|
|
+ }
|
|
+
|
|
+ CompoundTag tag = stack.getTag();
|
|
+ if (tag == null) {
|
|
+ tag = new CompoundTag();
|
|
+ }
|
|
+ tag.put("display", display);
|
|
+
|
|
+ stack.setTag(tag);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return stack;
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
public static void popResource(Level world, BlockPos pos, ItemStack stack) {
|
|
double d0 = (double) EntityType.ITEM.getHeight() / 2.0D;
|
|
double d1 = (double) pos.getX() + 0.5D + Mth.nextDouble(world.random, -0.25D, 0.25D);
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
|
index 1b248db497500aa6bd346b306dcb908af77626f3..64c55f3ebdbc27f7f0cea38247ff7b35fa99e341 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/BlockEntity.java
|
|
@@ -6,6 +6,8 @@ import net.minecraft.CrashReportCategory;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.registries.BuiltInRegistries;
|
|
import net.minecraft.nbt.CompoundTag;
|
|
+import net.minecraft.nbt.ListTag;
|
|
+import net.minecraft.nbt.StringTag;
|
|
import net.minecraft.network.protocol.Packet;
|
|
import net.minecraft.network.protocol.game.ClientGamePacketListener;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
@@ -74,10 +76,27 @@ public abstract class BlockEntity {
|
|
if (persistentDataTag instanceof CompoundTag) {
|
|
this.persistentDataContainer.putAll((CompoundTag) persistentDataTag);
|
|
}
|
|
+ // Purpur start
|
|
+ if (nbt.contains("Purpur.persistentDisplayName")) {
|
|
+ this.persistentDisplayName = nbt.getString("Purpur.persistentDisplayName");
|
|
+ }
|
|
+ if (nbt.contains("Purpur.persistentLore")) {
|
|
+ this.persistentLore = nbt.getList("Purpur.persistentLore", 8);
|
|
+ }
|
|
+ // Purpur end
|
|
}
|
|
// CraftBukkit end
|
|
|
|
- protected void saveAdditional(CompoundTag nbt) {}
|
|
+ protected void saveAdditional(CompoundTag nbt) {
|
|
+ // Purpur start
|
|
+ if (this.persistentDisplayName != null) {
|
|
+ nbt.put("Purpur.persistentDisplayName", StringTag.valueOf(this.persistentDisplayName));
|
|
+ }
|
|
+ if (this.persistentLore != null) {
|
|
+ nbt.put("Purpur.persistentLore", this.persistentLore);
|
|
+ }
|
|
+ // Purpur end
|
|
+ }
|
|
|
|
public final CompoundTag saveWithFullMetadata() {
|
|
CompoundTag nbttagcompound = this.saveWithoutMetadata();
|
|
@@ -264,4 +283,24 @@ public abstract class BlockEntity {
|
|
}
|
|
// Paper end
|
|
|
|
+ // Purpur start
|
|
+ private String persistentDisplayName = null;
|
|
+ private ListTag persistentLore = null;
|
|
+
|
|
+ public void setPersistentDisplayName(String json) {
|
|
+ this.persistentDisplayName = json;
|
|
+ }
|
|
+
|
|
+ public void setPersistentLore(ListTag lore) {
|
|
+ this.persistentLore = lore;
|
|
+ }
|
|
+
|
|
+ public String getPersistentDisplayName() {
|
|
+ return this.persistentDisplayName;
|
|
+ }
|
|
+
|
|
+ public ListTag getPersistentLore() {
|
|
+ return this.persistentLore;
|
|
+ }
|
|
+ // Purpur end
|
|
}
|
|
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
|
|
index dbf1099be0c16cb8d8facba8a2f7b56b3a586d23..788a9f3ebf1135e00f8e93199cf1e2a300b67f0b 100644
|
|
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
|
|
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
|
|
@@ -259,9 +259,11 @@ public class LeafConfig {
|
|
|
|
public static boolean compassItemShowsBossBar = false;
|
|
public static boolean allowWaterPlacementInTheEnd = true;
|
|
+ public static boolean persistentTileEntityDisplayNames = false;
|
|
private static void gameplayMechanicSettings() {
|
|
compassItemShowsBossBar = getBoolean("gameplay-mechanics.item.compass.holding-shows-bossbar", compassItemShowsBossBar);
|
|
allowWaterPlacementInTheEnd = getBoolean("gameplay-mechanics.allow-water-placement-in-the-end", allowWaterPlacementInTheEnd);
|
|
+ persistentTileEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-tileentity-display-names-and-lore", persistentTileEntityDisplayNames);
|
|
}
|
|
|
|
public static int spongeAbsorptionArea = 64;
|