Add setGridLocked to falling block disguise
This commit is contained in:
parent
6c93866122
commit
cc4156f914
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()
|
||||
|
Loading…
Reference in New Issue
Block a user