From 677ae94f6a8c2970583599c88e9c711d23361a6e Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Thu, 30 Jul 2026 11:58:19 -0400 Subject: [PATCH 1/7] Add files via upload --- .../server/commands/RandomCommand.java.patch | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch diff --git a/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch b/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch new file mode 100644 index 000000000000..9847b98aa09e --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch @@ -0,0 +1,20 @@ +--- a/net/minecraft/server/commands/RandomCommand.java ++++ b/net/minecraft/server/commands/RandomCommand.java +@@ -42,7 +42,7 @@ public class RandomCommand { + .then(drawRandomValueTree("roll", true)) + .then( + Commands.literal("reset") +- .requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)) ++ .requires(stack -> stack.getSender().isOp() || stack.getSender().hasPermission("minecraft.command.random.reset")) // Paper - Add permission node for reset + .then( + Commands.literal("*") + .executes(c -> resetAllSequences(c.getSource())) +@@ -122,7 +122,7 @@ public class RandomCommand { + .then( + Commands.argument("sequence", IdentifierArgument.id()) + .suggests(RandomCommand::suggestRandomSequence) +- .requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)) ++ .requires(stack -> stack.getSender().isOp() || stack.getSender().hasPermission("minecraft.command.random.sequence")) // Paper - Add permission node for sequence + .executes( + c -> randomSample(c.getSource(), RangeArgument.Ints.getRange(c, "range"), IdentifierArgument.getId(c, "sequence"), announce) + ) From 348a5fa2882a6796dc295d35ec1e78b85ce578f2 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Sun, 2 Aug 2026 09:27:21 -0400 Subject: [PATCH 2/7] Update RandomCommand.java.patch --- .../net/minecraft/server/commands/RandomCommand.java.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch b/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch index 9847b98aa09e..6f9e476a3113 100644 --- a/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch @@ -5,7 +5,7 @@ .then( Commands.literal("reset") - .requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)) -+ .requires(stack -> stack.getSender().isOp() || stack.getSender().hasPermission("minecraft.command.random.reset")) // Paper - Add permission node for reset ++ .requires(stack -> stack.getSender().hasPermission("minecraft.command.random.reset")) // Paper - Add permission node for reset .then( Commands.literal("*") .executes(c -> resetAllSequences(c.getSource())) @@ -14,7 +14,7 @@ Commands.argument("sequence", IdentifierArgument.id()) .suggests(RandomCommand::suggestRandomSequence) - .requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)) -+ .requires(stack -> stack.getSender().isOp() || stack.getSender().hasPermission("minecraft.command.random.sequence")) // Paper - Add permission node for sequence ++ .requires(stack -> stack.getSender().hasPermission("minecraft.command.random.sequence")) // Paper - Add permission node for sequence .executes( c -> randomSample(c.getSource(), RangeArgument.Ints.getRange(c, "range"), IdentifierArgument.getId(c, "sequence"), announce) ) From 8d0e561c824602b0d1afdc98ef4556deac264c99 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Sun, 2 Aug 2026 10:17:37 -0400 Subject: [PATCH 3/7] Add files via upload --- .../net/minecraft/server/commands/RandomCommand.java.patch | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch b/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch index 6f9e476a3113..0554b92bbda0 100644 --- a/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/commands/RandomCommand.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/commands/RandomCommand.java +++ b/net/minecraft/server/commands/RandomCommand.java -@@ -42,7 +42,7 @@ public class RandomCommand { +@@ -42,7 +_,7 @@ .then(drawRandomValueTree("roll", true)) .then( Commands.literal("reset") @@ -9,12 +9,12 @@ .then( Commands.literal("*") .executes(c -> resetAllSequences(c.getSource())) -@@ -122,7 +122,7 @@ public class RandomCommand { +@@ -122,7 +_,7 @@ .then( Commands.argument("sequence", IdentifierArgument.id()) .suggests(RandomCommand::suggestRandomSequence) - .requires(Commands.hasPermission(Commands.LEVEL_GAMEMASTERS)) -+ .requires(stack -> stack.getSender().hasPermission("minecraft.command.random.sequence")) // Paper - Add permission node for sequence ++ .requires(stack -> stack.getSender().hasPermission("minecraft.command.random.sequence." + (announce ? "roll" : "value"))) // Paper - Split permission node for sequence .executes( c -> randomSample(c.getSource(), RangeArgument.Ints.getRange(c, "range"), IdentifierArgument.getId(c, "sequence"), announce) ) From e9765247f3136d1598047e00c2d1ddf906c05906 Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Sun, 16 Aug 2026 19:06:19 -0400 Subject: [PATCH 4/7] Add methods for player limit and operator level management --- .../main/java/org/bukkit/OfflinePlayer.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/paper-api/src/main/java/org/bukkit/OfflinePlayer.java b/paper-api/src/main/java/org/bukkit/OfflinePlayer.java index 13ec9ea1ee08..f1dba4998e4c 100644 --- a/paper-api/src/main/java/org/bukkit/OfflinePlayer.java +++ b/paper-api/src/main/java/org/bukkit/OfflinePlayer.java @@ -591,4 +591,44 @@ default Location getBedSpawnLocation() { default void applySkinToPlayerHeadContents(final PlayerHeadObjectContents.Builder builder) { builder.skin(this.getPlayerProfile()); } + + /** + * Checks if this player bypasses the server player limit when connecting. + *

+ * Note: A player must be an operator for this privilege to take effect. + *

+ * + * @return true if the player bypasses the player limit, false otherwise + */ + boolean bypassesPlayerLimit(); + + /** + * Sets whether this player bypasses the server player limit when connecting. + *

+ * Note: The player must already be an operator for this to update their entry in ops.json. + *

+ * + * @param bypass true if the player should bypass the player limit + * @return true if the status was successfully updated, false if the player is not an operator + */ + boolean setBypassesPlayerLimit(boolean bypass); + + /** + * Gets the operator permission level for this player (0 through 4). + * + * @return the permission level, or 0 if the player is not an operator or entry is missing + */ + int getOpLevel(); + + /** + * Sets the operator permission level for this player. + *

+ * If setting a level greater than 0, the player will be added to ops.json if not present. + * If set to 0, the player's level will be cleared (or removed from ops depending on server logic). + *

+ * + * @param level the level to set (must be between 0 and 4) + * @throws IllegalArgumentException if level is outside the 0–4 range + */ + void setOpLevel(int level); } From a20d0589f5c077a285e0c0abb2f761284305e4db Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Sun, 16 Aug 2026 19:08:14 -0400 Subject: [PATCH 5/7] Add player limit bypass and op level management methods --- .../craftbukkit/CraftOfflinePlayer.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java index 1aa8f1e0a309..e9f180ad08bf 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -579,4 +579,79 @@ public void setStatistic(Statistic statistic, EntityType entityType, int newValu manager.save(); } } + + @Override + public boolean bypassesPlayerLimit() { + ServerOpList opList = MinecraftServer.getServer().getPlayerList().getOps(); + NameAndId nameAndId = new NameAndId(this.getUniqueId(), this.getName() != null ? this.getName() : ""); + ServerOpListEntry entry = opList.get(nameAndId); + + return entry != null && entry.getBypassesPlayerLimit(); + } + + @Override + public boolean setBypassesPlayerLimit(boolean bypass) { + MinecraftServer server = MinecraftServer.getServer(); + ServerOpList opList = server.getPlayerList().getOps(); + + NameAndId nameAndId = new NameAndId(this.getUniqueId(), this.getName() != null ? this.getName() : ""); + ServerOpListEntry existingEntry = opList.get(nameAndId); + + if (existingEntry == null) { + return false; + } + + ServerOpListEntry newEntry = new ServerOpListEntry( + nameAndId, + existingEntry.permissions(), + bypass + ); + + opList.add(newEntry); + return true; + } + + @Override + public int getOpLevel() { + ServerOpList opList = MinecraftServer.getServer().getPlayerList().getOps(); + NameAndId nameAndId = new NameAndId(this.getUniqueId(), this.getName() != null ? this.getName() : ""); + ServerOpListEntry entry = opList.get(nameAndId); + + if (entry == null) { + return 0; + } + + LevelBasedPermissionSet levelSet = entry.permissions(); + return levelSet.level().id(); + + } + + @Override + public void setOpLevel(int level) { + if (level < 0 || level > 4) { + throw new IllegalArgumentException("Operator permission level must be between 0 and 4."); + } + + MinecraftServer server = MinecraftServer.getServer(); + ServerOpList opList = server.getPlayerList().getOps(); + + NameAndId nameAndId = new NameAndId(this.getUniqueId(), this.getName() != null ? this.getName() : ""); + ServerOpListEntry existingEntry = opList.get(nameAndId); + + boolean bypassesLimit = existingEntry != null && existingEntry.getBypassesPlayerLimit(); + + PermissionLevel permLevel = PermissionLevel.byId(level); + ServerOpListEntry newEntry = new ServerOpListEntry( + nameAndId, + LevelBasedPermissionSet.forLevel(permLevel), + bypassesLimit + ); + + opList.add(newEntry); + + ServerPlayer serverPlayer = server.getPlayerList().getPlayer(this.getUniqueId()); + if (serverPlayer != null) { + server.getPlayerList().sendPlayerPermissionLevel(serverPlayer); + } + } } From 7f0ba49c08d3251b4057470f7a17c436eeaa9f9c Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Sun, 16 Aug 2026 19:09:17 -0400 Subject: [PATCH 6/7] Wrong branch --- .../craftbukkit/CraftOfflinePlayer.java | 75 ------------------- 1 file changed, 75 deletions(-) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java index e9f180ad08bf..1aa8f1e0a309 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -579,79 +579,4 @@ public void setStatistic(Statistic statistic, EntityType entityType, int newValu manager.save(); } } - - @Override - public boolean bypassesPlayerLimit() { - ServerOpList opList = MinecraftServer.getServer().getPlayerList().getOps(); - NameAndId nameAndId = new NameAndId(this.getUniqueId(), this.getName() != null ? this.getName() : ""); - ServerOpListEntry entry = opList.get(nameAndId); - - return entry != null && entry.getBypassesPlayerLimit(); - } - - @Override - public boolean setBypassesPlayerLimit(boolean bypass) { - MinecraftServer server = MinecraftServer.getServer(); - ServerOpList opList = server.getPlayerList().getOps(); - - NameAndId nameAndId = new NameAndId(this.getUniqueId(), this.getName() != null ? this.getName() : ""); - ServerOpListEntry existingEntry = opList.get(nameAndId); - - if (existingEntry == null) { - return false; - } - - ServerOpListEntry newEntry = new ServerOpListEntry( - nameAndId, - existingEntry.permissions(), - bypass - ); - - opList.add(newEntry); - return true; - } - - @Override - public int getOpLevel() { - ServerOpList opList = MinecraftServer.getServer().getPlayerList().getOps(); - NameAndId nameAndId = new NameAndId(this.getUniqueId(), this.getName() != null ? this.getName() : ""); - ServerOpListEntry entry = opList.get(nameAndId); - - if (entry == null) { - return 0; - } - - LevelBasedPermissionSet levelSet = entry.permissions(); - return levelSet.level().id(); - - } - - @Override - public void setOpLevel(int level) { - if (level < 0 || level > 4) { - throw new IllegalArgumentException("Operator permission level must be between 0 and 4."); - } - - MinecraftServer server = MinecraftServer.getServer(); - ServerOpList opList = server.getPlayerList().getOps(); - - NameAndId nameAndId = new NameAndId(this.getUniqueId(), this.getName() != null ? this.getName() : ""); - ServerOpListEntry existingEntry = opList.get(nameAndId); - - boolean bypassesLimit = existingEntry != null && existingEntry.getBypassesPlayerLimit(); - - PermissionLevel permLevel = PermissionLevel.byId(level); - ServerOpListEntry newEntry = new ServerOpListEntry( - nameAndId, - LevelBasedPermissionSet.forLevel(permLevel), - bypassesLimit - ); - - opList.add(newEntry); - - ServerPlayer serverPlayer = server.getPlayerList().getPlayer(this.getUniqueId()); - if (serverPlayer != null) { - server.getPlayerList().sendPlayerPermissionLevel(serverPlayer); - } - } } From 5bbb90d4216c4d74a2958b507a16f98c2870831a Mon Sep 17 00:00:00 2001 From: Mickey42302 <46900084+Mickey42302@users.noreply.github.com> Date: Sun, 16 Aug 2026 19:09:54 -0400 Subject: [PATCH 7/7] Wrong branch --- .../main/java/org/bukkit/OfflinePlayer.java | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/OfflinePlayer.java b/paper-api/src/main/java/org/bukkit/OfflinePlayer.java index f1dba4998e4c..13ec9ea1ee08 100644 --- a/paper-api/src/main/java/org/bukkit/OfflinePlayer.java +++ b/paper-api/src/main/java/org/bukkit/OfflinePlayer.java @@ -591,44 +591,4 @@ default Location getBedSpawnLocation() { default void applySkinToPlayerHeadContents(final PlayerHeadObjectContents.Builder builder) { builder.skin(this.getPlayerProfile()); } - - /** - * Checks if this player bypasses the server player limit when connecting. - *

- * Note: A player must be an operator for this privilege to take effect. - *

- * - * @return true if the player bypasses the player limit, false otherwise - */ - boolean bypassesPlayerLimit(); - - /** - * Sets whether this player bypasses the server player limit when connecting. - *

- * Note: The player must already be an operator for this to update their entry in ops.json. - *

- * - * @param bypass true if the player should bypass the player limit - * @return true if the status was successfully updated, false if the player is not an operator - */ - boolean setBypassesPlayerLimit(boolean bypass); - - /** - * Gets the operator permission level for this player (0 through 4). - * - * @return the permission level, or 0 if the player is not an operator or entry is missing - */ - int getOpLevel(); - - /** - * Sets the operator permission level for this player. - *

- * If setting a level greater than 0, the player will be added to ops.json if not present. - * If set to 0, the player's level will be cleared (or removed from ops depending on server logic). - *

- * - * @param level the level to set (must be between 0 and 4) - * @throws IllegalArgumentException if level is outside the 0–4 range - */ - void setOpLevel(int level); }