Fixed falling block grid lock, improved player disguises skins a ton
This commit is contained in:
		| @@ -52,7 +52,7 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|     @Getter |     @Getter | ||||||
|     private final UpdateChecker updateChecker = new UpdateChecker(); |     private final UpdateChecker updateChecker = new UpdateChecker(); | ||||||
|     @Getter |     @Getter | ||||||
|     private final PlayerSkinHandler skinHandler = new PlayerSkinHandler(); |     private PlayerSkinHandler skinHandler; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public void onLoad() { |     public void onLoad() { | ||||||
| @@ -178,6 +178,7 @@ public class LibsDisguises extends JavaPlugin { | |||||||
|         PacketsManager.addPacketListeners(); |         PacketsManager.addPacketListeners(); | ||||||
|  |  | ||||||
|         listener = new DisguiseListener(this); |         listener = new DisguiseListener(this); | ||||||
|  |         skinHandler = new PlayerSkinHandler(); | ||||||
|  |  | ||||||
|         Bukkit.getPluginManager().registerEvents(getSkinHandler(), LibsDisguises.getInstance()); |         Bukkit.getPluginManager().registerEvents(getSkinHandler(), LibsDisguises.getInstance()); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -3025,7 +3025,8 @@ public class DisguiseUtilities { | |||||||
|     /** |     /** | ||||||
|      * Get the Y level to add to the disguise for realism. |      * Get the Y level to add to the disguise for realism. | ||||||
|      */ |      */ | ||||||
|     public static double getYModifier(Entity entity, Disguise disguise) { |     public static double getYModifier(Disguise disguise) { | ||||||
|  |         Entity entity = disguise.getEntity(); | ||||||
|         double yMod = 0; |         double yMod = 0; | ||||||
|  |  | ||||||
|         if (disguise.getType() != DisguiseType.PLAYER && entity.getType() == EntityType.DROPPED_ITEM) { |         if (disguise.getType() != DisguiseType.PLAYER && entity.getType() == EntityType.DROPPED_ITEM) { | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ import com.comphenix.protocol.PacketType; | |||||||
| import com.comphenix.protocol.PacketType.Play.Server; | import com.comphenix.protocol.PacketType.Play.Server; | ||||||
| import com.comphenix.protocol.ProtocolLibrary; | import com.comphenix.protocol.ProtocolLibrary; | ||||||
| import com.comphenix.protocol.events.PacketContainer; | import com.comphenix.protocol.events.PacketContainer; | ||||||
|  | import com.comphenix.protocol.reflect.StructureModifier; | ||||||
| import com.comphenix.protocol.wrappers.EnumWrappers; | import com.comphenix.protocol.wrappers.EnumWrappers; | ||||||
| import com.google.common.cache.Cache; | import com.google.common.cache.Cache; | ||||||
| import com.google.common.cache.CacheBuilder; | import com.google.common.cache.CacheBuilder; | ||||||
| @@ -11,12 +12,15 @@ import com.google.common.cache.RemovalCause; | |||||||
| import lombok.Getter; | import lombok.Getter; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| import lombok.Setter; | import lombok.Setter; | ||||||
|  | import me.libraryaddict.disguise.DisguiseAPI; | ||||||
| import me.libraryaddict.disguise.DisguiseConfig; | import me.libraryaddict.disguise.DisguiseConfig; | ||||||
| import me.libraryaddict.disguise.LibsDisguises; | import me.libraryaddict.disguise.LibsDisguises; | ||||||
|  | import me.libraryaddict.disguise.disguisetypes.DisguiseType; | ||||||
| import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; | ||||||
| import me.libraryaddict.disguise.events.UndisguiseEvent; | import me.libraryaddict.disguise.events.UndisguiseEvent; | ||||||
| import me.libraryaddict.disguise.utilities.DisguiseUtilities; | import me.libraryaddict.disguise.utilities.DisguiseUtilities; | ||||||
| import me.libraryaddict.disguise.utilities.packets.LibsPackets; | import me.libraryaddict.disguise.utilities.packets.LibsPackets; | ||||||
|  | import org.bukkit.Location; | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
| import org.bukkit.event.EventHandler; | import org.bukkit.event.EventHandler; | ||||||
| import org.bukkit.event.EventPriority; | import org.bukkit.event.EventPriority; | ||||||
| @@ -84,6 +88,15 @@ public class PlayerSkinHandler implements Listener { | |||||||
|                 skins.clear(); |                 skins.clear(); | ||||||
|             }).build(); |             }).build(); | ||||||
|  |  | ||||||
|  |     public PlayerSkinHandler() { | ||||||
|  |         new BukkitRunnable() { | ||||||
|  |             @Override | ||||||
|  |             public void run() { | ||||||
|  |                 getCache().asMap().forEach((key, value) -> doTeleport(key, value)); | ||||||
|  |             } | ||||||
|  |         }.runTaskTimer(LibsDisguises.getInstance(), 1, 1); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public PlayerSkin addPlayerSkin(Player player, PlayerDisguise disguise) { |     public PlayerSkin addPlayerSkin(Player player, PlayerDisguise disguise) { | ||||||
|         tryProcess(player, false); |         tryProcess(player, false); | ||||||
|  |  | ||||||
| @@ -101,7 +114,53 @@ public class PlayerSkinHandler implements Listener { | |||||||
|         return toReturn; |         return toReturn; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private void doTeleport(Player player, List<PlayerSkin> value) { | ||||||
|  |         if (player == null || !player.isOnline()) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         Location loc = player.getLocation(); | ||||||
|  |         loc.add(loc.getDirection().normalize().multiply(10)); | ||||||
|  |  | ||||||
|  |         PacketContainer packet = new PacketContainer(Server.ENTITY_TELEPORT); | ||||||
|  |         packet.getModifier().write(1, loc.getX()); | ||||||
|  |         packet.getModifier().write(2, loc.getY()); | ||||||
|  |         packet.getModifier().write(3, loc.getZ()); | ||||||
|  |  | ||||||
|  |         for (PlayerSkin skin : value) { | ||||||
|  |             if (!skin.isSleepPackets()) { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             PlayerDisguise disguise = skin.getDisguise().get(); | ||||||
|  |  | ||||||
|  |             if (disguise == null || !disguise.isDisguiseInUse()) { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             packet = packet.shallowClone(); | ||||||
|  |  | ||||||
|  |             int id = disguise.getEntity().getEntityId(); | ||||||
|  |  | ||||||
|  |             if (id == player.getEntityId()) { | ||||||
|  |                 id = DisguiseAPI.getSelfDisguiseId(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             packet.getModifier().write(0, id); | ||||||
|  |  | ||||||
|  |             try { | ||||||
|  |                 ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false); | ||||||
|  |             } catch (InvocationTargetException e) { | ||||||
|  |                 e.printStackTrace(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public void handlePackets(Player player, PlayerDisguise disguise, LibsPackets packets) { |     public void handlePackets(Player player, PlayerDisguise disguise, LibsPackets packets) { | ||||||
|  |         if (packets.getPackets().stream().anyMatch(p -> p.getType() == Server.NAMED_ENTITY_SPAWN)) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         List<PlayerSkin> skins = getCache().getIfPresent(player); |         List<PlayerSkin> skins = getCache().getIfPresent(player); | ||||||
|  |  | ||||||
|         if (skins == null) { |         if (skins == null) { | ||||||
| @@ -170,6 +229,49 @@ public class PlayerSkinHandler implements Listener { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private void addTeleport(Player player, PlayerSkin skin) { | ||||||
|  |         PlayerDisguise disguise = skin.getDisguise().get(); | ||||||
|  |  | ||||||
|  |         PacketContainer teleport = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); | ||||||
|  |  | ||||||
|  |         StructureModifier<Object> mods = teleport.getModifier(); | ||||||
|  |         Location loc = disguise.getEntity().getLocation(); | ||||||
|  |  | ||||||
|  |         Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null; | ||||||
|  |         Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null; | ||||||
|  |  | ||||||
|  |         byte yaw = (byte) (int) ((yawLock == null ? loc.getYaw() : yawLock) * 256.0F / 360.0F); | ||||||
|  |         byte pitch = (byte) (int) ((pitchLock == null ? loc.getPitch() : pitchLock) * 256.0F / 360.0F); | ||||||
|  |  | ||||||
|  |         if (DisguiseConfig.isMovementPacketsEnabled()) { | ||||||
|  |             if (yawLock == null) { | ||||||
|  |                 yaw = DisguiseUtilities.getYaw(DisguiseType.getType(disguise.getEntity().getType()), yaw); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (pitchLock == null) { | ||||||
|  |                 pitch = DisguiseUtilities.getPitch(DisguiseType.getType(disguise.getEntity().getType()), pitch); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             yaw = DisguiseUtilities.getYaw(disguise.getType(), yaw); | ||||||
|  |             pitch = DisguiseUtilities.getPitch(disguise.getType(), pitch); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         int id = disguise.getEntity().getEntityId(); | ||||||
|  |  | ||||||
|  |         if (id == player.getEntityId()) { | ||||||
|  |             id = DisguiseAPI.getSelfDisguiseId(); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         mods.write(0, id); | ||||||
|  |         mods.write(1, loc.getX()); | ||||||
|  |         mods.write(2, loc.getY() + DisguiseUtilities.getYModifier(disguise)); | ||||||
|  |         mods.write(3, loc.getZ()); | ||||||
|  |         mods.write(4, yaw); | ||||||
|  |         mods.write(5, pitch); | ||||||
|  |  | ||||||
|  |         skin.getSleptPackets().computeIfAbsent(0, (a) -> new ArrayList<>()).add(teleport); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     private void doPacketRemoval(Player player, PlayerSkin skin) { |     private void doPacketRemoval(Player player, PlayerSkin skin) { | ||||||
|         PlayerDisguise disguise = skin.getDisguise().get(); |         PlayerDisguise disguise = skin.getDisguise().get(); | ||||||
|  |  | ||||||
| @@ -177,6 +279,10 @@ public class PlayerSkinHandler implements Listener { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if (skin.isSleepPackets()) { | ||||||
|  |             addTeleport(player, skin); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         try { |         try { | ||||||
|             for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : skin.getSleptPackets().entrySet()) { |             for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : skin.getSleptPackets().entrySet()) { | ||||||
|                 if (entry.getKey() == 0) { |                 if (entry.getKey() == 0) { | ||||||
|   | |||||||
| @@ -19,7 +19,10 @@ import org.bukkit.inventory.EquipmentSlot; | |||||||
| import org.bukkit.inventory.ItemStack; | import org.bukkit.inventory.ItemStack; | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; | import java.lang.reflect.InvocationTargetException; | ||||||
| import java.util.*; | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Created by libraryaddict on 3/01/2019. |  * Created by libraryaddict on 3/01/2019. | ||||||
|   | |||||||
| @@ -28,6 +28,11 @@ public class PacketHandlerHeadRotation implements IPacketHandler { | |||||||
|     @Override |     @Override | ||||||
|     public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, |     public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, | ||||||
|                        Entity entity) { |                        Entity entity) { | ||||||
|  |         if (disguise.getType() == DisguiseType.FALLING_BLOCK) { | ||||||
|  |             packets.clear(); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         Float pitchLock = disguise.getWatcher().getPitchLock(); |         Float pitchLock = disguise.getWatcher().getPitchLock(); | ||||||
|         Float yawLock = disguise.getWatcher().getYawLock(); |         Float yawLock = disguise.getWatcher().getYawLock(); | ||||||
|         boolean riding = observer.getVehicle() == entity; |         boolean riding = observer.getVehicle() == entity; | ||||||
|   | |||||||
| @@ -82,15 +82,31 @@ public class PacketHandlerMovement implements IPacketHandler { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // If falling block should be appearing in center of blocks |         // If falling block should be appearing in center of blocks | ||||||
|         if (sentPacket.getType() != PacketType.Play.Server.ENTITY_LOOK && |         if (disguise.getType() == DisguiseType.FALLING_BLOCK && | ||||||
|                 disguise.getType() == DisguiseType.FALLING_BLOCK && |  | ||||||
|                 ((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) { |                 ((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) { | ||||||
|             packets.clear(); |             packets.clear(); | ||||||
|  |  | ||||||
|  |             if (sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             PacketContainer movePacket = sentPacket.shallowClone(); |             PacketContainer movePacket = sentPacket.shallowClone(); | ||||||
|  |  | ||||||
|             // If relational movement |             // If not relational movement | ||||||
|             if (sentPacket.getType() != PacketType.Play.Server.ENTITY_TELEPORT) { |             if (movePacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) { | ||||||
|  |                 Location loc = entity.getLocation(); | ||||||
|  |  | ||||||
|  |                 StructureModifier<Double> doubles = movePacket.getDoubles(); | ||||||
|  |                 // Center the block | ||||||
|  |                 doubles.write(0, loc.getBlockX() + 0.5); | ||||||
|  |  | ||||||
|  |                 double y = loc.getBlockY(); | ||||||
|  |  | ||||||
|  |                 y += (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0); | ||||||
|  |  | ||||||
|  |                 doubles.write(1, y); | ||||||
|  |                 doubles.write(2, loc.getBlockZ() + 0.5); | ||||||
|  |             } else { | ||||||
|                 StructureModifier<Short> shorts = movePacket.getShorts(); |                 StructureModifier<Short> shorts = movePacket.getShorts(); | ||||||
|  |  | ||||||
|                 Location origLoc = entity.getLocation(); |                 Location origLoc = entity.getLocation(); | ||||||
| @@ -112,22 +128,10 @@ public class PacketHandlerMovement implements IPacketHandler { | |||||||
|                     shorts.write(1, conRel(origY, newY)); |                     shorts.write(1, conRel(origY, newY)); | ||||||
|                     shorts.write(2, conRel(origLoc.getBlockZ(), newLoc.getBlockZ())); |                     shorts.write(2, conRel(origLoc.getBlockZ(), newLoc.getBlockZ())); | ||||||
|                 } |                 } | ||||||
|             } else { |  | ||||||
|                 Location loc = entity.getLocation(); |  | ||||||
|  |  | ||||||
|                 StructureModifier<Double> doubles = movePacket.getDoubles(); |  | ||||||
|                 // Center the block |  | ||||||
|                 doubles.write(0, loc.getBlockX() + 0.5); |  | ||||||
|  |  | ||||||
|                 double y = loc.getBlockY(); |  | ||||||
|  |  | ||||||
|                 y += (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0); |  | ||||||
|  |  | ||||||
|                 doubles.write(1, y); |  | ||||||
|                 doubles.write(2, loc.getBlockZ() + 0.5); |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             packets.addPacket(movePacket); |             packets.addPacket(movePacket); | ||||||
|  |             return; | ||||||
|         } else if (disguise.getType() == DisguiseType.RABBIT && |         } else if (disguise.getType() == DisguiseType.RABBIT && | ||||||
|                 (sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE || |                 (sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE || | ||||||
|                         sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE_LOOK)) { |                         sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE_LOOK)) { | ||||||
| @@ -220,7 +224,7 @@ public class PacketHandlerMovement implements IPacketHandler { | |||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|  |  | ||||||
|                     double y = DisguiseUtilities.getYModifier(entity, disguise); |                     double y = DisguiseUtilities.getYModifier(disguise); | ||||||
|  |  | ||||||
|                     if (y != 0) { |                     if (y != 0) { | ||||||
|                         doubles.write(2, doubles.read(2) + y); |                         doubles.write(2, doubles.read(2) + y); | ||||||
|   | |||||||
| @@ -103,8 +103,7 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         Location loc = disguisedEntity.getLocation().clone() |         Location loc = disguisedEntity.getLocation().clone().add(0, DisguiseUtilities.getYModifier(disguise), 0); | ||||||
|                 .add(0, DisguiseUtilities.getYModifier(disguisedEntity, disguise), 0); |  | ||||||
|  |  | ||||||
|         Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null; |         Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null; | ||||||
|         Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null; |         Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null; | ||||||
| @@ -123,7 +122,6 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|  |  | ||||||
|             yaw = DisguiseUtilities.getYaw(disguise.getType(), yaw); |             yaw = DisguiseUtilities.getYaw(disguise.getType(), yaw); | ||||||
|             pitch = DisguiseUtilities.getPitch(disguise.getType(), pitch); |             pitch = DisguiseUtilities.getPitch(disguise.getType(), pitch); | ||||||
|  |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) { |         if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) { | ||||||
| @@ -213,14 +211,14 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|             double dist = observer.getLocation().distanceSquared(disguisedEntity.getLocation()); |             double dist = observer.getLocation().distanceSquared(disguisedEntity.getLocation()); | ||||||
|  |  | ||||||
|             // If self disguise, or further than 50 blocks, or not in front of entity |             // If self disguise, or further than 50 blocks, or not in front of entity | ||||||
|             boolean spawnFarAway = observer == disguisedEntity || dist > (50 * 50) || |             boolean normalPlayerDisguise = observer == disguisedEntity || dist > (50 * 50) || | ||||||
|                     (observer.getLocation().add(observer.getLocation().getDirection().normalize()) |                     (observer.getLocation().add(observer.getLocation().getDirection().normalize()) | ||||||
|                             .distanceSquared(disguisedEntity.getLocation()) - dist) < 0.3; |                             .distanceSquared(disguisedEntity.getLocation()) - dist) < 0.3; | ||||||
|  |  | ||||||
|             skin.setSleepPackets(!spawnFarAway); |             skin.setSleepPackets(!normalPlayerDisguise); | ||||||
|  |  | ||||||
|             Location spawnAt = spawnFarAway ? disguisedEntity.getLocation() : |             Location spawnAt = normalPlayerDisguise ? disguisedEntity.getLocation() : | ||||||
|                     observer.getLocation().add(observer.getLocation().getDirection().normalize().multiply(50)); |                     observer.getLocation().add(observer.getLocation().getDirection().normalize().multiply(10)); | ||||||
|  |  | ||||||
|             // Spawn him in front of the observer |             // Spawn him in front of the observer | ||||||
|             StructureModifier<Double> doubles = spawnPlayer.getDoubles(); |             StructureModifier<Double> doubles = spawnPlayer.getDoubles(); | ||||||
| @@ -240,7 +238,7 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|  |  | ||||||
|             WrappedDataWatcher toSend = dataWatcher; |             WrappedDataWatcher toSend = dataWatcher; | ||||||
|  |  | ||||||
|             if (!spawnFarAway) { |             if (!normalPlayerDisguise) { | ||||||
|                 toSend = new WrappedDataWatcher(); |                 toSend = new WrappedDataWatcher(); | ||||||
|                 WrappedDataWatcher.WrappedDataWatcherObject obj = |                 WrappedDataWatcher.WrappedDataWatcherObject obj = | ||||||
|                         ReflectionManager.createDataWatcherObject(MetaIndex.ENTITY_META, (byte) 32); |                         ReflectionManager.createDataWatcherObject(MetaIndex.ENTITY_META, (byte) 32); | ||||||
| @@ -259,23 +257,11 @@ public class PacketHandlerSpawn implements IPacketHandler { | |||||||
|                 spawnPlayer.getDataWatcherModifier().write(0, toSend); |                 spawnPlayer.getDataWatcherModifier().write(0, toSend); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (!spawnFarAway) { |             if (!normalPlayerDisguise) { | ||||||
|                 PacketContainer metaPacket = ProtocolLibrary.getProtocolManager() |                 PacketContainer metaPacket = ProtocolLibrary.getProtocolManager() | ||||||
|                         .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, entityId, dataWatcher, true) |                         .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, entityId, dataWatcher, true) | ||||||
|                         .createPacket(entityId, dataWatcher, true); |                         .createPacket(entityId, dataWatcher, true); | ||||||
|  |  | ||||||
|                 PacketContainer teleport = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); |  | ||||||
|  |  | ||||||
|                 StructureModifier<Object> mods = teleport.getModifier(); |  | ||||||
|  |  | ||||||
|                 mods.write(0, disguisedEntity.getEntityId()); |  | ||||||
|                 mods.write(1, loc.getX()); |  | ||||||
|                 mods.write(2, loc.getY()); |  | ||||||
|                 mods.write(3, loc.getZ()); |  | ||||||
|                 mods.write(4, yaw); |  | ||||||
|                 mods.write(5, pitch); |  | ||||||
|  |  | ||||||
|                 skin.getSleptPackets().computeIfAbsent(0, (a) -> new ArrayList<>()).add(teleport); |  | ||||||
|                 skin.getSleptPackets().computeIfAbsent(4, (a) -> new ArrayList<>()).add(metaPacket); |                 skin.getSleptPackets().computeIfAbsent(4, (a) -> new ArrayList<>()).add(metaPacket); | ||||||
|             } |             } | ||||||
|         } else if (disguise.isMobDisguise() || disguise.getType() == DisguiseType.ARMOR_STAND) { |         } else if (disguise.isMobDisguise() || disguise.getType() == DisguiseType.ARMOR_STAND) { | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| package me.libraryaddict.disguise.utilities.packets.packetlisteners; | package me.libraryaddict.disguise.utilities.packets.packetlisteners; | ||||||
|  |  | ||||||
| import com.comphenix.protocol.PacketType; |  | ||||||
| import com.comphenix.protocol.PacketType.Play.Server; | import com.comphenix.protocol.PacketType.Play.Server; | ||||||
| import com.comphenix.protocol.ProtocolLibrary; | import com.comphenix.protocol.ProtocolLibrary; | ||||||
| import com.comphenix.protocol.events.ListenerPriority; | import com.comphenix.protocol.events.ListenerPriority; | ||||||
| @@ -19,7 +18,6 @@ import me.libraryaddict.disguise.utilities.LibsPremium; | |||||||
| import me.libraryaddict.disguise.utilities.packets.LibsPackets; | import me.libraryaddict.disguise.utilities.packets.LibsPackets; | ||||||
| import me.libraryaddict.disguise.utilities.packets.PacketsManager; | import me.libraryaddict.disguise.utilities.packets.PacketsManager; | ||||||
| import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; | ||||||
| import org.bukkit.Bukkit; |  | ||||||
| import org.bukkit.entity.Player; | import org.bukkit.entity.Player; | ||||||
|  |  | ||||||
| import java.lang.reflect.InvocationTargetException; | import java.lang.reflect.InvocationTargetException; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user