Fixed falling block grid lock, improved player disguises skins a ton

This commit is contained in:
libraryaddict 2020-10-07 08:21:21 +13:00
parent bea34b18c2
commit dff3e23821
8 changed files with 148 additions and 44 deletions

View File

@ -52,7 +52,7 @@ public class LibsDisguises extends JavaPlugin {
@Getter @Getter
private final UpdateChecker updateChecker = new UpdateChecker(); private final UpdateChecker updateChecker = new UpdateChecker();
@Getter @Getter
private final PlayerSkinHandler skinHandler = new PlayerSkinHandler(); private PlayerSkinHandler skinHandler;
@Override @Override
public void onLoad() { public void onLoad() {
@ -178,6 +178,7 @@ public class LibsDisguises extends JavaPlugin {
PacketsManager.addPacketListeners(); PacketsManager.addPacketListeners();
listener = new DisguiseListener(this); listener = new DisguiseListener(this);
skinHandler = new PlayerSkinHandler();
Bukkit.getPluginManager().registerEvents(getSkinHandler(), LibsDisguises.getInstance()); Bukkit.getPluginManager().registerEvents(getSkinHandler(), LibsDisguises.getInstance());

View File

@ -3025,7 +3025,8 @@ public class DisguiseUtilities {
/** /**
* Get the Y level to add to the disguise for realism. * Get the Y level to add to the disguise for realism.
*/ */
public static double getYModifier(Entity entity, Disguise disguise) { public static double getYModifier(Disguise disguise) {
Entity entity = disguise.getEntity();
double yMod = 0; double yMod = 0;
if (disguise.getType() != DisguiseType.PLAYER && entity.getType() == EntityType.DROPPED_ITEM) { if (disguise.getType() != DisguiseType.PLAYER && entity.getType() == EntityType.DROPPED_ITEM) {

View File

@ -4,6 +4,7 @@ import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.PacketType.Play.Server; import com.comphenix.protocol.PacketType.Play.Server;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.reflect.StructureModifier;
import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.EnumWrappers;
import com.google.common.cache.Cache; import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
@ -11,12 +12,15 @@ import com.google.common.cache.RemovalCause;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
import me.libraryaddict.disguise.DisguiseAPI;
import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.DisguiseConfig;
import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.LibsDisguises;
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise; import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
import me.libraryaddict.disguise.events.UndisguiseEvent; import me.libraryaddict.disguise.events.UndisguiseEvent;
import me.libraryaddict.disguise.utilities.DisguiseUtilities; import me.libraryaddict.disguise.utilities.DisguiseUtilities;
import me.libraryaddict.disguise.utilities.packets.LibsPackets; import me.libraryaddict.disguise.utilities.packets.LibsPackets;
import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -84,6 +88,15 @@ public class PlayerSkinHandler implements Listener {
skins.clear(); skins.clear();
}).build(); }).build();
public PlayerSkinHandler() {
new BukkitRunnable() {
@Override
public void run() {
getCache().asMap().forEach((key, value) -> doTeleport(key, value));
}
}.runTaskTimer(LibsDisguises.getInstance(), 1, 1);
}
public PlayerSkin addPlayerSkin(Player player, PlayerDisguise disguise) { public PlayerSkin addPlayerSkin(Player player, PlayerDisguise disguise) {
tryProcess(player, false); tryProcess(player, false);
@ -101,7 +114,53 @@ public class PlayerSkinHandler implements Listener {
return toReturn; return toReturn;
} }
private void doTeleport(Player player, List<PlayerSkin> value) {
if (player == null || !player.isOnline()) {
return;
}
Location loc = player.getLocation();
loc.add(loc.getDirection().normalize().multiply(10));
PacketContainer packet = new PacketContainer(Server.ENTITY_TELEPORT);
packet.getModifier().write(1, loc.getX());
packet.getModifier().write(2, loc.getY());
packet.getModifier().write(3, loc.getZ());
for (PlayerSkin skin : value) {
if (!skin.isSleepPackets()) {
continue;
}
PlayerDisguise disguise = skin.getDisguise().get();
if (disguise == null || !disguise.isDisguiseInUse()) {
continue;
}
packet = packet.shallowClone();
int id = disguise.getEntity().getEntityId();
if (id == player.getEntityId()) {
id = DisguiseAPI.getSelfDisguiseId();
}
packet.getModifier().write(0, id);
try {
ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, false);
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
public void handlePackets(Player player, PlayerDisguise disguise, LibsPackets packets) { public void handlePackets(Player player, PlayerDisguise disguise, LibsPackets packets) {
if (packets.getPackets().stream().anyMatch(p -> p.getType() == Server.NAMED_ENTITY_SPAWN)) {
return;
}
List<PlayerSkin> skins = getCache().getIfPresent(player); List<PlayerSkin> skins = getCache().getIfPresent(player);
if (skins == null) { if (skins == null) {
@ -170,6 +229,49 @@ public class PlayerSkinHandler implements Listener {
} }
} }
private void addTeleport(Player player, PlayerSkin skin) {
PlayerDisguise disguise = skin.getDisguise().get();
PacketContainer teleport = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT);
StructureModifier<Object> mods = teleport.getModifier();
Location loc = disguise.getEntity().getLocation();
Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null;
Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null;
byte yaw = (byte) (int) ((yawLock == null ? loc.getYaw() : yawLock) * 256.0F / 360.0F);
byte pitch = (byte) (int) ((pitchLock == null ? loc.getPitch() : pitchLock) * 256.0F / 360.0F);
if (DisguiseConfig.isMovementPacketsEnabled()) {
if (yawLock == null) {
yaw = DisguiseUtilities.getYaw(DisguiseType.getType(disguise.getEntity().getType()), yaw);
}
if (pitchLock == null) {
pitch = DisguiseUtilities.getPitch(DisguiseType.getType(disguise.getEntity().getType()), pitch);
}
yaw = DisguiseUtilities.getYaw(disguise.getType(), yaw);
pitch = DisguiseUtilities.getPitch(disguise.getType(), pitch);
}
int id = disguise.getEntity().getEntityId();
if (id == player.getEntityId()) {
id = DisguiseAPI.getSelfDisguiseId();
}
mods.write(0, id);
mods.write(1, loc.getX());
mods.write(2, loc.getY() + DisguiseUtilities.getYModifier(disguise));
mods.write(3, loc.getZ());
mods.write(4, yaw);
mods.write(5, pitch);
skin.getSleptPackets().computeIfAbsent(0, (a) -> new ArrayList<>()).add(teleport);
}
private void doPacketRemoval(Player player, PlayerSkin skin) { private void doPacketRemoval(Player player, PlayerSkin skin) {
PlayerDisguise disguise = skin.getDisguise().get(); PlayerDisguise disguise = skin.getDisguise().get();
@ -177,6 +279,10 @@ public class PlayerSkinHandler implements Listener {
return; return;
} }
if (skin.isSleepPackets()) {
addTeleport(player, skin);
}
try { try {
for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : skin.getSleptPackets().entrySet()) { for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : skin.getSleptPackets().entrySet()) {
if (entry.getKey() == 0) { if (entry.getKey() == 0) {

View File

@ -19,7 +19,10 @@ import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** /**
* Created by libraryaddict on 3/01/2019. * Created by libraryaddict on 3/01/2019.

View File

@ -28,6 +28,11 @@ public class PacketHandlerHeadRotation implements IPacketHandler {
@Override @Override
public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer, public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer,
Entity entity) { Entity entity) {
if (disguise.getType() == DisguiseType.FALLING_BLOCK) {
packets.clear();
return;
}
Float pitchLock = disguise.getWatcher().getPitchLock(); Float pitchLock = disguise.getWatcher().getPitchLock();
Float yawLock = disguise.getWatcher().getYawLock(); Float yawLock = disguise.getWatcher().getYawLock();
boolean riding = observer.getVehicle() == entity; boolean riding = observer.getVehicle() == entity;

View File

@ -82,15 +82,31 @@ public class PacketHandlerMovement implements IPacketHandler {
} }
// If falling block should be appearing in center of blocks // If falling block should be appearing in center of blocks
if (sentPacket.getType() != PacketType.Play.Server.ENTITY_LOOK && if (disguise.getType() == DisguiseType.FALLING_BLOCK &&
disguise.getType() == DisguiseType.FALLING_BLOCK &&
((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) { ((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) {
packets.clear(); packets.clear();
if (sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK) {
return;
}
PacketContainer movePacket = sentPacket.shallowClone(); PacketContainer movePacket = sentPacket.shallowClone();
// If relational movement // If not relational movement
if (sentPacket.getType() != PacketType.Play.Server.ENTITY_TELEPORT) { if (movePacket.getType() == PacketType.Play.Server.ENTITY_TELEPORT) {
Location loc = entity.getLocation();
StructureModifier<Double> doubles = movePacket.getDoubles();
// Center the block
doubles.write(0, loc.getBlockX() + 0.5);
double y = loc.getBlockY();
y += (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0);
doubles.write(1, y);
doubles.write(2, loc.getBlockZ() + 0.5);
} else {
StructureModifier<Short> shorts = movePacket.getShorts(); StructureModifier<Short> shorts = movePacket.getShorts();
Location origLoc = entity.getLocation(); Location origLoc = entity.getLocation();
@ -112,22 +128,10 @@ public class PacketHandlerMovement implements IPacketHandler {
shorts.write(1, conRel(origY, newY)); shorts.write(1, conRel(origY, newY));
shorts.write(2, conRel(origLoc.getBlockZ(), newLoc.getBlockZ())); shorts.write(2, conRel(origLoc.getBlockZ(), newLoc.getBlockZ()));
} }
} else {
Location loc = entity.getLocation();
StructureModifier<Double> doubles = movePacket.getDoubles();
// Center the block
doubles.write(0, loc.getBlockX() + 0.5);
double y = loc.getBlockY();
y += (loc.getY() % 1 >= 0.85 ? 1 : loc.getY() % 1 >= 0.35 ? .5 : 0);
doubles.write(1, y);
doubles.write(2, loc.getBlockZ() + 0.5);
} }
packets.addPacket(movePacket); packets.addPacket(movePacket);
return;
} else if (disguise.getType() == DisguiseType.RABBIT && } else if (disguise.getType() == DisguiseType.RABBIT &&
(sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE || (sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE ||
sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE_LOOK)) { sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE_LOOK)) {
@ -220,7 +224,7 @@ public class PacketHandlerMovement implements IPacketHandler {
} }
} }
double y = DisguiseUtilities.getYModifier(entity, disguise); double y = DisguiseUtilities.getYModifier(disguise);
if (y != 0) { if (y != 0) {
doubles.write(2, doubles.read(2) + y); doubles.write(2, doubles.read(2) + y);

View File

@ -103,8 +103,7 @@ public class PacketHandlerSpawn implements IPacketHandler {
} }
} }
Location loc = disguisedEntity.getLocation().clone() Location loc = disguisedEntity.getLocation().clone().add(0, DisguiseUtilities.getYModifier(disguise), 0);
.add(0, DisguiseUtilities.getYModifier(disguisedEntity, disguise), 0);
Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null; Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null;
Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null; Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null;
@ -123,7 +122,6 @@ public class PacketHandlerSpawn implements IPacketHandler {
yaw = DisguiseUtilities.getYaw(disguise.getType(), yaw); yaw = DisguiseUtilities.getYaw(disguise.getType(), yaw);
pitch = DisguiseUtilities.getPitch(disguise.getType(), pitch); pitch = DisguiseUtilities.getPitch(disguise.getType(), pitch);
} }
if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) { if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) {
@ -213,14 +211,14 @@ public class PacketHandlerSpawn implements IPacketHandler {
double dist = observer.getLocation().distanceSquared(disguisedEntity.getLocation()); double dist = observer.getLocation().distanceSquared(disguisedEntity.getLocation());
// If self disguise, or further than 50 blocks, or not in front of entity // If self disguise, or further than 50 blocks, or not in front of entity
boolean spawnFarAway = observer == disguisedEntity || dist > (50 * 50) || boolean normalPlayerDisguise = observer == disguisedEntity || dist > (50 * 50) ||
(observer.getLocation().add(observer.getLocation().getDirection().normalize()) (observer.getLocation().add(observer.getLocation().getDirection().normalize())
.distanceSquared(disguisedEntity.getLocation()) - dist) < 0.3; .distanceSquared(disguisedEntity.getLocation()) - dist) < 0.3;
skin.setSleepPackets(!spawnFarAway); skin.setSleepPackets(!normalPlayerDisguise);
Location spawnAt = spawnFarAway ? disguisedEntity.getLocation() : Location spawnAt = normalPlayerDisguise ? disguisedEntity.getLocation() :
observer.getLocation().add(observer.getLocation().getDirection().normalize().multiply(50)); observer.getLocation().add(observer.getLocation().getDirection().normalize().multiply(10));
// Spawn him in front of the observer // Spawn him in front of the observer
StructureModifier<Double> doubles = spawnPlayer.getDoubles(); StructureModifier<Double> doubles = spawnPlayer.getDoubles();
@ -240,7 +238,7 @@ public class PacketHandlerSpawn implements IPacketHandler {
WrappedDataWatcher toSend = dataWatcher; WrappedDataWatcher toSend = dataWatcher;
if (!spawnFarAway) { if (!normalPlayerDisguise) {
toSend = new WrappedDataWatcher(); toSend = new WrappedDataWatcher();
WrappedDataWatcher.WrappedDataWatcherObject obj = WrappedDataWatcher.WrappedDataWatcherObject obj =
ReflectionManager.createDataWatcherObject(MetaIndex.ENTITY_META, (byte) 32); ReflectionManager.createDataWatcherObject(MetaIndex.ENTITY_META, (byte) 32);
@ -259,23 +257,11 @@ public class PacketHandlerSpawn implements IPacketHandler {
spawnPlayer.getDataWatcherModifier().write(0, toSend); spawnPlayer.getDataWatcherModifier().write(0, toSend);
} }
if (!spawnFarAway) { if (!normalPlayerDisguise) {
PacketContainer metaPacket = ProtocolLibrary.getProtocolManager() PacketContainer metaPacket = ProtocolLibrary.getProtocolManager()
.createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, entityId, dataWatcher, true) .createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, entityId, dataWatcher, true)
.createPacket(entityId, dataWatcher, true); .createPacket(entityId, dataWatcher, true);
PacketContainer teleport = new PacketContainer(PacketType.Play.Server.ENTITY_TELEPORT);
StructureModifier<Object> mods = teleport.getModifier();
mods.write(0, disguisedEntity.getEntityId());
mods.write(1, loc.getX());
mods.write(2, loc.getY());
mods.write(3, loc.getZ());
mods.write(4, yaw);
mods.write(5, pitch);
skin.getSleptPackets().computeIfAbsent(0, (a) -> new ArrayList<>()).add(teleport);
skin.getSleptPackets().computeIfAbsent(4, (a) -> new ArrayList<>()).add(metaPacket); skin.getSleptPackets().computeIfAbsent(4, (a) -> new ArrayList<>()).add(metaPacket);
} }
} else if (disguise.isMobDisguise() || disguise.getType() == DisguiseType.ARMOR_STAND) { } else if (disguise.isMobDisguise() || disguise.getType() == DisguiseType.ARMOR_STAND) {

View File

@ -1,6 +1,5 @@
package me.libraryaddict.disguise.utilities.packets.packetlisteners; package me.libraryaddict.disguise.utilities.packets.packetlisteners;
import com.comphenix.protocol.PacketType;
import com.comphenix.protocol.PacketType.Play.Server; import com.comphenix.protocol.PacketType.Play.Server;
import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.ListenerPriority;
@ -19,7 +18,6 @@ import me.libraryaddict.disguise.utilities.LibsPremium;
import me.libraryaddict.disguise.utilities.packets.LibsPackets; import me.libraryaddict.disguise.utilities.packets.LibsPackets;
import me.libraryaddict.disguise.utilities.packets.PacketsManager; import me.libraryaddict.disguise.utilities.packets.PacketsManager;
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;