From 899a7e2f32fdd688d0df46899c57470b47033c77 Mon Sep 17 00:00:00 2001 From: ineanto Date: Sun, 31 Aug 2025 15:33:50 +0200 Subject: [PATCH] fix: do not change entityid, packet send to receiver only, teleport player to avoid issue --- .../nicko/appearance/AppearanceManager.java | 18 +++++++++++++----- .../packet/PacketEventsPacketSender.java | 19 ++++++++++--------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java b/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java index 2982458..05dfbef 100644 --- a/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java +++ b/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java @@ -2,6 +2,7 @@ package xyz.ineanto.nicko.appearance; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerTeleportEvent; import xyz.ineanto.nicko.Nicko; import xyz.ineanto.nicko.event.custom.PlayerDisguiseEvent; import xyz.ineanto.nicko.event.custom.PlayerResetDisguiseEvent; @@ -60,16 +61,23 @@ public class AppearanceManager { } } - packetSender.sendPlayerRespawn(); + packetSender.sendEntityMetadataUpdate(); + packetSender.sendTabListUpdate(displayName); + packetSender.sendEntityRespawn(); + + //packetSender.sendChunkData(); + //packetSender.sendPlayerRespawn(); + + // From "https://minecraft.wiki/w/Java_Edition_protocol/FAQ#%E2%80%A6my_player_isn't_spawning!" + // "The client will also spawn after spending 30 seconds in the + // loading screen, even if it never received Game Event 13." + // Sending a teleport to the player's current location fixes this. + player.teleport(player.getLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN); // Call the event. final PlayerDisguiseEvent event = new PlayerDisguiseEvent(player, profile.getSkin(), profile.getName()); Bukkit.getPluginManager().callEvent(event); - packetSender.sendEntityMetadataUpdate(); - packetSender.sendTabListUpdate(displayName); - - packetSender.sendEntityRespawn(); return result; } diff --git a/src/main/java/xyz/ineanto/nicko/packet/PacketEventsPacketSender.java b/src/main/java/xyz/ineanto/nicko/packet/PacketEventsPacketSender.java index 1efc5c4..40da40d 100644 --- a/src/main/java/xyz/ineanto/nicko/packet/PacketEventsPacketSender.java +++ b/src/main/java/xyz/ineanto/nicko/packet/PacketEventsPacketSender.java @@ -28,7 +28,6 @@ import java.io.IOException; import java.util.EnumSet; import java.util.List; import java.util.Optional; -import java.util.Random; import java.util.concurrent.ExecutionException; public record PacketEventsPacketSender(Player player, NickoProfile profile) implements PacketSender { @@ -36,9 +35,11 @@ public record PacketEventsPacketSender(Player player, NickoProfile profile) impl public void sendEntityRespawn() { if (!profile.hasData()) return; + final int entityId = player.getEntityId(); + final WrapperPlayServerDestroyEntities destroy = new WrapperPlayServerDestroyEntities(player.getEntityId()); final WrapperPlayServerSpawnEntity spawn = new WrapperPlayServerSpawnEntity( - new Random().nextInt(9999), + entityId, Optional.of(player.getUniqueId()), EntityTypes.PLAYER, new Vector3d(player.getX(), player.getY(), player.getZ()), @@ -49,10 +50,12 @@ public record PacketEventsPacketSender(Player player, NickoProfile profile) impl Optional.empty() ); - Bukkit.getOnlinePlayers().stream().filter(receiver -> receiver.getUniqueId() != player.getUniqueId()).forEach(receiver -> { - sendPacket(destroy, player); - sendPacket(spawn, player); - }); + Bukkit.getOnlinePlayers().stream() + .filter(receiver -> receiver.getUniqueId() != player.getUniqueId()) + .forEach(receiver -> { + sendPacket(destroy, receiver); + sendPacket(spawn, receiver); + }); } @Override @@ -83,8 +86,7 @@ public record PacketEventsPacketSender(Player player, NickoProfile profile) impl return ActionResult.error(LanguageKey.Error.MOJANG); } - final MojangSkin skinResult = skin.get(); - playerProfile.setProperties(skinResult.asProfileProperties()); + playerProfile.setProperties(skin.get().asProfileProperties()); player.setPlayerProfile(playerProfile); return ActionResult.ok(); } catch (ExecutionException | IOException e) { @@ -127,7 +129,6 @@ public record PacketEventsPacketSender(Player player, NickoProfile profile) impl public void sendTabListUpdate(String displayName) { final EnumSet actions = EnumSet.of( WrapperPlayServerPlayerInfoUpdate.Action.ADD_PLAYER, - WrapperPlayServerPlayerInfoUpdate.Action.INITIALIZE_CHAT, WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_LISTED, WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_DISPLAY_NAME, WrapperPlayServerPlayerInfoUpdate.Action.UPDATE_GAME_MODE,