Add setGridLocked to falling block disguise
This commit is contained in:
		@@ -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