Fixed falling block grid lock, improved player disguises skins a ton
This commit is contained in:
parent
bea34b18c2
commit
dff3e23821
@ -52,7 +52,7 @@ public class LibsDisguises extends JavaPlugin {
|
||||
@Getter
|
||||
private final UpdateChecker updateChecker = new UpdateChecker();
|
||||
@Getter
|
||||
private final PlayerSkinHandler skinHandler = new PlayerSkinHandler();
|
||||
private PlayerSkinHandler skinHandler;
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
@ -178,6 +178,7 @@ public class LibsDisguises extends JavaPlugin {
|
||||
PacketsManager.addPacketListeners();
|
||||
|
||||
listener = new DisguiseListener(this);
|
||||
skinHandler = new PlayerSkinHandler();
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(getSkinHandler(), LibsDisguises.getInstance());
|
||||
|
||||
|
@ -3025,7 +3025,8 @@ public class DisguiseUtilities {
|
||||
/**
|
||||
* 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;
|
||||
|
||||
if (disguise.getType() != DisguiseType.PLAYER && entity.getType() == EntityType.DROPPED_ITEM) {
|
||||
|
@ -4,6 +4,7 @@ import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.PacketType.Play.Server;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.PacketContainer;
|
||||
import com.comphenix.protocol.reflect.StructureModifier;
|
||||
import com.comphenix.protocol.wrappers.EnumWrappers;
|
||||
import com.google.common.cache.Cache;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
@ -11,12 +12,15 @@ import com.google.common.cache.RemovalCause;
|
||||
import lombok.Getter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import me.libraryaddict.disguise.DisguiseAPI;
|
||||
import me.libraryaddict.disguise.DisguiseConfig;
|
||||
import me.libraryaddict.disguise.LibsDisguises;
|
||||
import me.libraryaddict.disguise.disguisetypes.DisguiseType;
|
||||
import me.libraryaddict.disguise.disguisetypes.PlayerDisguise;
|
||||
import me.libraryaddict.disguise.events.UndisguiseEvent;
|
||||
import me.libraryaddict.disguise.utilities.DisguiseUtilities;
|
||||
import me.libraryaddict.disguise.utilities.packets.LibsPackets;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
@ -84,6 +88,15 @@ public class PlayerSkinHandler implements Listener {
|
||||
skins.clear();
|
||||
}).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) {
|
||||
tryProcess(player, false);
|
||||
|
||||
@ -101,7 +114,53 @@ public class PlayerSkinHandler implements Listener {
|
||||
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) {
|
||||
if (packets.getPackets().stream().anyMatch(p -> p.getType() == Server.NAMED_ENTITY_SPAWN)) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<PlayerSkin> skins = getCache().getIfPresent(player);
|
||||
|
||||
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) {
|
||||
PlayerDisguise disguise = skin.getDisguise().get();
|
||||
|
||||
@ -177,6 +279,10 @@ public class PlayerSkinHandler implements Listener {
|
||||
return;
|
||||
}
|
||||
|
||||
if (skin.isSleepPackets()) {
|
||||
addTeleport(player, skin);
|
||||
}
|
||||
|
||||
try {
|
||||
for (Map.Entry<Integer, ArrayList<PacketContainer>> entry : skin.getSleptPackets().entrySet()) {
|
||||
if (entry.getKey() == 0) {
|
||||
|
@ -19,7 +19,10 @@ import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
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.
|
||||
|
@ -28,6 +28,11 @@ public class PacketHandlerHeadRotation implements IPacketHandler {
|
||||
@Override
|
||||
public void handle(Disguise disguise, PacketContainer sentPacket, LibsPackets packets, Player observer,
|
||||
Entity entity) {
|
||||
if (disguise.getType() == DisguiseType.FALLING_BLOCK) {
|
||||
packets.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
Float pitchLock = disguise.getWatcher().getPitchLock();
|
||||
Float yawLock = disguise.getWatcher().getYawLock();
|
||||
boolean riding = observer.getVehicle() == entity;
|
||||
|
@ -82,15 +82,31 @@ public class PacketHandlerMovement implements IPacketHandler {
|
||||
}
|
||||
|
||||
// If falling block should be appearing in center of blocks
|
||||
if (sentPacket.getType() != PacketType.Play.Server.ENTITY_LOOK &&
|
||||
disguise.getType() == DisguiseType.FALLING_BLOCK &&
|
||||
if (disguise.getType() == DisguiseType.FALLING_BLOCK &&
|
||||
((FallingBlockWatcher) disguise.getWatcher()).isGridLocked()) {
|
||||
packets.clear();
|
||||
|
||||
if (sentPacket.getType() == PacketType.Play.Server.ENTITY_LOOK) {
|
||||
return;
|
||||
}
|
||||
|
||||
PacketContainer movePacket = sentPacket.shallowClone();
|
||||
|
||||
// If relational movement
|
||||
if (sentPacket.getType() != PacketType.Play.Server.ENTITY_TELEPORT) {
|
||||
// If not relational movement
|
||||
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();
|
||||
|
||||
Location origLoc = entity.getLocation();
|
||||
@ -112,22 +128,10 @@ public class PacketHandlerMovement implements IPacketHandler {
|
||||
shorts.write(1, conRel(origY, newY));
|
||||
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);
|
||||
return;
|
||||
} else if (disguise.getType() == DisguiseType.RABBIT &&
|
||||
(sentPacket.getType() == PacketType.Play.Server.REL_ENTITY_MOVE ||
|
||||
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) {
|
||||
doubles.write(2, doubles.read(2) + y);
|
||||
|
@ -103,8 +103,7 @@ public class PacketHandlerSpawn implements IPacketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
Location loc = disguisedEntity.getLocation().clone()
|
||||
.add(0, DisguiseUtilities.getYModifier(disguisedEntity, disguise), 0);
|
||||
Location loc = disguisedEntity.getLocation().clone().add(0, DisguiseUtilities.getYModifier(disguise), 0);
|
||||
|
||||
Float pitchLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getPitchLock() : null;
|
||||
Float yawLock = DisguiseConfig.isMovementPacketsEnabled() ? disguise.getWatcher().getYawLock() : null;
|
||||
@ -123,7 +122,6 @@ public class PacketHandlerSpawn implements IPacketHandler {
|
||||
|
||||
yaw = DisguiseUtilities.getYaw(disguise.getType(), yaw);
|
||||
pitch = DisguiseUtilities.getPitch(disguise.getType(), pitch);
|
||||
|
||||
}
|
||||
|
||||
if (disguise.getType() == DisguiseType.EXPERIENCE_ORB) {
|
||||
@ -213,14 +211,14 @@ public class PacketHandlerSpawn implements IPacketHandler {
|
||||
double dist = observer.getLocation().distanceSquared(disguisedEntity.getLocation());
|
||||
|
||||
// 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())
|
||||
.distanceSquared(disguisedEntity.getLocation()) - dist) < 0.3;
|
||||
|
||||
skin.setSleepPackets(!spawnFarAway);
|
||||
skin.setSleepPackets(!normalPlayerDisguise);
|
||||
|
||||
Location spawnAt = spawnFarAway ? disguisedEntity.getLocation() :
|
||||
observer.getLocation().add(observer.getLocation().getDirection().normalize().multiply(50));
|
||||
Location spawnAt = normalPlayerDisguise ? disguisedEntity.getLocation() :
|
||||
observer.getLocation().add(observer.getLocation().getDirection().normalize().multiply(10));
|
||||
|
||||
// Spawn him in front of the observer
|
||||
StructureModifier<Double> doubles = spawnPlayer.getDoubles();
|
||||
@ -240,7 +238,7 @@ public class PacketHandlerSpawn implements IPacketHandler {
|
||||
|
||||
WrappedDataWatcher toSend = dataWatcher;
|
||||
|
||||
if (!spawnFarAway) {
|
||||
if (!normalPlayerDisguise) {
|
||||
toSend = new WrappedDataWatcher();
|
||||
WrappedDataWatcher.WrappedDataWatcherObject obj =
|
||||
ReflectionManager.createDataWatcherObject(MetaIndex.ENTITY_META, (byte) 32);
|
||||
@ -259,23 +257,11 @@ public class PacketHandlerSpawn implements IPacketHandler {
|
||||
spawnPlayer.getDataWatcherModifier().write(0, toSend);
|
||||
}
|
||||
|
||||
if (!spawnFarAway) {
|
||||
if (!normalPlayerDisguise) {
|
||||
PacketContainer metaPacket = ProtocolLibrary.getProtocolManager()
|
||||
.createPacketConstructor(PacketType.Play.Server.ENTITY_METADATA, 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);
|
||||
}
|
||||
} else if (disguise.isMobDisguise() || disguise.getType() == DisguiseType.ARMOR_STAND) {
|
||||
|
@ -1,6 +1,5 @@
|
||||
package me.libraryaddict.disguise.utilities.packets.packetlisteners;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.PacketType.Play.Server;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
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.PacketsManager;
|
||||
import me.libraryaddict.disguise.utilities.reflection.ReflectionManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
Loading…
Reference in New Issue
Block a user