Files
PlazmaBukkitMC/patches/server/0062-Add-option-to-set-player-can-bypass-limit.patch
2024-12-25 19:12:48 +09:00

126 lines
7.3 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: AlphaKR93 <dev@alpha93.kr>
Date: Wed, 25 Dec 2024 15:08:03 +0900
Subject: [PATCH] Add option to set player can bypass limit
diff --git a/src/main/java/net/minecraft/server/commands/OpCommand.java b/src/main/java/net/minecraft/server/commands/OpCommand.java
index e7b444a10b244828827b3c66c53465206ea8e0ec..af455e7f1c22fda87dbc5b487b757d046dcc2d49 100644
--- a/src/main/java/net/minecraft/server/commands/OpCommand.java
+++ b/src/main/java/net/minecraft/server/commands/OpCommand.java
@@ -34,20 +34,41 @@ public class OpCommand {
}
)
.executes(context -> opPlayers(context.getSource(), GameProfileArgument.getGameProfiles(context, "targets")))
+ // Plazma start - Add an option to set player can bypass limit
+ .then(
+ Commands.argument("permissionLevel", com.mojang.brigadier.arguments.IntegerArgumentType.integer(0, 4))
+ .executes(context ->
+ opPlayers(context.getSource(), GameProfileArgument.getGameProfiles(context, "targets"), com.mojang.brigadier.arguments.IntegerArgumentType.getInteger(context, "permissionLevel"), false)
+ )
+ .then(
+ Commands.argument("bypassPlayerLimit", com.mojang.brigadier.arguments.BoolArgumentType.bool())
+ .executes(context ->
+ opPlayers(context.getSource(), GameProfileArgument.getGameProfiles(context, "targets"), com.mojang.brigadier.arguments.IntegerArgumentType.getInteger(context, "permissionLevel"), com.mojang.brigadier.arguments.BoolArgumentType.getBool(context, "bypassPlayerLimit"))
+ )
+ )
+ )
+ // Plazma end - Add an option to set player can bypass limit
)
);
}
-
private static int opPlayers(CommandSourceStack source, Collection<GameProfile> targets) throws CommandSyntaxException {
+ // Plazma start - Add an option to set player can bypass limit
+ return opPlayers(source, targets, source.getServer().getOperatorUserPermissionLevel(), false);
+ }
+
+ private static int opPlayers(final CommandSourceStack source, final Collection<GameProfile> targets, final int permissionLevel, final boolean bypassPlayerLimit) throws CommandSyntaxException {
+ // Plazma end - Add an option to set player can bypass limit
PlayerList playerList = source.getServer().getPlayerList();
int i = 0;
for (GameProfile gameProfile : targets) {
- if (!playerList.isOp(gameProfile)) {
- playerList.op(gameProfile);
- i++;
- source.sendSuccess(() -> Component.translatable("commands.op.success", gameProfile.getName()), true); // Paper - fixes MC-253721
- }
+ // Plazma start - Add an option to set player can bypass limit
+ if (playerList.isOp(gameProfile) && playerList.canBypassPlayerLimit(gameProfile) == bypassPlayerLimit && playerList.getPermissionLevel(gameProfile) == permissionLevel) continue;
+
+ playerList.op(gameProfile, permissionLevel, bypassPlayerLimit);
+ source.sendSuccess(() -> Component.translatable("commands.op.success", gameProfile.getName()), true); // Paper - fixes MC-253721
+ i++;
+ // Plazma end - Add an option to set player can bypass limit
}
if (i == 0) {
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedPlayerList.java b/src/main/java/net/minecraft/server/dedicated/DedicatedPlayerList.java
index 20c531f11b310dab0a867e589c769393ed835df5..7d9358f3e287d1f05d799b1c8f59509e6ede8581 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedPlayerList.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedPlayerList.java
@@ -122,4 +122,11 @@ public class DedicatedPlayerList extends PlayerList {
public boolean canBypassPlayerLimit(GameProfile profile) {
return this.getOps().canBypassPlayerLimit(profile);
}
+
+ // Plazma start - Add an option to set player can bypass limit
+ @Override
+ public int getPermissionLevel(GameProfile profile) {
+ return this.getOps().getLevel(profile);
+ }
+ // Plazma end - Add an option to set player can bypass limit
}
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
index 8ab6df63d9a22ac76b2ba14bc8fef318e65484c8..81bae0453e09454c43d547c48de2f201a5e41023 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -1085,8 +1085,14 @@ public abstract class PlayerList {
return this.ipBans;
}
+ // Plazma start - Add an option to set player can bypass limit
public void op(GameProfile profile) {
- this.ops.add(new ServerOpListEntry(profile, this.server.getOperatorUserPermissionLevel(), this.ops.canBypassPlayerLimit(profile)));
+ this.op(profile, this.server.getOperatorUserPermissionLevel(), this.ops.canBypassPlayerLimit(profile));
+ }
+
+ public void op(final GameProfile profile, final int permissionLevel, final boolean bypassPlayerLimit) {
+ // Plazma end - Add an option to set player can bypass limit
+ this.ops.add(new ServerOpListEntry(profile, permissionLevel, bypassPlayerLimit));
ServerPlayer entityplayer = this.getPlayer(profile.getId());
if (entityplayer != null) {
@@ -1530,6 +1536,12 @@ public abstract class PlayerList {
return false;
}
+ // Plazma start - Add an option to set player can bypass limit
+ public int getPermissionLevel(GameProfile profile) {
+ return 0;
+ }
+ // Plazma end - Add an option to set player can bypass limit
+
public void reloadResources() {
// Paper start - API for updating recipes on clients
this.reloadAdvancementData();
diff --git a/src/main/java/net/minecraft/server/players/ServerOpList.java b/src/main/java/net/minecraft/server/players/ServerOpList.java
index a1c9686043b5a8c5cb1614b46e10484000c920ae..c2f597375003065434f1559959783a5b7de838f1 100644
--- a/src/main/java/net/minecraft/server/players/ServerOpList.java
+++ b/src/main/java/net/minecraft/server/players/ServerOpList.java
@@ -20,6 +20,13 @@ public class ServerOpList extends StoredUserList<GameProfile, ServerOpListEntry>
return this.getEntries().stream().map(StoredUserEntry::getUser).filter(Objects::nonNull).map(GameProfile::getName).toArray(String[]::new);
}
+ // Plazma start - Add an option to set player can bypass limit
+ public int getLevel(GameProfile profile) {
+ ServerOpListEntry serverOpListEntry = this.get(profile);
+ return serverOpListEntry != null ? serverOpListEntry.getLevel() : 0;
+ }
+ // Plazma end - Add an option to set player can bypass limit
+
public boolean canBypassPlayerLimit(GameProfile profile) {
ServerOpListEntry serverOpListEntry = this.get(profile);
return serverOpListEntry != null && serverOpListEntry.getBypassesPlayerLimit();