diff --git a/build.gradle.kts b/build.gradle.kts index c0ba2460..4c95ddf5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -244,6 +244,15 @@ bukkit { register("hmccosmetics.unapplydeath.bypass") { default = BukkitPluginDescription.Permission.Default.OP } + register("hmccosmetics.cmd.disableall") { + default = BukkitPluginDescription.Permission.Default.OP + } + register("hmccosmetics.cmd.hiddenreasons") { + default = BukkitPluginDescription.Permission.Default.OP + } + register("hmccosmetics.cmd.clearhiddenreasons") { + default = BukkitPluginDescription.Permission.Default.OP + } } } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/command/CosmeticCommand.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/command/CosmeticCommand.java index 8de84420..bafdf9dc 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/command/CosmeticCommand.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/command/CosmeticCommand.java @@ -427,7 +427,7 @@ public class CosmeticCommand implements CommandExecutor { CosmeticUser user = CosmeticUsers.getUser(player); if (!silent) MessagesUtil.sendMessage(sender, "show-cosmetic"); - user.showCosmetics(); + user.showCosmetics(CosmeticUser.HiddenReason.COMMAND); return true; } case ("debug") -> { @@ -496,6 +496,63 @@ public class CosmeticCommand implements CommandExecutor { user.getUserEmoteManager().playEmote(args[1]); return true; } + + case "disableall" -> { + if (!sender.hasPermission("hmccosmetics.cmd.disableall")) { + if (!silent) MessagesUtil.sendMessage(sender, "no-permission"); + return true; + } + if (args.length == 1) { + if (!silent) MessagesUtil.sendMessage(player, "not-enough-args"); + return true; + } + if (args[1].equalsIgnoreCase("true")) { + Settings.setAllPlayersHidden(true); + for (CosmeticUser user : CosmeticUsers.values()) user.hideCosmetics(CosmeticUser.HiddenReason.DISABLED); + if (!silent) MessagesUtil.sendMessage(sender, "disabled-all"); + } else if (args[1].equalsIgnoreCase("false")) { + Settings.setAllPlayersHidden(false); + for (CosmeticUser user : CosmeticUsers.values()) user.showCosmetics(CosmeticUser.HiddenReason.DISABLED); + if (!silent) MessagesUtil.sendMessage(sender, "enabled-all"); + } else { + if (!silent) MessagesUtil.sendMessage(sender, "invalid-args"); + } + return true; + } + + case "hiddenreasons" -> { + if (!sender.hasPermission("hmccosmetics.cmd.hiddenreasons")) { + if (!silent) MessagesUtil.sendMessage(sender, "no-permission"); + return true; + } + if (args.length >= 2) { + player = Bukkit.getPlayer(args[1]); + } + if (player == null) { + if (!silent) MessagesUtil.sendMessage(sender, "invalid-player"); + return true; + } + CosmeticUser user = CosmeticUsers.getUser(player); + sender.sendMessage(user.getHiddenReasons().toString()); + return true; + } + + case "clearhiddenreasons" -> { + if (!sender.hasPermission("hmccosmetics.cmd.clearhiddenreasons")) { + if (!silent) MessagesUtil.sendMessage(sender, "no-permission"); + return true; + } + if (args.length >= 2) { + player = Bukkit.getPlayer(args[1]); + } + if (player == null) { + if (!silent) MessagesUtil.sendMessage(sender, "invalid-player"); + return true; + } + CosmeticUser user = CosmeticUsers.getUser(player); + user.clearHiddenReasons(); + return true; + } } return true; } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/command/CosmeticCommandTabComplete.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/command/CosmeticCommandTabComplete.java index 0af5468e..4db93362 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/command/CosmeticCommandTabComplete.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/command/CosmeticCommandTabComplete.java @@ -46,6 +46,9 @@ public class CosmeticCommandTabComplete implements TabCompleter { if (hasPermission(sender, "hmccosmetics.cmd.debug")) completions.add("debug"); if (hasPermission(sender, "hmccosmetics.cmd.emote")) completions.add("emote"); if (hasPermission(sender, "hmccosmetics.cmd.playemote")) completions.add("playemote"); + if (hasPermission(sender, "hmccosmetics.cmd.disableall")) completions.add("disableall"); + if (hasPermission(sender, "hmccosmetics.cmd.hiddenreasons")) completions.add("hiddenreasons"); + if (hasPermission(sender, "hmccosmetics.cmd.clearhiddenreasons")) completions.add("clearhiddenreasons"); StringUtil.copyPartialMatches(args[0], completions, finalCompletions); } @@ -71,11 +74,15 @@ public class CosmeticCommandTabComplete implements TabCompleter { if (menu.canOpen(user.getPlayer())) completions.add(menu.getId()); } } - case "dataclear", "hide", "show", "emote" -> { + case "dataclear", "hide", "show", "emote", "hiddenreasons", "clearhiddenreasons" -> { for (Player player : Bukkit.getOnlinePlayers()) { completions.add(player.getName()); } } + case "disableall" -> { + completions.add("true"); + completions.add("false"); + } case "wardrobe" -> { for (Wardrobe wardrobe : WardrobeSettings.getWardrobes()) { if (wardrobe.hasPermission()) { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java index fb34d1dc..e2ec6a8e 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java @@ -3,6 +3,7 @@ package com.hibiscusmc.hmccosmetics.config; import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.util.MessagesUtil; import lombok.Getter; +import lombok.Setter; import me.lojosho.shaded.configurate.ConfigurationNode; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.util.Vector; @@ -159,6 +160,8 @@ public class Settings { private static boolean emoteCameraEnabled; @Getter private static boolean emoteMoveCheck; + @Getter @Setter + private static boolean allPlayersHidden; public static void load(ConfigurationNode source) { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/database/types/Data.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/database/types/Data.java index 4d76fad1..69c309bd 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/database/types/Data.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/database/types/Data.java @@ -13,9 +13,7 @@ import org.bukkit.Color; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; public abstract class Data { @@ -33,8 +31,8 @@ public abstract class Data { public final String serializeData(@NotNull CosmeticUser user) { StringBuilder data = new StringBuilder(); if (user.isHidden()) { - if (shouldHiddenSave(user.getHiddenReason())) { - data.append("HIDDEN=").append(user.getHiddenReason()); + for (CosmeticUser.HiddenReason reason : user.getHiddenReasons()) { + if (shouldHiddenSave(reason)) data.append("HIDDEN=").append(reason); } } for (Cosmetic cosmetic : user.getCosmetics()) { @@ -59,7 +57,7 @@ public abstract class Data { Map> cosmetics = new HashMap<>(); String[] rawData = raw.split(","); - CosmeticUser.HiddenReason hiddenReason = null; + ArrayList hiddenReason = new ArrayList<>(); for (String a : rawData) { if (a == null || a.isEmpty()) continue; String[] splitData = a.split("="); @@ -69,7 +67,7 @@ public abstract class Data { if (splitData[0].equalsIgnoreCase("HIDDEN")) { if (EnumUtils.isValidEnum(CosmeticUser.HiddenReason.class, splitData[1])) { if (Settings.isForceShowOnJoin()) continue; - hiddenReason = CosmeticUser.HiddenReason.valueOf(splitData[1]); + hiddenReason.add(CosmeticUser.HiddenReason.valueOf(splitData[1])); } continue; } @@ -100,8 +98,8 @@ public abstract class Data { MessagesUtil.sendDebugMessages("Hidden Reason: " + hiddenReason); // if else this, if else that, if else I got to deal with this anymore i'll lose my mind - if (hiddenReason != null) { - user.hideCosmetics(hiddenReason); + if (!hiddenReason.isEmpty()) { + for (CosmeticUser.HiddenReason reason : hiddenReason) user.hideCosmetics(reason); } else { Bukkit.getScheduler().runTask(HMCCosmeticsPlugin.getInstance(), () -> { // Handle gamemode check @@ -110,9 +108,9 @@ public abstract class Data { user.hideCosmetics(CosmeticUser.HiddenReason.GAMEMODE); return; } else { - if (user.getHiddenReason() != null && user.getHiddenReason().equals(CosmeticUser.HiddenReason.GAMEMODE)) { + if (user.isHidden(CosmeticUser.HiddenReason.GAMEMODE)) { MessagesUtil.sendDebugMessages("Join Gamemode Check: Showing Cosmetics"); - user.showCosmetics(); + user.showCosmetics(CosmeticUser.HiddenReason.GAMEMODE); return; } } @@ -121,11 +119,14 @@ public abstract class Data { MessagesUtil.sendDebugMessages("Hiding Cosmetics due to world"); user.hideCosmetics(CosmeticUser.HiddenReason.WORLD); } else { - if (user.getHiddenReason() != null && user.getHiddenReason().equals(CosmeticUser.HiddenReason.WORLD)) { + if (user.isHidden(CosmeticUser.HiddenReason.WORLD)) { MessagesUtil.sendDebugMessages("Join World Check: Showing Cosmetics"); - user.showCosmetics(); + user.showCosmetics(CosmeticUser.HiddenReason.WORLD); } } + if (Settings.isAllPlayersHidden()) { + user.hideCosmetics(CosmeticUser.HiddenReason.DISABLED); + } }); } return cosmetics; @@ -133,7 +134,7 @@ public abstract class Data { private boolean shouldHiddenSave(CosmeticUser.HiddenReason reason) { switch (reason) { - case EMOTE, NONE, GAMEMODE, WORLD -> { + case EMOTE, NONE, GAMEMODE, WORLD, DISABLED -> { return false; } default -> { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/action/actions/ActionCosmeticShow.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/action/actions/ActionCosmeticShow.java index 1e49a6c4..143b856c 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/action/actions/ActionCosmeticShow.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/action/actions/ActionCosmeticShow.java @@ -15,7 +15,7 @@ public class ActionCosmeticShow extends Action { if (!user.isHidden()) return; // Do not hide if it's already off for WG - if (user.getHiddenReason() != CosmeticUser.HiddenReason.ACTION && user.getHiddenReason() != CosmeticUser.HiddenReason.COMMAND) return; - user.showCosmetics(); + if (!user.isHidden(CosmeticUser.HiddenReason.ACTION) && !user.isHidden(CosmeticUser.HiddenReason.COMMAND)) return; + user.showCosmetics(CosmeticUser.HiddenReason.ACTION); } } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/action/actions/ActionCosmeticToggle.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/action/actions/ActionCosmeticToggle.java index da83c797..95544cb2 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/action/actions/ActionCosmeticToggle.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/action/actions/ActionCosmeticToggle.java @@ -13,8 +13,8 @@ public class ActionCosmeticToggle extends Action { @Override public void run(@NotNull CosmeticUser user, String raw) { if (user.isHidden()) { - if (user.getHiddenReason() != CosmeticUser.HiddenReason.ACTION && user.getHiddenReason() != CosmeticUser.HiddenReason.COMMAND) return; - user.showCosmetics(); + if (!user.isHidden(CosmeticUser.HiddenReason.ACTION) && !user.isHidden(CosmeticUser.HiddenReason.COMMAND)) return; + user.showCosmetics(CosmeticUser.HiddenReason.ACTION); return; } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/hooks/worldguard/WGListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/hooks/worldguard/WGListener.java index 0a71f996..75d3aead 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/hooks/worldguard/WGListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/hooks/worldguard/WGListener.java @@ -31,14 +31,14 @@ public class WGListener implements Listener { Location location = event.getPlayer().getLocation(); ApplicableRegionSet set = getRegions(location); if (user.isHidden()) { - if (user.getHiddenReason() == CosmeticUser.HiddenReason.WORLDGUARD && set.getRegions().isEmpty()) { - user.showCosmetics(); + if (set.getRegions().isEmpty()) { + user.showCosmetics(CosmeticUser.HiddenReason.WORLDGUARD); } } for (ProtectedRegion protectedRegion : set.getRegions()) { if (protectedRegion.getFlags().containsKey(WGHook.getCosmeticEnableFlag())) { if (protectedRegion.getFlags().get(WGHook.getCosmeticEnableFlag()).toString().equalsIgnoreCase("ALLOW")) { - if (user.getHiddenReason() == CosmeticUser.HiddenReason.WORLDGUARD) user.showCosmetics(); + user.showCosmetics(CosmeticUser.HiddenReason.WORLDGUARD); return; } user.hideCosmetics(CosmeticUser.HiddenReason.WORLDGUARD); @@ -59,14 +59,14 @@ public class WGListener implements Listener { Location location = event.getTo(); ApplicableRegionSet set = getRegions(location); if (user.isHidden()) { - if (user.getHiddenReason() == CosmeticUser.HiddenReason.WORLDGUARD && set.getRegions().isEmpty()) { - user.showCosmetics(); + if (set.getRegions().isEmpty()) { + user.showCosmetics(CosmeticUser.HiddenReason.WORLDGUARD); } } for (ProtectedRegion protectedRegion : set.getRegions()) { if (protectedRegion.getFlags().containsKey(WGHook.getCosmeticEnableFlag())) { if (protectedRegion.getFlags().get(WGHook.getCosmeticEnableFlag()).toString().equalsIgnoreCase("ALLOW")) { - if (user.getHiddenReason() == CosmeticUser.HiddenReason.WORLDGUARD) user.showCosmetics(); + user.showCosmetics(CosmeticUser.HiddenReason.WORLDGUARD); return; } user.hideCosmetics(CosmeticUser.HiddenReason.WORLDGUARD); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java index 216bc478..1bc471b3 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java @@ -135,9 +135,7 @@ public class PlayerGameListener implements Listener { if (Settings.getDisabledWorlds().contains(user.getEntity().getLocation().getWorld().getName())) { user.hideCosmetics(CosmeticUser.HiddenReason.WORLD); } else { - if (user.getHiddenReason() != null && user.getHiddenReason().equals(CosmeticUser.HiddenReason.WORLD)) { - user.showCosmetics(); - } + user.showCosmetics(CosmeticUser.HiddenReason.WORLD); } if (user.hasCosmeticInSlot(CosmeticSlot.BACKPACK) && user.getUserBackpackManager() != null) { user.respawnBackpack(); @@ -311,7 +309,7 @@ public class PlayerGameListener implements Listener { return; } if (event.getAction().equals(EntityPotionEffectEvent.Action.CLEARED) || event.getAction().equals(EntityPotionEffectEvent.Action.REMOVED)) { - user.showCosmetics(); + user.showCosmetics(CosmeticUser.HiddenReason.POTION); return; } } @@ -358,9 +356,7 @@ public class PlayerGameListener implements Listener { if (Settings.getDisabledGamemodes().contains(event.getNewGameMode().toString())) { user.hideCosmetics(CosmeticUser.HiddenReason.GAMEMODE); } else { - if (user.getHiddenReason() != null && user.getHiddenReason().equals(CosmeticUser.HiddenReason.GAMEMODE)) { - user.showCosmetics(); - } + user.showCosmetics(CosmeticUser.HiddenReason.GAMEMODE); } } @@ -420,7 +416,7 @@ public class PlayerGameListener implements Listener { CosmeticUser user = CosmeticUsers.getUser(event.getPlayer()); if (user == null) return; if (!user.isHidden()) return; - if (user.getHiddenReason().equals(CosmeticUser.HiddenReason.PLUGIN)) user.showCosmetics(); + user.showCosmetics(CosmeticUser.HiddenReason.PLUGIN); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java index f1a7d36e..f7a7467d 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java @@ -54,9 +54,7 @@ public class CosmeticUser { private final UserEmoteManager userEmoteManager; // Cosmetic Settings/Toggles - private boolean hideCosmetics; - @Getter - private HiddenReason hiddenReason; + private final ArrayList hiddenReason = new ArrayList<>(); private final HashMap colors = new HashMap<>(); public CosmeticUser(UUID uuid) { @@ -218,7 +216,7 @@ public class CosmeticUser { public ItemStack getUserCosmeticItem(Cosmetic cosmetic) { ItemStack item = null; - if (hideCosmetics) { + if (!hiddenReason.isEmpty()) { if (cosmetic instanceof CosmeticBackpackType || cosmetic instanceof CosmeticBalloonType) return new ItemStack(Material.AIR); return getPlayer().getInventory().getItem(HMCCInventoryUtils.getEquipmentSlot(cosmetic.getSlot())); } @@ -421,7 +419,7 @@ public class CosmeticUser { if (!hasCosmeticInSlot(CosmeticSlot.BACKPACK)) return; final Cosmetic cosmetic = getCosmetic(CosmeticSlot.BACKPACK); despawnBackpack(); - if (hideCosmetics) return; + if (!hiddenReason.isEmpty()) return; spawnBackpack((CosmeticBackpackType) cosmetic); MessagesUtil.sendDebugMessages("Respawned Backpack for " + getEntity().getName()); } @@ -430,7 +428,7 @@ public class CosmeticUser { if (!hasCosmeticInSlot(CosmeticSlot.BALLOON)) return; final Cosmetic cosmetic = getCosmetic(CosmeticSlot.BALLOON); despawnBalloon(); - if (hideCosmetics) return; + if (!hiddenReason.isEmpty()) return; spawnBalloon((CosmeticBalloonType) cosmetic); MessagesUtil.sendDebugMessages("Respawned Balloon for " + getEntity().getName()); } @@ -508,15 +506,13 @@ public class CosmeticUser { } public void hideCosmetics(HiddenReason reason) { - if (hideCosmetics) return; PlayerCosmeticHideEvent event = new PlayerCosmeticHideEvent(this, reason); Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { return; } - hideCosmetics = true; - hiddenReason = reason; + if (!hiddenReason.contains(reason)) hiddenReason.add(reason); if (hasCosmeticInSlot(CosmeticSlot.BALLOON)) { despawnBalloon(); //getBalloonManager().removePlayerFromModel(getPlayer()); @@ -529,8 +525,8 @@ public class CosmeticUser { MessagesUtil.sendDebugMessages("HideCosmetics"); } - public void showCosmetics() { - if (!hideCosmetics) return; + public void showCosmetics(HiddenReason reason) { + if (hiddenReason.isEmpty()) return; PlayerCosmeticShowEvent event = new PlayerCosmeticShowEvent(this); Bukkit.getPluginManager().callEvent(event); @@ -538,8 +534,8 @@ public class CosmeticUser { return; } - hideCosmetics = false; - hiddenReason = HiddenReason.NONE; + hiddenReason.remove(reason); + if (isHidden()) return; if (hasCosmeticInSlot(CosmeticSlot.BALLOON)) { if (!isBalloonSpawned()) respawnBalloon(); CosmeticBalloonType balloonType = (CosmeticBalloonType) getCosmetic(CosmeticSlot.BALLOON); @@ -564,11 +560,23 @@ public class CosmeticUser { */ @Deprecated(since = "2.7.2-DEV", forRemoval = true) public boolean getHidden() { - return this.hideCosmetics; + return !hiddenReason.isEmpty(); } public boolean isHidden() { - return this.hideCosmetics; + return !hiddenReason.isEmpty(); + } + + public boolean isHidden(HiddenReason reason) { + return hiddenReason.contains(reason); + } + + public List getHiddenReasons() { + return hiddenReason; + } + + public void clearHiddenReasons() { + hiddenReason.clear(); } public enum HiddenReason { @@ -580,6 +588,7 @@ public class CosmeticUser { COMMAND, EMOTE, GAMEMODE, - WORLD + WORLD, + DISABLED } } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEmoteModel.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEmoteModel.java index 3131e566..0451ce53 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEmoteModel.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEmoteModel.java @@ -124,7 +124,7 @@ public class UserEmoteModel extends PlayerModel { if (user.getPlayer() != null) player.setInvisible(false); user.getUserEmoteManager().despawnTextEntity(); user.showPlayer(); - user.showCosmetics(); + user.showCosmetics(CosmeticUser.HiddenReason.EMOTE); }); }