From bce4e96f5530c452c9a66d473950807a153b98be Mon Sep 17 00:00:00 2001 From: libraryaddict Date: Tue, 3 Jan 2023 08:01:40 +1300 Subject: [PATCH] Update how packet p[layer info is handled --- .../reflection/v1_17/ReflectionManager.java | 4 +- .../reflection/v1_18_1/ReflectionManager.java | 4 +- .../reflection/v1_18_2/ReflectionManager.java | 4 +- .../v1_19_R1/ReflectionManager.java | 4 +- .../v1_19_R2/ReflectionManager.java | 44 ++++++++++-- .../disguise/disguisetypes/Disguise.java | 6 +- .../disguisetypes/PlayerDisguise.java | 7 +- .../utilities/listeners/DisguiseListener.java | 4 +- .../utilities/packets/PacketsManager.java | 4 +- .../packethandlers/PacketHandlerSpawn.java | 4 +- .../PacketListenerTabList.java | 72 +++++++++---------- .../reflection/ReflectionManager.java | 25 +++---- .../reflection/ReflectionManagerAbstract.java | 7 +- 13 files changed, 105 insertions(+), 84 deletions(-) diff --git a/nms/v1_17_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_17/ReflectionManager.java b/nms/v1_17_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_17/ReflectionManager.java index fc56acb6..3aa14aed 100644 --- a/nms/v1_17_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_17/ReflectionManager.java +++ b/nms/v1_17_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_17/ReflectionManager.java @@ -235,14 +235,14 @@ public class ReflectionManager implements ReflectionManagerAbstract { } @Override - public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, EnumWrappers.PlayerInfoAction action, boolean nameVisible) { + public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, boolean nameVisible, EnumWrappers.PlayerInfoAction... actions) { ClientboundPlayerInfoPacket.PlayerUpdate entry = new ClientboundPlayerInfoPacket.PlayerUpdate((GameProfile) gameProfile.getHandle(), 0, GameType.SURVIVAL, new TextComponent(displayName)); PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); StructureModifier modifier = packet.getModifier(); - modifier.write(0, ClientboundPlayerInfoPacket.Action.valueOf(action.name())); + modifier.write(0, ClientboundPlayerInfoPacket.Action.valueOf(actions[0].name())); modifier.write(1, Collections.singletonList(entry)); return packet; diff --git a/nms/v1_18_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_18_1/ReflectionManager.java b/nms/v1_18_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_18_1/ReflectionManager.java index fa065c99..856706f5 100644 --- a/nms/v1_18_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_18_1/ReflectionManager.java +++ b/nms/v1_18_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_18_1/ReflectionManager.java @@ -235,14 +235,14 @@ public class ReflectionManager implements ReflectionManagerAbstract { } @Override - public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, EnumWrappers.PlayerInfoAction action, boolean nameVisible) { + public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, boolean nameVisible, EnumWrappers.PlayerInfoAction... actions) { ClientboundPlayerInfoPacket.PlayerUpdate entry = new ClientboundPlayerInfoPacket.PlayerUpdate((GameProfile) gameProfile.getHandle(), 0, GameType.SURVIVAL, new TextComponent(displayName)); PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); StructureModifier modifier = packet.getModifier(); - modifier.write(0, ClientboundPlayerInfoPacket.Action.valueOf(action.name())); + modifier.write(0, ClientboundPlayerInfoPacket.Action.valueOf(actions[0].name())); modifier.write(1, Collections.singletonList(entry)); return packet; diff --git a/nms/v1_18_R2/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_18_2/ReflectionManager.java b/nms/v1_18_R2/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_18_2/ReflectionManager.java index b22d7e67..667b2b54 100644 --- a/nms/v1_18_R2/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_18_2/ReflectionManager.java +++ b/nms/v1_18_R2/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_18_2/ReflectionManager.java @@ -236,14 +236,14 @@ public class ReflectionManager implements ReflectionManagerAbstract { } @Override - public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, EnumWrappers.PlayerInfoAction action, boolean nameVisible) { + public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, boolean nameVisible, EnumWrappers.PlayerInfoAction... actions) { ClientboundPlayerInfoPacket.PlayerUpdate entry = new ClientboundPlayerInfoPacket.PlayerUpdate((GameProfile) gameProfile.getHandle(), 0, GameType.SURVIVAL, new TextComponent(displayName)); PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); StructureModifier modifier = packet.getModifier(); - modifier.write(0, ClientboundPlayerInfoPacket.Action.valueOf(action.name())); + modifier.write(0, ClientboundPlayerInfoPacket.Action.valueOf(actions[0].name())); modifier.write(1, Collections.singletonList(entry)); return packet; diff --git a/nms/v1_19_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_19_R1/ReflectionManager.java b/nms/v1_19_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_19_R1/ReflectionManager.java index 3196af2a..4dc2d5be 100644 --- a/nms/v1_19_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_19_R1/ReflectionManager.java +++ b/nms/v1_19_R1/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_19_R1/ReflectionManager.java @@ -242,14 +242,14 @@ public class ReflectionManager implements ReflectionManagerAbstract { } @Override - public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, EnumWrappers.PlayerInfoAction action, boolean nameVisible) { + public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, boolean nameVisible, EnumWrappers.PlayerInfoAction... actions) { ClientboundPlayerInfoPacket.PlayerUpdate entry = new ClientboundPlayerInfoPacket.PlayerUpdate((GameProfile) gameProfile.getHandle(), 0, GameType.SURVIVAL, Component.literal(displayName), null); PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); StructureModifier modifier = packet.getModifier(); - modifier.write(0, ClientboundPlayerInfoPacket.Action.valueOf(action.name())); + modifier.write(0, ClientboundPlayerInfoPacket.Action.valueOf(actions[0].name())); modifier.write(1, Collections.singletonList(entry)); return packet; diff --git a/nms/v1_19_R2/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_19_R2/ReflectionManager.java b/nms/v1_19_R2/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_19_R2/ReflectionManager.java index cbec8b66..2f170246 100644 --- a/nms/v1_19_R2/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_19_R2/ReflectionManager.java +++ b/nms/v1_19_R2/src/main/java/me/libraryaddict/disguise/utilities/reflection/v1_19_R2/ReflectionManager.java @@ -2,6 +2,7 @@ package me.libraryaddict.disguise.utilities.reflection.v1_19_R2; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.EnumWrappers; @@ -43,7 +44,6 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.entity.animal.CatVariant; import net.minecraft.world.entity.animal.FrogVariant; -import net.minecraft.world.entity.animal.camel.Camel; import net.minecraft.world.entity.decoration.PaintingVariant; import net.minecraft.world.entity.npc.VillagerData; import net.minecraft.world.entity.npc.VillagerProfession; @@ -88,14 +88,18 @@ import org.bukkit.util.Vector; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; public class ReflectionManager implements ReflectionManagerAbstract { public boolean hasInvul(Entity entity) { @@ -248,8 +252,38 @@ public class ReflectionManager implements ReflectionManagerAbstract { return net.minecraft.core.Direction.from2DDataValue(direction); } - public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, EnumWrappers.PlayerInfoAction action, boolean nameVisible) { - if (action == EnumWrappers.PlayerInfoAction.REMOVE_PLAYER) { + @Override + public void handleTablistPacket(PacketEvent event, Function shouldRemove) { + ClientboundPlayerInfoUpdatePacket packet = (ClientboundPlayerInfoUpdatePacket) event.getPacket().getHandle(); + + if (!packet.actions().contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER)) { + return; + } + + List canKeep = new ArrayList<>(); + + for (ClientboundPlayerInfoUpdatePacket.Entry entry : packet.entries()) { + if (shouldRemove.apply(entry.profileId())) { + continue; + } + + canKeep.add(entry); + } + + if (canKeep.size() == packet.entries().size()) { + return; + } + + if (canKeep.isEmpty()) { + event.setCancelled(true); + return; + } + + event.getPacket().getModifier().write(1, canKeep); + } + + public PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, boolean nameVisible, EnumWrappers.PlayerInfoAction... actions) { + if (actions[0] == EnumWrappers.PlayerInfoAction.REMOVE_PLAYER) { PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO_REMOVE); packet.getModifier().write(0, Collections.singletonList(gameProfile.getUUID())); @@ -262,8 +296,10 @@ public class ReflectionManager implements ReflectionManagerAbstract { PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO); StructureModifier modifier = packet.getModifier(); + EnumSet enumSet = + EnumSet.copyOf(Arrays.stream(actions).map(action -> ClientboundPlayerInfoUpdatePacket.Action.valueOf(action.name())).collect(Collectors.toList())); - modifier.write(0, EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.valueOf(action.name()))); + modifier.write(0, enumSet); modifier.write(1, Collections.singletonList(entry)); return packet; diff --git a/plugin/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java b/plugin/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java index 5c97e06e..c3b860e9 100644 --- a/plugin/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java +++ b/plugin/src/main/java/me/libraryaddict/disguise/disguisetypes/Disguise.java @@ -985,16 +985,14 @@ public abstract class Disguise { PlayerDisguise disguise = (PlayerDisguise) this; if (disguise.isDisplayedInTab()) { - PacketContainer[] addTabs = ReflectionManager.createTablistAddPackets(disguise); + PacketContainer addTab = ReflectionManager.createTablistAddPackets(disguise); for (Player player : Bukkit.getOnlinePlayers()) { if (!((TargetedDisguise) this).canSee(player)) { continue; } - for (PacketContainer packet : addTabs) { - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); - } + ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab); } } } diff --git a/plugin/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java b/plugin/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java index 39ff6e7e..d81cb2c4 100644 --- a/plugin/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java +++ b/plugin/src/main/java/me/libraryaddict/disguise/disguisetypes/PlayerDisguise.java @@ -522,7 +522,7 @@ public class PlayerDisguise extends TargetedDisguise { } if (isDisplayedInTab()) { - PacketContainer[] addTabs = ReflectionManager.createTablistAddPackets(this); + PacketContainer addTab = ReflectionManager.createTablistAddPackets(this); PacketContainer deleteTab = ReflectionManager.createTablistPacket(this, PlayerInfoAction.REMOVE_PLAYER); for (Player player : Bukkit.getOnlinePlayers()) { @@ -531,10 +531,7 @@ public class PlayerDisguise extends TargetedDisguise { } ProtocolLibrary.getProtocolManager().sendServerPacket(player, deleteTab); - - for (PacketContainer packet : addTabs) { - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); - } + ProtocolLibrary.getProtocolManager().sendServerPacket(player, addTab); } } diff --git a/plugin/src/main/java/me/libraryaddict/disguise/utilities/listeners/DisguiseListener.java b/plugin/src/main/java/me/libraryaddict/disguise/utilities/listeners/DisguiseListener.java index ed9db502..dd48a7a2 100644 --- a/plugin/src/main/java/me/libraryaddict/disguise/utilities/listeners/DisguiseListener.java +++ b/plugin/src/main/java/me/libraryaddict/disguise/utilities/listeners/DisguiseListener.java @@ -452,9 +452,7 @@ public class DisguiseListener implements Listener { PlayerDisguise disguise = (PlayerDisguise) targetedDisguise; if (disguise.isDisplayedInTab()) { - for (PacketContainer packet : ReflectionManager.createTablistAddPackets(disguise)) { - ProtocolLibrary.getProtocolManager().sendServerPacket(p, packet); - } + ProtocolLibrary.getProtocolManager().sendServerPacket(p, ReflectionManager.createTablistAddPackets(disguise)); } } } diff --git a/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/PacketsManager.java b/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/PacketsManager.java index 11bc8599..7e07b4a3 100644 --- a/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/PacketsManager.java +++ b/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/PacketsManager.java @@ -43,10 +43,10 @@ public class PacketsManager { // Because it kicks you for hacking. clientInteractEntityListener = new PacketListenerClientInteract(LibsDisguises.getInstance()); - // PacketListener tabListListener = new PacketListenerTabList(LibsDisguises.getInstance()); + PacketListener tabListListener = new PacketListenerTabList(LibsDisguises.getInstance()); ProtocolLibrary.getProtocolManager().addPacketListener(clientInteractEntityListener); - // ProtocolLibrary.getProtocolManager().addPacketListener(tabListListener); + ProtocolLibrary.getProtocolManager().addPacketListener(tabListListener); ProtocolLibrary.getProtocolManager().addPacketListener(new PacketListenerClientCustomPayload()); // Now I call this and the main listener is registered! diff --git a/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java b/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java index 84be928b..db0969c7 100644 --- a/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java +++ b/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/packethandlers/PacketHandlerSpawn.java @@ -162,9 +162,7 @@ public class PacketHandlerSpawn implements IPacketHandler { if (DisguiseUtilities.isFancyHiddenTabs() || !playerDisguise.isDisplayedInTab() || !playerDisguise.isNameVisible()) { // Send player info along with the disguise - for (PacketContainer sendTab : ReflectionManager.createTablistAddPackets(playerDisguise)) { - packets.addPacket(sendTab); - } + packets.addPacket(ReflectionManager.createTablistAddPackets(playerDisguise)); skin = LibsDisguises.getInstance().getSkinHandler().addPlayerSkin(observer, playerDisguise); skin.setDoTabList(!DisguiseUtilities.isFancyHiddenTabs()); diff --git a/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerTabList.java b/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerTabList.java index 849aaa23..0e167ac9 100644 --- a/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerTabList.java +++ b/plugin/src/main/java/me/libraryaddict/disguise/utilities/packets/packetlisteners/PacketListenerTabList.java @@ -3,6 +3,7 @@ package me.libraryaddict.disguise.utilities.packets.packetlisteners; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.ListenerPriority; import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction; import com.comphenix.protocol.wrappers.PlayerInfoData; @@ -10,6 +11,7 @@ import me.libraryaddict.disguise.DisguiseAPI; import me.libraryaddict.disguise.LibsDisguises; import me.libraryaddict.disguise.disguisetypes.Disguise; import me.libraryaddict.disguise.utilities.reflection.NmsVersion; +import me.libraryaddict.disguise.utilities.reflection.ReflectionManager; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -17,8 +19,11 @@ import java.util.EnumSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.UUID; +import java.util.function.Function; public class PacketListenerTabList extends PacketAdapter { + public PacketListenerTabList(LibsDisguises plugin) { super(plugin, ListenerPriority.NORMAL, PacketType.Play.Server.PLAYER_INFO); } @@ -30,56 +35,51 @@ public class PacketListenerTabList extends PacketAdapter { } Player observer = event.getPlayer(); - Set actions; + + Function shouldRemove = uuid -> { + Player player = Bukkit.getPlayer(uuid); + + if (player == null) { + return false; + } + + Disguise disguise = DisguiseAPI.getDisguise(observer, player); + + return disguise != null && disguise.isHidePlayer(); + }; if (NmsVersion.v1_19_R2.isSupported()) { - actions = event.getPacket().getPlayerInfoActions().read(0); - } else { - actions = EnumSet.of(event.getPacket().getPlayerInfoAction().read(0)); - } - - if (actions.stream().noneMatch(a -> a == PlayerInfoAction.ADD_PLAYER)) { + ReflectionManager.getNmsReflection().handleTablistPacket(event, shouldRemove); return; } - List list = event.getPacket().getPlayerInfoDataLists().read(NmsVersion.v1_19_R2.isSupported() ? 1 : 0); + PacketContainer packet = event.getPacket(); + + if (packet.getPlayerInfoAction().read(0) != PlayerInfoAction.ADD_PLAYER) { + return; + } + + List list = packet.getPlayerInfoDataLists().read(0); Iterator itel = list.iterator(); - Iterator actionItel = actions.iterator(); + boolean modified = false; - while (itel.hasNext() && actionItel.hasNext()) { + while (itel.hasNext()) { PlayerInfoData data = itel.next(); - if (NmsVersion.v1_19_R2.isSupported()) { - if (actionItel.next() != PlayerInfoAction.ADD_PLAYER) { - continue; - } - } - if (data == null) { continue; } - Player player = Bukkit.getPlayer(data.getProfile().getUUID()); - - if (player == null) { - continue; - } - - Disguise disguise = DisguiseAPI.getDisguise(observer, player); - - if (disguise == null) { - continue; - } - - if (!disguise.isHidePlayer()) { + if (!shouldRemove.apply(data.getProfile().getUUID())) { continue; } itel.remove(); + modified = true; + } - if (NmsVersion.v1_19_R2.isSupported()) { - actionItel.remove(); - } + if (!modified) { + return; } if (list.isEmpty()) { @@ -87,12 +87,6 @@ public class PacketListenerTabList extends PacketAdapter { return; } - event.getPacket().getPlayerInfoDataLists().write(NmsVersion.v1_19_R2.isSupported() ? 1 : 0, list); - - if (!NmsVersion.v1_19_R2.isSupported()) { - return; - } - - event.getPacket().getPlayerInfoActions().write(0, actions); + packet.getPlayerInfoDataLists().write(0, list); } } diff --git a/plugin/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java b/plugin/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java index ac01905e..8774a143 100644 --- a/plugin/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java +++ b/plugin/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManager.java @@ -18,6 +18,7 @@ import com.comphenix.protocol.wrappers.WrappedParticle; import com.comphenix.protocol.wrappers.WrappedWatchableObject; import com.comphenix.protocol.wrappers.nbt.NbtWrapper; import com.mojang.authlib.GameProfile; +import lombok.Getter; import lombok.SneakyThrows; import me.libraryaddict.disguise.DisguiseConfig; import me.libraryaddict.disguise.LibsDisguises; @@ -189,6 +190,7 @@ public class ReflectionManager { private static Field playerConnection; private static Method incrementedInventoryStateId; private static Field playerInventoryContainer; + @Getter private static ReflectionManagerAbstract nmsReflection; private static Field trackedPlayers; private static Method clearEntityTracker; @@ -953,9 +955,9 @@ public class ReflectionManager { } public static PacketContainer updateTablistVisibility(Player player, boolean visible) { - if (NmsVersion.v1_19_R2.isSupported()) { - return nmsReflection.getTabListPacket(player.getPlayerListName(), ReflectionManager.getGameProfile(player), - EnumWrappers.PlayerInfoAction.UPDATE_LISTED, visible); + if (DisguiseUtilities.isFancyHiddenTabs()) { + return nmsReflection.getTabListPacket(player.getPlayerListName(), ReflectionManager.getGameProfile(player), visible, + EnumWrappers.PlayerInfoAction.UPDATE_LISTED); } PlayerInfoData playerInfo = @@ -970,25 +972,18 @@ public class ReflectionManager { return addTab; } - public static PacketContainer[] createTablistAddPackets(PlayerDisguise disguise) { + public static PacketContainer createTablistAddPackets(PlayerDisguise disguise) { if (!NmsVersion.v1_19_R2.isSupported()) { - return new PacketContainer[]{createTablistPacket(disguise, EnumWrappers.PlayerInfoAction.ADD_PLAYER)}; + return createTablistPacket(disguise, EnumWrappers.PlayerInfoAction.ADD_PLAYER); } - PacketContainer[] packets = new PacketContainer[disguise.isDisplayedInTab() ? 3 : 2]; - packets[0] = createTablistPacket(disguise, EnumWrappers.PlayerInfoAction.ADD_PLAYER); - packets[1] = createTablistPacket(disguise, EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME); - - if (disguise.isDisplayedInTab()) { - packets[2] = createTablistPacket(disguise, EnumWrappers.PlayerInfoAction.UPDATE_LISTED); - } - - return packets; + return nmsReflection.getTabListPacket(disguise.getName(), disguise.getGameProfile(), disguise.isDisplayedInTab(), + EnumWrappers.PlayerInfoAction.ADD_PLAYER, EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME, EnumWrappers.PlayerInfoAction.UPDATE_LISTED); } public static PacketContainer createTablistPacket(PlayerDisguise disguise, EnumWrappers.PlayerInfoAction action) { if (nmsReflection != null) { - return nmsReflection.getTabListPacket(disguise.getName(), disguise.getGameProfile(), action, disguise.isDisplayedInTab()); + return nmsReflection.getTabListPacket(disguise.getName(), disguise.getGameProfile(), disguise.isDisplayedInTab(), action); } try { diff --git a/shared/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManagerAbstract.java b/shared/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManagerAbstract.java index 92d624de..bdb875d0 100644 --- a/shared/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManagerAbstract.java +++ b/shared/src/main/java/me/libraryaddict/disguise/utilities/reflection/ReflectionManagerAbstract.java @@ -1,6 +1,7 @@ package me.libraryaddict.disguise.utilities.reflection; import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedGameProfile; @@ -24,6 +25,7 @@ import org.bukkit.util.Vector; import java.util.Map; import java.util.Optional; import java.util.UUID; +import java.util.function.Function; public interface ReflectionManagerAbstract { boolean hasInvul(Entity entity); @@ -72,7 +74,7 @@ public interface ReflectionManagerAbstract { Enum getEnumDirection(int direction); - PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, EnumWrappers.PlayerInfoAction action, boolean nameVisible); + PacketContainer getTabListPacket(String displayName, WrappedGameProfile gameProfile, boolean nameVisible, EnumWrappers.PlayerInfoAction... actions); Object getNmsEntity(Entity entity); @@ -145,6 +147,9 @@ public interface ReflectionManagerAbstract { ItemMeta getDeserializedItemMeta(Map meta); + default void handleTablistPacket(PacketEvent event, Function shouldRemove) { + } + /** * Implement this for custom metadata values that are not backwards compatible */