diff --git a/src/main/java/xyz/ineanto/nicko/Nicko.java b/src/main/java/xyz/ineanto/nicko/Nicko.java index a0621bb..5778698 100644 --- a/src/main/java/xyz/ineanto/nicko/Nicko.java +++ b/src/main/java/xyz/ineanto/nicko/Nicko.java @@ -1,9 +1,19 @@ package xyz.ineanto.nicko; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.events.ListenerPriority; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.reflect.accessors.Accessors; +import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.utility.MinecraftVersion; +import com.comphenix.protocol.wrappers.MinecraftKey; +import net.kyori.adventure.text.Component; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.command.PluginCommand; import org.bukkit.plugin.java.JavaPlugin; import xyz.ineanto.nicko.appearance.random.RandomNameFetcher; @@ -132,6 +142,32 @@ public class Nicko extends JavaPlugin { getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); getServer().getPluginManager().registerEvents(new PlayerQuitListener(), this); metrics = new Metrics(this, 20483); + + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(this, + ListenerPriority.HIGH, + PacketType.Play.Server.RESPAWN + ) { + @Override + public void onPacketSending(PacketEvent event) { + try { + Bukkit.broadcast(Component.text("intercepting packet...")); + Class commonPlayerInfoClazz = MinecraftReflection.getMinecraftClass("network.protocol.game.CommonPlayerSpawnInfo"); + // access CommonPlayerSpawnInfo, first field of that type in the Respawn / Login packets + Object commonSpawnData = Accessors.getFieldAccessor(event.getPacket().getClass(), commonPlayerInfoClazz, true).getField().get(event.getPacket()); + // get the key of the level the player is joining. Second field in the object. First of type ResourceKey + MinecraftKey key = MinecraftKey.fromHandle(Accessors.getFieldAccessor(commonPlayerInfoClazz, MinecraftReflection.getResourceKey(), true).get(commonSpawnData)); // wrap to ProtocolLib handle + for (World world : Bukkit.getWorlds()) { + if (key.getPrefix().equals(world.getKey().getNamespace()) && key.getKey().equals(world.getKey().getKey())) { + Bukkit.broadcast(Component.text("found world!")); + } else { + Bukkit.broadcast(Component.text("whoops, no matching world found")); + } + } + } catch (IllegalAccessException exception) { + throw new RuntimeException(exception); + } + } + }); } getLogger().info("Nicko has been enabled."); diff --git a/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java b/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java index 7b9fcd8..eaa1dc9 100644 --- a/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java +++ b/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java @@ -146,12 +146,12 @@ public class AppearanceManager { final boolean wasAllowedToFly = player.getAllowFlight(); final int foodLevel = player.getFoodLevel(); final WrapperPlayServerRespawn respawn = new WrapperPlayServerRespawn(); - respawn.setDimension(world); + //respawn.setDimension(world); respawn.setSeed(world.getSeed()); respawn.setGameMode(player.getGameMode()); respawn.setPreviousGameMode(player.getGameMode()); respawn.setCopyMetadata(true); - respawn.sendPacket(player); + //respawn.sendPacket(player); player.teleport(player.getLocation(), PlayerTeleportEvent.TeleportCause.PLUGIN); player.setAllowFlight(wasAllowedToFly); player.setFlying(wasFlying); diff --git a/src/main/java/xyz/ineanto/nicko/wrapper/WrapperPlayServerRespawn.java b/src/main/java/xyz/ineanto/nicko/wrapper/WrapperPlayServerRespawn.java index 02a8d06..6fd7b95 100644 --- a/src/main/java/xyz/ineanto/nicko/wrapper/WrapperPlayServerRespawn.java +++ b/src/main/java/xyz/ineanto/nicko/wrapper/WrapperPlayServerRespawn.java @@ -4,6 +4,8 @@ import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.InternalStructure; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.reflect.StructureModifier; +import com.comphenix.protocol.reflect.accessors.Accessors; +import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.utility.MinecraftVersion; import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.MinecraftKey; @@ -52,23 +54,27 @@ public class WrapperPlayServerRespawn extends AbstractPacket { // 1.20.5 to 1.21.1 // why is life so hard? - /**final Class commonPlayerInfoClazz = MinecraftReflection.getMinecraftClass("network.protocol.game.CommonPlayerSpawnInfo"); - Object commonSpawnData = Accessors.getFieldAccessor(TYPE.getPacketClass(), commonPlayerInfoClazz, true).getField().get(TYPE.getPacketClass()); - final MinecraftKey key = MinecraftKey.fromHandle( - Accessors.getFieldAccessor( - commonPlayerInfoClazz, - MinecraftReflection.getResourceKey(), - true - ) - .get(spawnInfoStructure)); + final Class commonPlayerInfoClazz = MinecraftReflection.getMinecraftClass("network.protocol.game.CommonPlayerSpawnInfo"); + try { + final Object commonSpawnData = Accessors.getFieldAccessor(TYPE.getPacketClass(), commonPlayerInfoClazz, true).getField() + .get(this); + final MinecraftKey key = MinecraftKey.fromHandle( + Accessors.getFieldAccessor( + commonPlayerInfoClazz, + MinecraftReflection.getResourceKey(), + true + ) + .get(spawnInfoStructure)); - // Set the key - Accessors.getFieldAccessor( - commonPlayerInfoClazz, - MinecraftReflection.getResourceKey(), - true - ) - .set(commonSpawnData, key);*/ + Accessors.getFieldAccessor( + commonPlayerInfoClazz, + MinecraftReflection.getResourceKey(), + true + ) + .set(commonSpawnData, key); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } } }