|
|
|
@@ -1,19 +1,13 @@
|
|
|
|
|
package me.libraryaddict.disguise.utilities;
|
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Array;
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.UUID;
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
|
|
import com.comphenix.protocol.PacketType;
|
|
|
|
|
import com.comphenix.protocol.ProtocolLibrary;
|
|
|
|
|
import com.comphenix.protocol.ProtocolManager;
|
|
|
|
|
import com.comphenix.protocol.events.PacketContainer;
|
|
|
|
|
import com.comphenix.protocol.reflect.StructureModifier;
|
|
|
|
|
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
|
|
|
|
|
import com.comphenix.protocol.wrappers.WrappedGameProfile;
|
|
|
|
|
import com.comphenix.protocol.wrappers.WrappedWatchableObject;
|
|
|
|
|
import me.libraryaddict.disguise.DisguiseAPI;
|
|
|
|
|
import me.libraryaddict.disguise.DisguiseConfig;
|
|
|
|
|
import me.libraryaddict.disguise.LibsDisguises;
|
|
|
|
@@ -22,11 +16,10 @@ import me.libraryaddict.disguise.disguisetypes.DisguiseType;
|
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.FlagWatcher;
|
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
|
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise;
|
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType;
|
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.watchers.AgeableWatcher;
|
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.watchers.PlayerWatcher;
|
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.watchers.ZombieWatcher;
|
|
|
|
|
import me.libraryaddict.disguise.disguisetypes.TargetedDisguise.TargetType;
|
|
|
|
|
|
|
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
|
import org.bukkit.Location;
|
|
|
|
|
import org.bukkit.Material;
|
|
|
|
@@ -41,14 +34,21 @@ import org.bukkit.potion.PotionEffect;
|
|
|
|
|
import org.bukkit.scheduler.BukkitRunnable;
|
|
|
|
|
import org.bukkit.util.Vector;
|
|
|
|
|
|
|
|
|
|
import com.comphenix.protocol.PacketType;
|
|
|
|
|
import com.comphenix.protocol.ProtocolLibrary;
|
|
|
|
|
import com.comphenix.protocol.ProtocolManager;
|
|
|
|
|
import com.comphenix.protocol.events.PacketContainer;
|
|
|
|
|
import com.comphenix.protocol.reflect.StructureModifier;
|
|
|
|
|
import com.comphenix.protocol.wrappers.WrappedDataWatcher;
|
|
|
|
|
import com.comphenix.protocol.wrappers.WrappedGameProfile;
|
|
|
|
|
import com.comphenix.protocol.wrappers.WrappedWatchableObject;
|
|
|
|
|
import java.lang.reflect.Array;
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Arrays;
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
import java.util.HashSet;
|
|
|
|
|
import java.util.Iterator;
|
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Set;
|
|
|
|
|
import java.util.UUID;
|
|
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
|
|
|
|
public class DisguiseUtilities {
|
|
|
|
|
|
|
|
|
@@ -60,7 +60,6 @@ public class DisguiseUtilities {
|
|
|
|
|
private static LinkedHashMap<String, Disguise> clonedDisguises = new LinkedHashMap<>();
|
|
|
|
|
/**
|
|
|
|
|
* A hashmap of the uuid's of entitys, alive and dead. And their disguises in use
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
private static HashMap<UUID, HashSet<TargetedDisguise>> disguisesInUse = new HashMap<>();
|
|
|
|
|
/**
|
|
|
|
@@ -252,12 +251,16 @@ public class DisguiseUtilities {
|
|
|
|
|
try {
|
|
|
|
|
Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity());
|
|
|
|
|
if (entityTrackerEntry != null) {
|
|
|
|
|
HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(
|
|
|
|
|
Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(
|
|
|
|
|
entityTrackerEntry);
|
|
|
|
|
HashSet cloned = (HashSet) trackedPlayers.clone();
|
|
|
|
|
Object trackedPlayersObj = ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry);
|
|
|
|
|
// If the tracker exists. Remove himself from his tracker
|
|
|
|
|
if (isHashSet(trackedPlayersObj)) {
|
|
|
|
|
trackedPlayers = (Set) ((HashSet<Object>)trackedPlayers).clone();
|
|
|
|
|
}
|
|
|
|
|
PacketContainer destroyPacket = new PacketContainer(PacketType.Play.Server.ENTITY_DESTROY);
|
|
|
|
|
destroyPacket.getIntegerArrays().write(0, new int[]{disguise.getEntity().getEntityId()});
|
|
|
|
|
for (Object p : cloned) {
|
|
|
|
|
for (Object p : trackedPlayers) {
|
|
|
|
|
Player player = (Player) ReflectionManager.getBukkitEntity(p);
|
|
|
|
|
if (player == disguise.getEntity() || disguise.canSee(player)) {
|
|
|
|
|
ProtocolLibrary.getProtocolManager().sendServerPacket(player, destroyPacket);
|
|
|
|
@@ -440,7 +443,7 @@ public class DisguiseUtilities {
|
|
|
|
|
try {
|
|
|
|
|
Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity());
|
|
|
|
|
if (entityTrackerEntry != null) {
|
|
|
|
|
HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(
|
|
|
|
|
Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(
|
|
|
|
|
entityTrackerEntry);
|
|
|
|
|
for (Object p : trackedPlayers) {
|
|
|
|
|
Player player = (Player) ReflectionManager.getBukkitEntity(p);
|
|
|
|
@@ -620,7 +623,7 @@ public class DisguiseUtilities {
|
|
|
|
|
try {
|
|
|
|
|
PacketContainer destroyPacket = getDestroyPacket(disguise.getEntity().getEntityId());
|
|
|
|
|
if (disguise.isDisguiseInUse() && disguise.getEntity() instanceof Player
|
|
|
|
|
&& ((Player) disguise.getEntity()).getName().equalsIgnoreCase(player)) {
|
|
|
|
|
&& disguise.getEntity().getName().equalsIgnoreCase(player)) {
|
|
|
|
|
removeSelfDisguise((Player) disguise.getEntity());
|
|
|
|
|
if (disguise.isSelfDisguiseVisible()) {
|
|
|
|
|
selfDisguised.add(disguise.getEntity().getUniqueId());
|
|
|
|
@@ -639,14 +642,16 @@ public class DisguiseUtilities {
|
|
|
|
|
} else {
|
|
|
|
|
final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity());
|
|
|
|
|
if (entityTrackerEntry != null) {
|
|
|
|
|
HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers")
|
|
|
|
|
Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers")
|
|
|
|
|
.get(entityTrackerEntry);
|
|
|
|
|
Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear",
|
|
|
|
|
ReflectionManager.getNmsClass("EntityPlayer"));
|
|
|
|
|
final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer",
|
|
|
|
|
ReflectionManager.getNmsClass("EntityPlayer"));
|
|
|
|
|
HashSet cloned = (HashSet) trackedPlayers.clone();
|
|
|
|
|
for (final Object p : cloned) {
|
|
|
|
|
if (isHashSet(trackedPlayers)) {
|
|
|
|
|
trackedPlayers = (Set) ((HashSet<Object>)trackedPlayers).clone();
|
|
|
|
|
}
|
|
|
|
|
for (final Object p : trackedPlayers) {
|
|
|
|
|
Player pl = (Player) ReflectionManager.getBukkitEntity(p);
|
|
|
|
|
if (player.equalsIgnoreCase((pl).getName())) {
|
|
|
|
|
clear.invoke(entityTrackerEntry, p);
|
|
|
|
@@ -681,14 +686,16 @@ public class DisguiseUtilities {
|
|
|
|
|
PacketContainer destroyPacket = getDestroyPacket(entity.getEntityId());
|
|
|
|
|
final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(entity);
|
|
|
|
|
if (entityTrackerEntry != null) {
|
|
|
|
|
HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(
|
|
|
|
|
Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(
|
|
|
|
|
entityTrackerEntry);
|
|
|
|
|
Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear",
|
|
|
|
|
ReflectionManager.getNmsClass("EntityPlayer"));
|
|
|
|
|
final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer",
|
|
|
|
|
ReflectionManager.getNmsClass("EntityPlayer"));
|
|
|
|
|
HashSet cloned = (HashSet) trackedPlayers.clone();
|
|
|
|
|
for (final Object p : cloned) {
|
|
|
|
|
if (isHashSet(trackedPlayers)) {
|
|
|
|
|
trackedPlayers = (Set) ((HashSet<Object>)trackedPlayers).clone();
|
|
|
|
|
}
|
|
|
|
|
for (final Object p : trackedPlayers) {
|
|
|
|
|
Player player = (Player) ReflectionManager.getBukkitEntity(p);
|
|
|
|
|
if (player != entity) {
|
|
|
|
|
clear.invoke(entityTrackerEntry, p);
|
|
|
|
@@ -736,14 +743,15 @@ public class DisguiseUtilities {
|
|
|
|
|
}
|
|
|
|
|
final Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(disguise.getEntity());
|
|
|
|
|
if (entityTrackerEntry != null) {
|
|
|
|
|
HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(
|
|
|
|
|
entityTrackerEntry);
|
|
|
|
|
Set trackedPlayers = (Set) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry);
|
|
|
|
|
Method clear = ReflectionManager.getNmsMethod("EntityTrackerEntry", "clear",
|
|
|
|
|
ReflectionManager.getNmsClass("EntityPlayer"));
|
|
|
|
|
final Method updatePlayer = ReflectionManager.getNmsMethod("EntityTrackerEntry", "updatePlayer",
|
|
|
|
|
ReflectionManager.getNmsClass("EntityPlayer"));
|
|
|
|
|
HashSet cloned = (HashSet) trackedPlayers.clone();
|
|
|
|
|
for (final Object p : cloned) {
|
|
|
|
|
if (isHashSet(trackedPlayers)) {
|
|
|
|
|
trackedPlayers = (Set) ((HashSet<Object>)trackedPlayers).clone();
|
|
|
|
|
}
|
|
|
|
|
for (final Object p : trackedPlayers) {
|
|
|
|
|
Player player = (Player) ReflectionManager.getBukkitEntity(p);
|
|
|
|
|
if (disguise.getEntity() != player && disguise.canSee(player)) {
|
|
|
|
|
clear.invoke(entityTrackerEntry, p);
|
|
|
|
@@ -767,6 +775,19 @@ public class DisguiseUtilities {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Pass in a set, check if it's a hashset.
|
|
|
|
|
* If it's not, return false.
|
|
|
|
|
* If you pass in something else, you failed.
|
|
|
|
|
* @param obj
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
private static boolean isHashSet(Object obj) {
|
|
|
|
|
if (obj instanceof HashSet) return true; //It's Spigot/Bukkit
|
|
|
|
|
if (obj instanceof Set) return false; //It's PaperSpigot/SportsBukkit
|
|
|
|
|
throw new IllegalArgumentException("Object passed was not either a hashset or set!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static boolean removeDisguise(TargetedDisguise disguise) {
|
|
|
|
|
UUID entityId = disguise.getEntity().getUniqueId();
|
|
|
|
|
if (getDisguises().containsKey(entityId) && getDisguises().get(entityId).remove(disguise)) {
|
|
|
|
@@ -805,10 +826,13 @@ public class DisguiseUtilities {
|
|
|
|
|
try {
|
|
|
|
|
Object entityTrackerEntry = ReflectionManager.getEntityTrackerEntry(player);
|
|
|
|
|
if (entityTrackerEntry != null) {
|
|
|
|
|
HashSet trackedPlayers = (HashSet) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(
|
|
|
|
|
entityTrackerEntry);
|
|
|
|
|
Object trackedPlayersObj = ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry);
|
|
|
|
|
// If the tracker exists. Remove himself from his tracker
|
|
|
|
|
trackedPlayers.remove(ReflectionManager.getNmsEntity(player));
|
|
|
|
|
if (isHashSet(trackedPlayersObj)) {
|
|
|
|
|
((Set<Object>) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)).remove(ReflectionManager.getNmsEntity(player));
|
|
|
|
|
} else {
|
|
|
|
|
((Map<Object, Object>) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayerMap").get(entityTrackerEntry)).remove(ReflectionManager.getNmsEntity(player));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
ex.printStackTrace(System.out);
|
|
|
|
@@ -855,8 +879,14 @@ public class DisguiseUtilities {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// Add himself to his own entity tracker
|
|
|
|
|
((HashSet<Object>) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry))
|
|
|
|
|
.add(ReflectionManager.getNmsEntity(player));
|
|
|
|
|
Object trackedPlayersObj = ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry);
|
|
|
|
|
//Check for code differences in PaperSpigot vs Spigot
|
|
|
|
|
if (isHashSet(trackedPlayersObj)) {
|
|
|
|
|
((Set<Object>) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayers").get(entityTrackerEntry)).add(ReflectionManager.getNmsEntity(player));
|
|
|
|
|
} else {
|
|
|
|
|
((Map<Object, Object>) ReflectionManager.getNmsField("EntityTrackerEntry", "trackedPlayerMap").get(entityTrackerEntry)).put(ReflectionManager.getNmsEntity(player), true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ProtocolManager manager = ProtocolLibrary.getProtocolManager();
|
|
|
|
|
// Send the player a packet with himself being spawned
|
|
|
|
|
manager.sendServerPacket(player, manager.createPacketConstructor(PacketType.Play.Server.NAMED_ENTITY_SPAWN, player)
|
|
|
|
|