From 72fa0ce340092797726ad12dfabc4bda96d852cd Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Sun, 11 Jun 2023 00:04:55 -0500 Subject: [PATCH] Backport command block API --- ...-Add-command-block-player-edit-event.patch | 173 ++++++++++++++++++ .../0043-Implement-command-block-events.patch | 74 ++++++++ 2 files changed, 247 insertions(+) create mode 100644 patches/api/0004-Add-command-block-player-edit-event.patch create mode 100644 patches/server/0043-Implement-command-block-events.patch diff --git a/patches/api/0004-Add-command-block-player-edit-event.patch b/patches/api/0004-Add-command-block-player-edit-event.patch new file mode 100644 index 0000000..67ebd55 --- /dev/null +++ b/patches/api/0004-Add-command-block-player-edit-event.patch @@ -0,0 +1,173 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Allink +Date: Fri, 2 Jun 2023 20:42:02 +0100 +Subject: [PATCH] Add command block player edit event + + +diff --git a/src/main/java/me/totalfreedom/scissors/event/block/CommandBlockPlayerEditEvent.java b/src/main/java/me/totalfreedom/scissors/event/block/CommandBlockPlayerEditEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..722f5839600954998cbbf799e68477d499d104c4 +--- /dev/null ++++ b/src/main/java/me/totalfreedom/scissors/event/block/CommandBlockPlayerEditEvent.java +@@ -0,0 +1,77 @@ ++package me.totalfreedom.scissors.event.block; ++ ++import org.bukkit.block.CommandBlock; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.Event; ++import org.bukkit.event.HandlerList; ++import org.jetbrains.annotations.NotNull; ++ ++/** ++ * Called when a command block is modified by a player ++ */ ++public class CommandBlockPlayerEditEvent extends Event implements Cancellable ++{ ++ private static final HandlerList handlers = new HandlerList(); ++ private boolean cancelled; ++ private final Player player; ++ private final String oldCommand; ++ private String newCommand; ++ private final CommandBlock commandBlock; ++ ++ public CommandBlockPlayerEditEvent(@NotNull Player player, @NotNull String oldCommand, @NotNull String newCommand, @NotNull CommandBlock commandBlock) ++ { ++ this.player = player; ++ this.oldCommand = oldCommand; ++ this.newCommand = newCommand; ++ this.commandBlock = commandBlock; ++ } ++ ++ public @NotNull String getNewCommand() ++ { ++ return this.newCommand; ++ } ++ ++ public @NotNull String getOldCommand() ++ { ++ return this.oldCommand; ++ } ++ ++ public void setNewCommand(@NotNull String newCommand) ++ { ++ this.newCommand = newCommand; ++ } ++ ++ public @NotNull Player getPlayer() ++ { ++ return this.player; ++ } ++ ++ public @NotNull CommandBlock getCommandBlock() ++ { ++ return this.commandBlock; ++ } ++ ++ @Override ++ public boolean isCancelled() ++ { ++ return this.cancelled; ++ } ++ ++ @Override ++ public void setCancelled(boolean cancel) ++ { ++ this.cancelled = cancel; ++ } ++ ++ @Override ++ public @NotNull HandlerList getHandlers() ++ { ++ return handlers; ++ } ++ ++ public static @NotNull HandlerList getHandlerList() ++ { ++ return handlers; ++ } ++} +diff --git a/src/main/java/me/totalfreedom/scissors/event/block/CommandMinecartPlayerEditEvent.java b/src/main/java/me/totalfreedom/scissors/event/block/CommandMinecartPlayerEditEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..4282f24deb87e52ee19a13b172ec80c6a6017e28 +--- /dev/null ++++ b/src/main/java/me/totalfreedom/scissors/event/block/CommandMinecartPlayerEditEvent.java +@@ -0,0 +1,78 @@ ++package me.totalfreedom.scissors.event.block; ++ ++import org.bukkit.block.CommandBlock; ++import org.bukkit.entity.Player; ++import org.bukkit.entity.minecart.CommandMinecart; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.Event; ++import org.bukkit.event.HandlerList; ++import org.jetbrains.annotations.NotNull; ++ ++/** ++ * Called when a command block is modified by a player ++ */ ++public class CommandMinecartPlayerEditEvent extends Event implements Cancellable ++{ ++ private static final HandlerList handlers = new HandlerList(); ++ private boolean cancelled; ++ private final Player player; ++ private final String oldCommand; ++ private String newCommand; ++ private final CommandMinecart commandMinecart; ++ ++ public CommandMinecartPlayerEditEvent(@NotNull Player player, @NotNull String oldCommand, @NotNull String newCommand, @NotNull CommandMinecart commandMinecart) ++ { ++ this.player = player; ++ this.oldCommand = oldCommand; ++ this.newCommand = newCommand; ++ this.commandMinecart = commandMinecart; ++ } ++ ++ public @NotNull String getNewCommand() ++ { ++ return this.newCommand; ++ } ++ ++ public @NotNull String getOldCommand() ++ { ++ return this.oldCommand; ++ } ++ ++ public void setNewCommand(@NotNull String newCommand) ++ { ++ this.newCommand = newCommand; ++ } ++ ++ public @NotNull Player getPlayer() ++ { ++ return this.player; ++ } ++ ++ public @NotNull CommandMinecart getCommandMinecart() ++ { ++ return this.commandMinecart; ++ } ++ ++ @Override ++ public boolean isCancelled() ++ { ++ return this.cancelled; ++ } ++ ++ @Override ++ public void setCancelled(boolean cancel) ++ { ++ this.cancelled = cancel; ++ } ++ ++ @Override ++ public @NotNull HandlerList getHandlers() ++ { ++ return handlers; ++ } ++ ++ public static @NotNull HandlerList getHandlerList() ++ { ++ return handlers; ++ } ++} diff --git a/patches/server/0043-Implement-command-block-events.patch b/patches/server/0043-Implement-command-block-events.patch new file mode 100644 index 0000000..ff6df51 --- /dev/null +++ b/patches/server/0043-Implement-command-block-events.patch @@ -0,0 +1,74 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Telesphoreo +Date: Sun, 11 Jun 2023 00:00:20 -0500 +Subject: [PATCH] Implement command block events + + +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 2e6e1af5244202e0bc77b443f089b4f3016be8ac..f1f17e33cddf23fffae96d60bfd92934b6ab3c5a 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -25,6 +25,8 @@ import java.util.stream.Collectors; + import java.util.stream.Stream; + import javax.annotation.Nullable; + ++import me.totalfreedom.scissors.event.block.CommandBlockPlayerEditEvent; ++import me.totalfreedom.scissors.event.block.CommandMinecartPlayerEditEvent; + import net.kyori.adventure.text.format.NamedTextColor; + import net.minecraft.ChatFormatting; + import net.minecraft.CrashReport; +@@ -156,6 +158,7 @@ import net.minecraft.world.phys.shapes.BooleanOp; + import net.minecraft.world.phys.shapes.Shapes; + import net.minecraft.world.phys.shapes.VoxelShape; + import org.apache.commons.lang3.StringUtils; ++import org.bukkit.entity.minecart.CommandMinecart; + import org.slf4j.Logger; + + // CraftBukkit start +@@ -916,6 +919,19 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + this.player.level.getChunkAt(blockposition).setBlockEntity(tileentity); + } + ++ // Scissors start - Implement command block events ++ if (commandblocklistenerabstract instanceof org.bukkit.block.CommandBlock commandBlock) { ++ CommandBlockPlayerEditEvent event = new CommandBlockPlayerEditEvent(this.getCraftPlayer(), Objects.requireNonNullElse(commandblocklistenerabstract.getCommand(), ""), s, commandBlock); ++ event.callEvent(); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ s = event.getNewCommand(); ++ } ++ // Scissors end ++ + commandblocklistenerabstract.setCommand(s); + commandblocklistenerabstract.setTrackOutput(flag); + if (!flag) { +@@ -947,7 +963,25 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + BaseCommandBlock commandblocklistenerabstract = packet.getCommandBlock(this.player.level); + + if (commandblocklistenerabstract != null) { +- commandblocklistenerabstract.setCommand(packet.getCommand()); ++ // Scissors start - Implement command block events ++ String command = packet.getCommand(); ++ ++ if (commandblocklistenerabstract instanceof CommandMinecart commandMinecart) { ++ CommandMinecartPlayerEditEvent event = new CommandMinecartPlayerEditEvent(this.getCraftPlayer(), Objects.requireNonNullElse(commandblocklistenerabstract.getCommand(), ""), command, commandMinecart); ++ event.callEvent(); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ command = event.getNewCommand(); ++ } ++ ++ commandblocklistenerabstract.setCommand(command); ++ ++ // commandblocklistenerabstract.setCommand(packet.getCommand()); ++ ++ // Scissors end + commandblocklistenerabstract.setTrackOutput(packet.isTrackOutput()); + if (!packet.isTrackOutput()) { + commandblocklistenerabstract.setLastOutput((Component) null);