diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityArmsRaised.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityArmsRaised.java index 636e762296..9c0537f602 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityArmsRaised.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/EntityArmsRaised.java @@ -2,7 +2,6 @@ import com.denizenscript.denizen.objects.EntityTag; import com.denizenscript.denizen.utilities.BukkitImplDeprecations; -import com.denizenscript.denizencore.objects.Mechanism; import com.denizenscript.denizencore.objects.core.ElementTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.ObjectTag; diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperElementExtensions.java b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperElementExtensions.java index 0e7dc03c76..22152bef6c 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperElementExtensions.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/properties/PaperElementExtensions.java @@ -8,7 +8,6 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.chat.ComponentSerializer; public class PaperElementExtensions { diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesTablistUpdateScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesTablistUpdateScriptEvent.java index 76ba27324b..c39c91d680 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesTablistUpdateScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerReceivesTablistUpdateScriptEvent.java @@ -29,7 +29,7 @@ public class PlayerReceivesTablistUpdateScriptEvent extends BukkitScriptEvent { // @Cancellable true // // @Context - // returns the update mode: 'add', 'remove', 'update_gamemode', 'update_latency', or 'update_display'. + // returns the update mode: 'add', 'remove', 'update_gamemode', 'update_latency', 'update_listed', or 'update_display'. As of 1.19.3, you can also receive update combos like "update_gamemode|update_latency". // returns the packet's associated UUID. // returns the packet's associated name (if any). // returns the packet's associated display name (if any). @@ -58,7 +58,7 @@ public PlayerReceivesTablistUpdateScriptEvent() { public static class TabPacketData { - public TabPacketData(String mode, UUID id, String name, String display, String gamemode, String texture, String signature, int latency) { + public TabPacketData(String mode, UUID id, boolean isListed, String name, String display, String gamemode, String texture, String signature, int latency) { this.mode = mode; this.id = id; this.name = name; @@ -67,6 +67,7 @@ public TabPacketData(String mode, UUID id, String name, String display, String g this.texture = texture; this.signature = signature; this.latency = latency; + this.isListed = isListed; } public UUID id; @@ -75,6 +76,8 @@ public TabPacketData(String mode, UUID id, String name, String display, String g public int latency; + public boolean isListed; + public boolean cancelled = false; public boolean modified = false; diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/ShootCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/ShootCommand.java index accd72d079..d078986024 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/ShootCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/entity/ShootCommand.java @@ -21,7 +21,6 @@ import com.denizenscript.denizencore.scripts.commands.Holdable; import com.denizenscript.denizencore.scripts.containers.core.TaskScriptContainer; import com.denizenscript.denizencore.scripts.queues.ScriptQueue; -import com.denizenscript.denizencore.utilities.CoreUtilities; import com.denizenscript.denizencore.utilities.ScriptUtilities; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; diff --git a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java index e27d363179..dadfaf4188 100644 --- a/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_18/src/main/java/com/denizenscript/denizen/nms/v1_18/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -352,7 +352,7 @@ public boolean processTablistPacket(Packet packet, GenericFutureListener materials) { - Map>, TagNetworkSerialization.NetworkPayload> packetInput = TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registryAccess()); - Map tags = ReflectionHelper.getFieldValue(TagNetworkSerialization.NetworkPayload.class, ReflectionMappingsInfo.TagNetworkSerializationNetworkPayload_tags, packetInput.get(Registry.BLOCK_REGISTRY)); + Map>, TagNetworkSerialization.NetworkPayload> packetInput = TagNetworkSerialization.serializeTagsToNetwork(((CraftServer) Bukkit.getServer()).getServer().registries()); + Map tags = ReflectionHelper.getFieldValue(TagNetworkSerialization.NetworkPayload.class, ReflectionMappingsInfo.TagNetworkSerializationNetworkPayload_tags, packetInput.get(BuiltInRegistries.BLOCK.key())); IntList intList = tags.get(BlockTags.CLIMBABLE.location()); intList.clear(); for (Material material : materials) { diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/BiomeNMSImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/BiomeNMSImpl.java index f2c73df4cc..43e07b6fab 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/BiomeNMSImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/BiomeNMSImpl.java @@ -7,7 +7,6 @@ import com.denizenscript.denizencore.utilities.debugging.Debug; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; -import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/ProfileEditorImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/ProfileEditorImpl.java index 6c0675c3f5..e9c39145b6 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/ProfileEditorImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/ProfileEditorImpl.java @@ -12,7 +12,9 @@ import com.denizenscript.denizen.nms.util.PlayerProfile; import com.denizenscript.denizencore.utilities.ReflectionHelper; import com.denizenscript.denizencore.utilities.debugging.Debug; +import io.netty.buffer.Unpooled; import net.md_5.bungee.api.ChatColor; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; import net.minecraft.server.level.ServerPlayer; @@ -22,9 +24,8 @@ import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; import org.bukkit.entity.Player; -import java.lang.invoke.MethodHandle; -import java.util.List; -import java.util.UUID; +import java.lang.reflect.Field; +import java.util.*; public class ProfileEditorImpl extends ProfileEditor { @@ -51,8 +52,8 @@ public static boolean handleAlteredProfiles(ClientboundPlayerInfoUpdatePacket pa if (ProfileEditor.mirrorUUIDs.isEmpty() && !RenameCommand.hasAnyDynamicRenames()) { return true; } - ClientboundPlayerInfoUpdatePacket.Action action = packet.actions(); - if (action != ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER && action != ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME) { + EnumSet action = packet.actions(); + if (!action.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER) && !action.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)) { return true; } List dataList = packet.entries(); @@ -62,7 +63,7 @@ public static boolean handleAlteredProfiles(ClientboundPlayerInfoUpdatePacket pa try { boolean any = false; for (ClientboundPlayerInfoUpdatePacket.Entry data : dataList) { - if (ProfileEditor.mirrorUUIDs.contains(data.profile().getId()) || RenameCommand.customNames.containsKey(data.profile().getId())) { + if (ProfileEditor.mirrorUUIDs.contains(data.profileId()) || RenameCommand.customNames.containsKey(data.profileId()) || fakeProfiles.containsKey(data.profileId())) { any = true; } } @@ -71,28 +72,23 @@ public static boolean handleAlteredProfiles(ClientboundPlayerInfoUpdatePacket pa } GameProfile ownProfile = manager.player.getGameProfile(); for (ClientboundPlayerInfoUpdatePacket.Entry data : dataList) { - if (!ProfileEditor.mirrorUUIDs.contains(data.profile().getId()) && !RenameCommand.customNames.containsKey(data.profile().getId())) { - ClientboundPlayerInfoUpdatePacket newPacket = new ClientboundPlayerInfoUpdatePacket(action); - List newPacketDataList = newPacket.entries(); - newPacketDataList.add(data); - manager.oldManager.send(newPacket); + if (!ProfileEditor.mirrorUUIDs.contains(data.profileId()) && !RenameCommand.customNames.containsKey(data.profileId()) && !fakeProfiles.containsKey(data.profileId())) { + manager.oldManager.send(createInfoPacket(action, Collections.singletonList(data))); } else { - String rename = RenameCommand.getCustomNameFor(data.profile().getId(), manager.player.getBukkitEntity(), false); - ClientboundPlayerInfoUpdatePacket newPacket = new ClientboundPlayerInfoUpdatePacket(action); - List newPacketDataList = newPacket.entries(); - GameProfile patchedProfile = new GameProfile(data.profile().getId(), rename != null ? (rename.length() > 16 ? rename.substring(0, 16) : rename) : data.profile().getName()); - if (ProfileEditor.mirrorUUIDs.contains(data.profile().getId())) { + String rename = RenameCommand.getCustomNameFor(data.profileId(), manager.player.getBukkitEntity(), false); + GameProfile baseProfile = fakeProfiles.containsKey(data.profileId()) ? getGameProfile(fakeProfiles.get(data.profileId())) : data.profile(); + GameProfile patchedProfile = new GameProfile(baseProfile.getId(), rename != null ? (rename.length() > 16 ? rename.substring(0, 16) : rename) : baseProfile.getName()); + if (ProfileEditor.mirrorUUIDs.contains(data.profileId())) { patchedProfile.getProperties().putAll(ownProfile.getProperties()); } else { - patchedProfile.getProperties().putAll(data.profile().getProperties()); + patchedProfile.getProperties().putAll(baseProfile.getProperties()); } - String listRename = RenameCommand.getCustomNameFor(data.profile().getId(), manager.player.getBukkitEntity(), true); + String listRename = RenameCommand.getCustomNameFor(data.profileId(), manager.player.getBukkitEntity(), true); Component displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : data.displayName(); ClientboundPlayerInfoUpdatePacket.Entry newData = new ClientboundPlayerInfoUpdatePacket.Entry(data.profileId(), patchedProfile, data.listed(), data.latency(), data.gameMode(), displayName, data.chatSession()); - newPacketDataList.add(newData); - manager.oldManager.send(newPacket); + manager.oldManager.send(createInfoPacket(action, Collections.singletonList(newData))); } } return false; @@ -103,25 +99,27 @@ public static boolean handleAlteredProfiles(ClientboundPlayerInfoUpdatePacket pa } } - public static void updatePlayerProfiles(ClientboundPlayerInfoUpdatePacket packet) { - ClientboundPlayerInfoUpdatePacket.Action action = packet.actions(); - if (action != ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER) { - return; - } - List dataList = packet.entries(); - if (dataList != null) { + public static final Field ClientboundPlayerInfoUpdatePacket_Action_writer = ReflectionHelper.getFields(ClientboundPlayerInfoUpdatePacket.Action.class).getFirstOfType(ClientboundPlayerInfoUpdatePacket.Action.Writer.class); + + public static ClientboundPlayerInfoUpdatePacket createInfoPacket(EnumSet actions, List entries) { + // Based on ClientboundPlayerInfoUpdatePacket#write + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeEnumSet(actions, ClientboundPlayerInfoUpdatePacket.Action.class); + buf.writeCollection(entries, (inBuf, entry) -> { try { - for (ClientboundPlayerInfoUpdatePacket.Entry data : dataList) { - GameProfile gameProfile = data.profile(); - if (fakeProfiles.containsKey(gameProfile.getId())) { - playerInfoData_gameProfile_Setter.invoke(data, getGameProfile(fakeProfiles.get(gameProfile.getId()))); - } + inBuf.writeUUID(entry.profileId()); + Iterator var3 = actions.iterator(); + while (var3.hasNext()) { + ClientboundPlayerInfoUpdatePacket.Action action = (ClientboundPlayerInfoUpdatePacket.Action) var3.next(); + ClientboundPlayerInfoUpdatePacket.Action.Writer writer = (ClientboundPlayerInfoUpdatePacket.Action.Writer) ClientboundPlayerInfoUpdatePacket_Action_writer.get(action); + writer.write(inBuf, entry); } } - catch (Throwable e) { - Debug.echoError(e); + catch (Throwable ex) { + Debug.echoError(ex); } - } + }); + return new ClientboundPlayerInfoUpdatePacket(buf); } private static GameProfile getGameProfile(PlayerProfile playerProfile) { @@ -131,6 +129,4 @@ private static GameProfile getGameProfile(PlayerProfile playerProfile) { } return gameProfile; } - - public static final MethodHandle playerInfoData_gameProfile_Setter = ReflectionHelper.getFinalSetterForFirstOfType(ClientboundPlayerInfoUpdatePacket.Entry.class, GameProfile.class); } diff --git a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/network/handlers/DenizenNetworkManagerImpl.java index 7ec83fc598..8d88d48798 100644 --- a/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_19/src/main/java/com/denizenscript/denizen/nms/v1_19/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -46,7 +46,6 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.PacketFlow; import net.minecraft.network.protocol.game.*; -import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.level.ChunkMap; @@ -330,25 +329,27 @@ public boolean processTablistPacket(Packet packet, PacketSendListener generic } if (packet instanceof ClientboundPlayerInfoUpdatePacket) { ClientboundPlayerInfoUpdatePacket infoPacket = (ClientboundPlayerInfoUpdatePacket) packet; - String mode; - switch (infoPacket.actions()) { - case ADD_PLAYER: - mode = "add"; - break; - case REMOVE_PLAYER: - mode = "remove"; - break; - case UPDATE_LATENCY: - mode = "update_latency"; - break; - case UPDATE_GAME_MODE: - mode = "update_gamemode"; - break; - case UPDATE_DISPLAY_NAME: - mode = "update_display"; - break; - default: - return false; + String mode = ""; + for (ClientboundPlayerInfoUpdatePacket.Action action : infoPacket.actions()) { + switch (action) { + case ADD_PLAYER: + mode = "add"; + break; + case UPDATE_LATENCY: + mode = mode.isEmpty() ? "update_latency" : mode + "|update_latency"; + break; + case UPDATE_GAME_MODE: + mode = mode.isEmpty() ? "update_gamemode" : mode + "|update_gamemode"; + break; + case UPDATE_DISPLAY_NAME: + mode = mode.isEmpty() ? "update_display" : mode + "|update_display"; + break; + case UPDATE_LISTED: + mode = mode.isEmpty() ? "update_listed" : mode + "|update_listed"; + break; + default: + return false; + } } boolean isOverriding = false; for (ClientboundPlayerInfoUpdatePacket.Entry update : infoPacket.entries()) { @@ -360,42 +361,52 @@ public boolean processTablistPacket(Packet packet, PacketSendListener generic signature = property.getSignature(); } String modeText = update.gameMode() == null ? null : update.gameMode().name(); - PlayerReceivesTablistUpdateScriptEvent.TabPacketData data = new PlayerReceivesTablistUpdateScriptEvent.TabPacketData(mode, profile.getId(), profile.getName(), + PlayerReceivesTablistUpdateScriptEvent.TabPacketData data = new PlayerReceivesTablistUpdateScriptEvent.TabPacketData(mode, profile.getId(), update.listed(), profile.getName(), update.displayName() == null ? null : FormattedTextHelper.stringify(Handler.componentToSpigot(update.displayName())), modeText, texture, signature, update.latency()); PlayerReceivesTablistUpdateScriptEvent.fire(player.getBukkitEntity(), data); if (data.modified) { if (!isOverriding) { isOverriding = true; - ClientboundPlayerInfoUpdatePacket priorsPacket = new ClientboundPlayerInfoUpdatePacket(infoPacket.actions()); for (ClientboundPlayerInfoUpdatePacket.Entry priorUpdate : infoPacket.entries()) { if (priorUpdate == update) { break; } - priorsPacket.entries().add(priorUpdate); - } - if (!priorsPacket.entries().isEmpty()) { - oldManager.send(priorsPacket, genericfuturelistener); + oldManager.send(ProfileEditorImpl.createInfoPacket(infoPacket.actions(), Collections.singletonList(priorUpdate))); } } if (!data.cancelled) { - ClientboundPlayerInfoUpdatePacket newPacket = new ClientboundPlayerInfoUpdatePacket(infoPacket.actions()); GameProfile newProfile = new GameProfile(data.id, data.name); if (data.texture != null) { newProfile.getProperties().put("textures", new Property("textures", data.texture, data.signature)); } - newPacket.entries().add(new ClientboundPlayerInfoUpdatePacket.Entry(newProfile.getId(), newProfile, data.isListed, data.latency, data.gamemode == null ? null : GameType.byName(CoreUtilities.toLowerCase(data.gamemode)), - data.display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(data.display, ChatColor.WHITE)), update.chatSession())); - oldManager.send(newPacket, genericfuturelistener); + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(newProfile.getId(), newProfile, data.isListed, data.latency, data.gamemode == null ? null : GameType.byName(CoreUtilities.toLowerCase(data.gamemode)), + data.display == null ? null : Handler.componentToNMS(FormattedTextHelper.parse(data.display, ChatColor.WHITE)), update.chatSession()); + oldManager.send(ProfileEditorImpl.createInfoPacket(infoPacket.actions(), Collections.singletonList(entry)), genericfuturelistener); } } else if (isOverriding) { - ClientboundPlayerInfoUpdatePacket newPacket = new ClientboundPlayerInfoUpdatePacket(infoPacket.actions()); - newPacket.entries().add(update); - oldManager.send(newPacket, genericfuturelistener); + oldManager.send(ProfileEditorImpl.createInfoPacket(infoPacket.actions(), Collections.singletonList(update)), genericfuturelistener); } } return isOverriding; } + else if (packet instanceof ClientboundPlayerInfoRemovePacket) { + ClientboundPlayerInfoRemovePacket removePacket = (ClientboundPlayerInfoRemovePacket) packet; + boolean modified = false; + List altIds = new ArrayList<>(((ClientboundPlayerInfoRemovePacket) packet).profileIds()); + for (UUID id : ((ClientboundPlayerInfoRemovePacket) packet).profileIds()) { + PlayerReceivesTablistUpdateScriptEvent.TabPacketData data = new PlayerReceivesTablistUpdateScriptEvent.TabPacketData("remove", id, false, null, null, null, null, null, 0); + PlayerReceivesTablistUpdateScriptEvent.fire(player.getBukkitEntity(), data); + if (data.modified && data.cancelled) { + modified = true; + altIds.remove(id); + } + } + if (modified) { + oldManager.send(new ClientboundPlayerInfoRemovePacket(altIds), genericfuturelistener); + return true; + } + } return false; } @@ -1127,7 +1138,6 @@ public void processFakePlayerSpawn(Entity entity) { public boolean processMirrorForPacket(Packet packet) { if (packet instanceof ClientboundPlayerInfoUpdatePacket) { ClientboundPlayerInfoUpdatePacket playerInfo = (ClientboundPlayerInfoUpdatePacket) packet; - ProfileEditorImpl.updatePlayerProfiles(playerInfo); if (!ProfileEditorImpl.handleAlteredProfiles(playerInfo, this)) { return true; }