Fixed metadata not being sent issue for player disguises

This commit is contained in:
libraryaddict 2016-11-30 17:31:12 +13:00
parent e1bcfbb5cc
commit 49910a4fa5
3 changed files with 29 additions and 58 deletions

View File

@ -2,6 +2,7 @@ package me.libraryaddict.disguise.disguisetypes;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -23,7 +24,6 @@ import com.comphenix.protocol.wrappers.WrappedWatchableObject;
import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.PacketsManager;
import me.libraryaddict.disguise.utilities.ReflectionManager; import me.libraryaddict.disguise.utilities.ReflectionManager;
public class FlagWatcher { public class FlagWatcher {
@ -36,7 +36,7 @@ public class FlagWatcher {
private HashMap<Integer, Object> entityValues = new HashMap<>(); private HashMap<Integer, Object> entityValues = new HashMap<>();
private LibsEquipment equipment; private LibsEquipment equipment;
private boolean hasDied; private boolean hasDied;
private HashSet<Integer> modifiedEntityAnimations = new HashSet<>(); private boolean[] modifiedEntityAnimations = new boolean[6];
private List<WrappedWatchableObject> watchableObjects; private List<WrappedWatchableObject> watchableObjects;
public FlagWatcher(Disguise disguise) { public FlagWatcher(Disguise disguise) {
@ -46,16 +46,12 @@ public class FlagWatcher {
} }
private byte addEntityAnimations(byte originalValue, byte entityValue) { private byte addEntityAnimations(byte originalValue, byte entityValue) {
byte valueByte = originalValue;
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations.contains(i)) { if ((entityValue & 1 << i) != 0 && !modifiedEntityAnimations[i]) {
valueByte = (byte) (valueByte | 1 << i); originalValue = (byte) (originalValue | 1 << i);
} }
} }
originalValue = valueByte;
return originalValue; return originalValue;
} }
@ -72,7 +68,7 @@ public class FlagWatcher {
cloned.entityValues = (HashMap<Integer, Object>) entityValues.clone(); cloned.entityValues = (HashMap<Integer, Object>) entityValues.clone();
cloned.equipment = equipment.clone(cloned); cloned.equipment = equipment.clone(cloned);
cloned.modifiedEntityAnimations = (HashSet<Integer>) modifiedEntityAnimations.clone(); cloned.modifiedEntityAnimations = Arrays.copyOf(modifiedEntityAnimations, modifiedEntityAnimations.length);
cloned.addEntityAnimations = addEntityAnimations; cloned.addEntityAnimations = addEntityAnimations;
return cloned; return cloned;
@ -89,7 +85,7 @@ public class FlagWatcher {
// Its sending the air metadata. This is the least commonly sent metadata which all entitys still share. // Its sending the air metadata. This is the least commonly sent metadata which all entitys still share.
// I send my custom values if I see this! // I send my custom values if I see this!
if (id == 1) { if (id == FlagType.ENTITY_AIR_TICKS.getIndex()) {
sendAllCustom = true; sendAllCustom = true;
} }
@ -334,10 +330,7 @@ public class FlagWatcher {
Object value = entityValues.get(data.getIndex()); Object value = entityValues.get(data.getIndex());
if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == FlagType.ENTITY_META) { if (isEntityAnimationsAdded() && DisguiseConfig.isMetadataPacketsEnabled() && data == FlagType.ENTITY_META) {
if (!PacketsManager.isStaticMetadataDisguiseType(disguise)) { value = addEntityAnimations((byte) value, WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0));
value = addEntityAnimations((byte) value,
WrappedDataWatcher.getEntityWatcher(disguise.getEntity()).getByte(0));
}
} }
WrappedWatchableObject watch = ReflectionManager.createWatchable(data.getIndex(), value); WrappedWatchableObject watch = ReflectionManager.createWatchable(data.getIndex(), value);
@ -408,7 +401,7 @@ public class FlagWatcher {
} }
private void setEntityFlag(int byteValue, boolean flag) { private void setEntityFlag(int byteValue, boolean flag) {
modifiedEntityAnimations.add(byteValue); modifiedEntityAnimations[byteValue] = true;
byte b0 = (byte) getData(FlagType.ENTITY_META); byte b0 = (byte) getData(FlagType.ENTITY_META);

View File

@ -80,7 +80,7 @@ public class PacketsManager {
} }
public void setPacketType(PacketType type) { public void setPacketType(PacketType type) {
isSpawnPacket = type.name().contains("SPAWN_"); isSpawnPacket = type.name().contains("SPAWN") && type.name().contains("ENTITY");
} }
public void addPacket(PacketContainer packet) { public void addPacket(PacketContainer packet) {
@ -142,7 +142,7 @@ public class PacketsManager {
private static PacketListener viewDisguisesListener; private static PacketListener viewDisguisesListener;
private static PacketListener tabListListener; private static PacketListener tabListListener;
private static boolean viewDisguisesListenerEnabled; private static boolean viewDisguisesListenerEnabled;
private static HashMap<Disguise, ArrayList<UUID>> _cancelMeta = new HashMap<Disguise, ArrayList<UUID>>(); private static HashMap<Disguise, ArrayList<UUID>> cancelMeta = new HashMap<Disguise, ArrayList<UUID>>();
public static void addPacketListeners() { public static void addPacketListeners() {
// Add a client listener to cancel them interacting with uninteractable disguised entitys. // Add a client listener to cancel them interacting with uninteractable disguised entitys.
@ -162,7 +162,7 @@ public class PacketsManager {
public static void removeCancel(Disguise disguise, Player observer) { public static void removeCancel(Disguise disguise, Player observer) {
ArrayList<UUID> cancel; ArrayList<UUID> cancel;
if ((cancel = _cancelMeta.get(disguise)) == null) if ((cancel = cancelMeta.get(disguise)) == null)
return; return;
cancel.remove(observer.getUniqueId()); cancel.remove(observer.getUniqueId());
@ -170,7 +170,7 @@ public class PacketsManager {
if (!cancel.isEmpty()) if (!cancel.isEmpty())
return; return;
_cancelMeta.remove(disguise); cancelMeta.remove(disguise);
} }
/** /**
@ -402,10 +402,11 @@ public class PacketsManager {
metaPacket.getIntegers().write(0, entityId); // Id metaPacket.getIntegers().write(0, entityId); // Id
metaPacket.getWatchableCollectionModifier().write(0, newWatcher.getWatchableObjects()); metaPacket.getWatchableCollectionModifier().write(0, newWatcher.getWatchableObjects());
if (!_cancelMeta.containsKey(disguise)) if (!cancelMeta.containsKey(disguise))
_cancelMeta.put(disguise, new ArrayList<UUID>()); cancelMeta.put(disguise, new ArrayList<UUID>());
cancelMeta.get(disguise).add(observer.getUniqueId());
_cancelMeta.get(disguise).add(observer.getUniqueId());
packets.addDelayedPacket(metaPacket, 4); packets.addDelayedPacket(metaPacket, 4);
} }
@ -929,8 +930,8 @@ public class PacketsManager {
else if (sentPacket.getType() == Server.ENTITY_METADATA) { else if (sentPacket.getType() == Server.ENTITY_METADATA) {
packets.clear(); packets.clear();
if (DisguiseConfig.isMetadataPacketsEnabled() && !isStaticMetadataDisguiseType(disguise) if (DisguiseConfig.isMetadataPacketsEnabled()
&& (!_cancelMeta.containsKey(disguise) || !_cancelMeta.get(disguise).contains(observer.getUniqueId()))) { && (!cancelMeta.containsKey(disguise) || !cancelMeta.get(disguise).contains(observer.getUniqueId()))) {
List<WrappedWatchableObject> watchableObjects = disguise.getWatcher() List<WrappedWatchableObject> watchableObjects = disguise.getWatcher()
.convert(sentPacket.getWatchableCollectionModifier().read(0)); .convert(sentPacket.getWatchableCollectionModifier().read(0));
@ -1066,7 +1067,7 @@ public class PacketsManager {
packets.addPacket(equipPacket); packets.addPacket(equipPacket);
equipPacket.getModifier().write(2, equipPacket.getModifier().write(2,
(itemStack.getTypeId() == 0 ? null : ReflectionManager.getNmsItem(itemStack))); ReflectionManager.getNmsItem(itemStack.getType() == Material.AIR ? null : itemStack));
} }
if (disguise.getWatcher().isRightClicking() && slot == EquipmentSlot.HAND) { if (disguise.getWatcher().isRightClicking() && slot == EquipmentSlot.HAND) {
@ -1076,7 +1077,7 @@ public class PacketsManager {
// Convert the datawatcher // Convert the datawatcher
List<WrappedWatchableObject> list = new ArrayList<>(); List<WrappedWatchableObject> list = new ArrayList<>();
if (DisguiseConfig.isMetadataPacketsEnabled() && !isStaticMetadataDisguiseType(disguise)) { if (DisguiseConfig.isMetadataPacketsEnabled()) {
WrappedWatchableObject watch = ReflectionManager.createWatchable(0, WrappedWatchableObject watch = ReflectionManager.createWatchable(0,
WrappedDataWatcher.getEntityWatcher(entity).getByte(0)); WrappedDataWatcher.getEntityWatcher(entity).getByte(0));
@ -1173,18 +1174,4 @@ public class PacketsManager {
return packets; return packets;
} }
/**
* Returns true if this disguise type doesn't have changing metadata.
*
* @param disguise
* @return
*/
public static boolean isStaticMetadataDisguiseType(Disguise disguise) {
return false;
/* return (disguise.getType() == DisguiseType.WOLF || disguise.getType() == DisguiseType.OCELOT
|| disguise.getType() == DisguiseType.ENDERMAN || disguise.getType() == DisguiseType.SHULKER
|| disguise.getType() == DisguiseType.SPLASH_POTION || disguise.getType() == DisguiseType.FIREWORK
|| disguise.getType() == DisguiseType.DROPPED_ITEM || disguise.getType() == DisguiseType.ENDER_CRYSTAL);*/
}
} }

View File

@ -21,16 +21,13 @@ import me.libraryaddict.disguise.disguisetypes.Disguise;
import me.libraryaddict.disguise.utilities.PacketsManager; import me.libraryaddict.disguise.utilities.PacketsManager;
import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets; import me.libraryaddict.disguise.utilities.PacketsManager.LibsPackets;
public class PacketListenerMain extends PacketAdapter public class PacketListenerMain extends PacketAdapter {
{ public PacketListenerMain(LibsDisguises plugin, ArrayList<PacketType> packetsToListen) {
public PacketListenerMain(LibsDisguises plugin, ArrayList<PacketType> packetsToListen)
{
super(plugin, ListenerPriority.HIGH, packetsToListen); super(plugin, ListenerPriority.HIGH, packetsToListen);
} }
@Override @Override
public void onPacketSending(final PacketEvent event) public void onPacketSending(final PacketEvent event) {
{
if (event.isCancelled()) if (event.isCancelled())
return; return;
@ -56,19 +53,16 @@ public class PacketListenerMain extends PacketAdapter
LibsPackets packets; LibsPackets packets;
try try {
{
packets = PacketsManager.transformPacket(event.getPacket(), disguise, observer, entity); packets = PacketsManager.transformPacket(event.getPacket(), disguise, observer, entity);
} }
catch (Exception ex) catch (Exception ex) {
{
ex.printStackTrace(); ex.printStackTrace();
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (packets.isUnhandled()) if (packets.isUnhandled()) {
{
return; return;
} }
@ -76,17 +70,14 @@ public class PacketListenerMain extends PacketAdapter
event.setCancelled(true); event.setCancelled(true);
try try {
{ for (PacketContainer packet : packets.getPackets()) {
for (PacketContainer packet : packets.getPackets())
{
ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false);
} }
packets.sendDelayed(observer); packets.sendDelayed(observer);
} }
catch (InvocationTargetException ex) catch (InvocationTargetException ex) {
{
ex.printStackTrace(); ex.printStackTrace();
} }