diff --git a/pom.xml b/pom.xml index bd46a4dc..d5e9b946 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ LibsDisguises LibsDisguises - 9.8.3 + 9.8.3-SNAPSHOT clean install diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java index 7459ab92..e85b47fe 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/watchers/FallingBlockWatcher.java @@ -1,14 +1,24 @@ package me.libraryaddict.disguise.disguisetypes.watchers; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLib; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.reflect.StructureModifier; import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.FlagWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; +import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import java.lang.reflect.InvocationTargetException; + public class FallingBlockWatcher extends FlagWatcher { private ItemStack block = new ItemStack(Material.STONE); + private boolean gridLocked; public FallingBlockWatcher(Disguise disguise) { super(disguise); @@ -22,6 +32,49 @@ public class FallingBlockWatcher extends FlagWatcher { return watcher; } + public boolean isGridLocked() { + return gridLocked; + } + + private short conRel(double oldCord, double newCord) { + return (short) (((oldCord - newCord) * 4096) * (isGridLocked() ? -1 : 1)); + } + + public void setGridLocked(boolean gridLocked) { + if (isGridLocked() == gridLocked) { + return; + } + + this.gridLocked = gridLocked; + + if (getDisguise().isDisguiseInUse() && getDisguise().getEntity() != null) { + PacketContainer relMove = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE); + StructureModifier shorts = relMove.getShorts(); + Location loc = getDisguise().getEntity().getLocation(); + + relMove.getModifier().write(0, getDisguise().getEntity().getEntityId()); + shorts.write(0, conRel(loc.getX(), loc.getBlockX() + 0.5)); + shorts.write(1, conRel(loc.getY(), loc.getBlockY())); + shorts.write(2, conRel(loc.getZ(), loc.getBlockZ() + 0.5)); + + try { + for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { + if (player == getDisguise().getEntity()) { + PacketContainer temp = relMove.shallowClone(); + temp.getModifier().write(0, DisguiseAPI.getSelfDisguiseId()); + + ProtocolLibrary.getProtocolManager().sendServerPacket(player, temp, isGridLocked()); + } else { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, relMove, isGridLocked()); + } + } + } + catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + } + public ItemStack getBlock() { return block; } diff --git a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerMovement.java b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerMovement.java index fea98e91..11ce9a48 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerMovement.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerMovement.java @@ -6,6 +6,7 @@ import com.comphenix.protocol.reflect.StructureModifier; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.disguisetypes.DisguiseType; +import me.libraryaddict.disguise.disguisetypes.watchers.FallingBlockWatcher; import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.packets.IPacketHandler; import me.libraryaddict.disguise.utilities.packets.LibsPackets; @@ -13,6 +14,7 @@ import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.metadata.FixedMetadataValue; +import org.bukkit.util.Vector; /** * Created by libraryaddict on 3/01/2019. @@ -24,11 +26,61 @@ public class PacketHandlerMovement implements IPacketHandler { PacketType.Play.Server.ENTITY_TELEPORT, PacketType.Play.Server.REL_ENTITY_MOVE}; } + private short conRel(int oldCord, int newCord) { + return (short) ((oldCord - newCord) * 4096); + } + @Override public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, Entity entity) { + // If falling block should be appearing in center of blocks + if (sentPacket.getType() != PacketType.Play.Server.ENTITY_LOOK && + disguise.getType() == DisguiseType.FALLING_BLOCK && + ((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) { + packets.clear(); - if (disguise.getType() == DisguiseType.RABBIT && + PacketContainer movePacket = sentPacket.shallowClone(); + + // If relational movement + if (sentPacket.getType() != PacketType.Play.Server.ENTITY_TELEPORT) { + StructureModifier shorts = movePacket.getShorts(); + + Location current = entity.getLocation(); + Vector diff = new Vector(shorts.read(0) / 4096D, shorts.read(1) / 4096D, shorts.read(2) / 4096D); + Location newLoc = current.clone().subtract(diff); + + boolean sameBlock = + current.getBlockX() == newLoc.getBlockX() && current.getBlockY() == newLoc.getBlockY() && + current.getBlockZ() == newLoc.getBlockZ(); + + if (sameBlock) { + // Make no modifications + return; + } else { + shorts.write(0, conRel(current.getBlockX(), newLoc.getBlockX())); + shorts.write(1, conRel(current.getBlockY(), newLoc.getBlockY())); + shorts.write(2, conRel(current.getBlockZ(), newLoc.getBlockZ())); + } + } else { + Location loc = entity.getLocation(); + + StructureModifier doubles = movePacket.getDoubles(); + // Center the block + doubles.write(0, loc.getBlockX() + 0.5); + doubles.write(1, (double) loc.getBlockY()); + doubles.write(2, loc.getBlockZ() + 0.5); + } + + packets.addPacket(movePacket); + + StructureModifier bytes = movePacket.getBytes(); + + byte yawValue = bytes.read(0); + byte pitchValue = bytes.read(1); + + bytes.write(0, DisguiseUtilities.getYaw(disguise.getType(), entity.getType(), yawValue)); + bytes.write(1, DisguiseUtilities.getPitch(disguise.getType(), entity.getType(), pitchValue)); + } else if (disguise.getType() == DisguiseType.RABBIT && (sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE || sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE_LOOK)) { // When did the rabbit disguise last hop @@ -55,49 +107,48 @@ public class PacketHandlerMovement implements IPacketHandler { statusPacket.getIntegers().write(0, entity.getEntityId()); statusPacket.getBytes().write(0, (byte) 1); } - } + } else + // Stop wither skulls from looking + if (sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK && + disguise.getType() == DisguiseType.WITHER_SKULL) { + packets.clear(); + } else if (sentPacket.getType() != PacketType.Play.Server.REL_ENTITY_MOVE) { + packets.clear(); - // Stop wither skulls from looking - if (sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK && - disguise.getType() == DisguiseType.WITHER_SKULL) { - packets.clear(); - } else if (sentPacket.getType() != PacketType.Play.Server.REL_ENTITY_MOVE) { - packets.clear(); + PacketContainer movePacket = sentPacket.shallowClone(); - PacketContainer movePacket = sentPacket.shallowClone(); + packets.addPacket(movePacket); - packets.addPacket(movePacket); + StructureModifier bytes = movePacket.getBytes(); - StructureModifier bytes = movePacket.getBytes(); + byte yawValue = bytes.read(0); + byte pitchValue = bytes.read(1); - byte yawValue = bytes.read(0); - byte pitchValue = bytes.read(1); + bytes.write(0, DisguiseUtilities.getYaw(disguise.getType(), entity.getType(), yawValue)); + bytes.write(1, DisguiseUtilities.getPitch(disguise.getType(), entity.getType(), pitchValue)); - bytes.write(0, DisguiseUtilities.getYaw(disguise.getType(), entity.getType(), yawValue)); - bytes.write(1, DisguiseUtilities.getPitch(disguise.getType(), entity.getType(), pitchValue)); + if (sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT && + disguise.getType() == DisguiseType.ITEM_FRAME) { + StructureModifier doubles = movePacket.getDoubles(); - if (sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT && - disguise.getType() == DisguiseType.ITEM_FRAME) { - StructureModifier doubles = movePacket.getDoubles(); + Location loc = entity.getLocation(); - Location loc = entity.getLocation(); + double data = (((loc.getYaw() % 360) + 720 + 45) / 90) % 4; - double data = (((loc.getYaw() % 360) + 720 + 45) / 90) % 4; - - if (data % 2 == 0) { if (data % 2 == 0) { - doubles.write(3, loc.getZ()); - } else { - doubles.write(1, loc.getZ()); + if (data % 2 == 0) { + doubles.write(3, loc.getZ()); + } else { + doubles.write(1, loc.getZ()); + } + } + + double y = DisguiseUtilities.getYModifier(entity, disguise); + + if (y != 0) { + doubles.write(2, doubles.read(2) + y); } } - - double y = DisguiseUtilities.getYModifier(entity, disguise); - - if (y != 0) { - doubles.write(2, doubles.read(2) + y); - } } - } } } 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 f220d60d..feb33299 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 @@ -303,11 +303,21 @@ public class PacketHandlerSpawn implements IPacketHandler { disguise.getWatcher())); } else if (disguise.getType().isMisc()) { int data = ((MiscDisguise) disguise).getData(); + double x = loc.getX(); + double y = loc.getY(); + double z = loc.getZ(); if (disguise.getType() == DisguiseType.FALLING_BLOCK) { ItemStack block = ((FallingBlockWatcher) disguise.getWatcher()).getBlock(); data = ReflectionManager.getCombinedIdByItemStack(block); + + if (((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) { + // Center the block + x = loc.getBlockX() + 0.5; + y = loc.getBlockY(); + z = loc.getBlockZ() + 0.5; + } } else if (disguise.getType() == DisguiseType.FISHING_HOOK && data == -1) { // If the MiscDisguise data isn't set. Then no entity id was provided, so default to the owners // entity id @@ -318,8 +328,8 @@ public class PacketHandlerSpawn implements IPacketHandler { Object entityType = ReflectionManager.getEntityType(disguise.getType().getEntityType()); - Object[] params = new Object[]{disguisedEntity.getEntityId(), disguisedEntity.getUniqueId(), loc.getX(), - loc.getY(), loc.getZ(), loc.getPitch(), loc.getYaw(), entityType, data, + Object[] params = new Object[]{disguisedEntity.getEntityId(), disguisedEntity.getUniqueId(), x, y, z, + loc.getPitch(), loc.getYaw(), entityType, data, ReflectionManager.getVec3D(disguisedEntity.getVelocity())}; PacketContainer spawnEntity = ProtocolLibrary.getProtocolManager()