From f54b7e8db55c42390c796f225869efd3a4fee9c1 Mon Sep 17 00:00:00 2001 From: Alex 'mcmonkey' Goodwin Date: Sun, 18 Oct 2020 03:49:56 -0700 Subject: [PATCH] rename per_player: partial player-type entity support --- .../nms/v1_16/helpers/PacketHelperImpl.java | 4 ++ .../nms/v1_16/impl/ProfileEditorImpl.java | 38 ++++++++++++------- .../handlers/DenizenNetworkManagerImpl.java | 3 +- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/PacketHelperImpl.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/PacketHelperImpl.java index 4e28e767e1..64fdfade16 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/PacketHelperImpl.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/PacketHelperImpl.java @@ -278,6 +278,10 @@ public void forceSpectate(Player player, Entity entity) { @Override public void sendRename(Player player, Entity entity, String name) { try { + if (entity.getType() == EntityType.PLAYER) { + // TODO: player rename somehow + return; + } PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(); ENTITY_METADATA_EID_SETTER.invoke(packet, entity.getEntityId()); List> list = new ArrayList<>(); diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/ProfileEditorImpl.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/ProfileEditorImpl.java index 3af1a91228..7d572ad2e8 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/ProfileEditorImpl.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/ProfileEditorImpl.java @@ -3,6 +3,7 @@ import com.denizenscript.denizen.nms.abstracts.ProfileEditor; import com.denizenscript.denizen.nms.v1_16.helpers.PacketHelperImpl; import com.denizenscript.denizen.nms.v1_16.impl.network.handlers.DenizenNetworkManagerImpl; +import com.denizenscript.denizen.scripts.commands.entity.RenameCommand; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.denizenscript.denizen.nms.NMSHandler; @@ -17,6 +18,7 @@ import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; +import java.lang.invoke.MethodHandle; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.util.List; @@ -46,8 +48,7 @@ public void run() { } else { if (isSkinChanging) { - ((CraftServer) Bukkit.getServer()).getHandle().moveToWorld( - entityPlayer, (WorldServer) entityPlayer.world, true, player.getLocation(), false); + ((CraftServer) Bukkit.getServer()).getHandle().moveToWorld(entityPlayer, (WorldServer) entityPlayer.world, true, player.getLocation(), false); } player.updateInventory(); } @@ -56,8 +57,8 @@ public void run() { }.runTaskLater(NMSHandler.getJavaPlugin(), 5); } - public static boolean handleMirrorProfiles(PacketPlayOutPlayerInfo packet, DenizenNetworkManagerImpl manager) { - if (ProfileEditor.mirrorUUIDs.isEmpty()) { + public static boolean handleAlteredProfiles(PacketPlayOutPlayerInfo packet, DenizenNetworkManagerImpl manager) { + if (ProfileEditor.mirrorUUIDs.isEmpty() && !RenameCommand.hasAnyDynamicRenames()) { return true; } PacketPlayOutPlayerInfo.EnumPlayerInfoAction action = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "a", packet); @@ -72,7 +73,7 @@ public static boolean handleMirrorProfiles(PacketPlayOutPlayerInfo packet, Deniz boolean any = false; for (Object data : dataList) { GameProfile gameProfile = (GameProfile) playerInfoData_gameProfile.get(data); - if (ProfileEditor.mirrorUUIDs.contains(gameProfile.getId())) { + if (ProfileEditor.mirrorUUIDs.contains(gameProfile.getId()) || RenameCommand.customNames.containsKey(gameProfile.getId())) { any = true; } } @@ -82,19 +83,24 @@ public static boolean handleMirrorProfiles(PacketPlayOutPlayerInfo packet, Deniz GameProfile ownProfile = manager.player.getProfile(); for (Object data : dataList) { GameProfile gameProfile = (GameProfile) playerInfoData_gameProfile.get(data); - if (!ProfileEditor.mirrorUUIDs.contains(gameProfile.getId())) { + if (!ProfileEditor.mirrorUUIDs.contains(gameProfile.getId()) && !RenameCommand.customNames.containsKey(gameProfile.getId())) { PacketPlayOutPlayerInfo newPacket = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER); List newPacketDataList = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "b", newPacket); newPacketDataList.add(data); manager.oldManager.sendPacket(newPacket); } else { + String rename = RenameCommand.getCustomNameFor(gameProfile.getId(), manager.player.getBukkitEntity()); PacketPlayOutPlayerInfo newPacket = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER); List newPacketDataList = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "b", newPacket); - GameProfile patchedProfile = new GameProfile(gameProfile.getId(), gameProfile.getName()); - patchedProfile.getProperties().putAll(ownProfile.getProperties()); - Object newData = playerInfoData_construct.newInstance(newPacket, patchedProfile, - playerInfoData_latency.getInt(data), playerInfoData_gamemode.get(data), playerInfoData_displayName.get(data)); + GameProfile patchedProfile = new GameProfile(gameProfile.getId(), rename != null ? rename : gameProfile.getName()); + if (ProfileEditor.mirrorUUIDs.contains(gameProfile.getId())) { + patchedProfile.getProperties().putAll(ownProfile.getProperties()); + } + else { + patchedProfile.getProperties().putAll(gameProfile.getProperties()); + } + Object newData = playerInfoData_construct.newInstance(newPacket, patchedProfile, playerInfoData_latency.getInt(data), playerInfoData_gamemode.get(data), playerInfoData_displayName.get(data)); newPacketDataList.add(newData); manager.oldManager.sendPacket(newPacket); } @@ -118,11 +124,11 @@ public static void updatePlayerProfiles(PacketPlayOutPlayerInfo packet) { for (Object data : dataList) { GameProfile gameProfile = (GameProfile) playerInfoData_gameProfile.get(data); if (fakeProfiles.containsKey(gameProfile.getId())) { - playerInfoData_gameProfile.set(data, getGameProfile(fakeProfiles.get(gameProfile.getId()))); + playerInfoData_gameProfile_Setter.invoke(data, getGameProfile(fakeProfiles.get(gameProfile.getId()))); } } } - catch (Exception e) { + catch (Throwable e) { Debug.echoError(e); } } @@ -130,11 +136,12 @@ public static void updatePlayerProfiles(PacketPlayOutPlayerInfo packet) { private static GameProfile getGameProfile(PlayerProfile playerProfile) { GameProfile gameProfile = new GameProfile(playerProfile.getUniqueId(), playerProfile.getName()); - gameProfile.getProperties().put("textures", - new Property("textures", playerProfile.getTexture(), playerProfile.getTextureSignature())); + gameProfile.getProperties().put("textures", new Property("textures", playerProfile.getTexture(), playerProfile.getTextureSignature())); return gameProfile; } + public static Field PLAYER_INFO_PLAYERDATA_LIST = ReflectionHelper.getFields(PacketPlayOutPlayerInfo.class).get("b"); + public static final Class playerInfoData; public static final Field playerInfoData_latency, @@ -142,6 +149,8 @@ private static GameProfile getGameProfile(PlayerProfile playerProfile) { playerInfoData_gameProfile, playerInfoData_displayName; + public static final MethodHandle playerInfoData_gameProfile_Setter; + public static final Constructor playerInfoData_construct; static { @@ -175,5 +184,6 @@ private static GameProfile getGameProfile(PlayerProfile playerProfile) { playerInfoData_gameProfile = pidGameProfile; playerInfoData_displayName = pidDisplayName; playerInfoData_construct = pidConstruct; + playerInfoData_gameProfile_Setter = ReflectionHelper.getFinalSetter(pid, "d"); } } diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/handlers/DenizenNetworkManagerImpl.java index 74f7cf5278..d4c6b54a15 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -174,7 +174,6 @@ public void sendPacket(Packet packet, GenericFutureListener packet) { if (packet instanceof PacketPlayOutPlayerInfo) { PacketPlayOutPlayerInfo playerInfo = (PacketPlayOutPlayerInfo) packet; - if (!ProfileEditorImpl.handleMirrorProfiles(playerInfo, this)) { + if (!ProfileEditorImpl.handleAlteredProfiles(playerInfo, this)) { return true; } ProfileEditorImpl.updatePlayerProfiles(playerInfo);