From 98b4d2ff882b937a29ee0dbeb2d02ad825da1fb5 Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 8 Jun 2023 12:19:59 +1000 Subject: [PATCH] SPIGOT-7372, SPIGOT-7373: Signs can't be edited, issues with SignChangeEvent --- .../level/block/entity/TileEntitySign.patch | 76 ++++++++++++------- .../bukkit/craftbukkit/block/CraftSign.java | 2 +- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/nms-patches/net/minecraft/world/level/block/entity/TileEntitySign.patch b/nms-patches/net/minecraft/world/level/block/entity/TileEntitySign.patch index a0c04cccf..027b472c8 100644 --- a/nms-patches/net/minecraft/world/level/block/entity/TileEntitySign.patch +++ b/nms-patches/net/minecraft/world/level/block/entity/TileEntitySign.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/TileEntitySign.java +++ b/net/minecraft/world/level/block/entity/TileEntitySign.java -@@ -31,7 +31,17 @@ +@@ -31,7 +31,18 @@ import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; @@ -9,6 +9,7 @@ +import net.minecraft.EnumChatFormat; +import net.minecraft.nbt.NBTBase; +import net.minecraft.server.level.EntityPlayer; ++import org.bukkit.block.sign.Side; +import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.util.CraftChatMessage; +import org.bukkit.entity.Player; @@ -19,7 +20,7 @@ private static final Logger LOGGER = LogUtils.getLogger(); private static final int MAX_TEXT_LINE_WIDTH = 90; -@@ -100,7 +110,7 @@ +@@ -100,7 +111,7 @@ @Override protected void saveAdditional(NBTTagCompound nbttagcompound) { super.saveAdditional(nbttagcompound); @@ -28,7 +29,7 @@ Logger logger = TileEntitySign.LOGGER; Objects.requireNonNull(logger); -@@ -119,7 +129,7 @@ +@@ -119,7 +130,7 @@ @Override public void load(NBTTagCompound nbttagcompound) { super.load(nbttagcompound); @@ -37,7 +38,14 @@ Logger logger; if (nbttagcompound.contains("front_text")) { -@@ -179,6 +189,7 @@ +@@ -173,12 +184,13 @@ + public void updateSignText(EntityHuman entityhuman, boolean flag, List list) { + if (!this.isWaxed() && entityhuman.getUUID().equals(this.getPlayerWhoMayEdit()) && this.level != null) { + this.updateText((signtext) -> { +- return this.setMessages(entityhuman, list, signtext); ++ return this.setMessages(entityhuman, list, signtext, flag); // CraftBukkit + }, flag); + this.setAllowedPlayerEditor((UUID) null); this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); } else { TileEntitySign.LOGGER.warn("Player {} just tried to change non-editable sign", entityhuman.getName().getString()); @@ -45,33 +53,45 @@ } } -@@ -198,6 +209,25 @@ - } else { - signtext = signtext.setMessage(i, IChatBaseComponent.literal(filteredtext.raw()).setStyle(chatmodifier), IChatBaseComponent.literal(filteredtext.filteredOrEmpty()).setStyle(chatmodifier)); +@@ -188,7 +200,8 @@ + return this.setText((SignText) unaryoperator.apply(signtext), flag); + } + +- private SignText setMessages(EntityHuman entityhuman, List list, SignText signtext) { ++ private SignText setMessages(EntityHuman entityhuman, List list, SignText signtext, boolean front) { // CraftBukkit ++ SignText originalText = signtext; // CraftBukkit + for (int i = 0; i < list.size(); ++i) { + FilteredText filteredtext = (FilteredText) list.get(i); + ChatModifier chatmodifier = signtext.getMessage(i, entityhuman.isTextFilteringEnabled()).getStyle(); +@@ -200,6 +213,27 @@ } -+ -+ // CraftBukkit start -+ Player player = ((EntityPlayer) entityhuman).getBukkitEntity(); -+ String[] lines = new String[4]; -+ -+ for (int j = 0; j < list.size(); ++j) { -+ lines[j] = CraftChatMessage.fromComponent(signtext.getMessage(j, entityhuman.isTextFilteringEnabled())); -+ } -+ -+ SignChangeEvent event = new SignChangeEvent(CraftBlock.at(this.level, this.worldPosition), player, lines); -+ entityhuman.level().getCraftServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ IChatBaseComponent[] components = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()); -+ for (int j = 0; j < components.length; j++) { -+ signtext = signtext.setMessage(j, components[j]); -+ } -+ } -+ // CraftBukkit end } ++ // CraftBukkit start ++ Player player = ((EntityPlayer) entityhuman).getBukkitEntity(); ++ String[] lines = new String[4]; ++ ++ for (int j = 0; j < list.size(); ++j) { ++ lines[j] = CraftChatMessage.fromComponent(signtext.getMessage(j, entityhuman.isTextFilteringEnabled())); ++ } ++ ++ SignChangeEvent event = new SignChangeEvent(CraftBlock.at(this.level, this.worldPosition), player, lines, (front) ? Side.FRONT : Side.BACK); ++ entityhuman.level().getCraftServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ IChatBaseComponent[] components = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()); ++ for (int j = 0; j < components.length; j++) { ++ signtext = signtext.setMessage(j, components[j]); ++ } ++ } else { ++ signtext = originalText; ++ } ++ // CraftBukkit end ++ return signtext; -@@ -250,11 +280,37 @@ + } + +@@ -250,11 +284,37 @@ return flag1; } @@ -111,7 +131,7 @@ } @Override -@@ -283,7 +339,7 @@ +@@ -283,7 +343,7 @@ private void markUpdated() { this.setChanged(); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java index 581ecce8f..c23ad78fd 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java @@ -109,7 +109,7 @@ public class CraftSign extends CraftBlockEntityState