From c3bd6274adbef31e2c5ca22bdad00938fa2e7008 Mon Sep 17 00:00:00 2001 From: xGabou <99047760+xGabou@users.noreply.github.com> Date: Fri, 1 Aug 2025 09:46:50 -0400 Subject: [PATCH] feat: allow restricting identity swaps to specific players --- .../draylar/identity/api/platform/IdentityConfig.java | 6 ++++++ .../identity/impl/tick/MenuKeyPressHandler.java | 5 ++++- .../draylar/identity/network/impl/SwapPackets.java | 10 ++++++++-- .../identity/fabric/config/IdentityFabricConfig.java | 8 ++++++++ .../identity/forge/config/IdentityForgeConfig.java | 6 ++++++ 5 files changed, 32 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/draylar/identity/api/platform/IdentityConfig.java b/common/src/main/java/draylar/identity/api/platform/IdentityConfig.java index 343d044..a192e91 100644 --- a/common/src/main/java/draylar/identity/api/platform/IdentityConfig.java +++ b/common/src/main/java/draylar/identity/api/platform/IdentityConfig.java @@ -76,6 +76,12 @@ public static IdentityConfig getInstance() { public abstract boolean enableSwaps(); + /** + * Players listed here may swap identities even when {@link #enableSwaps()} is false. + * Names are compared case-insensitively. + */ + public abstract List allowedSwappers(); + public abstract int hostilityTime(); public abstract boolean wardenIsBlinded(); diff --git a/common/src/main/java/draylar/identity/impl/tick/MenuKeyPressHandler.java b/common/src/main/java/draylar/identity/impl/tick/MenuKeyPressHandler.java index feab6ad..98a80ee 100644 --- a/common/src/main/java/draylar/identity/impl/tick/MenuKeyPressHandler.java +++ b/common/src/main/java/draylar/identity/impl/tick/MenuKeyPressHandler.java @@ -13,7 +13,10 @@ public void tick(MinecraftClient client) { assert client.player != null; if(IdentityClient.MENU_KEY.wasPressed()) { - if(IdentityConfig.getInstance().enableClientSwapMenu() || client.player.hasPermissionLevel(3)) { + if(IdentityConfig.getInstance().enableClientSwapMenu() || + client.player.hasPermissionLevel(3) || + IdentityConfig.getInstance().allowedSwappers().stream() + .anyMatch(p -> p.equalsIgnoreCase(client.player.getGameProfile().getName()))) { MinecraftClient.getInstance().setScreen(new IdentityScreen()); } } diff --git a/common/src/main/java/draylar/identity/network/impl/SwapPackets.java b/common/src/main/java/draylar/identity/network/impl/SwapPackets.java index 6630dc4..313e2a8 100644 --- a/common/src/main/java/draylar/identity/network/impl/SwapPackets.java +++ b/common/src/main/java/draylar/identity/network/impl/SwapPackets.java @@ -25,7 +25,10 @@ public static void registerIdentityRequestPacketHandler() { context.getPlayer().getServer().execute(() -> { // Ensure player has permission to switch identities - if(IdentityConfig.getInstance().enableSwaps() || context.getPlayer().hasPermissionLevel(3)) { + if(IdentityConfig.getInstance().enableSwaps() || + context.getPlayer().hasPermissionLevel(3) || + IdentityConfig.getInstance().allowedSwappers().stream() + .anyMatch(p -> p.equalsIgnoreCase(context.getPlayer().getGameProfile().getName()))) { // player type shouldn't be sent, but we still check regardless if(entityType.equals(EntityType.PLAYER)) { PlayerIdentity.updateIdentity((ServerPlayerEntity) context.getPlayer(), null, null); @@ -43,7 +46,10 @@ public static void registerIdentityRequestPacketHandler() { } else { // Swap back to player if server allows it context.getPlayer().getServer().execute(() -> { - if(IdentityConfig.getInstance().enableSwaps() || context.getPlayer().hasPermissionLevel(3)) { + if(IdentityConfig.getInstance().enableSwaps() || + context.getPlayer().hasPermissionLevel(3) || + IdentityConfig.getInstance().allowedSwappers().stream() + .anyMatch(p -> p.equalsIgnoreCase(context.getPlayer().getGameProfile().getName()))) { PlayerIdentity.updateIdentity((ServerPlayerEntity) context.getPlayer(), null, null); } diff --git a/fabric/src/main/java/draylar/identity/fabric/config/IdentityFabricConfig.java b/fabric/src/main/java/draylar/identity/fabric/config/IdentityFabricConfig.java index 9c9fb6a..9947f1f 100644 --- a/fabric/src/main/java/draylar/identity/fabric/config/IdentityFabricConfig.java +++ b/fabric/src/main/java/draylar/identity/fabric/config/IdentityFabricConfig.java @@ -78,6 +78,9 @@ public class IdentityFabricConfig extends IdentityConfig implements Config { @Comment(value = "If set to false, only operators can switch identities. Used on the server; guaranteed to be authoritative.") public boolean enableSwaps = true; + @Comment(value = "List of player names allowed to swap identities when swaps are disabled.") + public List allowedSwappers = new ArrayList<>(); + @Comment(value = "In blocks, how far can the Enderman ability teleport?") public int endermanAbilityTeleportDistance = 32; @@ -338,6 +341,11 @@ public boolean enableSwaps() { return enableSwaps; } + @Override + public List allowedSwappers() { + return allowedSwappers; + } + @Override public int hostilityTime() { return hostilityTime; diff --git a/forge/src/main/java/draylar/identity/forge/config/IdentityForgeConfig.java b/forge/src/main/java/draylar/identity/forge/config/IdentityForgeConfig.java index d8ce091..c3a3edf 100644 --- a/forge/src/main/java/draylar/identity/forge/config/IdentityForgeConfig.java +++ b/forge/src/main/java/draylar/identity/forge/config/IdentityForgeConfig.java @@ -44,6 +44,7 @@ public class IdentityForgeConfig extends IdentityConfig { public int maxHealth = 20; public boolean enableClientSwapMenu = true; public boolean enableSwaps = true; + public List allowedSwappers = new ArrayList<>(); public int endermanAbilityTeleportDistance = 32; public boolean showPlayerNametag = false; public boolean forceChangeNew = false; @@ -279,6 +280,11 @@ public boolean enableSwaps() { return enableSwaps; } + @Override + public List allowedSwappers() { + return allowedSwappers; + } + @Override public int hostilityTime() { return hostilityTime;