From 2073436f76e973f49942efcdd7da3bfadbba8726 Mon Sep 17 00:00:00 2001 From: "Justin A.L. Link" <44676012+allinkdev@users.noreply.github.com> Date: Sun, 4 Jun 2023 22:58:17 +0100 Subject: [PATCH] Implement command block events (1.17.1) (#89) * Implement command block events * Add missing getHandlerList() method --- ...-Add-command-block-player-edit-event.patch | 173 ++++++++++++++++++ .../0055-Implement-command-block-events.patch | 86 +++++++++ 2 files changed, 259 insertions(+) create mode 100644 patches/api/0004-Add-command-block-player-edit-event.patch create mode 100644 patches/server/0055-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..17f99b2 --- /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 23:40:13 +0100 +Subject: [PATCH] Add command block player edit event + + +diff --git a/src/main/java/com/github/atlasmediagroup/scissors/event/block/CommandBlockPlayerEditEvent.java b/src/main/java/com/github/atlasmediagroup/scissors/event/block/CommandBlockPlayerEditEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..983dd3b25800d5f1fcc61415051bf7c28d0147bd +--- /dev/null ++++ b/src/main/java/com/github/atlasmediagroup/scissors/event/block/CommandBlockPlayerEditEvent.java +@@ -0,0 +1,77 @@ ++package com.github.atlasmediagroup.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/com/github/atlasmediagroup/scissors/event/block/CommandMinecartPlayerEditEvent.java b/src/main/java/com/github/atlasmediagroup/scissors/event/block/CommandMinecartPlayerEditEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..2ecaad3d67d3a028a50e998d791de3a829197117 +--- /dev/null ++++ b/src/main/java/com/github/atlasmediagroup/scissors/event/block/CommandMinecartPlayerEditEvent.java +@@ -0,0 +1,78 @@ ++package com.github.atlasmediagroup.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/0055-Implement-command-block-events.patch b/patches/server/0055-Implement-command-block-events.patch new file mode 100644 index 0000000..9c01ca0 --- /dev/null +++ b/patches/server/0055-Implement-command-block-events.patch @@ -0,0 +1,86 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Allink +Date: Fri, 2 Jun 2023 23:42:46 +0100 +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 8ec188a09dd1d5150a25fdf18f49deac1593fb4d..0eb54b2b36df7870724e33d75d1d3f6d5492ffab 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -1,6 +1,8 @@ + package net.minecraft.server.network; + + import com.github.atlasmediagroup.scissors.ScissorsConfig; ++import com.github.atlasmediagroup.scissors.event.block.CommandBlockPlayerEditEvent; ++import com.github.atlasmediagroup.scissors.event.block.CommandMinecartPlayerEditEvent; + import com.github.atlasmediagroup.scissors.event.player.SpectatorTeleportEvent; + import com.google.common.collect.Lists; + import com.google.common.primitives.Floats; +@@ -134,6 +136,7 @@ import net.minecraft.world.entity.player.ChatVisiblity; + import net.minecraft.world.entity.player.Inventory; + import net.minecraft.world.entity.projectile.AbstractArrow; + import net.minecraft.world.entity.vehicle.Boat; ++import net.minecraft.world.entity.vehicle.MinecartCommandBlock; + import net.minecraft.world.item.BlockItem; + import net.minecraft.world.item.BucketItem; + import net.minecraft.world.item.Item; +@@ -186,6 +189,7 @@ import org.bukkit.craftbukkit.util.CraftMagicNumbers; + import org.bukkit.craftbukkit.util.LazyPlayerSet; + import org.bukkit.craftbukkit.util.Waitable; + import org.bukkit.entity.Player; ++import org.bukkit.entity.minecart.CommandMinecart; + import org.bukkit.event.Event; + import org.bukkit.event.block.Action; + import org.bukkit.event.block.SignChangeEvent; +@@ -902,6 +906,21 @@ 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) { +@@ -933,7 +952,27 @@ 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);