--- a/net/minecraft/world/level/block/entity/TileEntitySign.java +++ b/net/minecraft/world/level/block/entity/TileEntitySign.java @@ -31,7 +31,17 @@ import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; -public class TileEntitySign extends TileEntity { +// CraftBukkit start +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; +import org.bukkit.event.block.SignChangeEvent; +// CraftBukkit end + +public class TileEntitySign extends TileEntity implements ICommandListener { // CraftBukkit - implements private static final Logger LOGGER = LogUtils.getLogger(); private static final int MAX_TEXT_LINE_WIDTH = 90; @@ -100,7 +110,7 @@ @Override protected void saveAdditional(NBTTagCompound nbttagcompound) { super.saveAdditional(nbttagcompound); - DataResult dataresult = SignText.DIRECT_CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.frontText); + DataResult dataresult = SignText.DIRECT_CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.frontText); // CraftBukkit - decompile error Logger logger = TileEntitySign.LOGGER; Objects.requireNonNull(logger); @@ -119,7 +129,7 @@ @Override public void load(NBTTagCompound nbttagcompound) { super.load(nbttagcompound); - DataResult dataresult; + DataResult dataresult; // CraftBukkit - decompile error Logger logger; if (nbttagcompound.contains("front_text")) { @@ -173,12 +183,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()); + ((EntityPlayer) entityhuman).connection.send(this.getUpdatePacket()); // CraftBukkit } } @@ -188,7 +199,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 +212,29 @@ } } + // CraftBukkit start + Player player = ((EntityPlayer) entityhuman).getBukkitEntity(); + String[] lines = new String[4]; + + for (int i = 0; i < list.size(); ++i) { + lines[i] = CraftChatMessage.fromComponent(signtext.getMessage(i, entityhuman.isTextFilteringEnabled())); + } + + SignChangeEvent event = new SignChangeEvent(CraftBlock.at(this.level, this.worldPosition), player, lines.clone(), (front) ? Side.FRONT : Side.BACK); + entityhuman.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return originalText; + } + + IChatBaseComponent[] components = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()); + for (int i = 0; i < components.length; i++) { + if (!Objects.equals(lines[i], event.getLine(i))) { + signtext = signtext.setMessage(i, components[i]); + } + } + // CraftBukkit end + return signtext; } @@ -250,11 +285,37 @@ return flag1; } - private static CommandListenerWrapper createCommandSourceStack(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition) { + // CraftBukkit start + @Override + public void sendSystemMessage(IChatBaseComponent ichatbasecomponent) {} + + @Override + public org.bukkit.command.CommandSender getBukkitSender(CommandListenerWrapper wrapper) { + return wrapper.getEntity() != null ? wrapper.getEntity().getBukkitSender(wrapper) : new org.bukkit.craftbukkit.command.CraftBlockCommandSender(wrapper, this); + } + + @Override + public boolean acceptsSuccess() { + return false; + } + + @Override + public boolean acceptsFailure() { + return false; + } + + @Override + public boolean shouldInformAdmins() { + return false; + } + + private CommandListenerWrapper createCommandSourceStack(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition) { + // CraftBukkit end String s = entityhuman == null ? "Sign" : entityhuman.getName().getString(); Object object = entityhuman == null ? IChatBaseComponent.literal("Sign") : entityhuman.getDisplayName(); - return new CommandListenerWrapper(ICommandListener.NULL, Vec3D.atCenterOf(blockposition), Vec2F.ZERO, (WorldServer) world, 2, s, (IChatBaseComponent) object, world.getServer(), entityhuman); + // CraftBukkit - this + return new CommandListenerWrapper(this, Vec3D.atCenterOf(blockposition), Vec2F.ZERO, (WorldServer) world, 2, s, (IChatBaseComponent) object, world.getServer(), entityhuman); } @Override @@ -283,7 +344,7 @@ private void markUpdated() { this.setChanged(); - this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); + if (this.level != null) this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); // CraftBukkit - skip notify if world is null (SPIGOT-5122) } public boolean isWaxed() {