diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java index e28f962b56..b943ac4ace 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/PlayerTag.java @@ -2943,7 +2943,7 @@ public void adjust(Mechanism mechanism) { // Note that dynamic matchables like 'entity_flagged' will behave in unexpected ways when dynamically changing. // --> if (mechanism.matches("hide_entities") && mechanism.hasValue()) { - HideEntitiesHelper.PlayerHideMap map = HideEntitiesHelper.playerHides.computeIfAbsent(getUUID(), (k) -> new HideEntitiesHelper.PlayerHideMap()); + HideEntitiesHelper.PlayerHideMap map = HideEntitiesHelper.getPlayerMapFor(getUUID()); String hideMe = mechanism.getValue().asString(); map.matchersHidden.add(hideMe); if (isOnline()) { @@ -2963,7 +2963,7 @@ public void adjust(Mechanism mechanism) { // Removes any entity hides added by <@link mechanism PlayerTag.hide_entities>. Input must exactly match the input given to the hide mechanism. // --> if (mechanism.matches("unhide_entities") && mechanism.hasValue()) { - HideEntitiesHelper.PlayerHideMap map = HideEntitiesHelper.playerHides.computeIfAbsent(getUUID(), (k) -> new HideEntitiesHelper.PlayerHideMap()); + HideEntitiesHelper.PlayerHideMap map = HideEntitiesHelper.getPlayerMapFor(getUUID()); String unhideMe = mechanism.getValue().asString(); map.matchersHidden.remove(unhideMe); if (map.matchersHidden.isEmpty() && map.entitiesHidden.isEmpty() && map.overridinglyShow.isEmpty()) { @@ -2972,7 +2972,7 @@ public void adjust(Mechanism mechanism) { if (isOnline()) { for (Entity ent : getPlayerEntity().getWorld().getEntities()) { if (BukkitScriptEvent.tryEntity(new EntityTag(ent), unhideMe) && !map.shouldHide(ent)) { - NMSHandler.getEntityHelper().sendHidePacket(getPlayerEntity(), ent); + NMSHandler.getEntityHelper().sendShowPacket(getPlayerEntity(), ent); } } } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/HideEntitiesHelper.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/HideEntitiesHelper.java index 29268026e3..f2a816b240 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/HideEntitiesHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/entity/HideEntitiesHelper.java @@ -18,6 +18,8 @@ public class HideEntitiesHelper { public static class PlayerHideMap { + public UUID player; + public HashSet entitiesHidden = new HashSet<>(); public HashSet overridinglyShow = new HashSet<>(); @@ -35,6 +37,12 @@ public boolean shouldHideViaMatcher(Entity entity) { EntityTag entityTag = new EntityTag(entity); for (String matchable : matchersHidden) { if (BukkitScriptEvent.tryEntity(entityTag, matchable)) { + if (entity instanceof Player) { + Player thisPlayer = Bukkit.getPlayer(player); + if (thisPlayer != null && thisPlayer.canSee((Player) entity)) { + thisPlayer.hidePlayer(Denizen.getInstance(), (Player) entity); + } + } return true; } } @@ -67,6 +75,16 @@ public static boolean hasAnyHides() { return !playerHides.isEmpty() || !defaultHidden.isEmpty(); } + public static PlayerHideMap getPlayerMapFor(UUID player) { + PlayerHideMap map = playerHides.get(player); + if (map == null) { + map = new PlayerHideMap(); + map.player = player; + playerHides.put(player, map); + } + return map; + } + public static boolean playerShouldHide(UUID player, Entity ent) { PlayerHideMap map = playerHides.get(player); if (map == null) { @@ -80,7 +98,7 @@ public static boolean addHide(UUID player, UUID entity) { if (player == null) { return defaultHidden.add(entity); } - PlayerHideMap map = playerHides.computeIfAbsent(player, k -> new PlayerHideMap()); + PlayerHideMap map = getPlayerMapFor(player); map.overridinglyShow.remove(entity); return map.entitiesHidden.add(entity); } @@ -106,6 +124,7 @@ public static boolean removeHide(UUID player, UUID entity) { if (defaultHidden.contains(entity) || (map != null && map.shouldHideViaMatcher(Bukkit.getEntity(entity)))) { if (map == null) { map = new PlayerHideMap(); + map.player = player; playerHides.put(player, map); } map.entitiesHidden.remove(entity);