Add setGridLocked to falling block disguise
This commit is contained in:
		
							
								
								
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|     <!-- A good example on why temporary names for project identification shouldn't be used --> | ||||
|     <groupId>LibsDisguises</groupId> | ||||
|     <artifactId>LibsDisguises</artifactId> | ||||
|     <version>9.8.3</version> | ||||
|     <version>9.8.3-SNAPSHOT</version> | ||||
|  | ||||
|     <build> | ||||
|         <defaultGoal>clean install</defaultGoal> | ||||
|   | ||||
| @@ -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<Short> 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; | ||||
|     } | ||||
|   | ||||
| @@ -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<Short> 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<Double> 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<Byte> 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<Byte> bytes = movePacket.getBytes(); | ||||
|  | ||||
|             StructureModifier<Byte> 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<Double> doubles = movePacket.getDoubles(); | ||||
|  | ||||
|             if (sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT && | ||||
|                     disguise.getType() == DisguiseType.ITEM_FRAME) { | ||||
|                 StructureModifier<Double> 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); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user