aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0649-additions-to-PlayerGameModeChangeEvent.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0649-additions-to-PlayerGameModeChangeEvent.patch')
-rw-r--r--patches/server/0649-additions-to-PlayerGameModeChangeEvent.patch153
1 files changed, 153 insertions, 0 deletions
diff --git a/patches/server/0649-additions-to-PlayerGameModeChangeEvent.patch b/patches/server/0649-additions-to-PlayerGameModeChangeEvent.patch
new file mode 100644
index 0000000000..769f85c58f
--- /dev/null
+++ b/patches/server/0649-additions-to-PlayerGameModeChangeEvent.patch
@@ -0,0 +1,153 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Sat, 15 May 2021 10:04:43 -0700
+Subject: [PATCH] additions to PlayerGameModeChangeEvent
+
+
+diff --git a/src/main/java/net/minecraft/server/commands/DefaultGameModeCommands.java b/src/main/java/net/minecraft/server/commands/DefaultGameModeCommands.java
+index d25a27f3a6775ca86092ea8bdeab4abdd8909d35..7d9ec435f3821f95d3bed893c4e46d5a2531cd58 100644
+--- a/src/main/java/net/minecraft/server/commands/DefaultGameModeCommands.java
++++ b/src/main/java/net/minecraft/server/commands/DefaultGameModeCommands.java
+@@ -31,9 +31,13 @@ public class DefaultGameModeCommands {
+ GameType gameType = minecraftServer.getForcedGameType();
+ if (gameType != null) {
+ for(ServerPlayer serverPlayer : minecraftServer.getPlayerList().getPlayers()) {
+- if (serverPlayer.setGameMode(gameType)) {
+- ++i;
++ // Paper start - extend PlayerGameModeChangeEvent
++ org.bukkit.event.player.PlayerGameModeChangeEvent event = serverPlayer.setGameMode(gameType, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, net.kyori.adventure.text.Component.empty());
++ if (event != null && event.isCancelled()) {
++ source.sendSuccess(io.papermc.paper.adventure.PaperAdventure.asVanilla(event.cancelMessage()), false);
+ }
++ // Paper end
++ ++i;
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/server/commands/GameModeCommand.java b/src/main/java/net/minecraft/server/commands/GameModeCommand.java
+index d75f78d2e3fb1376e8f6a8668c98a04a693c99e1..79f6089b934124c3309c6bee2e48b36b937252e0 100644
+--- a/src/main/java/net/minecraft/server/commands/GameModeCommand.java
++++ b/src/main/java/net/minecraft/server/commands/GameModeCommand.java
+@@ -52,9 +52,14 @@ public class GameModeCommand {
+ int i = 0;
+
+ for(ServerPlayer serverPlayer : targets) {
+- if (serverPlayer.setGameMode(gameMode)) {
++ // Paper start - extend PlayerGameModeChangeEvent
++ org.bukkit.event.player.PlayerGameModeChangeEvent event = serverPlayer.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.COMMAND, net.kyori.adventure.text.Component.empty());
++ if (event != null && !event.isCancelled()) {
+ logGamemodeChange(context.getSource(), serverPlayer, gameMode);
+ ++i;
++ } else if (event != null && event.cancelMessage() != null) {
++ context.getSource().sendSuccess(io.papermc.paper.adventure.PaperAdventure.asVanilla(event.cancelMessage()), true);
++ // Paper end
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 160b1a7396472b682236d5f626ebf267bc8a5aea..f1661e228ed982f38e0bc3e9e0c1720608e0b4a4 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -1803,8 +1803,15 @@ public class ServerPlayer extends Player {
+ }
+
+ public boolean setGameMode(GameType gameMode) {
+- if (!this.gameMode.changeGameModeForPlayer(gameMode)) {
+- return false;
++ // Paper start - Add cause and nullable message to event
++ org.bukkit.event.player.PlayerGameModeChangeEvent event = this.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.UNKNOWN, null);
++ return event == null ? false : event.isCancelled();
++ }
++ public org.bukkit.event.player.PlayerGameModeChangeEvent setGameMode(GameType gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause cause, net.kyori.adventure.text.Component message) {
++ org.bukkit.event.player.PlayerGameModeChangeEvent event = this.gameMode.changeGameModeForPlayer(gameMode, cause, message);
++ if (event == null || event.isCancelled()) {
++ // Paper end
++ return null;
+ } else {
+ this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, (float) gameMode.getId()));
+ if (gameMode == GameType.SPECTATOR) {
+@@ -1816,7 +1823,7 @@ public class ServerPlayer extends Player {
+
+ this.onUpdateAbilities();
+ this.updateEffectVisibility();
+- return true;
++ return event; // Paper
+ }
+ }
+
+@@ -2198,6 +2205,16 @@ public class ServerPlayer extends Player {
+ }
+
+ public void loadGameTypes(@Nullable CompoundTag nbt) {
++ // Paper start
++ if (this.server.getForcedGameType() != null && this.server.getForcedGameType() != ServerPlayer.readPlayerMode(nbt, "playerGameType")) {
++ if (new org.bukkit.event.player.PlayerGameModeChangeEvent(this.getBukkitEntity(), org.bukkit.GameMode.getByValue(this.server.getDefaultGameType().getId()), org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, null).callEvent()) {
++ this.gameMode.setGameModeForPlayer(this.server.getForcedGameType(), GameType.DEFAULT_MODE);
++ } else {
++ this.gameMode.setGameModeForPlayer(ServerPlayer.readPlayerMode(nbt,"playerGameType"), ServerPlayer.readPlayerMode(nbt, "previousPlayerGameType"));
++ }
++ return;
++ }
++ // Paper end
+ this.gameMode.setGameModeForPlayer(this.calculateGameModeForNewPlayer(ServerPlayer.readPlayerMode(nbt, "playerGameType")), ServerPlayer.readPlayerMode(nbt, "previousPlayerGameType"));
+ }
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+index f97d97426144527cff9ebb91b26fe8541a9c6d9b..b6eef41079120fffd63f06f681378b1b628b95e0 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+@@ -74,18 +74,24 @@ public class ServerPlayerGameMode {
+ }
+
+ public boolean changeGameModeForPlayer(GameType gameMode) {
++ // Paper end
++ PlayerGameModeChangeEvent event = this.changeGameModeForPlayer(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.UNKNOWN, null);
++ return event == null ? false : event.isCancelled();
++ }
++ public PlayerGameModeChangeEvent changeGameModeForPlayer(GameType gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause cause, net.kyori.adventure.text.Component cancelMessage) {
++ // Paper end
+ if (gameMode == this.gameModeForPlayer) {
+- return false;
++ return null; // Paper
+ } else {
+ // CraftBukkit start
+- PlayerGameModeChangeEvent event = new PlayerGameModeChangeEvent(this.player.getBukkitEntity(), GameMode.getByValue(gameMode.getId()));
++ PlayerGameModeChangeEvent event = new PlayerGameModeChangeEvent(this.player.getBukkitEntity(), GameMode.getByValue(gameMode.getId()), cause, cancelMessage); // Paper
+ this.level.getCraftServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+- return false;
++ return event; // Paper
+ }
+ // CraftBukkit end
+ this.setGameModeForPlayer(gameMode, this.gameModeForPlayer);
+- return true;
++ return event; // Paper
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 6764cfef07169db97662177837aa7815f7346a5d..1dce75b762c2b9134819bcd66d14fc07826dc48f 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -2506,7 +2506,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
+
+ this.player = this.server.getPlayerList().respawn(this.player, false);
+ if (this.server.isHardcore()) {
+- this.player.setGameMode(GameType.SPECTATOR);
++ this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper
+ ((GameRules.BooleanValue) this.player.getLevel().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS)).set(false, this.server);
+ }
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index d5d73ba9d6c7d1e91aa469c6d0e2df80393a621c..f623aad54714449d0c2793d68adbf8cfb1f640a2 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -1286,7 +1286,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ throw new IllegalArgumentException("Mode cannot be null");
+ }
+
+- this.getHandle().setGameMode(GameType.byId(mode.getValue()));
++ this.getHandle().setGameMode(GameType.byId(mode.getValue()), org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.PLUGIN, null); // Paper
+ }
+
+ @Override