diff --git a/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java b/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java index effd2f0..94ca38f 100644 --- a/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java +++ b/src/main/java/xyz/ineanto/nicko/appearance/AppearanceManager.java @@ -145,12 +145,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/debug/RespawnPacketListener.java b/src/main/java/xyz/ineanto/nicko/debug/RespawnPacketListener.java index fa37b6b..f65d10e 100644 --- a/src/main/java/xyz/ineanto/nicko/debug/RespawnPacketListener.java +++ b/src/main/java/xyz/ineanto/nicko/debug/RespawnPacketListener.java @@ -4,7 +4,6 @@ import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.ListeningWhitelist; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketListener; -import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.wrappers.MinecraftKey; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; @@ -58,7 +57,6 @@ public class RespawnPacketListener implements PacketListener { } public Optional getWorld(PacketEvent event) throws Throwable { - final Class commonPlayerInfoClazz = MinecraftReflection.getMinecraftClass("network.protocol.game.CommonPlayerSpawnInfo"); // access CommonPlayerSpawnInfo, first field of that type in the Respawn / Login packets final Object packetHandle = event.getPacket().getHandle(); final Object commonSpawnData = packetHandle.getClass().getRecordComponents()[0].getAccessor().invoke(packetHandle); @@ -68,19 +66,18 @@ public class RespawnPacketListener implements PacketListener { System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-"); System.out.println(component.getName()); System.out.println(component.getType().getSimpleName()); - System.out.println("-=-=-=-=-=-=-=-=-=-=-=-=-=-"); component.getAccessor().setAccessible(false); } ); // 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(commonSpawnData.getClass(), MinecraftReflection.getResourceKey(), true) - .get(commonSpawnData)); // wrap to ProtocolLib handle - for (World world : Bukkit.getWorlds()) { - if (keysEquals(key, world.getKey())) { - return Optional.of(world); - } - }*/ + MinecraftKey key = MinecraftKey.fromHandle(commonSpawnData.getClass().getRecordComponents()[1]); + System.out.println(key.getPrefix() + " / " + key.getKey() + " (" + key.getFullKey() + ")"); + for (World world : Bukkit.getWorlds()) { + if (keysEquals(key, world.getKey())) { + return Optional.of(world); + } + } return Optional.empty(); } } diff --git a/src/main/java/xyz/ineanto/nicko/wrapper/WrapperCommonPlayerSpawnInfo.java b/src/main/java/xyz/ineanto/nicko/wrapper/WrapperCommonPlayerSpawnInfo.java new file mode 100644 index 0000000..e91a109 --- /dev/null +++ b/src/main/java/xyz/ineanto/nicko/wrapper/WrapperCommonPlayerSpawnInfo.java @@ -0,0 +1,11 @@ +package xyz.ineanto.nicko.wrapper; + +public class WrapperCommonPlayerSpawnInfo { + private final Object handle; + + public WrapperCommonPlayerSpawnInfo(Object handle) { + this.handle = handle; + } + + +} diff --git a/src/main/java/xyz/ineanto/nicko/wrapper/WrapperPlayServerRespawn.java b/src/main/java/xyz/ineanto/nicko/wrapper/WrapperPlayServerRespawn.java index 707258c..1ed2ec8 100644 --- a/src/main/java/xyz/ineanto/nicko/wrapper/WrapperPlayServerRespawn.java +++ b/src/main/java/xyz/ineanto/nicko/wrapper/WrapperPlayServerRespawn.java @@ -4,16 +4,17 @@ 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.BukkitConverters; import com.comphenix.protocol.wrappers.EnumWrappers; import com.comphenix.protocol.wrappers.MinecraftKey; import com.google.common.hash.Hashing; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.World; import java.lang.reflect.Field; +import java.lang.reflect.RecordComponent; /** * PacketPlayServerRespawn Wrapper class (1.20.X to 1.21.X) @@ -55,27 +56,16 @@ public class WrapperPlayServerRespawn extends AbstractPacket { } else { // 1.20.5 to 1.21.1 - final Class commonPlayerInfoClazz = MinecraftReflection.getMinecraftClass("network.protocol.game.CommonPlayerSpawnInfo"); try { - final Field commonSpawnDataField = Accessors.getFieldAccessor(TYPE.getPacketClass(), commonPlayerInfoClazz, true).getField(); - commonSpawnDataField.setAccessible(true); + final Object spawnInfoStructureHandle = spawnInfoStructure.getHandle(); + final RecordComponent[] components = spawnInfoStructureHandle.getClass().getRecordComponents(); - final MinecraftKey key = MinecraftKey.fromHandle( - Accessors.getFieldAccessor( - commonPlayerInfoClazz, - MinecraftReflection.getResourceKey(), - true - ) - .get(spawnInfoStructure)); - - Accessors.getFieldAccessor( - commonPlayerInfoClazz, - MinecraftReflection.getResourceKey(), - true - ) - .set(commonSpawnDataField.get(this), key); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); + // Doesn't work! + final Field levelKeyField = spawnInfoStructureHandle.getClass().getDeclaredField(components[1].getAccessor().getName()); + levelKeyField.setAccessible(true); + levelKeyField.set(spawnInfoStructureHandle, BukkitConverters.getWorldKeyConverter().getGeneric(Bukkit.getWorld("world"))); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(); } } }