Skip to content

Commit

Permalink
add entity default hide/show options
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Jun 19, 2018
1 parent 969b4e8 commit 677e7b7
Show file tree
Hide file tree
Showing 5 changed files with 200 additions and 41 deletions.
Expand Up @@ -16,7 +16,6 @@

public class PlayerCompletesAdvancementScriptEvent extends BukkitScriptEvent implements Listener {

// TODO: Advancement scripts
// <--[event]
// @Events
// player completes advancement
Expand Down
24 changes: 24 additions & 0 deletions plugin/src/main/java/net/aufdemrand/denizen/objects/dEntity.java
Expand Up @@ -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);
Expand Down
Expand Up @@ -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]
Expand Down
8 changes: 4 additions & 4 deletions pom.xml
Expand Up @@ -28,14 +28,14 @@

<!-- Repositories -->
<repositories>
<repository>
<id>vault-repo</id>
<url>http://nexus.hc.to/content/repositories/pub_releases/</url>
</repository>
<repository>
<id>everything</id>
<url>http://repo.citizensnpcs.co</url>
</repository>
<repository>
<id>vault-repo</id>
<url>http://nexus.hc.to/content/repositories/pub_releases/</url>
</repository>
</repositories>

<ciManagement>
Expand Down
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -299,54 +305,153 @@ public void run() {
Hide Entity
*/

public static Map<UUID, Set<UUID>> hiddenEntities = new HashMap<UUID, Set<UUID>>();
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<UUID> 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<UUID, Set<UUID>> hiddenEntitiesEntPl = new HashMap<UUID, Set<UUID>>();

public static Map<UUID, Set<UUID>> hiddenEntitiesPlEnt = new HashMap<UUID, Set<UUID>>();

public static EnforcePlayerHides EPH = null;

public static Set<UUID> hiddenByDefaultPlayers = new HashSet<UUID>();

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<UUID> hidden = hiddenEntitiesEntPl.get(entity);
if (hidden == null) {
hidden = new HashSet<UUID>();
hiddenEntitiesEntPl.put(entity, hidden);
}
if (player.equals(DEFAULT_HIDE)) {
for (UUID pl : hidden) {
Set<UUID> plHid = hiddenEntitiesPlEnt.get(pl);
if (plHid != null) {
plHid.remove(entity);
}
}
hidden.clear();
}
else {
Set<UUID> plHid = hiddenEntitiesPlEnt.get(player);
if (plHid == null) {
plHid = new HashSet<UUID>();
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<UUID>());
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<UUID> hidden = hiddenEntitiesEntPl.get(entity);
if (hidden == null) {
return false;
}
boolean toRet = hidden.remove(player);
if (player.equals(DEFAULT_HIDE)) {
for (UUID pl : hidden) {
Set<UUID> plHid = hiddenEntitiesPlEnt.get(pl);
if (plHid != null) {
plHid.remove(entity);
}
}
hidden.clear();
}
else {
Set<UUID> 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());
Expand All @@ -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<UUID> 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<UUID> hiding = hiddenEntitiesEntPl.get(entity.getUniqueId());
return hiding == null || !hiding.contains(player.getUniqueId());
}
UUID uuid = player.getUniqueId();
Set<UUID> hiding = hiddenEntities.get(uuid);
return hiding != null && hiding.contains(entity.getUniqueId());
Set<UUID> hiding = hiddenEntitiesEntPl.get(entity.getUniqueId());
return hiding != null && hiding.contains(player.getUniqueId());
}

@Override
Expand Down

0 comments on commit 677e7b7

Please sign in to comment.