9147456fc9
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing CraftBukkit Changes: ab8ace685 SPIGOT-7236: Bone meal doesn't increase use statistic 7dcb59b8e Avoid switch on material in previous commit Spigot Changes: 19641c75 SPIGOT-7235: World.Spigot#strikeLightningEffect doesn't do anything
127 Zeilen
6.5 KiB
Diff
127 Zeilen
6.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Fri, 9 Jul 2021 13:50:48 -0700
|
|
Subject: [PATCH] Fix commands from signs not firing command events
|
|
|
|
This patch changes sign command logic so that `run_command` click events:
|
|
- are logged to the console
|
|
- fire PlayerCommandPreprocessEvent
|
|
- work with double-slash commands like `//wand`
|
|
- sends failure messages to the player who clicked the sign
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/commands/DelegatingCommandSource.java b/src/main/java/io/papermc/paper/commands/DelegatingCommandSource.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..01a2bc1feec808790bb93618ce46adb9bea5a9c8
|
|
--- /dev/null
|
|
+++ b/src/main/java/io/papermc/paper/commands/DelegatingCommandSource.java
|
|
@@ -0,0 +1,42 @@
|
|
+package io.papermc.paper.commands;
|
|
+
|
|
+import net.minecraft.commands.CommandSource;
|
|
+import net.minecraft.commands.CommandSourceStack;
|
|
+import net.minecraft.network.chat.Component;
|
|
+import org.bukkit.command.CommandSender;
|
|
+
|
|
+import java.util.UUID;
|
|
+
|
|
+public class DelegatingCommandSource implements CommandSource {
|
|
+
|
|
+ private final CommandSource delegate;
|
|
+
|
|
+ public DelegatingCommandSource(CommandSource delegate) {
|
|
+ this.delegate = delegate;
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void sendSystemMessage(Component message) {
|
|
+ delegate.sendSystemMessage(message);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean acceptsSuccess() {
|
|
+ return delegate.acceptsSuccess();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean acceptsFailure() {
|
|
+ return delegate.acceptsFailure();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean shouldInformAdmins() {
|
|
+ return delegate.shouldInformAdmins();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public CommandSender getBukkitSender(CommandSourceStack wrapper) {
|
|
+ return delegate.getBukkitSender(wrapper);
|
|
+ }
|
|
+}
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
|
|
index aca2da47651a76f3e5593d71c500d749d92ccc3b..4da4edae517a0efec6e03a719ec47b700509dab1 100644
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
|
|
@@ -43,6 +43,7 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C
|
|
private boolean renderMessagedFiltered;
|
|
private DyeColor color;
|
|
private boolean hasGlowingText;
|
|
+ private static final org.apache.logging.log4j.Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger();
|
|
|
|
public SignBlockEntity(BlockPos pos, BlockState state) {
|
|
super(BlockEntityType.SIGN, pos, state);
|
|
@@ -260,7 +261,17 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C
|
|
ClickEvent chatclickable = chatmodifier.getClickEvent();
|
|
|
|
if (chatclickable != null && chatclickable.getAction() == ClickEvent.Action.RUN_COMMAND) {
|
|
- player.getServer().getCommands().performPrefixedCommand(this.createCommandSourceStack(player), chatclickable.getValue());
|
|
+ // Paper start
|
|
+ String command = chatclickable.getValue().startsWith("/") ? chatclickable.getValue() : "/" + chatclickable.getValue();
|
|
+ if (org.spigotmc.SpigotConfig.logCommands) {
|
|
+ LOGGER.info("{} issued server command: {}", player.getScoreboardName(), command);
|
|
+ }
|
|
+ io.papermc.paper.event.player.PlayerSignCommandPreprocessEvent event = new io.papermc.paper.event.player.PlayerSignCommandPreprocessEvent(player.getBukkitEntity(), command, new org.bukkit.craftbukkit.util.LazyPlayerSet(player.getServer()), (org.bukkit.block.Sign) io.papermc.paper.util.MCUtil.toBukkitBlock(this.level, this.worldPosition).getState());
|
|
+ if (!event.callEvent()) {
|
|
+ return false;
|
|
+ }
|
|
+ player.getServer().getCommands().performPrefixedCommand(this.createCommandSourceStack(((org.bukkit.craftbukkit.entity.CraftPlayer) event.getPlayer()).getHandle()), event.getMessage());
|
|
+ // Paper end
|
|
}
|
|
}
|
|
|
|
@@ -296,8 +307,21 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C
|
|
String s = player == null ? "Sign" : player.getName().getString();
|
|
Object object = player == null ? Component.literal("Sign") : player.getDisplayName();
|
|
|
|
+ // Paper start - send messages back to the player
|
|
+ CommandSource commandSource = this.level.paperConfig().misc.showSignClickCommandFailureMsgsToPlayer ? new io.papermc.paper.commands.DelegatingCommandSource(this) {
|
|
+ @Override
|
|
+ public void sendSystemMessage(Component message) {
|
|
+ player.sendSystemMessage(message);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public boolean acceptsFailure() {
|
|
+ return true;
|
|
+ }
|
|
+ } : this;
|
|
+ // Paper end
|
|
// CraftBukkit - this
|
|
- return new CommandSourceStack(this, Vec3.atCenterOf(this.worldPosition), Vec2.ZERO, (ServerLevel) this.level, 2, s, (Component) object, this.level.getServer(), player);
|
|
+ return new CommandSourceStack(commandSource, Vec3.atCenterOf(this.worldPosition), Vec2.ZERO, (ServerLevel) this.level, 2, s, (Component) object, this.level.getServer(), player); // Paper
|
|
}
|
|
|
|
public DyeColor getColor() {
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
|
|
index d113e54a30db16e2ad955170df6030d15de530d6..26f3a2799e687731d883e7733591f6934479e88d 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
|
|
@@ -61,7 +61,7 @@ public class BukkitCommandWrapper implements com.mojang.brigadier.Command<Comman
|
|
CommandSender sender = context.getSource().getBukkitSender();
|
|
|
|
try {
|
|
- return this.server.dispatchCommand(sender, context.getInput()) ? 1 : 0;
|
|
+ return this.server.dispatchCommand(sender, context.getRange().get(context.getInput())) ? 1 : 0; // Paper - actually use the StringRange from context
|
|
} catch (CommandException ex) {
|
|
sender.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command");
|
|
this.server.getLogger().log(Level.SEVERE, null, ex);
|