diff --git a/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitPlayer.java b/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitPlayer.java index 825c85261..f752fa055 100644 --- a/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitPlayer.java +++ b/bukkit/src/main/java/net/pl3x/map/bukkit/BukkitPlayer.java @@ -147,6 +147,11 @@ public boolean isSpectator() { return getPlayer().getGameMode() == GameMode.SPECTATOR; } + @Override + public boolean canBeHidden() { + return getPlayer().hasPermission("pl3xmap.player.can-be-hidden"); + } + @Override public boolean isPersistentlyHidden() { return getPlayer().getPersistentDataContainer().getOrDefault(hiddenKey, PersistentDataType.BYTE, (byte) 0) != 0; diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 462332b7e..2d9c85297 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -97,3 +97,7 @@ permissions: default: op children: pl3xmap.command.map: true + + pl3xmap.player.can-be-hidden: + description: Determines if a player can be hidden on the map + default: true diff --git a/core/src/main/java/net/pl3x/map/core/command/commands/HideCommand.java b/core/src/main/java/net/pl3x/map/core/command/commands/HideCommand.java index a302b3acd..1fba22d0a 100644 --- a/core/src/main/java/net/pl3x/map/core/command/commands/HideCommand.java +++ b/core/src/main/java/net/pl3x/map/core/command/commands/HideCommand.java @@ -62,6 +62,12 @@ private void execute(CommandContext context) { return; } + if (!player.canBeHidden()) { + sender.sendMessage(Lang.PLAYER_CANNOT_BE_HIDDEN_OR_SHOWN, + Placeholder.unparsed("player", player.getName())); + return; + } + if (player.isHidden()) { sender.sendMessage(Lang.COMMAND_HIDE_ALREADY_HIDDEN, Placeholder.unparsed("player", player.getName())); diff --git a/core/src/main/java/net/pl3x/map/core/command/commands/ShowCommand.java b/core/src/main/java/net/pl3x/map/core/command/commands/ShowCommand.java index 9c37c7634..a43a5183d 100644 --- a/core/src/main/java/net/pl3x/map/core/command/commands/ShowCommand.java +++ b/core/src/main/java/net/pl3x/map/core/command/commands/ShowCommand.java @@ -54,22 +54,28 @@ public void register() { private void execute(CommandContext context) { Sender sender = context.sender(); - Player target = getHandler().getPlatformParsers().resolvePlayerFromPlayerSelector("player", context); + Player player = getHandler().getPlatformParsers().resolvePlayerFromPlayerSelector("player", context); - if (target == null) { + if (player == null) { sender.sendMessage(Lang.ERROR_MUST_SPECIFY_PLAYER); return; } - if (!target.isHidden()) { + if (!player.canBeHidden()){ + sender.sendMessage(Lang.PLAYER_CANNOT_BE_HIDDEN_OR_SHOWN, + Placeholder.unparsed("player", player.getName())); + return; + } + + if (!player.isHidden()) { sender.sendMessage(Lang.COMMAND_SHOW_NOT_HIDDEN, - Placeholder.unparsed("player", target.getName())); + Placeholder.unparsed("player", player.getName())); return; } - target.setHidden(false, true); + player.setHidden(false, true); sender.sendMessage(Lang.COMMAND_SHOW_SUCCESS, - Placeholder.unparsed("player", target.getName())); + Placeholder.unparsed("player", player.getName())); } } diff --git a/core/src/main/java/net/pl3x/map/core/configuration/Lang.java b/core/src/main/java/net/pl3x/map/core/configuration/Lang.java index 58e8b8f78..e34c20a25 100644 --- a/core/src/main/java/net/pl3x/map/core/configuration/Lang.java +++ b/core/src/main/java/net/pl3x/map/core/configuration/Lang.java @@ -95,6 +95,9 @@ public final class Lang extends AbstractConfig { @Key("command.hide.success") public static String COMMAND_HIDE_SUCCESS = " is now hidden from the map"; + // TODO: what should the key be? + public static String PLAYER_CANNOT_BE_HIDDEN_OR_SHOWN = " cannot be hidden or shown from the map."; + @Key("command.pause.description") public static String COMMAND_PAUSE_DESCRIPTION = "Pause renderers"; @Key("command.pause.paused") diff --git a/core/src/main/java/net/pl3x/map/core/markers/layer/PlayersLayer.java b/core/src/main/java/net/pl3x/map/core/markers/layer/PlayersLayer.java index 5da43f935..09e55b043 100644 --- a/core/src/main/java/net/pl3x/map/core/markers/layer/PlayersLayer.java +++ b/core/src/main/java/net/pl3x/map/core/markers/layer/PlayersLayer.java @@ -95,7 +95,7 @@ public PlayersLayer(String key, World world, Supplier labelSupplier) { public Collection> getMarkers() { Set> icons = new HashSet<>(); getWorld().getPlayers().forEach(player -> { - if (player.isHidden()) { + if (player.canBeHidden() && player.isHidden()) { return; } if (player.isNPC()) { diff --git a/core/src/main/java/net/pl3x/map/core/player/Player.java b/core/src/main/java/net/pl3x/map/core/player/Player.java index a7aeb77ce..b557f95e2 100644 --- a/core/src/main/java/net/pl3x/map/core/player/Player.java +++ b/core/src/main/java/net/pl3x/map/core/player/Player.java @@ -139,6 +139,13 @@ public void setPlayer(Object player) { */ public abstract boolean isSpectator(); + /** + * Get whether player is allowed to hide from the map. + * + * @return true if player can be hidden + */ + public abstract boolean canBeHidden(); + /** * Get whether player is hidden from the map. * diff --git a/fabric/src/main/java/net/pl3x/map/fabric/server/FabricPlayer.java b/fabric/src/main/java/net/pl3x/map/fabric/server/FabricPlayer.java index 8c94fd377..10043adbb 100644 --- a/fabric/src/main/java/net/pl3x/map/fabric/server/FabricPlayer.java +++ b/fabric/src/main/java/net/pl3x/map/fabric/server/FabricPlayer.java @@ -141,6 +141,11 @@ public boolean isSpectator() { return getPlayer().isSpectator(); } + @Override + public boolean canBeHidden() { + return true; // TODO: make this customizable on fabric.. maybe directly integrate with LuckPerms? + } + @Override public boolean isPersistentlyHidden() { return ((AccessServerPlayer) getPlayer()).pl3xMap$isHidden();