From b1d1570b3949b73b9ad31895e93313a5b963f0d5 Mon Sep 17 00:00:00 2001 From: ineanto Date: Sun, 31 Aug 2025 13:43:27 +0200 Subject: [PATCH 1/2] feat: still not working. --- build.gradle.kts | 10 ++---- src/main/java/xyz/ineanto/nicko/Nicko.java | 31 +++++++++---------- .../nicko/appearance/AppearanceManager.java | 3 +- .../nicko/loader/NickoPluginLoader.java | 2 +- .../packet/PacketEventsPacketSender.java | 2 +- src/main/resources/paper-plugin.yml | 9 ------ .../ineanto/nicko/test/TestPluginMock.java | 4 --- 7 files changed, 20 insertions(+), 41 deletions(-) delete mode 100644 src/test/java/xyz/ineanto/nicko/test/TestPluginMock.java diff --git a/build.gradle.kts b/build.gradle.kts index 3d4fb43..967b045 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,12 +35,11 @@ dependencies { compileOnly("io.papermc.paper:paper-api:1.21.8-R0.1-SNAPSHOT") compileOnly("me.clip:placeholderapi:2.11.5") - compileOnly("net.kyori:adventure-api:4.21.0") + compileOnly("net.kyori:adventure-api:4.24.0") compileOnly("xyz.xenondevs.invui:invui-core:$invuiVersion") compileOnly("net.wesjd:anvilgui:1.10.4-SNAPSHOT") - implementation("com.github.retrooper:packetevents-spigot:2.9.0") - + implementation("com.github.retrooper:packetevents-spigot:2.9.5") implementation("com.github.jsixface:yamlconfig:1.2") implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion") @@ -48,11 +47,6 @@ dependencies { implementation("org.mariadb.jdbc:mariadb-java-client:3.5.2") implementation("redis.clients:jedis:5.2.0") implementation("com.google.code.gson:gson:2.13.1") - - testImplementation("org.mockbukkit.mockbukkit:mockbukkit-v1.21:$mockBukkitVersion") - testImplementation(platform("org.junit:junit-bom:5.13.4")) - testImplementation("org.junit.jupiter:junit-jupiter") - testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks { diff --git a/src/main/java/xyz/ineanto/nicko/Nicko.java b/src/main/java/xyz/ineanto/nicko/Nicko.java index 783fb50..0080d24 100644 --- a/src/main/java/xyz/ineanto/nicko/Nicko.java +++ b/src/main/java/xyz/ineanto/nicko/Nicko.java @@ -2,6 +2,7 @@ package xyz.ineanto.nicko; import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.manager.server.ServerVersion; +import com.github.retrooper.packetevents.settings.PacketEventsSettings; import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -32,22 +33,23 @@ import java.io.IOException; public class Nicko extends JavaPlugin { private static Nicko plugin; - private MojangAPI mojangAPI; + private final MojangAPI mojangApi = new MojangAPI(); + private final PlayerNameStore nameStore = new PlayerNameStore(); private PlayerDataStore dataStore; private ConfigurationManager configurationManager; private Configuration configuration; private CustomLanguage customLanguage; - private PlayerNameStore nameStore; private RandomNameFetcher nameFetcher; - public Nicko() { - super(); - } - @Override public void onLoad() { - PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this)); - PacketEvents.getAPI().getSettings().checkForUpdates(false).kickOnPacketException(true); + PacketEvents.setAPI( + SpigotPacketEventsBuilder.build(this, + new PacketEventsSettings() + .checkForUpdates(true) + .kickOnPacketException(true) + ) + ); PacketEvents.getAPI().load(); } @@ -55,12 +57,13 @@ public class Nicko extends JavaPlugin { public void onEnable() { plugin = this; - PacketEvents.getAPI().init(); - configurationManager = new ConfigurationManager(getDataFolder()); configurationManager.saveDefaultConfig(); - dataStore = new PlayerDataStore(mojangAPI, getNickoConfig()); + nameFetcher = new RandomNameFetcher(this); + dataStore = new PlayerDataStore(mojangApi, getNickoConfig()); + + PacketEvents.getAPI().init(); if (PacketEvents.getAPI().getServerManager().getVersion().isOlderThan(ServerVersion.V_1_20)) { getLogger().severe("This version (" + PacketEvents.getAPI().getServerManager().getVersion() + ") is not officially supported by Nicko!"); @@ -95,10 +98,6 @@ public class Nicko extends JavaPlugin { dataStore.setCache(cache); } - nameStore = new PlayerNameStore(); - mojangAPI = new MojangAPI(); - nameFetcher = new RandomNameFetcher(this); - new ConfigurationMigrator(this).migrate(); InvUI.getInstance().setPlugin(this); @@ -181,7 +180,7 @@ public class Nicko extends JavaPlugin { } public MojangAPI getMojangAPI() { - return mojangAPI; + return mojangApi; } public CustomLanguage getCustomLocale() { diff --git a/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java b/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java index 70c2765..2982458 100644 --- a/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java +++ b/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java @@ -60,8 +60,7 @@ public class AppearanceManager { } } - // Not needed, but still broken using PE. - //packetSender.sendPlayerRespawn(); + packetSender.sendPlayerRespawn(); // Call the event. final PlayerDisguiseEvent event = new PlayerDisguiseEvent(player, profile.getSkin(), profile.getName()); diff --git a/src/main/java/xyz/ineanto/nicko/loader/NickoPluginLoader.java b/src/main/java/xyz/ineanto/nicko/loader/NickoPluginLoader.java index 11762da..cb50e3a 100644 --- a/src/main/java/xyz/ineanto/nicko/loader/NickoPluginLoader.java +++ b/src/main/java/xyz/ineanto/nicko/loader/NickoPluginLoader.java @@ -14,7 +14,7 @@ public class NickoPluginLoader implements PluginLoader { final MavenLibraryResolver resolver = new MavenLibraryResolver(); resolver.addRepository(new RemoteRepository.Builder("xenondevs", "default", "https://repo.xenondevs.xyz/releases/").build()); - resolver.addDependency(new Dependency(new DefaultArtifact("xyz.xenondevs.invui:invui:pom:1.45"), null)); + resolver.addDependency(new Dependency(new DefaultArtifact("xyz.xenondevs.invui:invui:pom:1.46"), null)); pluginClasspathBuilder.addLibrary(resolver); } diff --git a/src/main/java/xyz/ineanto/nicko/packet/PacketEventsPacketSender.java b/src/main/java/xyz/ineanto/nicko/packet/PacketEventsPacketSender.java index ac17fcb..1efc5c4 100644 --- a/src/main/java/xyz/ineanto/nicko/packet/PacketEventsPacketSender.java +++ b/src/main/java/xyz/ineanto/nicko/packet/PacketEventsPacketSender.java @@ -111,7 +111,7 @@ public record PacketEventsPacketSender(Player player, NickoProfile profile) impl Difficulty.getById(world.getDifficulty().ordinal()), world.getSeed(), SpigotConversionUtil.fromBukkitGameMode(player.getGameMode()), - SpigotConversionUtil.fromBukkitGameMode(player.getPreviousGameMode()), + null, false, false, true, diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index f515c80..f073094 100644 --- a/src/main/resources/paper-plugin.yml +++ b/src/main/resources/paper-plugin.yml @@ -6,15 +6,6 @@ author: Ineanto description: "The feature packed, next generation disguise plugin for Minecraft." api-version: "1.21" softdepend: [ PlaceholderAPI ] -depend: - - ProtocolLib - -dependencies: - server: - ProtocolLib: - load: BEFORE - join-classpath: true - permissions: nicko.*: default: op diff --git a/src/test/java/xyz/ineanto/nicko/test/TestPluginMock.java b/src/test/java/xyz/ineanto/nicko/test/TestPluginMock.java deleted file mode 100644 index c6a3043..0000000 --- a/src/test/java/xyz/ineanto/nicko/test/TestPluginMock.java +++ /dev/null @@ -1,4 +0,0 @@ -package xyz.ineanto.nicko.test; - -public class TestPluginMock { -} From 899a7e2f32fdd688d0df46899c57470b47033c77 Mon Sep 17 00:00:00 2001 From: ineanto Date: Sun, 31 Aug 2025 15:33:50 +0200 Subject: [PATCH 2/2] 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,