diff --git a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java b/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java index dedf2208..ebe19d02 100644 --- a/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java +++ b/src/main/java/me/libraryaddict/disguise/disguisetypes/FlagWatcher.java @@ -62,6 +62,8 @@ public class FlagWatcher { private Float pitchLock; @Getter private Float yawLock; + @Getter + private float yModifier; public FlagWatcher(Disguise disguise) { this.disguise = (TargetedDisguise) disguise; @@ -80,11 +82,41 @@ public class FlagWatcher { setPitchLock(pitchLocked ? 0F : null); } + public void setYModifier(float yModifier) { + if (!DisguiseConfig.isMovementPacketsEnabled()) { + return; + } + + double diff = yModifier - getYModifier(); + + this.yModifier = yModifier; + + if (!getDisguise().isDisguiseInUse()) { + return; + } + + PacketContainer packet = ProtocolLibrary.getProtocolManager() + .createPacketConstructor(Server.ENTITY_TELEPORT, getDisguise().getEntity()) + .createPacket(getDisguise().getEntity()); + + try { + for (Player player : DisguiseUtilities.getPerverts(getDisguise())) { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); + } + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + public boolean isYawLocked() { return yawLock != null; } public void setYawLocked(boolean yawLocked) { + if (!DisguiseConfig.isMovementPacketsEnabled()) { + return; + } + if (isYawLocked() == yawLocked) { return; } @@ -93,6 +125,10 @@ public class FlagWatcher { } public void setPitchLock(Float pitch) { + if (!DisguiseConfig.isMovementPacketsEnabled()) { + return; + } + this.pitchLock = pitch; if (!getDisguise().isDisguiseInUse()) { diff --git a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java index 77bca506..5bffa9fe 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/DisguiseUtilities.java @@ -2311,8 +2311,6 @@ public class DisguiseUtilities { } } - Location loc = player.getLocation(); - // Resend any active potion effects for (PotionEffect potionEffect : player.getActivePotionEffects()) { Object mobEffect = ReflectionManager.createMobEffect(potionEffect); @@ -2939,7 +2937,7 @@ public class DisguiseUtilities { Location loc = disguise.getEntity().getLocation(); packet.getDoubles().write(0, loc.getX()); - packet.getDoubles().write(1, loc.getY() + height + (0.28 * i)); + packet.getDoubles().write(1, loc.getY() + height + disguise.getWatcher().getYModifier() + (0.28 * i)); packet.getDoubles().write(2, loc.getZ()); packets.add(packet); diff --git a/src/main/java/me/libraryaddict/disguise/utilities/listeners/PlayerSkinHandler.java b/src/main/java/me/libraryaddict/disguise/utilities/listeners/PlayerSkinHandler.java index 0f3f16ec..f66fe3a6 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/listeners/PlayerSkinHandler.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/listeners/PlayerSkinHandler.java @@ -235,7 +235,7 @@ public class PlayerSkinHandler implements Listener { PacketContainer teleport = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT); StructureModifier mods = teleport.getModifier(); - Location loc = disguise.getEntity().getLocation(); + Location loc = disguise.getEntity().getLocation().add(0, disguise.getWatcher().getYModifier(), 0); Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null; Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null; 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 ec9693c4..e956fc56 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 @@ -81,6 +81,8 @@ public class PacketHandlerMovement implements IPacketHandler { return; } + double yMod = disguise.getWatcher().getYModifier(); + // If falling block should be appearing in center of blocks if (disguise.getType() == DisguiseType.FALLING_BLOCK && ((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) { @@ -91,11 +93,10 @@ public class PacketHandlerMovement implements IPacketHandler { } PacketContainer movePacket = sentPacket.shallowClone(); + Location loc = entity.getLocation(); // If not relational movement if (movePacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) { - Location loc = entity.getLocation(); - StructureModifier doubles = movePacket.getDoubles(); // Center the block doubles.write(0, loc.getBlockX() + 0.5); @@ -104,29 +105,27 @@ public class PacketHandlerMovement implements IPacketHandler { y += (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0); - doubles.write(1, y); + doubles.write(1, y + yMod); doubles.write(2, loc.getBlockZ() + 0.5); } else { StructureModifier shorts = movePacket.getShorts(); - Location origLoc = entity.getLocation(); Vector diff = new Vector(shorts.read(0) / 4096D, shorts.read(1) / 4096D, shorts.read(2) / 4096D); - Location newLoc = origLoc.clone().subtract(diff); + Location newLoc = loc.clone().subtract(diff); - double origY = - origLoc.getBlockY() + (origLoc.getY() % 1 >= 0.85 ? 1 : origLoc.getY() % 1 >= 0.35 ? .5 : 0); + double origY = loc.getBlockY() + (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0); double newY = newLoc.getBlockY() + (newLoc.getY() % 1 >= 0.85 ? 1 : newLoc.getY() % 1 >= 0.35 ? .5 : 0); - boolean sameBlock = origLoc.getBlockX() == newLoc.getBlockX() && newY == origY && - origLoc.getBlockZ() == newLoc.getBlockZ(); + boolean sameBlock = + loc.getBlockX() == newLoc.getBlockX() && newY == origY && loc.getBlockZ() == newLoc.getBlockZ(); if (sameBlock) { // Make no modifications but don't send anything return; } else { - shorts.write(0, conRel(origLoc.getBlockX(), newLoc.getBlockX())); + shorts.write(0, conRel(loc.getBlockX(), newLoc.getBlockX())); shorts.write(1, conRel(origY, newY)); - shorts.write(2, conRel(origLoc.getBlockZ(), newLoc.getBlockZ())); + shorts.write(2, conRel(loc.getBlockZ(), newLoc.getBlockZ())); } } @@ -186,7 +185,6 @@ public class PacketHandlerMovement implements IPacketHandler { pitchValue = DisguiseUtilities.getPitch(disguise.getType(), pitchValue); } else { pitchValue = DisguiseUtilities.getPitch(disguise.getType(), entity.getType(), pitchValue); - } if (yawLock != null) { @@ -242,6 +240,21 @@ public class PacketHandlerMovement implements IPacketHandler { movePacket.getBooleans().write(0, false); } + + if (yMod != 0 && sentPacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) { + PacketContainer packet = packets.getPackets().get(0); + + if (packet == sentPacket) { + packet = packet.shallowClone(); + + packets.clear(); + packets.addPacket(packet); + } + + StructureModifier doubles = packet.getDoubles(); + + doubles.write(1, doubles.read(1) + yMod); + } } } } 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 1275eddc..d2a5923f 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 @@ -103,7 +103,8 @@ public class PacketHandlerSpawn implements IPacketHandler { } } - Location loc = disguisedEntity.getLocation().clone().add(0, DisguiseUtilities.getYModifier(disguise), 0); + Location loc = disguisedEntity.getLocation().clone() + .add(0, DisguiseUtilities.getYModifier(disguise) + disguise.getWatcher().getYModifier(), 0); Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null; Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null; @@ -350,9 +351,12 @@ public class PacketHandlerSpawn implements IPacketHandler { } if (((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) { + double yMod = disguise.getWatcher().getYModifier(); + y -= yMod; + // Center the block x = loc.getBlockX() + 0.5; - y = loc.getBlockY() + (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0); + y = Math.floor(y) + yMod + (y % 1 >= 0.85 ? 1 : y % 1 >= 0.35 ? .5 : 0); z = loc.getBlockZ() + 0.5; } } else if (disguise.getType() == DisguiseType.FISHING_HOOK && data == -1) { diff --git a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePermissions.java b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePermissions.java index cc8ad51e..ac55c097 100644 --- a/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePermissions.java +++ b/src/main/java/me/libraryaddict/disguise/utilities/parser/DisguisePermissions.java @@ -5,6 +5,7 @@ import me.libraryaddict.disguise.disguisetypes.DisguiseType; import org.bukkit.entity.Ageable; import org.bukkit.entity.Animals; import org.bukkit.entity.Monster; +import org.bukkit.entity.Player; import org.bukkit.permissions.Permissible; import org.bukkit.permissions.PermissionAttachmentInfo; @@ -44,7 +45,7 @@ public class DisguisePermissions { private boolean wildcardCommand; public ParsedPermission(DisguisePerm[] disguisePerm, HashMap options, byte inheritance, - boolean wildcardCommand) { + boolean wildcardCommand) { this.disguisePerm = new Vector<>(Arrays.asList(disguisePerm)); this.options = options; this.inheritance = inheritance; @@ -381,6 +382,11 @@ public class DisguisePermissions { storage.negatedOptions.add("setinvisible"); } + if (sender instanceof Player && !sender.isOp()) { + storage.permittedOptions.remove("setYModifier"); + storage.negatedOptions.add("setYModifier"); + } + disguises.add(storage); } } @@ -474,7 +480,8 @@ public class DisguisePermissions { } // If the user is using a forbidden option, return false. Otherwise true - return disguiseOptions.stream().noneMatch(option -> storage.negatedOptions.contains(option.toLowerCase(Locale.ENGLISH))); + return disguiseOptions.stream() + .noneMatch(option -> storage.negatedOptions.contains(option.toLowerCase(Locale.ENGLISH))); } public boolean isAllowedDisguise(DisguisePerm disguisePerm) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 89c62f97..5c8f9413 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -210,7 +210,7 @@ NameAboveHeadAlwaysVisible: true # Two placeholders can be used. # %simple% = The very basic name, 'libraryaddict' # %complex% = Name will be grabbed from scoreboard or display name if scoreboard fails. -NameAboveDisguise: %complex% +NameAboveDisguise: '%complex%' # This modifies the bounding box, This is stuff like can a arrow hit them. # If you turn this to true, arrows will act like they hit the disguise in the right place!