diff --git a/Spigot-API-Patches/0252-Added-WorldGameRuleChangeEvent.patch b/Spigot-API-Patches/0252-Added-WorldGameRuleChangeEvent.patch new file mode 100644 index 0000000000..8ef5f7efcd --- /dev/null +++ b/Spigot-API-Patches/0252-Added-WorldGameRuleChangeEvent.patch @@ -0,0 +1,103 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Sun, 20 Dec 2020 16:41:44 -0800 +Subject: [PATCH] Added WorldGameRuleChangeEvent + + +diff --git a/src/main/java/io/papermc/paper/event/world/WorldGameRuleChangeEvent.java b/src/main/java/io/papermc/paper/event/world/WorldGameRuleChangeEvent.java +new file mode 100644 +index 0000000000000000000000000000000000000000..20c25a0f9d65188402e8bb3981348bc6462904bf +--- /dev/null ++++ b/src/main/java/io/papermc/paper/event/world/WorldGameRuleChangeEvent.java +@@ -0,0 +1,91 @@ ++package io.papermc.paper.event.world; ++ ++import org.bukkit.GameRule; ++import org.bukkit.World; ++import org.bukkit.command.CommandSender; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Cancellable; ++import org.bukkit.event.HandlerList; ++import org.bukkit.event.world.WorldEvent; ++import org.jetbrains.annotations.NotNull; ++import org.jetbrains.annotations.Nullable; ++ ++/** ++ * Called when a world's gamerule is changed, either by command or by api. ++ */ ++public class WorldGameRuleChangeEvent extends WorldEvent implements Cancellable { ++ ++ private static final HandlerList HANDLER_LIST = new HandlerList(); ++ ++ private final CommandSender commandSender; ++ private final GameRule gameRule; ++ private String value; ++ private boolean cancelled; ++ ++ public WorldGameRuleChangeEvent(@NotNull World world, @Nullable CommandSender commandSender, @NotNull GameRule gameRule, @NotNull String value) { ++ super(world); ++ this.commandSender = commandSender; ++ this.gameRule = gameRule; ++ this.value = value; ++ } ++ ++ /** ++ * Gets the command sender associated with this event. ++ * ++ * @return {@code null} if the gamerule was changed via api, otherwise the {@link CommandSender}. ++ */ ++ @Nullable ++ public CommandSender getCommandSender() { ++ return commandSender; ++ } ++ ++ /** ++ * Gets the game rule associated with this event. ++ * ++ * @return the gamerule being changed. ++ */ ++ @NotNull ++ public GameRule getGameRule() { ++ return gameRule; ++ } ++ ++ /** ++ * Gets the new value of the gamerule. ++ * ++ * @return the new value of the gamerule. ++ */ ++ @NotNull ++ public String getValue() { ++ return value; ++ } ++ ++ /** ++ * Sets the new value of this gamerule. ++ * ++ * @param value the new value of the gamerule. ++ */ ++ public void setValue(@NotNull String value) { ++ this.value = value; ++ } ++ ++ @Override ++ public boolean isCancelled() { ++ return cancelled; ++ } ++ ++ @Override ++ public void setCancelled(boolean cancel) { ++ this.cancelled = cancel; ++ } ++ ++ @NotNull ++ @Override ++ public HandlerList getHandlers() { ++ return HANDLER_LIST; ++ } ++ ++ @NotNull ++ public static HandlerList getHandlerList() { ++ return HANDLER_LIST; ++ } ++} diff --git a/Spigot-Server-Patches/0638-Added-WorldGameRuleChangeEvent.patch b/Spigot-Server-Patches/0638-Added-WorldGameRuleChangeEvent.patch new file mode 100644 index 0000000000..32c7d06bc8 --- /dev/null +++ b/Spigot-Server-Patches/0638-Added-WorldGameRuleChangeEvent.patch @@ -0,0 +1,108 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Sun, 20 Dec 2020 16:41:44 -0800 +Subject: [PATCH] Added WorldGameRuleChangeEvent + + +diff --git a/src/main/java/net/minecraft/server/CommandGamerule.java b/src/main/java/net/minecraft/server/CommandGamerule.java +index 1ae60aae1d2017226c1f3ea39148d24aaf40cdde..f8ce9be8527111786c233c98e45f6d8fe183c70e 100644 +--- a/src/main/java/net/minecraft/server/CommandGamerule.java ++++ b/src/main/java/net/minecraft/server/CommandGamerule.java +@@ -27,7 +27,7 @@ public class CommandGamerule { + CommandListenerWrapper commandlistenerwrapper = (CommandListenerWrapper) commandcontext.getSource(); + T t0 = commandlistenerwrapper.getWorld().getGameRules().get(gamerules_gamerulekey); // CraftBukkit + +- t0.b(commandcontext, "value"); ++ t0.setValue(commandcontext, "value", gamerules_gamerulekey); // Paper + commandlistenerwrapper.sendMessage(new ChatMessage("commands.gamerule.set", new Object[]{gamerules_gamerulekey.a(), t0.toString()}), true); + return t0.getIntValue(); + } +diff --git a/src/main/java/net/minecraft/server/GameRules.java b/src/main/java/net/minecraft/server/GameRules.java +index b245428604e2a432fa3bab4836a5ca1fb35c3f64..53b40f8947c9380ef57ecc7edca203c5bc894013 100644 +--- a/src/main/java/net/minecraft/server/GameRules.java ++++ b/src/main/java/net/minecraft/server/GameRules.java +@@ -18,6 +18,7 @@ import java.util.function.Supplier; + import javax.annotation.Nullable; + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; ++import io.papermc.paper.event.world.WorldGameRuleChangeEvent; // Paper + + public class GameRules { + +@@ -170,8 +171,11 @@ public class GameRules { + } + + @Override +- protected void a(CommandContext commandcontext, String s) { +- this.b = BoolArgumentType.getBool(commandcontext, s); ++ protected void a(CommandContext commandcontext, String s, GameRules.GameRuleKey gameRuleKey) { // Paper start ++ WorldGameRuleChangeEvent event = new WorldGameRuleChangeEvent(commandcontext.getSource().getBukkitWorld(), commandcontext.getSource().getBukkitSender(), (org.bukkit.GameRule) org.bukkit.GameRule.getByName(gameRuleKey.toString()), String.valueOf(BoolArgumentType.getBool(commandcontext, s))); ++ if (!event.callEvent()) return; ++ this.b = Boolean.parseBoolean(event.getValue()); ++ // Paper end + } + + public boolean a() { +@@ -230,8 +234,11 @@ public class GameRules { + } + + @Override +- protected void a(CommandContext commandcontext, String s) { +- this.b = IntegerArgumentType.getInteger(commandcontext, s); ++ protected void a(CommandContext commandcontext, String s, GameRules.GameRuleKey gameRuleKey) { // Paper start ++ WorldGameRuleChangeEvent event = new WorldGameRuleChangeEvent(commandcontext.getSource().getBukkitWorld(), commandcontext.getSource().getBukkitSender(), (org.bukkit.GameRule) org.bukkit.GameRule.getByName(gameRuleKey.toString()), String.valueOf(IntegerArgumentType.getInteger(commandcontext, s))); ++ if (!event.callEvent()) return; ++ this.b = Integer.parseInt(event.getValue()); ++ // Paper end + } + + public int a() { +@@ -284,10 +291,12 @@ public class GameRules { + this.a = gamerules_gameruledefinition; + } + +- protected abstract void a(CommandContext commandcontext, String s); ++ protected void updateValue(CommandContext commandcontext, String s, GameRules.GameRuleKey gameRuleKey) { this.a(commandcontext, s, gameRuleKey); } // Paper - OBFHELPER ++ protected abstract void a(CommandContext commandcontext, String s, GameRules.GameRuleKey gameRuleKey); // Paper + +- public void b(CommandContext commandcontext, String s) { +- this.a(commandcontext, s); ++ public void setValue(CommandContext commandcontext, String s, GameRules.GameRuleKey gameRuleKey) { this.b(commandcontext, s, gameRuleKey); } // Paper - OBFHELPER ++ public void b(CommandContext commandcontext, String s, GameRules.GameRuleKey gameRuleKey) { // Paper ++ this.updateValue(commandcontext, s, gameRuleKey); // Paper + this.onChange(((CommandListenerWrapper) commandcontext.getSource()).getServer()); + } + +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +index b71316cce3bdbf3485be456f0260c6b3463cff8e..0314cb1270803265dc4bf4268697b09aabf2c612 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +@@ -2345,8 +2345,13 @@ public class CraftWorld implements World { + + if (!isGameRule(rule)) return false; + ++ // Paper start ++ GameRule gameRule = GameRule.getByName(rule); ++ io.papermc.paper.event.world.WorldGameRuleChangeEvent event = new io.papermc.paper.event.world.WorldGameRuleChangeEvent(this, null, gameRule, value); ++ if (!event.callEvent()) return false; ++ // Paper end + GameRules.GameRuleValue handle = getHandle().getGameRules().get(getGameRulesNMS().get(rule)); +- handle.setValue(value); ++ handle.setValue(event.getValue().toString()); // Paper + handle.onChange(getHandle().getMinecraftServer()); + return true; + } +@@ -2381,8 +2386,12 @@ public class CraftWorld implements World { + + if (!isGameRule(rule.getName())) return false; + ++ // Paper start ++ io.papermc.paper.event.world.WorldGameRuleChangeEvent event = new io.papermc.paper.event.world.WorldGameRuleChangeEvent(this, null, rule, String.valueOf(newValue)); ++ if (!event.callEvent()) return false; ++ // Paper end + GameRules.GameRuleValue handle = getHandle().getGameRules().get(getGameRulesNMS().get(rule.getName())); +- handle.setValue(newValue.toString()); ++ handle.setValue(event.getValue().toString()); // Paper + handle.onChange(getHandle().getMinecraftServer()); + return true; + }