From 677e7b75642203a1418da9555751cabfe8b4a57b Mon Sep 17 00:00:00 2001 From: mcmonkey Date: Tue, 19 Jun 2018 11:41:08 -0700 Subject: [PATCH] add entity default hide/show options --- ...PlayerCompletesAdvancementScriptEvent.java | 1 - .../aufdemrand/denizen/objects/dEntity.java | 24 ++ .../aufdemrand/denizen/objects/dPlayer.java | 3 + pom.xml | 8 +- .../nms/helpers/EntityHelper_v1_12_R1.java | 205 +++++++++++++++--- 5 files changed, 200 insertions(+), 41 deletions(-) diff --git a/plugin/src/main/java/net/aufdemrand/denizen/events/player/PlayerCompletesAdvancementScriptEvent.java b/plugin/src/main/java/net/aufdemrand/denizen/events/player/PlayerCompletesAdvancementScriptEvent.java index b1253a81eb..8a3e83abf8 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/events/player/PlayerCompletesAdvancementScriptEvent.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/events/player/PlayerCompletesAdvancementScriptEvent.java @@ -16,7 +16,6 @@ public class PlayerCompletesAdvancementScriptEvent extends BukkitScriptEvent implements Listener { - // TODO: Advancement scripts // <--[event] // @Events // player completes advancement diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/dEntity.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/dEntity.java index 285b38ce90..fa5fbab56f 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/objects/dEntity.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/dEntity.java @@ -3518,6 +3518,30 @@ && getBukkitEntity() instanceof Sheep) { } } + // END AREA EFFECT CLOUD BLOCK + + // <--[mechanism] + // @object dEntity + // @name show_to_players + // @input None + // @description + // Marks the entity as visible to players by default (if it was hidden). + // --> + if (mechanism.matches("show_to_players")) { + NMSHandler.getInstance().getEntityHelper().unhideEntity(null, getBukkitEntity()); + } + + // <--[mechanism] + // @object dEntity + // @name hide_from_players + // @input None + // @description + // Hides the entity from players by default. + // --> + if (mechanism.matches("hide_from_players")) { + NMSHandler.getInstance().getEntityHelper().hideEntity(null, getBukkitEntity(), false); + } + // Iterate through this object's properties' mechanisms for (Property property : PropertyParser.getProperties(this)) { property.adjust(mechanism); diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java index 0b4cde30f1..29705fab2e 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/dPlayer.java @@ -2655,6 +2655,9 @@ else if (split.length > 1 && new Element(split[1]).isBoolean()) { dB.echoError("'" + split[0] + "' is not a valid entity!"); } } + else { + dB.echoError("Must specify an entity to hide!"); + } } // <--[mechanism] diff --git a/pom.xml b/pom.xml index b5e281c781..ea36a79ca5 100644 --- a/pom.xml +++ b/pom.xml @@ -28,14 +28,14 @@ - - vault-repo - http://nexus.hc.to/content/repositories/pub_releases/ - everything http://repo.citizensnpcs.co + + vault-repo + http://nexus.hc.to/content/repositories/pub_releases/ + diff --git a/v1_12_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/EntityHelper_v1_12_R1.java b/v1_12_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/EntityHelper_v1_12_R1.java index ce45b366ab..bddaa46651 100644 --- a/v1_12_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/EntityHelper_v1_12_R1.java +++ b/v1_12_R1/src/main/java/net/aufdemrand/denizen/nms/helpers/EntityHelper_v1_12_R1.java @@ -7,6 +7,7 @@ import net.aufdemrand.denizen.nms.util.Utilities; import net.aufdemrand.denizen.nms.util.jnbt.CompoundTag; import net.minecraft.server.v1_12_R1.*; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.BlockFace; @@ -18,8 +19,13 @@ import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; import org.bukkit.entity.*; import org.bukkit.entity.Entity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; @@ -299,54 +305,153 @@ public void run() { Hide Entity */ - public static Map> hiddenEntities = new HashMap>(); + public static class EnforcePlayerHides implements Listener { - @Override - public void hideEntity(Player player, Entity entity, boolean keepInTabList) { // TODO: remove or reimplement tablist option somehow? - // Use Bukkit API for Player entities + public Plugin denizenPlugin; + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + for (UUID id : hiddenByDefaultPlayers) { + Entity pTarget = Bukkit.getEntity(id); + if (pTarget != null && pTarget instanceof Player) { + event.getPlayer().hidePlayer((Player) pTarget); + } + } + final Player pl = event.getPlayer(); + final Set hides = hiddenEntitiesPlEnt.get(pl.getUniqueId()); + if (hides == null || hides.isEmpty()) { + return; + } + new BukkitRunnable() { + @Override + public void run() { + if (pl.isOnline()) { + for (UUID id : hides) { + Entity ent = Bukkit.getEntity(id); + if (ent != null) { + sendHidePacket(pl, ent); + } + } + } + } + }.runTaskLater(denizenPlugin, 5); + } + } + + public static Map> hiddenEntitiesEntPl = new HashMap>(); + + public static Map> hiddenEntitiesPlEnt = new HashMap>(); + + public static EnforcePlayerHides EPH = null; + + public static Set hiddenByDefaultPlayers = new HashSet(); + + public static void ensurePlayerHiding() { + if (EPH == null) { + Plugin pl = Bukkit.getPluginManager().getPlugin("Denizen"); // Very lazy way to get the correct plugin instance + EPH = new EnforcePlayerHides(); + EPH.denizenPlugin = pl; + Bukkit.getPluginManager().registerEvents(EPH, pl); + } + } + + public boolean addHide(UUID player, UUID entity) { + Set hidden = hiddenEntitiesEntPl.get(entity); + if (hidden == null) { + hidden = new HashSet(); + hiddenEntitiesEntPl.put(entity, hidden); + } + if (player.equals(DEFAULT_HIDE)) { + for (UUID pl : hidden) { + Set plHid = hiddenEntitiesPlEnt.get(pl); + if (plHid != null) { + plHid.remove(entity); + } + } + hidden.clear(); + } + else { + Set plHid = hiddenEntitiesPlEnt.get(player); + if (plHid == null) { + plHid = new HashSet(); + hiddenEntitiesPlEnt.put(player, plHid); + } + plHid.add(entity); + } + return hidden.add(player); + } + + public static void sendHidePacket(Player pl, Entity entity) { if (entity instanceof Player) { - player.hidePlayer((Player) entity); + ensurePlayerHiding(); + pl.hidePlayer((Player) entity); return; } - CraftPlayer craftPlayer = (CraftPlayer) player; + CraftPlayer craftPlayer = (CraftPlayer) pl; EntityPlayer entityPlayer = craftPlayer.getHandle(); - UUID playerUUID = player.getUniqueId(); if (entityPlayer.playerConnection != null && !craftPlayer.equals(entity)) { - if (!hiddenEntities.containsKey(playerUUID)) { - hiddenEntities.put(playerUUID, new HashSet()); + EntityTracker tracker = ((WorldServer) craftPlayer.getHandle().world).tracker; + net.minecraft.server.v1_12_R1.Entity other = ((CraftEntity) entity).getHandle(); + EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId()); + if (entry != null) { + entry.clear(entityPlayer); } - Set hidden = hiddenEntities.get(playerUUID); - UUID entityUUID = entity.getUniqueId(); - if (!hidden.contains(entityUUID)) { - hidden.add(entityUUID); - EntityTracker tracker = ((WorldServer) craftPlayer.getHandle().world).tracker; - net.minecraft.server.v1_12_R1.Entity other = ((CraftEntity) entity).getHandle(); - EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId()); - if (entry != null) { - entry.clear(entityPlayer); + } + } + + @Override + public void hideEntity(Player player, Entity entity, boolean keepInTabList) { // TODO: remove or reimplement tablist option somehow? + if (player == null) { + addHide(DEFAULT_HIDE, entity.getUniqueId()); + if (entity instanceof Player) { + hiddenByDefaultPlayers.add(entity.getUniqueId()); + } + for (Player pl : Bukkit.getOnlinePlayers()) { + sendHidePacket(pl, entity); + } + return; + } + if (isHiddenByDefault(entity)) { + removeHide(player.getUniqueId(), entity.getUniqueId()); + } + else { + addHide(player.getUniqueId(), entity.getUniqueId()); + } + sendHidePacket(player, entity); + } + + public static boolean removeHide(UUID player, UUID entity) { + Set hidden = hiddenEntitiesEntPl.get(entity); + if (hidden == null) { + return false; + } + boolean toRet = hidden.remove(player); + if (player.equals(DEFAULT_HIDE)) { + for (UUID pl : hidden) { + Set plHid = hiddenEntitiesPlEnt.get(pl); + if (plHid != null) { + plHid.remove(entity); } } + hidden.clear(); } + else { + Set plHid = hiddenEntitiesPlEnt.get(player); + if (plHid != null) { + plHid.remove(entity); + } + } + return toRet; } - @Override - public void unhideEntity(Player player, Entity entity) { - // Use Bukkit API for Player entities + public void sendShowPacket(Player pl, Entity entity) { if (entity instanceof Player) { - player.showPlayer((Player) entity); + pl.showPlayer((Player) entity); return; } - CraftPlayer craftPlayer = (CraftPlayer) player; + CraftPlayer craftPlayer = (CraftPlayer) pl; EntityPlayer entityPlayer = craftPlayer.getHandle(); - UUID playerUUID = player.getUniqueId(); if (entityPlayer.playerConnection != null && !craftPlayer.equals(entity)) { - UUID entityUUID = entity.getUniqueId(); - if (hiddenEntities.containsKey(playerUUID)) { - Set hidden = hiddenEntities.get(playerUUID); - if (hidden.contains(entityUUID)) { - hidden.remove(entityUUID); - } - } EntityTracker tracker = ((WorldServer) craftPlayer.getHandle().world).tracker; net.minecraft.server.v1_12_R1.Entity other = ((CraftEntity) entity).getHandle(); EntityTrackerEntry entry = tracker.trackedEntities.get(other.getId()); @@ -357,14 +462,42 @@ public void unhideEntity(Player player, Entity entity) { } } + @Override + public void unhideEntity(Player player, Entity entity) { + if (player == null) { + removeHide(DEFAULT_HIDE, entity.getUniqueId()); + if (entity instanceof Player) { + hiddenByDefaultPlayers.remove(entity.getUniqueId()); + } + for (Player pl : Bukkit.getOnlinePlayers()) { + sendShowPacket(pl, entity); + } + return; + } + if (isHiddenByDefault(entity)) { + addHide(player.getUniqueId(), entity.getUniqueId()); + } + else { + removeHide(player.getUniqueId(), entity.getUniqueId()); + } + sendShowPacket(player, entity); + } + + public static UUID DEFAULT_HIDE = new UUID(0, 0); + + public boolean isHiddenByDefault(Entity ent) { // TODO: Backport? + Set hiding = hiddenEntitiesEntPl.get(ent.getUniqueId()); + return hiding != null && hiding.contains(DEFAULT_HIDE); + } + @Override public boolean isHidden(Player player, Entity entity) { - if (entity instanceof Player) { - return !player.canSee((Player) entity); + if (isHiddenByDefault(entity)) { + Set hiding = hiddenEntitiesEntPl.get(entity.getUniqueId()); + return hiding == null || !hiding.contains(player.getUniqueId()); } - UUID uuid = player.getUniqueId(); - Set hiding = hiddenEntities.get(uuid); - return hiding != null && hiding.contains(entity.getUniqueId()); + Set hiding = hiddenEntitiesEntPl.get(entity.getUniqueId()); + return hiding != null && hiding.contains(player.getUniqueId()); } @Override