aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0531-Expand-PlayerGameModeChangeEvent.patch
diff options
context:
space:
mode:
authorBjarne Koll <[email protected]>2024-09-19 16:36:07 +0200
committerGitHub <[email protected]>2024-09-19 16:36:07 +0200
commitc5a10665b8b80af650500b9263036f778f06d500 (patch)
treefedc133f0dbc101067951e1fccd9d577c312fdb8 /patches/server/0531-Expand-PlayerGameModeChangeEvent.patch
parent5c829557332f21b34bc81e6ad1a73e511faef8f6 (diff)
downloadPaper-c5a10665b8b80af650500b9263036f778f06d500.tar.gz
Paper-c5a10665b8b80af650500b9263036f778f06d500.zip
Remove wall-time / unused skip tick protection (#11412)
Spigot still maintains some partial implementation of "tick skipping", a practice in which the MinecraftServer.currentTick field is updated not by an increment of one per actual tick, but instead set to System.currentTimeMillis() / 50. This behaviour means that the tracked tick may "skip" a tick value in case a previous tick took more than the expected 50ms. To compensate for this in important paths, spigot/craftbukkit implements "wall-time". Instead of incrementing/decrementing ticks on block entities/entities by one for each call to their tick() method, they instead increment/decrement important values, like an ItemEntity's age or pickupDelay, by the difference of `currentTick - lastTick`, where `lastTick` is the value of `currentTick` during the last tick() call. These "fixes" however do not play nicely with minecraft's simulation distance as entities/block entities implementing the above behaviour would "catch up" their values when moving from a non-ticking chunk to a ticking one as their `lastTick` value remains stuck on the last tick in a ticking chunk and hence lead to a large "catch up" once ticked again. Paper completely removes the "tick skipping" behaviour (See patch "Further-improve-server-tick-loop"), making the above precautions completely unnecessary, which also rids paper of the previous described incompatibility with non-ticking chunks.
Diffstat (limited to 'patches/server/0531-Expand-PlayerGameModeChangeEvent.patch')
-rw-r--r--patches/server/0531-Expand-PlayerGameModeChangeEvent.patch161
1 files changed, 161 insertions, 0 deletions
diff --git a/patches/server/0531-Expand-PlayerGameModeChangeEvent.patch b/patches/server/0531-Expand-PlayerGameModeChangeEvent.patch
new file mode 100644
index 0000000000..08394e448a
--- /dev/null
+++ b/patches/server/0531-Expand-PlayerGameModeChangeEvent.patch
@@ -0,0 +1,161 @@
+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] Expand PlayerGameModeChangeEvent
+
+
+diff --git a/src/main/java/net/minecraft/server/commands/DefaultGameModeCommands.java b/src/main/java/net/minecraft/server/commands/DefaultGameModeCommands.java
+index b95a979f8f58f43e0becedcd843ff8bb992eb455..a046a0b1519806ff3d987e6402f152b60a3a6f4c 100644
+--- a/src/main/java/net/minecraft/server/commands/DefaultGameModeCommands.java
++++ b/src/main/java/net/minecraft/server/commands/DefaultGameModeCommands.java
+@@ -28,9 +28,13 @@ public class DefaultGameModeCommands {
+ GameType gameType = minecraftServer.getForcedGameType();
+ if (gameType != null) {
+ for (ServerPlayer serverPlayer : minecraftServer.getPlayerList().getPlayers()) {
+- if (serverPlayer.setGameMode(gameType)) {
+- i++;
++ // Paper start - Expand 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 - Expand PlayerGameModeChangeEvent
++ i++;
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/server/commands/GameModeCommand.java b/src/main/java/net/minecraft/server/commands/GameModeCommand.java
+index 7f09119bc7d661e08a960dd2bd46006efe752d3e..d1da3600dc07107309b20ebe6e7c0c4da0e8de76 100644
+--- a/src/main/java/net/minecraft/server/commands/GameModeCommand.java
++++ b/src/main/java/net/minecraft/server/commands/GameModeCommand.java
+@@ -60,9 +60,14 @@ public class GameModeCommand {
+ int i = 0;
+
+ for (ServerPlayer serverPlayer : targets) {
+- if (serverPlayer.setGameMode(gameMode)) {
++ // Paper start - Expand 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 - Expand PlayerGameModeChangeEvent
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index 52a5274fb811870481a48bf0505769d7ac5df31f..42df8d45ceb963043cf6467b8fc47272ce0873da 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -2084,10 +2084,18 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
+ }
+
+ public boolean setGameMode(GameType gameMode) {
++ // Paper start - Expand PlayerGameModeChangeEvent
++ org.bukkit.event.player.PlayerGameModeChangeEvent event = this.setGameMode(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.UNKNOWN, null);
++ return event == null ? false : event.isCancelled();
++ }
++ @Nullable
++ public org.bukkit.event.player.PlayerGameModeChangeEvent setGameMode(GameType gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause cause, @Nullable net.kyori.adventure.text.Component message) {
+ boolean flag = this.isSpectator();
+
+- if (!this.gameMode.changeGameModeForPlayer(gameMode)) {
+- return false;
++ org.bukkit.event.player.PlayerGameModeChangeEvent event = this.gameMode.changeGameModeForPlayer(gameMode, cause, message);
++ if (event == null || event.isCancelled()) {
++ return null;
++ // Paper end - Expand PlayerGameModeChangeEvent
+ } else {
+ this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, (float) gameMode.getId()));
+ if (gameMode == GameType.SPECTATOR) {
+@@ -2103,7 +2111,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
+
+ this.onUpdateAbilities();
+ this.updateEffectVisibility();
+- return true;
++ return event; // Paper - Expand PlayerGameModeChangeEvent
+ }
+ }
+
+@@ -2509,6 +2517,16 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player {
+ }
+
+ public void loadGameTypes(@Nullable CompoundTag nbt) {
++ // Paper start - Expand PlayerGameModeChangeEvent
++ 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 - Expand PlayerGameModeChangeEvent
+ 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 5de472df78940d1b8320f73d18b2edf3a796227e..073cf184a0e7af41048ae67a9b17b4cdfcc43c35 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayerGameMode.java
+@@ -74,14 +74,21 @@ public class ServerPlayerGameMode {
+ }
+
+ public boolean changeGameModeForPlayer(GameType gameMode) {
++ // Paper start - Expand PlayerGameModeChangeEvent
++ PlayerGameModeChangeEvent event = this.changeGameModeForPlayer(gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.UNKNOWN, null);
++ return event != null && event.isCancelled();
++ }
++ @Nullable
++ public PlayerGameModeChangeEvent changeGameModeForPlayer(GameType gameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause cause, @Nullable net.kyori.adventure.text.Component cancelMessage) {
++ // Paper end - Expand PlayerGameModeChangeEvent
+ if (gameMode == this.gameModeForPlayer) {
+- return false;
++ return null; // Paper - Expand PlayerGameModeChangeEvent
+ } 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 - Expand PlayerGameModeChangeEvent
+ }
+ // CraftBukkit end
+ this.setGameModeForPlayer(gameMode, this.previousGameModeForPlayer);
+@@ -92,7 +99,7 @@ public class ServerPlayerGameMode {
+ this.player.resetCurrentImpulseContext();
+ }
+
+- return true;
++ return event; // Paper - Expand PlayerGameModeChangeEvent
+ }
+ }
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 276c0b017452a1d7b60a2a8e779f2f3fcf4960cc..9781047aa5e0a6e6bc9f9c43a1eb347b6ecdff66 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -2730,7 +2730,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+
+ this.player = this.server.getPlayerList().respawn(this.player, false, Entity.RemovalReason.KILLED, RespawnReason.DEATH); // CraftBukkit
+ if (this.server.isHardcore()) {
+- this.player.setGameMode(GameType.SPECTATOR);
++ this.player.setGameMode(GameType.SPECTATOR, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.HARDCORE_DEATH, null); // Paper - Expand PlayerGameModeChangeEvent
+ ((GameRules.BooleanValue) this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS)).set(false, this.player.serverLevel()); // CraftBukkit - per-world
+ }
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+index 7de53f6750d478a052bc8ade6edac056565fe068..a85983b947147a1557908846b8773aab29c17fae 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+@@ -1654,7 +1654,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ Preconditions.checkArgument(mode != null, "GameMode cannot be null");
+ if (this.getHandle().connection == null) return;
+
+- this.getHandle().setGameMode(GameType.byId(mode.getValue()));
++ this.getHandle().setGameMode(GameType.byId(mode.getValue()), org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.PLUGIN, null); // Paper - Expand PlayerGameModeChangeEvent
+ }
+
+ @Override