From 3ad3da91791581a7af1fba3bdee54cbc4e58de07 Mon Sep 17 00:00:00 2001 From: ineanto Date: Wed, 17 May 2023 13:23:21 +0200 Subject: [PATCH] feat: player respawn support for 1.19 --- pom.xml | 30 ++++++++--------- .../nicko/disguise/AppearanceManager.java | 20 ++++++++--- .../wrapper/WrapperPlayServerRespawn.java | 33 +++++-------------- 3 files changed, 39 insertions(+), 44 deletions(-) diff --git a/pom.xml b/pom.xml index e88257a..1988940 100644 --- a/pom.xml +++ b/pom.xml @@ -39,12 +39,12 @@ - - com.comphenix.protocol - ProtocolLib - 5.0.0-SNAPSHOT - - + + + com.comphenix.protocol + ProtocolLib + 5.0.0-SNAPSHOT + me.clip @@ -52,13 +52,6 @@ 2.11.2 provided - - - org.spigotmc - spigot - 1.19.4-R0.1-SNAPSHOT - provided - xyz.xenondevs.invui @@ -97,15 +90,22 @@ yamlconfig 1.1.2 + com.fasterxml.jackson.core jackson-core - 2.13.3 + 2.14.2 + + + org.spigotmc + spigot-api + 1.19.4-R0.1-SNAPSHOT + provided com.fasterxml.jackson.dataformat jackson-dataformat-yaml - 2.13.3 + 2.14.2 diff --git a/src/main/java/net/artelnatif/nicko/disguise/AppearanceManager.java b/src/main/java/net/artelnatif/nicko/disguise/AppearanceManager.java index 0075f05..4659b9d 100644 --- a/src/main/java/net/artelnatif/nicko/disguise/AppearanceManager.java +++ b/src/main/java/net/artelnatif/nicko/disguise/AppearanceManager.java @@ -102,12 +102,14 @@ public class AppearanceManager { final WrappedGameProfile gameProfile = WrappedGameProfile.fromPlayer(player).withName(displayName); final ActionResult result = updateGameProfileSkin(gameProfile, skinChange); if (!result.isError()) { + updateMetadata(); updateTabList(gameProfile, displayName); respawnPlayer(); } return new ActionResult<>(); } + private ActionResult updateGameProfileSkin(WrappedGameProfile gameProfile, boolean skinChange) { final boolean changeOnlyName = profile.getSkin() != null && !profile.getSkin().equalsIgnoreCase(player.getName()); @@ -135,6 +137,11 @@ public class AppearanceManager { return new ActionResult<>(); } + private void updateMetadata() { + final WrappedDataWatcher entityWatcher = WrappedDataWatcher.getEntityWatcher(player); + entityWatcher.setObject(17, (byte) 0x7f, true); + } + private void respawnPlayer() { final World world = player.getWorld(); final WrapperPlayServerRespawn respawn = new WrapperPlayServerRespawn(); @@ -145,7 +152,7 @@ public class AppearanceManager { respawn.setDifficulty(world.getDifficulty()); respawn.setCopyMetadata(false); respawn.getHandle().getBooleans().write(0, false); // is debug - respawn.getHandle().getBooleans().write(1, false); // is flat + respawn.getHandle().getBooleans().write(0, false); // is flat respawn.sendPacket(player); } @@ -155,17 +162,22 @@ public class AppearanceManager { final WrapperPlayerServerPlayerInfo update = new WrapperPlayerServerPlayerInfo(); update.setActions(EnumSet.of(EnumWrappers.PlayerInfoAction.ADD_PLAYER, + EnumWrappers.PlayerInfoAction.INITIALIZE_CHAT, EnumWrappers.PlayerInfoAction.UPDATE_LISTED, EnumWrappers.PlayerInfoAction.UPDATE_DISPLAY_NAME, EnumWrappers.PlayerInfoAction.UPDATE_GAME_MODE, EnumWrappers.PlayerInfoAction.UPDATE_LATENCY)); update.setData(ImmutableList.of(new PlayerInfoData( - gameProfile, + player.getUniqueId(), player.getPing(), + true, EnumWrappers.NativeGameMode.fromBukkit(player.getGameMode()), - WrappedChatComponent.fromText(displayName) + gameProfile, + WrappedChatComponent.fromText(displayName), + new WrappedRemoteChatSessionData(UUID.randomUUID(), + WrappedProfilePublicKey.ofPlayer(player).getKeyData()) ))); remove.sendPacket(player); update.sendPacket(player); } -} +} \ No newline at end of file diff --git a/src/main/java/net/artelnatif/nicko/wrapper/WrapperPlayServerRespawn.java b/src/main/java/net/artelnatif/nicko/wrapper/WrapperPlayServerRespawn.java index d7ac3e9..ace7147 100644 --- a/src/main/java/net/artelnatif/nicko/wrapper/WrapperPlayServerRespawn.java +++ b/src/main/java/net/artelnatif/nicko/wrapper/WrapperPlayServerRespawn.java @@ -1,20 +1,18 @@ package net.artelnatif.nicko.wrapper; import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.InternalStructure; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.utility.MinecraftVersion; -import com.comphenix.protocol.wrappers.BlockPosition; 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.Difficulty; import org.bukkit.GameMode; -import org.bukkit.Location; import org.bukkit.World; -import java.util.Optional; - /** * Up-to-date version of the Wrapper class * for the PacketPlayServerRespawn. @@ -50,7 +48,12 @@ public class WrapperPlayServerRespawn extends AbstractPacket { public void setDimension(World value) { if (MinecraftVersion.WILD_UPDATE.atOrAbove()) { - // 1.19 and above + // 1.19 to 1.19.4 + // Thank you lukalt! + final InternalStructure dimensionType = handle.getStructures().read(0); + dimensionType.getMinecraftKeys().write(0, new MinecraftKey("minecraft", "dimension_type")); + dimensionType.getMinecraftKeys().write(1, new MinecraftKey("minecraft", "overworld")); + handle.getStructures().write(0, dimensionType); handle.getWorldKeys().write(0, value); } else if (MinecraftVersion.CAVES_CLIFFS_2.atOrAbove()) { // 1.18 @@ -100,26 +103,6 @@ public class WrapperPlayServerRespawn extends AbstractPacket { handle.getBytes().write(0, ((byte) (value ? 0x01 : 0x00))); } - //............. - // Last death location Field - // Added in 1.19. - //............. - - public Optional getLastDeathLocation() { - if (MinecraftVersion.WILD_UPDATE.atOrAbove()) { - return handle.getOptionals(BlockPosition.getConverter()).read(0); - } - return Optional.empty(); - } - - public void setLastDeathLocation(Location value) { - if (MinecraftVersion.WILD_UPDATE.atOrAbove()) { - final BlockPosition locationToBlockPosition = BlockPosition.getConverter().getSpecific(value); - final Optional blockPosition = Optional.ofNullable(locationToBlockPosition); - handle.getOptionals(BlockPosition.getConverter()).write(0, blockPosition); - } - } - //............. // Seed Field // Added in 1.15.