From c8822dc0dfd5981d75e80086517704619db6ecb0 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Mon, 10 Nov 2025 20:55:17 -0500 Subject: [PATCH 1/9] Add bypass permission node patches. --- ...s-permission-node-for-force-gamemode.patch | 19 ++++++ ...-Add-vanilla-spawn-protection-bypass.patch | 19 ++++++ .../0035-Add-spam-bypass-permission.patch | 20 +++++++ .../0036-Add-flight-bypass-nodes.patch | 26 ++++++++ .../0037-Add-movement-bypass-nodes.patch | 59 +++++++++++++++++++ 5 files changed, 143 insertions(+) create mode 100644 paper-server/patches/features/0033-Add-bypass-permission-node-for-force-gamemode.patch create mode 100644 paper-server/patches/features/0034-Add-vanilla-spawn-protection-bypass.patch create mode 100644 paper-server/patches/features/0035-Add-spam-bypass-permission.patch create mode 100644 paper-server/patches/features/0036-Add-flight-bypass-nodes.patch create mode 100644 paper-server/patches/features/0037-Add-movement-bypass-nodes.patch diff --git a/paper-server/patches/features/0033-Add-bypass-permission-node-for-force-gamemode.patch b/paper-server/patches/features/0033-Add-bypass-permission-node-for-force-gamemode.patch new file mode 100644 index 000000000000..ead01eed9587 --- /dev/null +++ b/paper-server/patches/features/0033-Add-bypass-permission-node-for-force-gamemode.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mickey42302 +Date: Mon, 10 Nov 2025 19:33:16 -0500 +Subject: [PATCH] Add bypass permission node for force-gamemode + + +diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java +index b4a996ac6c570e988b38237a32f90ec5042cbc17..5a4ad14ee3d8fa10bd167227cb8b38bfec901049 100644 +--- a/net/minecraft/server/level/ServerPlayer.java ++++ b/net/minecraft/server/level/ServerPlayer.java +@@ -521,7 +521,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + } + private void loadGameTypes(ValueInput input) { + if (this.server.getForcedGameType() != null && this.server.getForcedGameType() != readPlayerMode(input, "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()) { ++ if (!getBukkitEntity().hasPermission("minecraft.force-gamemode.bypass") && 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(readPlayerMode(input, "playerGameType"), readPlayerMode(input, "previousPlayerGameType")); diff --git a/paper-server/patches/features/0034-Add-vanilla-spawn-protection-bypass.patch b/paper-server/patches/features/0034-Add-vanilla-spawn-protection-bypass.patch new file mode 100644 index 000000000000..b47fc5d0ad92 --- /dev/null +++ b/paper-server/patches/features/0034-Add-vanilla-spawn-protection-bypass.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mickey42302 +Date: Mon, 10 Nov 2025 20:13:52 -0500 +Subject: [PATCH] Add vanilla spawn protection bypass + + +diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java +index 354b48c88b113c4048e258f2402aad2647d3c364..8a55ac72d89027637ac074e330c6e49178991ba0 100644 +--- a/net/minecraft/server/dedicated/DedicatedServer.java ++++ b/net/minecraft/server/dedicated/DedicatedServer.java +@@ -677,6 +677,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface + return false; + } else if (this.spawnProtectionRadius() <= 0) { + return false; ++ } else if (player instanceof ServerPlayer serverPlayer && serverPlayer.getBukkitEntity().hasPermission("minecraft.spawn-protection.bypass")) { ++ return false; + } else { + BlockPos blockPos = respawnData.pos(); + int abs = Mth.abs(pos.getX() - blockPos.getX()); diff --git a/paper-server/patches/features/0035-Add-spam-bypass-permission.patch b/paper-server/patches/features/0035-Add-spam-bypass-permission.patch new file mode 100644 index 000000000000..49e9a91bb628 --- /dev/null +++ b/paper-server/patches/features/0035-Add-spam-bypass-permission.patch @@ -0,0 +1,20 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mickey42302 +Date: Mon, 10 Nov 2025 20:32:11 -0500 +Subject: [PATCH] Add spam bypass permission + + +diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index ef7d44ea1c1582bbf1d544819825778c414fe40d..9b6d3528fbbe2800d57f8ff8164b586628ee2619 100644 +--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -2557,7 +2557,8 @@ public class ServerGamePacketListenerImpl + if (!this.chatSpamThrottler.isIncrementAndUnderThreshold() + // CraftBukkit end + && !this.server.getPlayerList().isOp(this.player.nameAndId()) +- && !this.server.isSingleplayerOwner(this.player.nameAndId())) { ++ && !this.server.isSingleplayerOwner(this.player.nameAndId()) ++ && !(java.util.Objects.requireNonNull(this.server.getPlayerList().getPlayer(this.player.getUUID()))).getBukkitEntity().hasPermission("minecraft.spam.bypass")) { + this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - kick event cause & add proper async disconnect + } + } diff --git a/paper-server/patches/features/0036-Add-flight-bypass-nodes.patch b/paper-server/patches/features/0036-Add-flight-bypass-nodes.patch new file mode 100644 index 000000000000..878e0766fea8 --- /dev/null +++ b/paper-server/patches/features/0036-Add-flight-bypass-nodes.patch @@ -0,0 +1,26 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mickey42302 +Date: Mon, 10 Nov 2025 20:37:14 -0500 +Subject: [PATCH] Add flight bypass nodes + + +diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 9b6d3528fbbe2800d57f8ff8164b586628ee2619..092261baeff155d18026074bf1f9db17bcb20431 100644 +--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -707,6 +707,7 @@ public class ServerGamePacketListenerImpl + this.clientVehicleIsFloating = verticalDelta >= -0.03125 + && !flag + && !this.server.allowFlight() ++ && !this.player.getBukkitEntity().hasPermission("minecraft.flight.bypass.vehicle") + && !rootVehicle.isFlyingVehicle() + && !rootVehicle.isNoGravity() + && this.noBlocksAround(rootVehicle); +@@ -1684,6 +1685,7 @@ public class ServerGamePacketListenerImpl + && !this.server.allowFlight() + && !this.player.getAbilities().mayfly + && !this.player.hasEffect(MobEffects.LEVITATION) ++ && !this.player.getBukkitEntity().hasPermission("minecraft.flight.bypass.client") + && !isFallFlying + && !isAutoSpinAttack + && this.noBlocksAround(this.player); diff --git a/paper-server/patches/features/0037-Add-movement-bypass-nodes.patch b/paper-server/patches/features/0037-Add-movement-bypass-nodes.patch new file mode 100644 index 000000000000..0dd009bd5a38 --- /dev/null +++ b/paper-server/patches/features/0037-Add-movement-bypass-nodes.patch @@ -0,0 +1,59 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Mickey42302 +Date: Mon, 10 Nov 2025 20:53:27 -0500 +Subject: [PATCH] Add movement bypass nodes + + +diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index 092261baeff155d18026074bf1f9db17bcb20431..89bd3a39f410215f773de79238bebb77e81196ec 100644 +--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -598,6 +598,9 @@ public class ServerGamePacketListenerImpl + // Paper end - Prevent moving into unloaded chunks + if (d7 - d6 > Math.max(100.0, Mth.square(org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed)) && !this.isSingleplayerOwner()) { + // CraftBukkit end ++ if (this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.vehicle")) { ++ return; ++ } + LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", rootVehicle.getPlainTextName(), this.player.getPlainTextName(), d3, d4, d5); + this.send(ClientboundMoveVehiclePacket.fromEntity(rootVehicle)); + return; +@@ -626,6 +629,9 @@ public class ServerGamePacketListenerImpl + boolean flag1 = false; + if (d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot + flag1 = true; // Paper - diff on change, this should be moved wrongly ++ if (this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.vehicle")) { ++ return; ++ } + LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", rootVehicle.getPlainTextName(), this.player.getPlainTextName(), Math.sqrt(d7)); + } + +@@ -1502,6 +1508,9 @@ public class ServerGamePacketListenerImpl + float f2 = isFallFlying ? 300.0F : 100.0F; + if (d7 - d6 > Math.max(f2, Mth.square(org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed))) { + // CraftBukkit end ++ if (this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.client")) { ++ return; ++ } + // Paper start - Add fail move event + io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_TOO_QUICKLY, + toX, toY, toZ, toYaw, toPitch, true); +@@ -1578,7 +1587,8 @@ public class ServerGamePacketListenerImpl + && d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold // Spigot + && !this.player.isSleeping() + && !this.player.isCreative() +- && !this.player.isSpectator()) { ++ && !this.player.isSpectator() ++ && !this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.client")) { + // Paper start - Add fail move event + io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_WRONGLY, + toX, toY, toZ, toYaw, toPitch, true); +@@ -1729,6 +1739,8 @@ public class ServerGamePacketListenerImpl + return false; + } else if (this.player.isChangingDimension()) { + return false; ++ } else if (this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.elytra")) { ++ return false; + } else { + GameRules gameRules = this.player.level().getGameRules(); + return !gameRules.getBoolean(GameRules.RULE_DISABLE_PLAYER_MOVEMENT_CHECK) From c5d816ba974ee88fe263688aa3900b770c43857c Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:06:32 -0400 Subject: [PATCH 2/9] Delete feature patch (replacing with file patch) --- ...s-permission-node-for-force-gamemode.patch | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 paper-server/patches/features/0033-Add-bypass-permission-node-for-force-gamemode.patch diff --git a/paper-server/patches/features/0033-Add-bypass-permission-node-for-force-gamemode.patch b/paper-server/patches/features/0033-Add-bypass-permission-node-for-force-gamemode.patch deleted file mode 100644 index ead01eed9587..000000000000 --- a/paper-server/patches/features/0033-Add-bypass-permission-node-for-force-gamemode.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mickey42302 -Date: Mon, 10 Nov 2025 19:33:16 -0500 -Subject: [PATCH] Add bypass permission node for force-gamemode - - -diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index b4a996ac6c570e988b38237a32f90ec5042cbc17..5a4ad14ee3d8fa10bd167227cb8b38bfec901049 100644 ---- a/net/minecraft/server/level/ServerPlayer.java -+++ b/net/minecraft/server/level/ServerPlayer.java -@@ -521,7 +521,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - } - private void loadGameTypes(ValueInput input) { - if (this.server.getForcedGameType() != null && this.server.getForcedGameType() != readPlayerMode(input, "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()) { -+ if (!getBukkitEntity().hasPermission("minecraft.force-gamemode.bypass") && 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(readPlayerMode(input, "playerGameType"), readPlayerMode(input, "previousPlayerGameType")); From 5de96a1d6a0dc36942ff7ffedbfc1d26eb047818 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:06:41 -0400 Subject: [PATCH 3/9] Delete feature patch (replacing with file patch) --- ...-Add-vanilla-spawn-protection-bypass.patch | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 paper-server/patches/features/0034-Add-vanilla-spawn-protection-bypass.patch diff --git a/paper-server/patches/features/0034-Add-vanilla-spawn-protection-bypass.patch b/paper-server/patches/features/0034-Add-vanilla-spawn-protection-bypass.patch deleted file mode 100644 index b47fc5d0ad92..000000000000 --- a/paper-server/patches/features/0034-Add-vanilla-spawn-protection-bypass.patch +++ /dev/null @@ -1,19 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mickey42302 -Date: Mon, 10 Nov 2025 20:13:52 -0500 -Subject: [PATCH] Add vanilla spawn protection bypass - - -diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 354b48c88b113c4048e258f2402aad2647d3c364..8a55ac72d89027637ac074e330c6e49178991ba0 100644 ---- a/net/minecraft/server/dedicated/DedicatedServer.java -+++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -677,6 +677,8 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - return false; - } else if (this.spawnProtectionRadius() <= 0) { - return false; -+ } else if (player instanceof ServerPlayer serverPlayer && serverPlayer.getBukkitEntity().hasPermission("minecraft.spawn-protection.bypass")) { -+ return false; - } else { - BlockPos blockPos = respawnData.pos(); - int abs = Mth.abs(pos.getX() - blockPos.getX()); From 21dace09cf09a6a05fe8311b36f09dc7ffef25b4 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:06:51 -0400 Subject: [PATCH 4/9] Delete feature patch (replacing with file patch) --- .../0035-Add-spam-bypass-permission.patch | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 paper-server/patches/features/0035-Add-spam-bypass-permission.patch diff --git a/paper-server/patches/features/0035-Add-spam-bypass-permission.patch b/paper-server/patches/features/0035-Add-spam-bypass-permission.patch deleted file mode 100644 index 49e9a91bb628..000000000000 --- a/paper-server/patches/features/0035-Add-spam-bypass-permission.patch +++ /dev/null @@ -1,20 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mickey42302 -Date: Mon, 10 Nov 2025 20:32:11 -0500 -Subject: [PATCH] Add spam bypass permission - - -diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index ef7d44ea1c1582bbf1d544819825778c414fe40d..9b6d3528fbbe2800d57f8ff8164b586628ee2619 100644 ---- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2557,7 +2557,8 @@ public class ServerGamePacketListenerImpl - if (!this.chatSpamThrottler.isIncrementAndUnderThreshold() - // CraftBukkit end - && !this.server.getPlayerList().isOp(this.player.nameAndId()) -- && !this.server.isSingleplayerOwner(this.player.nameAndId())) { -+ && !this.server.isSingleplayerOwner(this.player.nameAndId()) -+ && !(java.util.Objects.requireNonNull(this.server.getPlayerList().getPlayer(this.player.getUUID()))).getBukkitEntity().hasPermission("minecraft.spam.bypass")) { - this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - kick event cause & add proper async disconnect - } - } From 1ad18514c3e61b45ebbddc56466586920acc8b89 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:07:00 -0400 Subject: [PATCH 5/9] Delete feature patch (replacing with file patch) --- .../0036-Add-flight-bypass-nodes.patch | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 paper-server/patches/features/0036-Add-flight-bypass-nodes.patch diff --git a/paper-server/patches/features/0036-Add-flight-bypass-nodes.patch b/paper-server/patches/features/0036-Add-flight-bypass-nodes.patch deleted file mode 100644 index 878e0766fea8..000000000000 --- a/paper-server/patches/features/0036-Add-flight-bypass-nodes.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mickey42302 -Date: Mon, 10 Nov 2025 20:37:14 -0500 -Subject: [PATCH] Add flight bypass nodes - - -diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 9b6d3528fbbe2800d57f8ff8164b586628ee2619..092261baeff155d18026074bf1f9db17bcb20431 100644 ---- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -707,6 +707,7 @@ public class ServerGamePacketListenerImpl - this.clientVehicleIsFloating = verticalDelta >= -0.03125 - && !flag - && !this.server.allowFlight() -+ && !this.player.getBukkitEntity().hasPermission("minecraft.flight.bypass.vehicle") - && !rootVehicle.isFlyingVehicle() - && !rootVehicle.isNoGravity() - && this.noBlocksAround(rootVehicle); -@@ -1684,6 +1685,7 @@ public class ServerGamePacketListenerImpl - && !this.server.allowFlight() - && !this.player.getAbilities().mayfly - && !this.player.hasEffect(MobEffects.LEVITATION) -+ && !this.player.getBukkitEntity().hasPermission("minecraft.flight.bypass.client") - && !isFallFlying - && !isAutoSpinAttack - && this.noBlocksAround(this.player); From 459b3b85ada3186bb88b09c6753113e2ed6c33ea Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:07:09 -0400 Subject: [PATCH 6/9] Delete feature patch (replacing with file patch) --- .../0037-Add-movement-bypass-nodes.patch | 59 ------------------- 1 file changed, 59 deletions(-) delete mode 100644 paper-server/patches/features/0037-Add-movement-bypass-nodes.patch diff --git a/paper-server/patches/features/0037-Add-movement-bypass-nodes.patch b/paper-server/patches/features/0037-Add-movement-bypass-nodes.patch deleted file mode 100644 index 0dd009bd5a38..000000000000 --- a/paper-server/patches/features/0037-Add-movement-bypass-nodes.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Mickey42302 -Date: Mon, 10 Nov 2025 20:53:27 -0500 -Subject: [PATCH] Add movement bypass nodes - - -diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 092261baeff155d18026074bf1f9db17bcb20431..89bd3a39f410215f773de79238bebb77e81196ec 100644 ---- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -598,6 +598,9 @@ public class ServerGamePacketListenerImpl - // Paper end - Prevent moving into unloaded chunks - if (d7 - d6 > Math.max(100.0, Mth.square(org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed)) && !this.isSingleplayerOwner()) { - // CraftBukkit end -+ if (this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.vehicle")) { -+ return; -+ } - LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", rootVehicle.getPlainTextName(), this.player.getPlainTextName(), d3, d4, d5); - this.send(ClientboundMoveVehiclePacket.fromEntity(rootVehicle)); - return; -@@ -626,6 +629,9 @@ public class ServerGamePacketListenerImpl - boolean flag1 = false; - if (d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot - flag1 = true; // Paper - diff on change, this should be moved wrongly -+ if (this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.vehicle")) { -+ return; -+ } - LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", rootVehicle.getPlainTextName(), this.player.getPlainTextName(), Math.sqrt(d7)); - } - -@@ -1502,6 +1508,9 @@ public class ServerGamePacketListenerImpl - float f2 = isFallFlying ? 300.0F : 100.0F; - if (d7 - d6 > Math.max(f2, Mth.square(org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed))) { - // CraftBukkit end -+ if (this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.client")) { -+ return; -+ } - // Paper start - Add fail move event - io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_TOO_QUICKLY, - toX, toY, toZ, toYaw, toPitch, true); -@@ -1578,7 +1587,8 @@ public class ServerGamePacketListenerImpl - && d7 > org.spigotmc.SpigotConfig.movedWronglyThreshold // Spigot - && !this.player.isSleeping() - && !this.player.isCreative() -- && !this.player.isSpectator()) { -+ && !this.player.isSpectator() -+ && !this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.client")) { - // Paper start - Add fail move event - io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_WRONGLY, - toX, toY, toZ, toYaw, toPitch, true); -@@ -1729,6 +1739,8 @@ public class ServerGamePacketListenerImpl - return false; - } else if (this.player.isChangingDimension()) { - return false; -+ } else if (this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.elytra")) { -+ return false; - } else { - GameRules gameRules = this.player.level().getGameRules(); - return !gameRules.getBoolean(GameRules.RULE_DISABLE_PLAYER_MOVEMENT_CHECK) From 5dbab4c372301b7efedf70d54fb77523a58d20d1 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:10:44 -0400 Subject: [PATCH 7/9] Add files via upload --- .../ServerGamePacketListenerImpl.java.patch | 64 ++++++++++++++----- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index 706ddff5c781..a6aa62471801 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -270,7 +270,7 @@ + return; + } + // Paper end - Prevent moving into unloaded chunks -+ if (movedDist - expectedDist > Math.max(100.0, Mth.square(org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed)) && !this.isSingleplayerOwner()) { ++ if (movedDist - expectedDist > Math.max(100.0, Mth.square(org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed)) && !this.isSingleplayerOwner() && !this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.vehicle.quickly")) { // Paper - add bypass permission + // CraftBukkit end LOGGER.warn( "{} (vehicle of {}) moved too quickly! {},{},{}", vehicle.getPlainTextName(), this.player.getPlainTextName(), xDist, yDist, zDist @@ -293,7 +293,7 @@ movedDist = xDist * xDist + yDist * yDist + zDist * zDist; boolean fail = false; - if (movedDist > 0.0625) { -+ if (movedDist > org.spigotmc.SpigotConfig.movedWronglyThreshold) { // Spigot ++ if (movedDist > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.vehicle.wrongly")) { // Spigot fail = true; LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", vehicle.getPlainTextName(), this.player.getPlainTextName(), Math.sqrt(movedDist)); } @@ -355,6 +355,16 @@ this.player.level().getChunkSource().move(this.player); Vec3 clientDeltaMovement = new Vec3(vehicle.getX() - oldX, vehicle.getY() - oldY, vehicle.getZ() - oldZ); this.handlePlayerKnownMovement(clientDeltaMovement); +@@ -513,7 +_,8 @@ + && !this.server.allowFlight() + && !vehicle.isFlyingVehicle() + && !vehicle.isNoGravity() +- && this.noBlocksAround(vehicle); ++ && this.noBlocksAround(vehicle) ++ && !this.getCraftPlayer().hasPermission("minecraft.flight.bypass.vehicle"); // Paper - add bypass permission + this.vehicleLastGoodX = vehicle.getX(); + this.vehicleLastGoodY = vehicle.getY(); + this.vehicleLastGoodZ = vehicle.getZ(); @@ -532,7 +_,7 @@ PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); if (packet.getId() == this.awaitingTeleport) { @@ -388,7 +398,7 @@ this.player.getRecipeBook().setBookSetting(packet.getBookType(), packet.isOpen(), packet.isFiltering()); } -@@ -591,25 +_,112 @@ +@@ -591,25 +_,113 @@ } } @@ -402,7 +412,7 @@ - PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); + // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); // Paper - AsyncTabCompleteEvent; run this async + // CraftBukkit start -+ if (!this.tabSpamThrottler.isIncrementAndUnderThreshold() && !this.server.getPlayerList().isOp(this.player.nameAndId()) && !this.server.isSingleplayerOwner(this.player.nameAndId())) { // Paper - configurable tab spam limits ++ if (!this.tabSpamThrottler.isIncrementAndUnderThreshold() && !this.player.getBukkitEntity().hasPermission("minecraft.spam.bypass.command-suggestions.frequency") && !this.server.getPlayerList().isOp(this.player.nameAndId()) && !this.server.isSingleplayerOwner(this.player.nameAndId())) { // Paper - configurable tab spam limits and a bypass permission node + this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause // Paper - add proper async disconnect + return; + } @@ -414,7 +424,7 @@ + // Paper end - Don't suggest if tab-complete is disabled + // Paper start + final int index; -+ if (packet.getCommand().length() > 64 && ((index = packet.getCommand().indexOf(' ')) == -1 || index >= 64)) { ++ if (!this.player.getBukkitEntity().hasPermission("minecraft.spam.bypass.command-suggestions.length") && packet.getCommand().length() > 64 && ((index = packet.getCommand().indexOf(' ')) == -1 || index >= 64)) { // Paper - add bypass permission node + this.disconnectAsync(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - add proper async disconnect + return; + } @@ -473,7 +483,8 @@ + // Paper end - AsyncTabCompleteEvent ParseResults parse = this.server.getCommands().getDispatcher().parse(command, this.player.createCommandSourceStack()); + // Paper start - Handle non-recoverable exceptions -+ if (!parse.getExceptions().isEmpty() ++ if (!this.player.getBukkitEntity().hasPermission("minecraft.spam.bypass.server-suggestions") // Paper - add a bypass permission node ++ && !parse.getExceptions().isEmpty() + && parse.getExceptions().values().stream().anyMatch(e -> e instanceof io.papermc.paper.brigadier.TagParseCommandSyntaxException)) { + this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); + return; @@ -784,7 +795,8 @@ + } + // Paper end - Prevent moving into unloaded chunks - if (this.shouldCheckPlayerMovement(isFallFlying)) { +- if (this.shouldCheckPlayerMovement(isFallFlying)) { ++ if (this.shouldCheckPlayerMovement(isFallFlying) && !this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.player.quickly")) { // Paper - add bypass permission float metersPerTick = isFallFlying ? 300.0F : 100.0F; - if (movedDist - expectedDist > metersPerTick * deltaPackets) { + if (movedDist - expectedDist > Math.max(metersPerTick, Mth.square(org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) deltaPackets * speed))) { @@ -848,7 +860,7 @@ double oyDist = yDist; xDist = targetX - this.player.getX(); yDist = targetY - this.player.getY(); -@@ -1143,21 +_,88 @@ +@@ -1143,27 +_,96 @@ zDist = targetZ - this.player.getZ(); movedDist = xDist * xDist + yDist * yDist + zDist * zDist; @@ -860,8 +872,10 @@ && !this.player.isSleeping() && !this.player.isCreative() && !this.player.isSpectator() - && !this.player.isInPostImpulseGraceTime()) { +- && !this.player.isInPostImpulseGraceTime()) { - fail = true; ++ && !this.player.isInPostImpulseGraceTime() ++ && !this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.player.wrongly")) { // Paper - add bypass permission + // Paper start - Add fail move event + io.papermc.paper.event.player.PlayerFailMoveEvent event = fireFailMove(io.papermc.paper.event.player.PlayerFailMoveEvent.FailReason.MOVED_WRONGLY, + targetX, targetY, targetZ, targetYRot, targetXRot, true); @@ -946,6 +960,13 @@ this.player.absSnapTo(targetX, targetY, targetZ, targetYRot, targetXRot); boolean isAutoSpinAttack = this.player.isAutoSpinAttack(); this.clientIsFloating = oyDist >= -0.03125 + && !playerStandsOnSomething + && !this.player.isSpectator() + && !this.server.allowFlight() ++ && !this.player.getBukkitEntity().hasPermission("minecraft.flight.bypass.player") // Paper - add bypass permission + && !this.player.getAbilities().mayfly + && !this.player.hasEffect(MobEffects.LEVITATION) + && !isFallFlying @@ -1192,7 +_,7 @@ this.lastGoodY = this.player.getY(); this.lastGoodZ = this.player.getZ(); @@ -955,6 +976,17 @@ this.player .doCheckFallDamage( this.player.getX() - startX, this.player.getY() - startY, this.player.getZ() - startZ, packet.isOnGround() +@@ -1216,6 +_,10 @@ + return false; + } + ++ if (isFallFlying && this.player.getBukkitEntity().hasPermission("minecraft.movement.bypass.elytra")) { // Paper - add bypass permission ++ return false; ++ } ++ + GameRules gameRules = this.player.level().getGameRules(); + return gameRules.get(GameRules.PLAYER_MOVEMENT_CHECK) && (!isFallFlying || gameRules.get(GameRules.ELYTRA_MOVEMENT_CHECK)); + } @@ -1232,6 +_,7 @@ this.player.getXRot() ); @@ -1235,7 +1267,7 @@ this.player.swing(hand, true); } -@@ -1394,6 +_,15 @@ +@@ -1394,20 +_,24 @@ && success.swingSource() == InteractionResult.SwingSource.SERVER) { this.player.swing(hand, true); } @@ -1249,9 +1281,10 @@ + } + // Paper end - Fix inventory desync } else { - this.player.sendBuildLimitMessage(true, maxY); +- this.player.sendBuildLimitMessage(true, maxY); ++ // this.player.sendBuildLimitMessage(true, maxY); // Paper - Fix MC-306582: Fix build limit message being sent when it shouldn't be } -@@ -1401,13 +_,8 @@ + this.send(new ClientboundBlockUpdatePacket(level, pos)); this.send(new ClientboundBlockUpdatePacket(level, pos.relative(direction))); } @@ -1561,7 +1594,7 @@ return Optional.empty(); } -@@ -1669,31 +_,91 @@ +@@ -1669,31 +_,92 @@ return false; } @@ -1642,7 +1675,8 @@ + // CraftBukkit start - replaced with thread safe throttle + // throttler.increment(); + if (!throttler.isIncrementAndUnderThreshold() -+ // CraftBukkit end - replaced with thread safe throttle ++ // CraftBukkit end - replaced with thread safe throttle ++ && !this.player.getBukkitEntity().hasPermission("minecraft.spam.bypass.rate") // Paper - add bypass permission node && !this.server.getPlayerList().isOp(this.player.nameAndId()) && !this.server.isSingleplayerOwner(this.player.nameAndId())) { - this.disconnect(Component.translatable("disconnect.spam")); @@ -2294,7 +2328,7 @@ public void handlePlaceRecipe(final ServerboundPlaceRecipePacket packet) { + // Paper start - auto recipe limit + if (!org.bukkit.Bukkit.isPrimaryThread()) { -+ if (!this.recipeSpamPackets.isIncrementAndUnderThreshold()) { ++ if (!this.player.getBukkitEntity().hasPermission("minecraft.spam.bypass.place") && !this.recipeSpamPackets.isIncrementAndUnderThreshold()) { // Paper - add bypass permission node + this.disconnectAsync(net.minecraft.network.chat.Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - kick event cause // Paper - add proper async disconnect + return; + } From 1dca2fa01d533bf2f3c6709e3623812465bfdca4 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:11:03 -0400 Subject: [PATCH 8/9] Add files via upload --- .../dedicated/DedicatedServer.java.patch | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch b/paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch index b96362df1adc..addf74ac5d15 100644 --- a/paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch @@ -308,6 +308,33 @@ this.getCommands().performPrefixedCommand(input.source, input.msg); } } +@@ -509,6 +_,7 @@ + this.settings.update(p -> p.spawnProtection.update(this.registryAccess(), spawnProtectionRadius)); + } + ++ // Paper start - add a bypass permission node + @Override + public boolean isUnderSpawnProtection(final ServerLevel level, final BlockPos pos, final Player player) { + LevelData.RespawnData respawnData = level.getRespawnData(); +@@ -524,6 +_,10 @@ + return false; + } + ++ if (player.getBukkitEntity().hasPermission("minecraft.spawn-protection.bypass")) { ++ return false; ++ } ++ + if (this.spawnProtectionRadius() <= 0) { + return false; + } +@@ -534,6 +_,7 @@ + int dist = Math.max(xd, zd); + return dist <= this.spawnProtectionRadius(); + } ++ // Paper - end + + @Override + public boolean repliesToStatus() { @@ -592,12 +_,15 @@ @Override From 5ec698008962e4c30c111526005023c72f727e02 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 19:11:26 -0400 Subject: [PATCH 9/9] Add files via upload --- .../server/level/ServerPlayer.java.patch | 59 +++++++++---------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch index fc4746f898f7..356de8fa9a5d 100644 --- a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -125,7 +125,7 @@ if (this.isSleeping()) { this.stopSleeping(); } -@@ -405,12 +_,26 @@ +@@ -405,12 +_,44 @@ this.respawnConfig = input.read("respawn", ServerPlayer.RespawnConfig.CODEC).orElse(null); this.spawnExtraParticlesOnFall = input.getBooleanOr("spawn_extra_particles_on_fall", false); this.raidOmenPosition = input.read("raid_omen_position", BlockPos.CODEC).orElse(null); @@ -138,16 +138,34 @@ + // Paper start - Expand PlayerGameModeChangeEvent + private void loadGameTypes(ValueInput input) { -+ if (this.server.getForcedGameType() != null && this.server.getForcedGameType() != readPlayerMode(input, "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()) { ++ GameType playerGameType = readPlayerMode(input, "playerGameType"); ++ GameType previousPlayerGameType = readPlayerMode(input, "previousPlayerGameType"); ++ ++ if (this.server.getForcedGameType() != null && this.server.getForcedGameType() != playerGameType) { ++ if (this.getBukkitEntity().hasPermission("minecraft.force-gamemode.bypass")) { // Paper - add bypass permission ++ this.gameMode.setGameModeForPlayer( ++ playerGameType != null ? playerGameType : this.calculateGameModeForNewPlayer(null), ++ previousPlayerGameType ++ ); ++ return; ++ } ++ ++ org.bukkit.GameMode forcedBukkitGameMode = org.bukkit.GameMode.getByValue(this.server.getDefaultGameType().getId()); ++ if (forcedBukkitGameMode == null) { ++ forcedBukkitGameMode = org.bukkit.GameMode.SURVIVAL; ++ } ++ ++ if (new org.bukkit.event.player.PlayerGameModeChangeEvent(this.getBukkitEntity(), forcedBukkitGameMode, org.bukkit.event.player.PlayerGameModeChangeEvent.Cause.DEFAULT_GAMEMODE, null).callEvent()) { + this.gameMode.setGameModeForPlayer(this.server.getForcedGameType(), GameType.DEFAULT_MODE); + } else { -+ this.gameMode.setGameModeForPlayer(readPlayerMode(input, "playerGameType"), readPlayerMode(input, "previousPlayerGameType")); ++ this.gameMode.setGameModeForPlayer( ++ playerGameType != null ? playerGameType : this.calculateGameModeForNewPlayer(null), ++ previousPlayerGameType ++ ); + } + return; + } -+ this.gameMode -+ .setGameModeForPlayer(this.calculateGameModeForNewPlayer(readPlayerMode(input, "playerGameType")), readPlayerMode(input, "previousPlayerGameType")); ++ this.gameMode.setGameModeForPlayer(this.calculateGameModeForNewPlayer(playerGameType), previousPlayerGameType); + } + // Paper end - Expand PlayerGameModeChangeEvent + @@ -597,7 +615,7 @@ } @Override -@@ -1004,24 +_,98 @@ +@@ -1004,24 +_,87 @@ return this.level().isPvpAllowed(); } @@ -684,18 +702,7 @@ + location = respawnEvent.getRespawnLocation(); + + return new RespawnResult( -+ new TeleportTransition( -+ ((org.bukkit.craftbukkit.CraftWorld) location.getWorld()).getHandle(), -+ org.bukkit.craftbukkit.util.CraftLocation.toVec3(location), -+ teleportTransition.deltaMovement(), -+ location.getYaw(), -+ location.getPitch(), -+ teleportTransition.missingRespawnBlock(), -+ teleportTransition.asPassenger(), -+ teleportTransition.relatives(), -+ teleportTransition.postTeleportTransition(), -+ teleportTransition.cause() -+ ), ++ teleportTransition.withChangedLocation(location), + isBedSpawn, + isAnchorSpawn + ); @@ -744,7 +751,7 @@ if (this.isRemoved()) { return null; } -@@ -1103,12 +_,46 @@ +@@ -1103,12 +_,36 @@ ServerLevel newLevel = transition.newLevel(); ServerLevel oldLevel = this.level(); ResourceKey lastDimension = oldLevel.dimension(); @@ -769,17 +776,7 @@ + } + if (!newExit.equals(exit)) { + newLevel = ((org.bukkit.craftbukkit.CraftWorld) newExit.getWorld()).getHandle(); -+ transition = new TeleportTransition( -+ newLevel, -+ org.bukkit.craftbukkit.util.CraftLocation.toVec3(newExit), -+ Vec3.ZERO, -+ newExit.getYaw(), -+ newExit.getPitch(), -+ transition.missingRespawnBlock(), -+ transition.asPassenger(), -+ Set.of(), -+ transition.postTeleportTransition(), -+ transition.cause()); ++ transition = transition.withChangedLocation(newExit).withVelocity(Vec3.ZERO).withRelatives(Set.of()); + } + // CraftBukkit end if (!transition.asPassenger()) {