From 15efff8ce204c16c2b481546e7c057dcc719eace Mon Sep 17 00:00:00 2001 From: Allink <44676012+allinkdev@users.noreply.github.com> Date: Fri, 2 Jun 2023 23:23:19 +0100 Subject: [PATCH] Implement command block events (#86) * Implement command block events * Make annotation test pass * Squash annotation test patch into base patch --- ...-Add-command-block-player-edit-event.patch | 163 ++++++++++++++++++ .../0048-Implement-command-block-events.patch | 86 +++++++++ 2 files changed, 249 insertions(+) create mode 100644 patches/api/0004-Add-command-block-player-edit-event.patch create mode 100644 patches/server/0048-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..510ffac --- /dev/null +++ b/patches/api/0004-Add-command-block-player-edit-event.patch @@ -0,0 +1,163 @@ +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..eed9a93475aa32992dc28b6677a0fab154a4fa38 +--- /dev/null ++++ b/src/main/java/me/totalfreedom/scissors/event/block/CommandBlockPlayerEditEvent.java +@@ -0,0 +1,72 @@ ++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; ++ } ++} +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..9cc63909e8fb83984e4a0d0803e81a27cda65f88 +--- /dev/null ++++ b/src/main/java/me/totalfreedom/scissors/event/block/CommandMinecartPlayerEditEvent.java +@@ -0,0 +1,73 @@ ++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; ++ } ++} diff --git a/patches/server/0048-Implement-command-block-events.patch b/patches/server/0048-Implement-command-block-events.patch new file mode 100644 index 0000000..fd6708e --- /dev/null +++ b/patches/server/0048-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 20:55:18 +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 2549ff41d1d63ba0dbdaee3e526a44f953945b6d..2748949301ce9b2c3b098dd2a7d2caee331980a7 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 me.totalfreedom.scissors.ScissorsConfig; ++import me.totalfreedom.scissors.event.block.CommandBlockPlayerEditEvent; ++import me.totalfreedom.scissors.event.block.CommandMinecartPlayerEditEvent; + import me.totalfreedom.scissors.event.player.SpectatorTeleportEvent; + import com.google.common.collect.Lists; + import com.google.common.primitives.Floats; +@@ -160,6 +162,7 @@ import net.minecraft.world.entity.player.Inventory; + import net.minecraft.world.entity.player.ProfilePublicKey; + 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; +@@ -188,6 +191,7 @@ import net.minecraft.world.phys.Vec3; + import net.minecraft.world.phys.shapes.BooleanOp; + import net.minecraft.world.phys.shapes.Shapes; + import net.minecraft.world.phys.shapes.VoxelShape; ++import org.bukkit.entity.minecart.CommandMinecart; + import org.slf4j.Logger; + + // CraftBukkit start +@@ -994,6 +998,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + 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) { +@@ -1025,7 +1044,27 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + 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);