diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 1236b6fe..cc4514c8 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -83,6 +83,7 @@ public class DisguiseUtilities { */ private static long velocityTime; private static int velocityID; + private static HashMap> disguiseLoading = new HashMap<>(); public static void setPlayerVelocity(Player player) { velocityID = player.getEntityId(); @@ -1720,7 +1721,6 @@ public class DisguiseUtilities { return; } - // player.spigot().setCollidesWithEntities(false); // Finish up selfDisguised.add(player.getUniqueId()); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/LibsPackets.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/LibsPackets.java index 108ec6b7..4249c0bd 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/LibsPackets.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/LibsPackets.java @@ -5,6 +5,7 @@ import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.Disguise; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -82,6 +83,10 @@ public class LibsPackets { final boolean isRemoveCancel = isSpawnPacket && largestTick.get().equals(entry.getKey()); Bukkit.getScheduler().scheduleSyncDelayedTask(LibsDisguises.getInstance(), () -> { + if (isRemoveCancel) { + PacketsManager.getPacketsHandler().removeCancel(disguise, observer); + } + try { for (PacketContainer packet : entry.getValue()) { ProtocolLibrary.getProtocolManager().sendServerPacket(observer, packet, false); @@ -90,10 +95,6 @@ public class LibsPackets { catch (InvocationTargetException e) { e.printStackTrace(); } - - if (isRemoveCancel) { - PacketsManager.getPacketsHandler().removeCancel(disguise, observer); - } }, entry.getKey()); } } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/PacketsHandler.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/PacketsHandler.java index dd1b913a..e51abe92 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/PacketsHandler.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/PacketsHandler.java @@ -31,7 +31,7 @@ public class PacketsHandler { packetHandlers.add(new PacketHandlerBed()); packetHandlers.add(new PacketHandlerCollect()); packetHandlers.add(new PacketHandlerEntityStatus()); - packetHandlers.add(new PacketHandlerEquipment()); + packetHandlers.add(new PacketHandlerEquipment(this)); packetHandlers.add(new PacketHandlerHeadRotation()); packetHandlers.add(new PacketHandlerMetadata(this)); packetHandlers.add(new PacketHandlerMovement()); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerEquipment.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerEquipment.java index e8cea10a..3a0f0f0d 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerEquipment.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerEquipment.java @@ -7,8 +7,10 @@ import com.comphenix.protocol.wrappers.WrappedWatchableObject; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.MetaIndex; +import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.packets.IPacketHandler; import me.libraryaddict.disguise.utilities.packets.LibsPackets; +import me.libraryaddict.disguise.utilities.packets.PacketsHandler; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import org.bukkit.Material; import org.bukkit.entity.Entity; @@ -23,6 +25,12 @@ import java.util.List; * Created by libraryaddict on 3/01/2019. */ public class PacketHandlerEquipment implements IPacketHandler { + private PacketsHandler packetsHandler; + + public PacketHandlerEquipment(PacketsHandler packetsHandler) { + this.packetsHandler = packetsHandler; + } + @Override public PacketType[] getHandledPackets() { return new PacketType[]{PacketType.Play.Server.ENTITY_EQUIPMENT}; @@ -31,6 +39,11 @@ public class PacketHandlerEquipment implements IPacketHandler { @Override public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, Entity entity) { + if (packetsHandler.isCancelMeta(disguise, observer)) { + packets.clear(); + return; + } + // Else if the disguise is updating equipment EquipmentSlot slot = ReflectionManager.createEquipmentSlot(packets.getPackets().get(0).getModifier().read(1)); @@ -56,8 +69,8 @@ public class PacketHandlerEquipment implements IPacketHandler { List list = new ArrayList<>(); if (DisguiseConfig.isMetadataPacketsEnabled()) { - WrappedWatchableObject watch = ReflectionManager - .createWatchable(MetaIndex.ENTITY_META, WrappedDataWatcher.getEntityWatcher(entity).getByte(0)); + WrappedWatchableObject watch = ReflectionManager.createWatchable(MetaIndex.ENTITY_META, + WrappedDataWatcher.getEntityWatcher(entity).getByte(0)); if (watch != null) list.add(watch); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java index cf91eb1f..bed8ae01 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java @@ -27,6 +27,7 @@ import org.bukkit.entity.Damageable; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; @@ -71,36 +72,6 @@ public class PacketHandlerSpawn implements IPacketHandler { disguise.setEntity(disguisedEntity); } - // This sends the armor packets so that the player isn't naked. - // Please note it only sends the packets that wouldn't be sent normally - if (DisguiseConfig.isEquipmentPacketsEnabled()) { - for (EquipmentSlot slot : EquipmentSlot.values()) { - ItemStack itemstack = disguise.getWatcher().getItemStack(slot); - - if (itemstack == null || itemstack.getType() == Material.AIR) { - continue; - } - - if (disguisedEntity instanceof LivingEntity) { - ItemStack item = ReflectionManager.getEquipment(slot, disguisedEntity); - - if (item != null && item.getType() != Material.AIR) { - continue; - } - } - - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); - - StructureModifier mods = packet.getModifier(); - - mods.write(0, disguisedEntity.getEntityId()); - mods.write(1, ReflectionManager.createEnumItemSlot(slot)); - mods.write(2, ReflectionManager.getNmsItem(itemstack)); - - packets.addDelayedPacket(packet); - } - } - if (DisguiseConfig.isMiscDisguisesForLivingEnabled()) { if (disguise.getWatcher() instanceof LivingWatcher) { @@ -257,10 +228,8 @@ public class PacketHandlerSpawn implements IPacketHandler { bytes.write(0, yaw); bytes.write(1, pitch); - packets.addPacket(teleportPacket); - } + packets.addDelayedPacket(teleportPacket, 3); - if (!selfDisguise) { // Send a metadata packet PacketContainer metaPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); @@ -398,5 +367,49 @@ public class PacketHandlerSpawn implements IPacketHandler { packets.addPacket(newPacket); } + + boolean requiresArmor = + (disguise.isPlayerDisguise() && disguisedEntity != observer) && disguisedEntity instanceof LivingEntity; + // This sends the armor packets so that the player isn't naked. + if (DisguiseConfig.isEquipmentPacketsEnabled() || requiresArmor) { + for (EquipmentSlot slot : EquipmentSlot.values()) { + ItemStack itemstack = disguise.getWatcher().getItemStack(slot); + ItemStack entityItem; + + if (itemstack == null || itemstack.getType() == Material.AIR) { + if (requiresArmor) { + itemstack = ReflectionManager.getEquipment(slot, disguisedEntity); + + if (itemstack == null || itemstack.getType() == Material.AIR) { + continue; + } + } else { + continue; + } + } + + if (!requiresArmor && disguisedEntity instanceof LivingEntity) { + ItemStack item = ReflectionManager.getEquipment(slot, disguisedEntity); + + if (item != null && item.getType() != Material.AIR) { + continue; + } + } + + PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_EQUIPMENT); + + StructureModifier mods = packet.getModifier(); + + mods.write(0, disguisedEntity.getEntityId()); + mods.write(1, ReflectionManager.createEnumItemSlot(slot)); + mods.write(2, ReflectionManager.getNmsItem(itemstack)); + + if (requiresArmor) { + packets.addDelayedPacket(packet, 3); + } else { + packets.addDelayedPacket(packet); + } + } + } } }