From eaa12287081e09b6928cc2a753a7702a0b27e2d5 Mon Sep 17 00:00:00 2001 From: Boy Date: Thu, 1 May 2025 11:15:26 +0200 Subject: [PATCH 01/12] refactor: drop protocollib, swap remaining packets to nms --- build.gradle.kts | 16 +---- .../hibiscuscommons/nms/NMSPackets.java | 14 ++-- .../lojosho/hibiscuscommons/nms/NMSUtils.java | 1 - .../hibiscuscommons/util/ServerUtils.java | 14 ++-- .../util/packets/PacketManager.java | 49 ++------------ .../nms/v1_20_R3/NMSPackets.java | 64 +++++++++++-------- .../nms/v1_20_R4/NMSPackets.java | 54 +++++++++++----- .../nms/v1_21_R1/NMSPackets.java | 53 ++++++++++----- .../nms/v1_21_R2/NMSPackets.java | 54 +++++++++++----- .../nms/v1_21_R3/NMSPackets.java | 54 +++++++++++----- .../nms/v1_21_R4/NMSPackets.java | 58 ++++++++++++----- 11 files changed, 244 insertions(+), 187 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6c5a68c..c979575 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -33,7 +33,7 @@ allprojects { maven("https://repo.nexomc.com/snapshots/") maven("https://repo.nexomc.com/releases/") - // Geary & Backup ProtocolLib repo + // Geary repo maven("https://repo.mineinabyss.com/releases/") maven("https://repo.mineinabyss.com/snapshots/") @@ -55,9 +55,6 @@ allprojects { // PlaceholderAPI maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") - // ProtocolLib - maven("https://repo.dmulloy2.net/repository/public/") - // Oraxen maven("https://repo.oraxen.com/releases") @@ -83,7 +80,7 @@ allprojects { compileOnly("com.mojang:authlib:3.13.56") compileOnly("org.jetbrains:annotations:26.0.1") compileOnly("io.th0rgal:oraxen:1.182.0") - compileOnly("com.nexomc:nexo:1.0.0") + compileOnly("com.nexomc:nexo:1.4.0") compileOnly("com.github.LoneDev6:API-ItemsAdder:3.6.3-beta-14") compileOnly("com.mineinabyss:geary-papermc:0.31.0-dev.4") compileOnly("it.unimi.dsi:fastutil:8.5.15") @@ -98,7 +95,6 @@ allprojects { } compileOnly("com.github.Xiao-MoMi:Custom-Fishing:2.3.3") compileOnly("com.ticxo.modelengine:ModelEngine:R4.0.2") - compileOnly("com.comphenix.protocol:ProtocolLib:5.3.0") compileOnly("org.joml:joml:1.10.8") compileOnly("com.google.guava:guava:33.4.0-jre") // Sometimes just not included in compile time??? compileOnly("com.github.Gecolay.GSit:core:2.0.0") @@ -151,7 +147,6 @@ tasks { downloadPlugins { hangar("PlaceholderAPI", "2.11.6") - url("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/build/libs/ProtocolLib.jar") url("https://download.luckperms.net/1567/bukkit/loader/LuckPerms-Bukkit-5.4.150.jar") } } @@ -203,7 +198,6 @@ bukkit { main = "me.lojosho.hibiscuscommons.HibiscusCommonsPlugin" apiVersion = "1.20" authors = listOf("LoJoSho") - depend = listOf("ProtocolLib") softDepend = listOf( "ModelEngine", "Oraxen", @@ -250,12 +244,6 @@ hangarPublish { val versions: List = listOf("1.18.2-1.20.4") platformVersions.set(versions) - - dependencies { - hangar("ProtocolLib") { - required.set(true) - } - } } } } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java index 06b7e47..d6db71a 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java @@ -2,6 +2,7 @@ package me.lojosho.hibiscuscommons.nms; import it.unimi.dsi.fastutil.ints.IntList; import net.kyori.adventure.text.Component; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.entity.Display; import org.bukkit.entity.EntityType; @@ -20,10 +21,13 @@ public interface NMSPackets { static int POSITION_INTERPOLATION_DURATION = 2; - void sendSlotUpdate( - Player player, - int slot - ); + void sendGamemodeChange(Player player, GameMode gameMode); + + void sendRotateHeadPacket(int entityId, Location location, List sendTo); + + void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo); + + void sendSlotUpdate(Player player, int slot); void sendEquipmentSlotUpdate( int entityId, @@ -58,8 +62,6 @@ public interface NMSPackets { List sendTo ); - void sendRotationPacket(int entityId, float yaw, boolean onGround, List sendTo); - void sendCameraPacket(int entityId, List sendTo); void sendSpawnEntityPacket(int entityId, UUID uuid, EntityType entityType, Location location, List sendTo); diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSUtils.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSUtils.java index 833f0b8..87ef60e 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSUtils.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSUtils.java @@ -2,7 +2,6 @@ package me.lojosho.hibiscuscommons.nms; import org.bukkit.Color; import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java b/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java index 4d6ffaf..38aa218 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/util/ServerUtils.java @@ -1,12 +1,12 @@ package me.lojosho.hibiscuscommons.util; -import com.comphenix.protocol.wrappers.WrappedGameProfile; -import com.comphenix.protocol.wrappers.WrappedSignedProperty; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import me.lojosho.hibiscuscommons.nms.NMSHandlers; import org.bukkit.Color; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.profile.PlayerProfile; +import org.bukkit.profile.PlayerTextures; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -21,14 +21,8 @@ public class ServerUtils { } @Nullable - public static WrappedSignedProperty getSkin(Player player) { - WrappedSignedProperty skinData = WrappedGameProfile.fromPlayer(player).getProperties() - .get("textures").stream().findAny().orElse(null); - - if (skinData == null) { - return null; - } - return new WrappedSignedProperty("textures", skinData.getValue(), skinData.getSignature()); + public static PlayerTextures getSkin(Player player) { + return player.getPlayerProfile().getTextures(); } /** diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/util/packets/PacketManager.java b/common/src/main/java/me/lojosho/hibiscuscommons/util/packets/PacketManager.java index 07e8fad..fe9e60c 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/util/packets/PacketManager.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/util/packets/PacketManager.java @@ -1,12 +1,10 @@ package me.lojosho.hibiscuscommons.util.packets; -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import me.lojosho.hibiscuscommons.nms.NMSHandlers; import me.lojosho.hibiscuscommons.util.MessagesUtil; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -34,14 +32,9 @@ public class PacketManager { public static void gamemodeChangePacket( Player player, - int gamemode + GameMode gamemode ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.GAME_STATE_CHANGE); - packet.getGameStateIDs().write(0, 3); - // Tells what event this is. This is a change gamemode event. - packet.getFloat().write(0, (float) gamemode); - sendPacket(player, packet); - MessagesUtil.sendDebugMessages("Gamemode Change sent to " + player + " to be " + gamemode); + NMSHandlers.getHandler().getPacketHandler().sendGamemodeChange(player, gamemode); } public static void ridingMountPacket( @@ -52,15 +45,12 @@ public class PacketManager { NMSHandlers.getHandler().getPacketHandler().sendMountPacket(mountId, new int[]{passengerId}, sendTo); } - public static void sendLookPacket( + public static void sendRotateHeadPacket( int entityId, @NotNull Location location, @NotNull List sendTo ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_HEAD_ROTATION); - packet.getIntegers().write(0, entityId); - packet.getBytes().write(0, (byte) (location.getYaw() * 256.0F / 360.0F)); - for (Player p : sendTo) sendPacket(p, packet); + NMSHandlers.getHandler().getPacketHandler().sendRotateHeadPacket(entityId, location, sendTo); } public static void sendRotationPacket( @@ -69,29 +59,7 @@ public class PacketManager { boolean onGround, @NotNull List sendTo ) { - float ROTATION_FACTOR = 256.0F / 360.0F; - float yaw = location.getYaw() * ROTATION_FACTOR; - float pitch = location.getPitch() * ROTATION_FACTOR; - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); - packet.getIntegers().write(0, entityId); - packet.getBytes().write(0, (byte) yaw); - packet.getBytes().write(1, (byte) pitch); - - //Bukkit.getLogger().info("DEBUG: Yaw: " + (location.getYaw() * ROTATION_FACTOR) + " | Original Yaw: " + location.getYaw()); - packet.getBooleans().write(0, onGround); - for (Player p : sendTo) sendPacket(p, packet); - } - - public static void sendRotationPacket( - int entityId, - int yaw, - boolean onGround, - @NotNull List sendTo - ) { - float ROTATION_FACTOR = 256.0F / 360.0F; - float yaw2 = yaw * ROTATION_FACTOR; - - NMSHandlers.getHandler().getPacketHandler().sendRotationPacket(entityId, yaw2, onGround, sendTo); + NMSHandlers.getHandler().getPacketHandler().sendRotationPacket(entityId, location, onGround, sendTo); } public static void sendRidingPacket( @@ -213,9 +181,4 @@ public class PacketManager { return players; } - public static void sendPacket(Player player, PacketContainer packet) { - if (player == null) return; - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, null,false); - } - } diff --git a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java index d3501df..290f4bc 100644 --- a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java +++ b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java @@ -1,23 +1,14 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R3; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.JsonOps; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; -import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.minecraft.advancements.Advancement; -import net.minecraft.advancements.AdvancementHolder; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; @@ -25,6 +16,7 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.v1_20_R3.CraftEquipmentSlot; import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntityType; @@ -36,12 +28,10 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.joml.Quaternionf; import org.joml.Vector3f; import java.lang.reflect.Constructor; -import java.nio.ByteBuffer; import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { @@ -50,7 +40,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. static Constructor linkConstructor; static Constructor teleportConstructor; static Constructor cameraConstructor; - static Constructor lookAtConstructor; + static Constructor rotateHeadConstructor; static { try { passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); @@ -77,13 +67,45 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } try { - lookAtConstructor = ClientboundPlayerLookAtPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - lookAtConstructor.setAccessible(true); + rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); + rotateHeadConstructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } } + @Override + public void sendGamemodeChange(Player player, GameMode gameMode) { + ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; + float param = gameMode.ordinal(); + + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(type, param); + sendPacket(player, packet); + } + + @Override + public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeVarInt(entityId); + byteBuf.writeByte(headRot); + try { + ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); + for (Player p : sendTo) sendPacket(p, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + byte yaw = (byte) (location.getYaw() * ROTATION_FACTOR); + byte pitch = (byte) (location.getPitch() * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, yaw, pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendEquipmentSlotUpdate( int entityId, @@ -229,20 +251,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } } - @Override - public void sendRotationPacket(int entityId, float yaw, boolean onGround, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeFloat(yaw); - byteBuf.writeBoolean(onGround); - try { - ClientboundPlayerLookAtPacket packet = lookAtConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } - @Override public void sendCameraPacket(int entityId, List sendTo) { FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java index afe43fb..4a13cb3 100644 --- a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java @@ -24,8 +24,10 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -49,7 +51,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. static Constructor linkConstructor; static Constructor teleportConstructor; static Constructor cameraConstructor; - static Constructor lookAtConstructor; + static Constructor rotateHeadConstructor; static { try { passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); @@ -76,13 +78,45 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } try { - lookAtConstructor = ClientboundPlayerLookAtPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - lookAtConstructor.setAccessible(true); + rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); + rotateHeadConstructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } } + @Override + public void sendGamemodeChange(Player player, GameMode gameMode) { + ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; + float param = gameMode.ordinal(); + + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(type, param); + sendPacket(player, packet); + } + + @Override + public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeVarInt(entityId); + byteBuf.writeByte(headRot); + try { + ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); + for (Player p : sendTo) sendPacket(p, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + byte yaw = (byte) (location.getYaw() * ROTATION_FACTOR); + byte pitch = (byte) (location.getPitch() * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, yaw, pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendEquipmentSlotUpdate( int entityId, @@ -227,20 +261,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } } - @Override - public void sendRotationPacket(int entityId, float yaw, boolean onGround, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeFloat(yaw); - byteBuf.writeBoolean(onGround); - try { - ClientboundPlayerLookAtPacket packet = lookAtConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } - @Override public void sendCameraPacket(int entityId, List sendTo) { FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); diff --git a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java index 0433390..a820566 100644 --- a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java +++ b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java @@ -25,8 +25,10 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -49,7 +51,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. static Constructor linkConstructor; static Constructor teleportConstructor; static Constructor cameraConstructor; - static Constructor lookAtConstructor; + static Constructor rotateHeadConstructor; static Constructor rotationConstructor; static Constructor spawnConstructor; @@ -79,8 +81,8 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } try { - lookAtConstructor = ClientboundPlayerLookAtPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - lookAtConstructor.setAccessible(true); + rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); + rotateHeadConstructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } @@ -92,6 +94,37 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } } + @Override + public void sendGamemodeChange(Player player, GameMode gameMode) { + ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; + float param = gameMode.ordinal(); + + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(type, param); + sendPacket(player, packet); + } + + @Override + public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeVarInt(entityId); + byteBuf.writeByte(headRot); + try { + ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); + for (Player p : sendTo) sendPacket(p, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + byte yaw = (byte) (location.getYaw() * ROTATION_FACTOR); + byte pitch = (byte) (location.getPitch() * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, yaw, pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } @Override public void sendEquipmentSlotUpdate( @@ -237,20 +270,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } } - @Override - public void sendRotationPacket(int entityId, float yaw, boolean onGround, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeFloat(yaw); - byteBuf.writeBoolean(onGround); - try { - ClientboundPlayerLookAtPacket packet = lookAtConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } - @Override public void sendCameraPacket(int entityId, List sendTo) { FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); diff --git a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java index 6170489..daea761 100644 --- a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java +++ b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java @@ -26,8 +26,10 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -51,7 +53,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. static Constructor passengerConstructor; static Constructor linkConstructor; static Constructor cameraConstructor; - static Constructor lookAtConstructor; + static Constructor rotateHeadConstructor; static { try { passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); @@ -72,13 +74,45 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } try { - lookAtConstructor = ClientboundPlayerLookAtPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - lookAtConstructor.setAccessible(true); + rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); + rotateHeadConstructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } } + @Override + public void sendGamemodeChange(Player player, GameMode gameMode) { + ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; + float param = gameMode.ordinal(); + + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(type, param); + sendPacket(player, packet); + } + + @Override + public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeVarInt(entityId); + byteBuf.writeByte(headRot); + try { + ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); + for (Player p : sendTo) sendPacket(p, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + byte yaw = (byte) (location.getYaw() * ROTATION_FACTOR); + byte pitch = (byte) (location.getPitch() * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, yaw, pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendEquipmentSlotUpdate( int entityId, @@ -215,20 +249,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } } - @Override - public void sendRotationPacket(int entityId, float yaw, boolean onGround, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeFloat(yaw); - byteBuf.writeBoolean(onGround); - try { - ClientboundPlayerLookAtPacket packet = lookAtConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } - @Override public void sendCameraPacket(int entityId, List sendTo) { FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java index 5349455..44ee3f9 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java @@ -28,8 +28,10 @@ import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; import org.bukkit.Bukkit; import org.bukkit.Color; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -54,7 +56,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. static Constructor passengerConstructor; static Constructor linkConstructor; static Constructor cameraConstructor; - static Constructor lookAtConstructor; + static Constructor rotateHeadConstructor; static { try { @@ -76,13 +78,45 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } try { - lookAtConstructor = ClientboundPlayerLookAtPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - lookAtConstructor.setAccessible(true); + rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); + rotateHeadConstructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } } + @Override + public void sendGamemodeChange(Player player, GameMode gameMode) { + ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; + float param = gameMode.ordinal(); + + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(type, param); + sendPacket(player, packet); + } + + @Override + public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeVarInt(entityId); + byteBuf.writeByte(headRot); + try { + ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); + for (Player p : sendTo) sendPacket(p, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + byte yaw = (byte) (location.getYaw() * ROTATION_FACTOR); + byte pitch = (byte) (location.getPitch() * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, yaw, pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendEquipmentSlotUpdate( int entityId, @@ -219,20 +253,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } } - @Override - public void sendRotationPacket(int entityId, float yaw, boolean onGround, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeFloat(yaw); - byteBuf.writeBoolean(onGround); - try { - ClientboundPlayerLookAtPacket packet = lookAtConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } - @Override public void sendCameraPacket(int entityId, List sendTo) { FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); diff --git a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java index 81056db..c3c4553 100644 --- a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java +++ b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java @@ -4,6 +4,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; +import io.lumine.mythic.bukkit.utils.redis.jedis.Client; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; @@ -11,6 +12,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.kyori.adventure.text.serializer.json.JSONComponentSerializer; import net.minecraft.advancements.*; +import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; @@ -19,8 +21,10 @@ import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.level.portal.TeleportTransition; import net.minecraft.world.phys.Vec3; @@ -28,8 +32,10 @@ import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; import org.bukkit.Bukkit; import org.bukkit.Color; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -53,7 +59,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. static Constructor passengerConstructor; static Constructor linkConstructor; static Constructor cameraConstructor; - static Constructor lookAtConstructor; + static Constructor rotateHeadConstructor; static { try { @@ -75,13 +81,45 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } try { - lookAtConstructor = ClientboundPlayerLookAtPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - lookAtConstructor.setAccessible(true); + rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); + rotateHeadConstructor.setAccessible(true); } catch (Exception e) { e.printStackTrace(); } } + @Override + public void sendGamemodeChange(Player player, GameMode gameMode) { + ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; + float param = gameMode.ordinal(); + + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(type, param); + sendPacket(player, packet); + } + + @Override + public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); + FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); + byteBuf.writeVarInt(entityId); + byteBuf.writeByte(headRot); + try { + ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); + for (Player p : sendTo) sendPacket(p, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + byte yaw = (byte) (location.getYaw() * ROTATION_FACTOR); + byte pitch = (byte) (location.getPitch() * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, yaw, pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendEquipmentSlotUpdate( int entityId, @@ -218,20 +256,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } } - @Override - public void sendRotationPacket(int entityId, float yaw, boolean onGround, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeFloat(yaw); - byteBuf.writeBoolean(onGround); - try { - ClientboundPlayerLookAtPacket packet = lookAtConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } - @Override public void sendCameraPacket(int entityId, List sendTo) { FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); From b2c1dd2d4e3d8af657c8d2a1547d9b26c19792c0 Mon Sep 17 00:00:00 2001 From: Boy Date: Thu, 1 May 2025 11:47:44 +0200 Subject: [PATCH 02/12] refactor: use fake entities instead of reflection for packets where possible --- .../nms/v1_20_R3/NMSPackets.java | 98 ++++++------------- .../nms/v1_20_R4/NMSPackets.java | 97 ++++++------------ .../nms/v1_21_R1/NMSPackets.java | 97 ++++++------------ .../nms/v1_21_R2/NMSPackets.java | 69 +++++-------- .../nms/v1_21_R3/NMSPackets.java | 69 +++++-------- .../nms/v1_21_R4/NMSPackets.java | 69 +++++-------- 6 files changed, 154 insertions(+), 345 deletions(-) diff --git a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java index 290f4bc..7eeaf33 100644 --- a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java +++ b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java @@ -9,8 +9,12 @@ import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; @@ -37,10 +41,6 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { static Constructor passengerConstructor; - static Constructor linkConstructor; - static Constructor teleportConstructor; - static Constructor cameraConstructor; - static Constructor rotateHeadConstructor; static { try { passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); @@ -48,30 +48,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } catch (Exception e) { e.printStackTrace(); } - try { - linkConstructor = ClientboundSetEntityLinkPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - linkConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - teleportConstructor = ClientboundTeleportEntityPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - teleportConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - cameraConstructor = ClientboundSetCameraPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - cameraConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - rotateHeadConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } } @Override @@ -85,16 +61,13 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeByte(headRot); - try { - ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -212,15 +185,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendLeashPacket(int leashEntity, int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeInt(leashEntity); - byteBuf.writeInt(entityId); - try { - ClientboundSetEntityLinkPacket packet = linkConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entities just to avoid reflection + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity1 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + Entity entity2 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity1.setId(leashEntity); + entity2.setId(entityId); + + ClientboundSetEntityLinkPacket packet = new ClientboundSetEntityLinkPacket(entity1, entity2); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -234,33 +207,22 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. boolean onGround, List sendTo ) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeDouble(x); - byteBuf.writeDouble(y); - byteBuf.writeDouble(z); - byteBuf.writeByte((byte) (yaw * 256.0F / 360.0F)); - byteBuf.writeByte((byte) (pitch * 256.0F / 360.0F)); - byteBuf.writeBoolean(onGround); + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(level, x, y, z); + entity.setId(entityId); + entity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); + entity.setOnGround(onGround); - try { - ClientboundTeleportEntityPacket packet = teleportConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } @Override public void sendCameraPacket(int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - try { - ClientboundSetCameraPacket packet = cameraConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entity just to avoid reflection + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java index 4a13cb3..d33ca7b 100644 --- a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java @@ -17,8 +17,11 @@ import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; @@ -48,10 +51,6 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { static Constructor passengerConstructor; - static Constructor linkConstructor; - static Constructor teleportConstructor; - static Constructor cameraConstructor; - static Constructor rotateHeadConstructor; static { try { passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); @@ -59,30 +58,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } catch (Exception e) { e.printStackTrace(); } - try { - linkConstructor = ClientboundSetEntityLinkPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - linkConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - teleportConstructor = ClientboundTeleportEntityPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - teleportConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - cameraConstructor = ClientboundSetCameraPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - cameraConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - rotateHeadConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } } @Override @@ -96,16 +71,13 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeByte(headRot); - try { - ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -222,15 +194,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendLeashPacket(int leashEntity, int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeInt(leashEntity); - byteBuf.writeInt(entityId); - try { - ClientboundSetEntityLinkPacket packet = linkConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entities just to avoid reflection + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity1 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + Entity entity2 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity1.setId(leashEntity); + entity2.setId(entityId); + + ClientboundSetEntityLinkPacket packet = new ClientboundSetEntityLinkPacket(entity1, entity2); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -244,33 +216,22 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. boolean onGround, List sendTo ) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeDouble(x); - byteBuf.writeDouble(y); - byteBuf.writeDouble(z); - byteBuf.writeByte((byte) (yaw * 256.0F / 360.0F)); - byteBuf.writeByte((byte) (pitch * 256.0F / 360.0F)); - byteBuf.writeBoolean(onGround); + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(level, x, y, z); + entity.setId(entityId); + entity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); + entity.setOnGround(onGround); - try { - ClientboundTeleportEntityPacket packet = teleportConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } @Override public void sendCameraPacket(int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - try { - ClientboundSetCameraPacket packet = cameraConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entity just to avoid reflection + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java index a820566..8f58be9 100644 --- a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java +++ b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java @@ -18,8 +18,11 @@ import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; @@ -48,10 +51,6 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { static Constructor passengerConstructor; - static Constructor linkConstructor; - static Constructor teleportConstructor; - static Constructor cameraConstructor; - static Constructor rotateHeadConstructor; static Constructor rotationConstructor; static Constructor spawnConstructor; @@ -62,30 +61,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } catch (Exception e) { e.printStackTrace(); } - try { - linkConstructor = ClientboundSetEntityLinkPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - linkConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - teleportConstructor = ClientboundTeleportEntityPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - teleportConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - cameraConstructor = ClientboundSetCameraPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - cameraConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - rotateHeadConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } try { rotationConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); rotationConstructor.setAccessible(true); @@ -105,16 +80,13 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeByte(headRot); - try { - ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -231,15 +203,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendLeashPacket(int leashEntity, int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeInt(leashEntity); - byteBuf.writeInt(entityId); - try { - ClientboundSetEntityLinkPacket packet = linkConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entities just to avoid reflection + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity1 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + Entity entity2 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity1.setId(leashEntity); + entity2.setId(entityId); + + ClientboundSetEntityLinkPacket packet = new ClientboundSetEntityLinkPacket(entity1, entity2); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -253,33 +225,22 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. boolean onGround, List sendTo ) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeDouble(x); - byteBuf.writeDouble(y); - byteBuf.writeDouble(z); - byteBuf.writeByte((byte) (yaw * 256.0F / 360.0F)); - byteBuf.writeByte((byte) (pitch * 256.0F / 360.0F)); - byteBuf.writeBoolean(onGround); + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(level, x, y, z); + entity.setId(entityId); + entity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); + entity.setOnGround(onGround); - try { - ClientboundTeleportEntityPacket packet = teleportConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } @Override public void sendCameraPacket(int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - try { - ClientboundSetCameraPacket packet = cameraConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entity just to avoid reflection + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } @Override diff --git a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java index daea761..b3d2cef 100644 --- a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java +++ b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java @@ -17,9 +17,12 @@ import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.level.portal.TeleportTransition; import net.minecraft.world.phys.Vec3; @@ -51,9 +54,6 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { static Constructor passengerConstructor; - static Constructor linkConstructor; - static Constructor cameraConstructor; - static Constructor rotateHeadConstructor; static { try { passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); @@ -61,24 +61,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } catch (Exception e) { e.printStackTrace(); } - try { - linkConstructor = ClientboundSetEntityLinkPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - linkConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - cameraConstructor = ClientboundSetCameraPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - cameraConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - rotateHeadConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } } @Override @@ -92,16 +74,13 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeByte(headRot); - try { - ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -219,15 +198,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendLeashPacket(int leashEntity, int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeInt(leashEntity); - byteBuf.writeInt(entityId); - try { - ClientboundSetEntityLinkPacket packet = linkConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entities just to avoid reflection + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity1 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + Entity entity2 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity1.setId(leashEntity); + entity2.setId(entityId); + + ClientboundSetEntityLinkPacket packet = new ClientboundSetEntityLinkPacket(entity1, entity2); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -251,14 +230,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendCameraPacket(int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - try { - ClientboundSetCameraPacket packet = cameraConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entity just to avoid reflection + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java index 44ee3f9..ae6b42e 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java @@ -18,9 +18,12 @@ import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.level.portal.TeleportTransition; import net.minecraft.world.phys.Vec3; @@ -54,9 +57,6 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { static Constructor passengerConstructor; - static Constructor linkConstructor; - static Constructor cameraConstructor; - static Constructor rotateHeadConstructor; static { try { @@ -65,24 +65,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } catch (Exception e) { e.printStackTrace(); } - try { - linkConstructor = ClientboundSetEntityLinkPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - linkConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - cameraConstructor = ClientboundSetCameraPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - cameraConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - rotateHeadConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } } @Override @@ -96,16 +78,13 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeByte(headRot); - try { - ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -223,15 +202,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendLeashPacket(int leashEntity, int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeInt(leashEntity); - byteBuf.writeInt(entityId); - try { - ClientboundSetEntityLinkPacket packet = linkConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entities just to avoid reflection + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity1 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + Entity entity2 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity1.setId(leashEntity); + entity2.setId(entityId); + + ClientboundSetEntityLinkPacket packet = new ClientboundSetEntityLinkPacket(entity1, entity2); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -255,14 +234,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendCameraPacket(int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - try { - ClientboundSetCameraPacket packet = cameraConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entity just to avoid reflection + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java index c3c4553..a9df95d 100644 --- a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java +++ b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java @@ -20,6 +20,7 @@ import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; @@ -57,9 +58,6 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { static Constructor passengerConstructor; - static Constructor linkConstructor; - static Constructor cameraConstructor; - static Constructor rotateHeadConstructor; static { try { @@ -68,24 +66,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } catch (Exception e) { e.printStackTrace(); } - try { - linkConstructor = ClientboundSetEntityLinkPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - linkConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - cameraConstructor = ClientboundSetCameraPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - cameraConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - rotateHeadConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - rotateHeadConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } } @Override @@ -99,16 +79,13 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeByte(headRot); - try { - ClientboundRotateHeadPacket packet = rotateHeadConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -226,15 +203,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendLeashPacket(int leashEntity, int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeInt(leashEntity); - byteBuf.writeInt(entityId); - try { - ClientboundSetEntityLinkPacket packet = linkConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entities just to avoid reflection + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity1 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + Entity entity2 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity1.setId(leashEntity); + entity2.setId(entityId); + + ClientboundSetEntityLinkPacket packet = new ClientboundSetEntityLinkPacket(entity1, entity2); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -258,14 +235,12 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendCameraPacket(int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - try { - ClientboundSetCameraPacket packet = cameraConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entity just to avoid reflection + Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); + entity.setId(entityId); + + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + for (Player p : sendTo) sendPacket(p, packet); } From ceca7561843e5e3d512d28e77b79c17a117e0414 Mon Sep 17 00:00:00 2001 From: Boy Date: Thu, 1 May 2025 11:54:02 +0200 Subject: [PATCH 03/12] refactor: use static entity object for fake nms entity --- .../nms/v1_20_R3/NMSPackets.java | 24 +++++++------- .../nms/v1_20_R4/NMSPackets.java | 24 +++++++------- .../nms/v1_21_R1/NMSPackets.java | 32 +++++++------------ .../nms/v1_21_R2/NMSPackets.java | 14 ++++---- .../nms/v1_21_R3/NMSPackets.java | 14 ++++---- .../nms/v1_21_R4/NMSPackets.java | 14 ++++---- 6 files changed, 53 insertions(+), 69 deletions(-) diff --git a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java index 7eeaf33..4fed040 100644 --- a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java +++ b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java @@ -40,6 +40,8 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { + private static ServerLevel level = MinecraftServer.getServer().overworld(); + private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); static Constructor passengerConstructor; static { try { @@ -61,12 +63,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - entity.setId(entityId); + fakeNmsEntity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(fakeNmsEntity, headRot); for (Player p : sendTo) sendPacket(p, packet); } @@ -207,21 +207,19 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. boolean onGround, List sendTo ) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(level, x, y, z); - entity.setId(entityId); - entity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); - entity.setOnGround(onGround); + fakeNmsEntity.setId(entityId); + fakeNmsEntity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); + fakeNmsEntity.setOnGround(onGround); - ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(entity); + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } @Override public void sendCameraPacket(int entityId, List sendTo) { - // Fake entity just to avoid reflection - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); - ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + fakeNmsEntity.setId(entityId); + + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java index d33ca7b..7c5cc04 100644 --- a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java @@ -50,6 +50,8 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { + private static ServerLevel level = MinecraftServer.getServer().overworld(); + private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); static Constructor passengerConstructor; static { try { @@ -71,12 +73,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - entity.setId(entityId); + fakeNmsEntity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(fakeNmsEntity, headRot); for (Player p : sendTo) sendPacket(p, packet); } @@ -216,21 +216,19 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. boolean onGround, List sendTo ) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(level, x, y, z); - entity.setId(entityId); - entity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); - entity.setOnGround(onGround); + fakeNmsEntity.setId(entityId); + fakeNmsEntity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); + fakeNmsEntity.setOnGround(onGround); - ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(entity); + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } @Override public void sendCameraPacket(int entityId, List sendTo) { - // Fake entity just to avoid reflection - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); - ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + fakeNmsEntity.setId(entityId); + + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java index 8f58be9..616ebb3 100644 --- a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java +++ b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java @@ -50,9 +50,9 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { + private static ServerLevel level = MinecraftServer.getServer().overworld(); + private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); static Constructor passengerConstructor; - static Constructor rotationConstructor; - static Constructor spawnConstructor; static { try { @@ -61,12 +61,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } catch (Exception e) { e.printStackTrace(); } - try { - rotationConstructor = ClientboundRotateHeadPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - rotationConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } } @Override @@ -80,12 +74,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - entity.setId(entityId); + fakeNmsEntity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(fakeNmsEntity, headRot); for (Player p : sendTo) sendPacket(p, packet); } @@ -225,21 +217,19 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. boolean onGround, List sendTo ) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(level, x, y, z); - entity.setId(entityId); - entity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); - entity.setOnGround(onGround); + fakeNmsEntity.setId(entityId); + fakeNmsEntity.setRot((yaw * 256.0F / 360.0F), (pitch * 256.0F / 360.0F)); + fakeNmsEntity.setOnGround(onGround); - ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(entity); + ClientboundTeleportEntityPacket packet = new ClientboundTeleportEntityPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } @Override public void sendCameraPacket(int entityId, List sendTo) { - // Fake entity just to avoid reflection - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); - ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + fakeNmsEntity.setId(entityId); + + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java index b3d2cef..8b92555 100644 --- a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java +++ b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java @@ -53,6 +53,8 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { + private static ServerLevel level = MinecraftServer.getServer().overworld(); + private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); static Constructor passengerConstructor; static { try { @@ -74,12 +76,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - entity.setId(entityId); + fakeNmsEntity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(fakeNmsEntity, headRot); for (Player p : sendTo) sendPacket(p, packet); } @@ -230,9 +230,9 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendCameraPacket(int entityId, List sendTo) { - // Fake entity just to avoid reflection - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); - ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + fakeNmsEntity.setId(entityId); + + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java index ae6b42e..5824c46 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java @@ -56,6 +56,8 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { + private static ServerLevel level = MinecraftServer.getServer().overworld(); + private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); static Constructor passengerConstructor; static { @@ -78,12 +80,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - entity.setId(entityId); + fakeNmsEntity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(fakeNmsEntity, headRot); for (Player p : sendTo) sendPacket(p, packet); } @@ -234,9 +234,9 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendCameraPacket(int entityId, List sendTo) { - // Fake entity just to avoid reflection - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); - ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + fakeNmsEntity.setId(entityId); + + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } diff --git a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java index a9df95d..aa84c2b 100644 --- a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java +++ b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java @@ -57,6 +57,8 @@ import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { + private static ServerLevel level = MinecraftServer.getServer().overworld(); + private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); static Constructor passengerConstructor; static { @@ -79,12 +81,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { - ServerLevel level = MinecraftServer.getServer().overworld(); - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - entity.setId(entityId); + fakeNmsEntity.setId(entityId); byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); - ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(entity, headRot); + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(fakeNmsEntity, headRot); for (Player p : sendTo) sendPacket(p, packet); } @@ -235,11 +235,9 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendCameraPacket(int entityId, List sendTo) { - // Fake entity just to avoid reflection - Entity entity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, MinecraftServer.getServer().overworld()); - entity.setId(entityId); + fakeNmsEntity.setId(entityId); - ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(entity); + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(fakeNmsEntity); for (Player p : sendTo) sendPacket(p, packet); } From 827577639de12c2e3eba44d4aabc3a075035de84 Mon Sep 17 00:00:00 2001 From: Boy Date: Thu, 1 May 2025 12:00:03 +0200 Subject: [PATCH 04/12] refactor: swap passenger packet logic off reflection aswell --- .../nms/v1_20_R3/NMSPackets.java | 28 +++++++----------- .../nms/v1_20_R4/NMSPackets.java | 28 +++++++----------- .../nms/v1_21_R1/NMSPackets.java | 29 +++++++------------ .../nms/v1_21_R2/NMSPackets.java | 28 +++++++----------- .../nms/v1_21_R3/NMSPackets.java | 29 +++++++------------ .../nms/v1_21_R4/NMSPackets.java | 29 +++++++------------ 6 files changed, 60 insertions(+), 111 deletions(-) diff --git a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java index 4fed040..b150ead 100644 --- a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java +++ b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java @@ -1,5 +1,6 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R3; +import com.google.common.collect.ImmutableList; import com.mojang.datafixers.util.Pair; import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; @@ -42,15 +43,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - static Constructor passengerConstructor; - static { - try { - passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - passengerConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } @Override public void sendGamemodeChange(Player player, GameMode gameMode) { @@ -172,15 +164,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendMountPacket(int mountId, int[] passengerIds, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(mountId); - byteBuf.writeVarIntArray(passengerIds); - try { - ClientboundSetPassengersPacket packet = passengerConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + for (Player p : sendTo) sendPacket(p, packet); } @Override diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java index 7c5cc04..1ea61a9 100644 --- a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java @@ -1,5 +1,6 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R4; +import com.google.common.collect.ImmutableList; import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; @@ -52,15 +53,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - static Constructor passengerConstructor; - static { - try { - passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - passengerConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } @Override public void sendGamemodeChange(Player player, GameMode gameMode) { @@ -181,15 +173,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendMountPacket(int mountId, int[] passengerIds, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(mountId); - byteBuf.writeVarIntArray(passengerIds); - try { - ClientboundSetPassengersPacket packet = passengerConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + for (Player p : sendTo) sendPacket(p, packet); } @Override diff --git a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java index 616ebb3..04bf957 100644 --- a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java +++ b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java @@ -1,5 +1,6 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R1; +import com.google.common.collect.ImmutableList; import com.google.gson.JsonObject; import com.mojang.datafixers.kinds.Const; import com.mojang.datafixers.util.Pair; @@ -52,16 +53,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - static Constructor passengerConstructor; - - static { - try { - passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - passengerConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } @Override public void sendGamemodeChange(Player player, GameMode gameMode) { @@ -182,15 +173,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendMountPacket(int mountId, int[] passengerIds, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(mountId); - byteBuf.writeVarIntArray(passengerIds); - try { - ClientboundSetPassengersPacket packet = passengerConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + for (Player p : sendTo) sendPacket(p, packet); } @Override diff --git a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java index 8b92555..b33a26b 100644 --- a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java +++ b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java @@ -1,5 +1,6 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R2; +import com.google.common.collect.ImmutableList; import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; @@ -55,15 +56,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - static Constructor passengerConstructor; - static { - try { - passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - passengerConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } @Override public void sendGamemodeChange(Player player, GameMode gameMode) { @@ -185,15 +177,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendMountPacket(int mountId, int[] passengerIds, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(mountId); - byteBuf.writeVarIntArray(passengerIds); - try { - ClientboundSetPassengersPacket packet = passengerConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + for (Player p : sendTo) sendPacket(p, packet); } @Override diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java index 5824c46..42d8fc7 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java @@ -1,5 +1,6 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R3; +import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; @@ -58,16 +59,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - static Constructor passengerConstructor; - - static { - try { - passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - passengerConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } @Override public void sendGamemodeChange(Player player, GameMode gameMode) { @@ -189,15 +180,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendMountPacket(int mountId, int[] passengerIds, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(mountId); - byteBuf.writeVarIntArray(passengerIds); - try { - ClientboundSetPassengersPacket packet = passengerConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + for (Player p : sendTo) sendPacket(p, packet); } @Override diff --git a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java index aa84c2b..892b509 100644 --- a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java +++ b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java @@ -1,5 +1,6 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R4; +import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.mojang.datafixers.util.Pair; @@ -59,16 +60,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - static Constructor passengerConstructor; - - static { - try { - passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - passengerConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - } @Override public void sendGamemodeChange(Player player, GameMode gameMode) { @@ -190,15 +181,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendMountPacket(int mountId, int[] passengerIds, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(mountId); - byteBuf.writeVarIntArray(passengerIds); - try { - ClientboundSetPassengersPacket packet = passengerConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + for (Player p : sendTo) sendPacket(p, packet); } @Override From 32402bd44b68c563cbd14f19a87e480febd14f81 Mon Sep 17 00:00:00 2001 From: Boy Date: Thu, 1 May 2025 13:54:20 +0200 Subject: [PATCH 05/12] refactor: move even more packets from hmcc to nms --- .../hibiscuscommons/nms/NMSPackets.java | 14 +++ .../nms/v1_20_R3/NMSPackets.java | 81 +++++++++++++- .../nms/v1_20_R4/NMSPackets.java | 82 +++++++++++++- .../nms/v1_21_R1/NMSPackets.java | 82 +++++++++++++- .../nms/v1_21_R2/NMSPackets.java | 84 +++++++++++++-- .../nms/v1_21_R3/NMSPackets.java | 88 +++++++++++++-- .../nms/v1_21_R4/NMSPackets.java | 101 +++++++++++++++--- 7 files changed, 488 insertions(+), 44 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java index d6db71a..990b785 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java @@ -1,5 +1,6 @@ package me.lojosho.hibiscuscommons.nms; +import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.ints.IntList; import net.kyori.adventure.text.Component; import org.bukkit.GameMode; @@ -10,21 +11,34 @@ import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import org.joml.Quaternionf; import org.joml.Vector3f; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.UUID; public interface NMSPackets { static int POSITION_INTERPOLATION_DURATION = 2; + static int SHARED_ENTITY_METADATA = 0; + + void sendSharedEntityData(int entityId, Map dataValues, List sendTo); + + void sendFakePlayerInfoPacket(final Player skinnedPlayer, final int entityId, final UUID uuid, final String npcName, final List sendTo); + + void sendPlayerInfoRemovePacket(final UUID uuid, final List sendTo); + + void sendMovePacket(final int entityId, final @NotNull Location from, final @NotNull Location to, final boolean onGround, @NotNull List sendTo); void sendGamemodeChange(Player player, GameMode gameMode); void sendRotateHeadPacket(int entityId, Location location, List sendTo); + void sendRotationPacket(int entityId, float yaw, float pitch, boolean onGround, List sendTo); + void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo); void sendSlotUpdate(Player player, int slot); diff --git a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java index b150ead..6bbe400 100644 --- a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java +++ b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java @@ -1,13 +1,16 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R3; import com.google.common.collect.ImmutableList; +import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; -import io.netty.buffer.Unpooled; +import io.papermc.paper.adventure.PaperAdventure; import it.unimi.dsi.fastutil.ints.IntList; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.util.AdventureUtils; import net.kyori.adventure.text.Component; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; @@ -17,6 +20,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.level.GameType; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; @@ -33,17 +37,79 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import org.joml.Quaternionf; import org.joml.Vector3f; -import java.lang.reflect.Constructor; import java.util.*; +import java.util.stream.Collectors; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + @Override @SuppressWarnings("unchecked") + public void sendSharedEntityData(int entityId, Map dataValues, List sendTo) { + List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { + int index = entry.getKey(); + Number value = entry.getValue(); + return switch (value) { + case Byte byteVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.BYTE, byteVal); + case Float floatVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.FLOAT, floatVal); + case Integer intVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.INT, intVal); + default -> + throw new IllegalArgumentException("Unsupported data value type: " + value.getClass().getSimpleName()); + }; + }).collect(Collectors.toList()); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendFakePlayerInfoPacket( + final Player skinnedPlayer, + final int entityId, + final UUID uuid, + final String npcName, + final List sendTo + ) { + ServerPlayer player = ((CraftPlayer) skinnedPlayer).getHandle(); + String name = npcName.substring(0, 15); + GameProfile profile = new GameProfile(uuid, name); + + Component component = AdventureUtils.MINI_MESSAGE.deserialize(name); + net.minecraft.network.chat.Component nmsComponent = HibiscusCommonsPlugin.isOnPaper() ? PaperAdventure.asVanilla(component) : net.minecraft.network.chat.Component.literal(name); + + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(uuid, profile, false, 0, GameType.CREATIVE, nmsComponent, player.getChatSession().asData()); + EnumSet actions = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(actions, entry); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendPlayerInfoRemovePacket(final UUID uuid, final List sendTo) { + ClientboundPlayerInfoRemovePacket packet = new ClientboundPlayerInfoRemovePacket(List.of(uuid)); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendMovePacket( + final int entityId, + final @NotNull Location from, + final @NotNull Location to, + final boolean onGround, + @NotNull List sendTo + ) { + byte dx = (byte) (to.getX() - from.getX()); + byte dy = (byte) (to.getY() - from.getY()); + byte dz = (byte) (to.getZ() - from.getZ()); + + ClientboundMoveEntityPacket.Pos packet = new ClientboundMoveEntityPacket.Pos(entityId, dx, dy, dz, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendGamemodeChange(Player player, GameMode gameMode) { ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; @@ -62,6 +128,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void sendRotationPacket(int entityId, float yaw, float pitch, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + yaw = (byte) (yaw * ROTATION_FACTOR); + pitch = (byte) (pitch * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, (byte) yaw, (byte) pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { float ROTATION_FACTOR = 256.0F / 360.0F; diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java index 1ea61a9..9ac73d0 100644 --- a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java @@ -2,18 +2,20 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R4; import com.google.common.collect.ImmutableList; import com.google.gson.JsonObject; +import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; -import io.netty.buffer.Unpooled; +import io.papermc.paper.adventure.PaperAdventure; import it.unimi.dsi.fastutil.ints.IntList; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.util.AdventureUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; @@ -24,6 +26,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.level.GameType; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; @@ -31,7 +34,6 @@ import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; -import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -42,18 +44,79 @@ import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; import org.joml.Quaternionf; import org.joml.Vector3f; -import java.lang.reflect.Constructor; -import java.nio.ByteBuffer; import java.util.*; +import java.util.stream.Collectors; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + @Override @SuppressWarnings("unchecked") + public void sendSharedEntityData(int entityId, Map dataValues, List sendTo) { + List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { + int index = entry.getKey(); + Number value = entry.getValue(); + return switch (value) { + case Byte byteVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.BYTE, byteVal); + case Float floatVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.FLOAT, floatVal); + case Integer intVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.INT, intVal); + default -> + throw new IllegalArgumentException("Unsupported data value type: " + value.getClass().getSimpleName()); + }; + }).collect(Collectors.toList()); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendFakePlayerInfoPacket( + final Player skinnedPlayer, + final int entityId, + final UUID uuid, + final String npcName, + final List sendTo + ) { + ServerPlayer player = ((CraftPlayer) skinnedPlayer).getHandle(); + String name = npcName.substring(0, 15); + GameProfile profile = new GameProfile(uuid, name); + + Component component = AdventureUtils.MINI_MESSAGE.deserialize(name); + net.minecraft.network.chat.Component nmsComponent = HibiscusCommonsPlugin.isOnPaper() ? PaperAdventure.asVanilla(component) : net.minecraft.network.chat.Component.literal(name); + + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(uuid, profile, false, 0, GameType.CREATIVE, nmsComponent, player.getChatSession().asData()); + EnumSet actions = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(actions, entry); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendPlayerInfoRemovePacket(final UUID uuid, final List sendTo) { + ClientboundPlayerInfoRemovePacket packet = new ClientboundPlayerInfoRemovePacket(List.of(uuid)); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendMovePacket( + final int entityId, + final @NotNull Location from, + final @NotNull Location to, + final boolean onGround, + @NotNull List sendTo + ) { + byte dx = (byte) (to.getX() - from.getX()); + byte dy = (byte) (to.getY() - from.getY()); + byte dz = (byte) (to.getZ() - from.getZ()); + + ClientboundMoveEntityPacket.Pos packet = new ClientboundMoveEntityPacket.Pos(entityId, dx, dy, dz, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendGamemodeChange(Player player, GameMode gameMode) { ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; @@ -72,6 +135,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void sendRotationPacket(int entityId, float yaw, float pitch, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + yaw = (byte) (yaw * ROTATION_FACTOR); + pitch = (byte) (pitch * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, (byte) yaw, (byte) pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { float ROTATION_FACTOR = 256.0F / 360.0F; diff --git a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java index 04bf957..bedd00e 100644 --- a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java +++ b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java @@ -2,19 +2,20 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R1; import com.google.common.collect.ImmutableList; import com.google.gson.JsonObject; -import com.mojang.datafixers.kinds.Const; +import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; -import io.netty.buffer.Unpooled; +import io.papermc.paper.adventure.PaperAdventure; import it.unimi.dsi.fastutil.ints.IntList; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.util.AdventureUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; @@ -25,6 +26,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.level.GameType; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; @@ -32,7 +34,6 @@ import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; -import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -43,17 +44,79 @@ import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; import org.joml.Quaternionf; import org.joml.Vector3f; -import java.lang.reflect.Constructor; import java.util.*; +import java.util.stream.Collectors; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + @Override @SuppressWarnings("unchecked") + public void sendSharedEntityData(int entityId, Map dataValues, List sendTo) { + List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { + int index = entry.getKey(); + Number value = entry.getValue(); + return switch (value) { + case Byte byteVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.BYTE, byteVal); + case Float floatVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.FLOAT, floatVal); + case Integer intVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.INT, intVal); + default -> + throw new IllegalArgumentException("Unsupported data value type: " + value.getClass().getSimpleName()); + }; + }).collect(Collectors.toList()); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendFakePlayerInfoPacket( + final Player skinnedPlayer, + final int entityId, + final UUID uuid, + final String npcName, + final List sendTo + ) { + ServerPlayer player = ((CraftPlayer) skinnedPlayer).getHandle(); + String name = npcName.substring(0, 15); + GameProfile profile = new GameProfile(uuid, name); + + Component component = AdventureUtils.MINI_MESSAGE.deserialize(name); + net.minecraft.network.chat.Component nmsComponent = HibiscusCommonsPlugin.isOnPaper() ? PaperAdventure.asVanilla(component) : net.minecraft.network.chat.Component.literal(name); + + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(uuid, profile, false, 0, GameType.CREATIVE, nmsComponent, player.getChatSession().asData()); + EnumSet actions = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(actions, entry); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendPlayerInfoRemovePacket(final UUID uuid, final List sendTo) { + ClientboundPlayerInfoRemovePacket packet = new ClientboundPlayerInfoRemovePacket(List.of(uuid)); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendMovePacket( + final int entityId, + final @NotNull Location from, + final @NotNull Location to, + final boolean onGround, + @NotNull List sendTo + ) { + byte dx = (byte) (to.getX() - from.getX()); + byte dy = (byte) (to.getY() - from.getY()); + byte dz = (byte) (to.getZ() - from.getZ()); + + ClientboundMoveEntityPacket.Pos packet = new ClientboundMoveEntityPacket.Pos(entityId, dx, dy, dz, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendGamemodeChange(Player player, GameMode gameMode) { ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; @@ -72,6 +135,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void sendRotationPacket(int entityId, float yaw, float pitch, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + yaw = (byte) (yaw * ROTATION_FACTOR); + pitch = (byte) (pitch * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, (byte) yaw, (byte) pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { float ROTATION_FACTOR = 256.0F / 360.0F; diff --git a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java index b33a26b..09fe21a 100644 --- a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java +++ b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java @@ -2,18 +2,20 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R2; import com.google.common.collect.ImmutableList; import com.google.gson.JsonObject; +import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; -import io.netty.buffer.Unpooled; +import io.papermc.paper.adventure.PaperAdventure; import it.unimi.dsi.fastutil.ints.IntList; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.util.AdventureUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; @@ -25,7 +27,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.level.portal.TeleportTransition; +import net.minecraft.world.level.GameType; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; @@ -33,7 +35,6 @@ import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; -import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -42,21 +43,81 @@ import org.bukkit.entity.Display; import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; import org.joml.Quaternionf; import org.joml.Vector3f; -import java.lang.reflect.Constructor; -import java.nio.ByteBuffer; import java.util.*; +import java.util.stream.Collectors; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + @Override @SuppressWarnings("unchecked") + public void sendSharedEntityData(int entityId, Map dataValues, List sendTo) { + List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { + int index = entry.getKey(); + Number value = entry.getValue(); + return switch (value) { + case Byte byteVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.BYTE, byteVal); + case Float floatVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.FLOAT, floatVal); + case Integer intVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.INT, intVal); + default -> + throw new IllegalArgumentException("Unsupported data value type: " + value.getClass().getSimpleName()); + }; + }).collect(Collectors.toList()); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendFakePlayerInfoPacket( + final Player skinnedPlayer, + final int entityId, + final UUID uuid, + final String npcName, + final List sendTo + ) { + ServerPlayer player = ((CraftPlayer) skinnedPlayer).getHandle(); + String name = npcName.substring(0, 15); + GameProfile profile = new GameProfile(uuid, name); + + Component component = AdventureUtils.MINI_MESSAGE.deserialize(name); + net.minecraft.network.chat.Component nmsComponent = HibiscusCommonsPlugin.isOnPaper() ? PaperAdventure.asVanilla(component) : net.minecraft.network.chat.Component.literal(name); + + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(uuid, profile, false, 0, GameType.CREATIVE, nmsComponent, player.listOrder, player.getChatSession().asData()); + EnumSet actions = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(actions, entry); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendPlayerInfoRemovePacket(final UUID uuid, final List sendTo) { + ClientboundPlayerInfoRemovePacket packet = new ClientboundPlayerInfoRemovePacket(List.of(uuid)); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendMovePacket( + final int entityId, + final @NotNull Location from, + final @NotNull Location to, + final boolean onGround, + @NotNull List sendTo + ) { + byte dx = (byte) (to.getX() - from.getX()); + byte dy = (byte) (to.getY() - from.getY()); + byte dz = (byte) (to.getZ() - from.getZ()); + + ClientboundMoveEntityPacket.Pos packet = new ClientboundMoveEntityPacket.Pos(entityId, dx, dy, dz, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendGamemodeChange(Player player, GameMode gameMode) { ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; @@ -75,6 +136,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void sendRotationPacket(int entityId, float yaw, float pitch, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + yaw = (byte) (yaw * ROTATION_FACTOR); + pitch = (byte) (pitch * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, (byte) yaw, (byte) pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { float ROTATION_FACTOR = 256.0F / 360.0F; diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java index 42d8fc7..0347060 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java @@ -3,18 +3,20 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R3; import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; -import io.netty.buffer.Unpooled; +import io.papermc.paper.adventure.PaperAdventure; import it.unimi.dsi.fastutil.ints.IntList; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.util.AdventureUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.kyori.adventure.text.serializer.json.JSONComponentSerializer; -import net.minecraft.advancements.*; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; @@ -26,7 +28,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.level.portal.TeleportTransition; +import net.minecraft.world.level.GameType; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; @@ -35,7 +37,6 @@ import org.bukkit.Color; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; -import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -44,22 +45,82 @@ import org.bukkit.entity.Display; import org.bukkit.entity.EntityType; import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.components.CustomModelDataComponent; +import org.jetbrains.annotations.NotNull; import org.joml.Quaternionf; import org.joml.Vector3f; -import java.lang.reflect.Constructor; -import java.nio.ByteBuffer; import java.util.*; +import java.util.stream.Collectors; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + @Override @SuppressWarnings("unchecked") + public void sendSharedEntityData(int entityId, Map dataValues, List sendTo) { + List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { + int index = entry.getKey(); + Number value = entry.getValue(); + return switch (value) { + case Byte byteVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.BYTE, byteVal); + case Float floatVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.FLOAT, floatVal); + case Integer intVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.INT, intVal); + default -> + throw new IllegalArgumentException("Unsupported data value type: " + value.getClass().getSimpleName()); + }; + }).collect(Collectors.toList()); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendFakePlayerInfoPacket( + final Player skinnedPlayer, + final int entityId, + final UUID uuid, + final String npcName, + final List sendTo + ) { + ServerPlayer player = ((CraftPlayer) skinnedPlayer).getHandle(); + String name = npcName.substring(0, 15); + GameProfile profile = new GameProfile(uuid, name); + + Component component = AdventureUtils.MINI_MESSAGE.deserialize(name); + net.minecraft.network.chat.Component nmsComponent = HibiscusCommonsPlugin.isOnPaper() ? PaperAdventure.asVanilla(component) : net.minecraft.network.chat.Component.literal(name); + + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(uuid, profile, false, 0, GameType.CREATIVE, nmsComponent, true, player.listOrder, player.getChatSession().asData()); + EnumSet actions = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(actions, entry); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendPlayerInfoRemovePacket(final UUID uuid, final List sendTo) { + ClientboundPlayerInfoRemovePacket packet = new ClientboundPlayerInfoRemovePacket(List.of(uuid)); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendMovePacket( + final int entityId, + final @NotNull Location from, + final @NotNull Location to, + final boolean onGround, + @NotNull List sendTo + ) { + byte dx = (byte) (to.getX() - from.getX()); + byte dy = (byte) (to.getY() - from.getY()); + byte dz = (byte) (to.getZ() - from.getZ()); + + ClientboundMoveEntityPacket.Pos packet = new ClientboundMoveEntityPacket.Pos(entityId, dx, dy, dz, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendGamemodeChange(Player player, GameMode gameMode) { ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; @@ -78,6 +139,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void sendRotationPacket(int entityId, float yaw, float pitch, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + yaw = (byte) (yaw * ROTATION_FACTOR); + pitch = (byte) (pitch * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, (byte) yaw, (byte) pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { float ROTATION_FACTOR = 256.0F / 360.0F; diff --git a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java index 892b509..d4d7197 100644 --- a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java +++ b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java @@ -3,22 +3,26 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R4; import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; -import io.lumine.mythic.bukkit.utils.redis.jedis.Client; -import io.netty.buffer.Unpooled; +import io.papermc.paper.adventure.AdventureComponent; +import io.papermc.paper.adventure.PaperAdventure; import it.unimi.dsi.fastutil.ints.IntList; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.util.AdventureUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.kyori.adventure.text.serializer.json.JSONComponentSerializer; -import net.minecraft.advancements.*; -import net.minecraft.commands.arguments.EntityAnchorArgument; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; +import net.minecraft.network.syncher.EntityDataSerializer; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; @@ -28,39 +32,97 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.level.portal.TeleportTransition; +import net.minecraft.world.level.GameType; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; +import org.apache.commons.lang3.tuple.Triple; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; -import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.scoreboard.CraftScoreboard; -import org.bukkit.entity.Display; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.ItemDisplay; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.components.CustomModelDataComponent; +import org.jetbrains.annotations.NotNull; import org.joml.Quaternionf; import org.joml.Vector3f; -import java.lang.reflect.Constructor; import java.util.*; +import java.util.stream.Collectors; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { private static ServerLevel level = MinecraftServer.getServer().overworld(); private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + @Override @SuppressWarnings("unchecked") + public void sendSharedEntityData(int entityId, Map dataValues, List sendTo) { + List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { + int index = entry.getKey(); + Number value = entry.getValue(); + return switch (value) { + case Byte byteVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.BYTE, byteVal); + case Float floatVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.FLOAT, floatVal); + case Integer intVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.INT, intVal); + default -> + throw new IllegalArgumentException("Unsupported data value type: " + value.getClass().getSimpleName()); + }; + }).collect(Collectors.toList()); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendFakePlayerInfoPacket( + final Player skinnedPlayer, + final int entityId, + final UUID uuid, + final String npcName, + final List sendTo + ) { + ServerPlayer player = ((CraftPlayer) skinnedPlayer).getHandle(); + String name = npcName.substring(0, 15); + GameProfile profile = new GameProfile(uuid, name); + + Component component = AdventureUtils.MINI_MESSAGE.deserialize(name); + net.minecraft.network.chat.Component nmsComponent = HibiscusCommonsPlugin.isOnPaper() ? PaperAdventure.asVanilla(component) : net.minecraft.network.chat.Component.literal(name); + + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(uuid, profile, false, 0, GameType.CREATIVE, nmsComponent, true, player.listOrder, player.getChatSession().asData()); + EnumSet actions = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(actions, entry); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendPlayerInfoRemovePacket(final UUID uuid, final List sendTo) { + ClientboundPlayerInfoRemovePacket packet = new ClientboundPlayerInfoRemovePacket(List.of(uuid)); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendMovePacket( + final int entityId, + final @NotNull Location from, + final @NotNull Location to, + final boolean onGround, + @NotNull List sendTo + ) { + byte dx = (byte) (to.getX() - from.getX()); + byte dy = (byte) (to.getY() - from.getY()); + byte dz = (byte) (to.getZ() - from.getZ()); + + ClientboundMoveEntityPacket.Pos packet = new ClientboundMoveEntityPacket.Pos(entityId, dx, dy, dz, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendGamemodeChange(Player player, GameMode gameMode) { ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; @@ -79,6 +141,15 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. for (Player p : sendTo) sendPacket(p, packet); } + @Override + public void sendRotationPacket(int entityId, float yaw, float pitch, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + yaw = (byte) (yaw * ROTATION_FACTOR); + pitch = (byte) (pitch * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, (byte) yaw, (byte) pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { float ROTATION_FACTOR = 256.0F / 360.0F; @@ -217,7 +288,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. List sendTo ) { try { - ClientboundTeleportEntityPacket packet = ClientboundTeleportEntityPacket.teleport(entityId, new PositionMoveRotation(new Vec3(x, y, z), Vec3.ZERO, yaw, pitch), java.util.Set.of(), onGround); + ClientboundTeleportEntityPacket packet = ClientboundTeleportEntityPacket.teleport(entityId, new PositionMoveRotation(new Vec3(x, y, z), Vec3.ZERO, yaw, pitch), Set.of(), onGround); for (Player p : sendTo) sendPacket(p, packet); } catch (Exception e) { e.printStackTrace(); From 026c5b8ce69cea4f25e3129d375b93771cbfcd2c Mon Sep 17 00:00:00 2001 From: Boy0000 Date: Sun, 18 May 2025 21:53:35 +0200 Subject: [PATCH 06/12] feat: expose helper method to create mount-packets --- .../me/lojosho/hibiscuscommons/nms/NMSPackets.java | 2 ++ gradle.properties | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- .../hibiscuscommons/nms/v1_20_R3/NMSPackets.java | 14 ++++++++++++++ .../hibiscuscommons/nms/v1_20_R4/NMSPackets.java | 14 ++++++++++++++ .../hibiscuscommons/nms/v1_21_R1/NMSPackets.java | 14 ++++++++++++++ .../hibiscuscommons/nms/v1_21_R2/NMSPackets.java | 14 ++++++++++++++ .../hibiscuscommons/nms/v1_21_R3/NMSPackets.java | 14 ++++++++++++++ .../hibiscuscommons/nms/v1_21_R4/NMSPackets.java | 14 ++++++++++++++ 9 files changed, 88 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java index 990b785..8d21795 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java @@ -93,4 +93,6 @@ public interface NMSPackets { List sendTo); void sendToastPacket(Player player, ItemStack icon, Component title, Component description); + + Object createMountPacket(int entityId, int[] passengerIds); } diff --git a/gradle.properties b/gradle.properties index 14a7ad3..4d061dc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -userdevVersion=2.0.0-beta.14 \ No newline at end of file +userdevVersion=2.0.0-beta.17 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 18362b7..3c44eb1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java index 6bbe400..751d51f 100644 --- a/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java +++ b/v1_20_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R3/NMSPackets.java @@ -346,4 +346,18 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. public void sendToastPacket(Player player, ItemStack icon, Component title, Component description) { throw new UnsupportedOperationException("Not implemented in this version."); } + + @Override + public Object createMountPacket(int entityId, int[] passengerIds) { + fakeNmsEntity.setId(entityId); + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + return packet; + } } diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java index 9ac73d0..a343988 100644 --- a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSPackets.java @@ -415,4 +415,18 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. sendPacket(player, removePacket); }, 2L); } + + @Override + public Object createMountPacket(int entityId, int[] passengerIds) { + fakeNmsEntity.setId(entityId); + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + return packet; + } } diff --git a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java index bedd00e..ce9122b 100644 --- a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java +++ b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSPackets.java @@ -414,4 +414,18 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. sendPacket(player, removePacket); }, 2L); } + + @Override + public Object createMountPacket(int entityId, int[] passengerIds) { + fakeNmsEntity.setId(entityId); + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + return packet; + } } diff --git a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java index 09fe21a..50e6abc 100644 --- a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java +++ b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSPackets.java @@ -417,4 +417,18 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. sendPacket(player, removePacket); }, 2L); } + + @Override + public Object createMountPacket(int entityId, int[] passengerIds) { + fakeNmsEntity.setId(entityId); + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + return packet; + } } diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java index 0347060..eeb1d72 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java @@ -454,4 +454,18 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. sendPacket(player, removePacket); }, 2L); } + + @Override + public Object createMountPacket(int entityId, int[] passengerIds) { + fakeNmsEntity.setId(entityId); + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + return packet; + } } diff --git a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java index d4d7197..4b2c139 100644 --- a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java +++ b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSPackets.java @@ -453,4 +453,18 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. sendPacket(player, removePacket); }, 2L); } + + @Override + public Object createMountPacket(int entityId, int[] passengerIds) { + fakeNmsEntity.setId(entityId); + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + return packet; + } } From 5d66e97101a7c3dfaac5dc13c0e134e5b52f8cde Mon Sep 17 00:00:00 2001 From: Boy0000 Date: Thu, 22 May 2025 22:35:58 +0200 Subject: [PATCH 07/12] fix: not setting mountId for mount-packet --- .../java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java | 1 + 1 file changed, 1 insertion(+) diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java index eeb1d72..eade0a1 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSPackets.java @@ -255,6 +255,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. passenger.setId(id); return passenger; }).toList(); + fakeNmsEntity.setId(mountId); fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); fakeNmsEntity.passengers = ImmutableList.of(); From a693c4e6bca45b2f3bf145948409619d0305d99d Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 26 Jun 2025 10:12:41 -0500 Subject: [PATCH 08/12] feat: update to 1.21.6 --- .../nms/v1_21_R5/NMSPackets.java | 228 ++++++++++++------ 1 file changed, 148 insertions(+), 80 deletions(-) diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java index 5a43ee4..88cbc39 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java @@ -1,84 +1,156 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R5; +import com.google.common.collect.ImmutableList; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.JsonOps; -import io.netty.buffer.Unpooled; +import io.papermc.paper.adventure.PaperAdventure; import it.unimi.dsi.fastutil.ints.IntList; import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.util.AdventureUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; -import net.minecraft.advancements.*; -import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementHolder; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; +import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.level.portal.TeleportTransition; +import net.minecraft.world.level.GameType; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; import net.minecraft.world.scores.Team; import org.bukkit.Bukkit; import org.bukkit.Color; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.craftbukkit.CraftEquipmentSlot; import org.bukkit.craftbukkit.entity.CraftEntityType; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.scoreboard.CraftScoreboard; -import org.bukkit.entity.Display; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.ItemDisplay; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.entity.*; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.components.CustomModelDataComponent; +import org.jetbrains.annotations.NotNull; import org.joml.Quaternionf; import org.joml.Vector3f; -import java.lang.reflect.Constructor; import java.util.*; +import java.util.stream.Collectors; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { - static Constructor passengerConstructor; - static Constructor linkConstructor; - static Constructor cameraConstructor; - static Constructor lookAtConstructor; + private static ServerLevel level = MinecraftServer.getServer().overworld(); + private static Entity fakeNmsEntity = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); - static { - try { - passengerConstructor = ClientboundSetPassengersPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - passengerConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - linkConstructor = ClientboundSetEntityLinkPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - linkConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - cameraConstructor = ClientboundSetCameraPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - cameraConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } - try { - lookAtConstructor = ClientboundPlayerLookAtPacket.class.getDeclaredConstructor(FriendlyByteBuf.class); - lookAtConstructor.setAccessible(true); - } catch (Exception e) { - e.printStackTrace(); - } + @Override @SuppressWarnings("unchecked") + public void sendSharedEntityData(int entityId, Map dataValues, List sendTo) { + List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { + int index = entry.getKey(); + Number value = entry.getValue(); + return switch (value) { + case Byte byteVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.BYTE, byteVal); + case Float floatVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.FLOAT, floatVal); + case Integer intVal -> new SynchedEntityData.DataValue<>(index, EntityDataSerializers.INT, intVal); + default -> + throw new IllegalArgumentException("Unsupported data value type: " + value.getClass().getSimpleName()); + }; + }).collect(Collectors.toList()); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendFakePlayerInfoPacket( + final Player skinnedPlayer, + final int entityId, + final UUID uuid, + final String npcName, + final List sendTo + ) { + ServerPlayer player = ((CraftPlayer) skinnedPlayer).getHandle(); + String name = npcName.substring(0, 15); + GameProfile profile = new GameProfile(uuid, name); + + Component component = AdventureUtils.MINI_MESSAGE.deserialize(name); + net.minecraft.network.chat.Component nmsComponent = HibiscusCommonsPlugin.isOnPaper() ? PaperAdventure.asVanilla(component) : net.minecraft.network.chat.Component.literal(name); + + ClientboundPlayerInfoUpdatePacket.Entry entry = new ClientboundPlayerInfoUpdatePacket.Entry(uuid, profile, false, 0, GameType.CREATIVE, nmsComponent, true, player.listOrder, player.getChatSession().asData()); + EnumSet actions = EnumSet.of(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER); + ClientboundPlayerInfoUpdatePacket packet = new ClientboundPlayerInfoUpdatePacket(actions, entry); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendPlayerInfoRemovePacket(final UUID uuid, final List sendTo) { + ClientboundPlayerInfoRemovePacket packet = new ClientboundPlayerInfoRemovePacket(List.of(uuid)); + for (Player player : sendTo) sendPacket(player, packet); + } + + @Override + public void sendMovePacket( + final int entityId, + final @NotNull Location from, + final @NotNull Location to, + final boolean onGround, + @NotNull List sendTo + ) { + byte dx = (byte) (to.getX() - from.getX()); + byte dy = (byte) (to.getY() - from.getY()); + byte dz = (byte) (to.getZ() - from.getZ()); + + ClientboundMoveEntityPacket.Pos packet = new ClientboundMoveEntityPacket.Pos(entityId, dx, dy, dz, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendGamemodeChange(Player player, GameMode gameMode) { + ClientboundGameEventPacket.Type type = ClientboundGameEventPacket.CHANGE_GAME_MODE; + float param = gameMode.ordinal(); + + ClientboundGameEventPacket packet = new ClientboundGameEventPacket(type, param); + sendPacket(player, packet); + } + + @Override + public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { + fakeNmsEntity.setId(entityId); + byte headRot = (byte) (location.getYaw() * 256.0F / 360.0F); + + ClientboundRotateHeadPacket packet = new ClientboundRotateHeadPacket(fakeNmsEntity, headRot); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendRotationPacket(int entityId, float yaw, float pitch, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + yaw = (byte) (yaw * ROTATION_FACTOR); + pitch = (byte) (pitch * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, (byte) yaw, (byte) pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendRotationPacket(int entityId, Location location, boolean onGround, List sendTo) { + float ROTATION_FACTOR = 256.0F / 360.0F; + byte yaw = (byte) (location.getYaw() * ROTATION_FACTOR); + byte pitch = (byte) (location.getPitch() * ROTATION_FACTOR); + ClientboundMoveEntityPacket.Rot packet = new ClientboundMoveEntityPacket.Rot(entityId, yaw, pitch, onGround); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -174,28 +246,28 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendMountPacket(int mountId, int[] passengerIds, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(mountId); - byteBuf.writeVarIntArray(passengerIds); - try { - ClientboundSetPassengersPacket packet = passengerConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + for (Player p : sendTo) sendPacket(p, packet); } @Override public void sendLeashPacket(int leashEntity, int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeInt(leashEntity); - byteBuf.writeInt(entityId); - try { - ClientboundSetEntityLinkPacket packet = linkConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + // Fake entities just to avoid reflection + ServerLevel level = MinecraftServer.getServer().overworld(); + Entity entity1 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + Entity entity2 = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + entity1.setId(leashEntity); + entity2.setId(entityId); + + ClientboundSetEntityLinkPacket packet = new ClientboundSetEntityLinkPacket(entity1, entity2); + for (Player p : sendTo) sendPacket(p, packet); } @Override @@ -210,21 +282,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. List sendTo ) { try { - ClientboundTeleportEntityPacket packet = ClientboundTeleportEntityPacket.teleport(entityId, new PositionMoveRotation(new Vec3(x, y, z), Vec3.ZERO, yaw, pitch), java.util.Set.of(), onGround); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void sendRotationPacket(int entityId, float yaw, boolean onGround, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - byteBuf.writeFloat(yaw); - byteBuf.writeBoolean(onGround); - try { - ClientboundPlayerLookAtPacket packet = lookAtConstructor.newInstance(byteBuf); + ClientboundTeleportEntityPacket packet = ClientboundTeleportEntityPacket.teleport(entityId, new PositionMoveRotation(new Vec3(x, y, z), Vec3.ZERO, yaw, pitch), Set.of(), onGround); for (Player p : sendTo) sendPacket(p, packet); } catch (Exception e) { e.printStackTrace(); @@ -233,14 +291,10 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. @Override public void sendCameraPacket(int entityId, List sendTo) { - FriendlyByteBuf byteBuf = new FriendlyByteBuf(Unpooled.buffer()); - byteBuf.writeVarInt(entityId); - try { - ClientboundSetCameraPacket packet = cameraConstructor.newInstance(byteBuf); - for (Player p : sendTo) sendPacket(p, packet); - } catch (Exception e) { - e.printStackTrace(); - } + fakeNmsEntity.setId(entityId); + + ClientboundSetCameraPacket packet = new ClientboundSetCameraPacket(fakeNmsEntity); + for (Player p : sendTo) sendPacket(p, packet); } @@ -393,4 +447,18 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. sendPacket(player, removePacket); }, 2L); } + + @Override + public Object createMountPacket(int entityId, int[] passengerIds) { + fakeNmsEntity.setId(entityId); + List passengers = Arrays.stream(passengerIds).mapToObj(id -> { + Entity passenger = new ArmorStand(net.minecraft.world.entity.EntityType.ARMOR_STAND, level); + passenger.setId(id); + return passenger; + }).toList(); + fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); + ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); + fakeNmsEntity.passengers = ImmutableList.of(); + return packet; + } } From 9f6f0f19bf5ea6a20cfc64d1465079958dca0757 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 26 Jun 2025 11:52:05 -0500 Subject: [PATCH 09/12] feat: move towards easily overrideable methods in sub plugins rather than each plugin needing their own channel --- build.gradle.kts | 6 +- .../HibiscusCommonsPlugin.java | 3 + .../hibiscuscommons/HibiscusPlugin.java | 9 + .../listener/PlayerConnectionEvent.java | 15 ++ .../lojosho/hibiscuscommons/nms/NMSUtils.java | 5 + .../packets/DefaultPacketInterface.java | 5 + .../hibiscuscommons/packets/PacketAction.java | 7 + .../packets/PacketInterface.java | 48 ++++ .../hibiscuscommons/plugins/SubPlugins.java | 29 +++ .../nms/v1_21_R5/NMSCommon.java | 1 - .../nms/v1_21_R5/NMSPacketChannel.java | 223 ++++++++++++++++++ .../nms/v1_21_R5/NMSUtils.java | 17 ++ 12 files changed, 364 insertions(+), 4 deletions(-) create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/listener/PlayerConnectionEvent.java create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/DefaultPacketInterface.java create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketAction.java create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/plugins/SubPlugins.java create mode 100644 v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java diff --git a/build.gradle.kts b/build.gradle.kts index b56bad9..a4022bd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } group = "me.lojosho" -version = "0.6.5${getGitCommitHash()}" +version = "0.7.0${getGitCommitHash()}" allprojects { apply(plugin = "java") @@ -144,11 +144,11 @@ tasks { runServer { dependsOn(shadowJar) dependsOn(jar) - minecraftVersion("1.21.5") + minecraftVersion("1.21.6") downloadPlugins { hangar("PlaceholderAPI", "2.11.6") - url("https://download.luckperms.net/1567/bukkit/loader/LuckPerms-Bukkit-5.4.150.jar") + url("https://download.luckperms.net/1593/bukkit/loader/LuckPerms-Bukkit-5.5.8.jar") } } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusCommonsPlugin.java b/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusCommonsPlugin.java index 6713406..c233775 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusCommonsPlugin.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusCommonsPlugin.java @@ -2,6 +2,7 @@ package me.lojosho.hibiscuscommons; import lombok.Getter; import me.lojosho.hibiscuscommons.hooks.Hooks; +import me.lojosho.hibiscuscommons.listener.PlayerConnectionEvent; import me.lojosho.hibiscuscommons.nms.NMSHandlers; import me.lojosho.hibiscuscommons.util.ServerUtils; import org.jetbrains.annotations.ApiStatus; @@ -42,6 +43,8 @@ public final class HibiscusCommonsPlugin extends HibiscusPlugin { return; } + getServer().getPluginManager().registerEvents(new PlayerConnectionEvent(), this); + // Plugin startup logic Hooks.setup(); } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java b/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java index f56c3cc..3d11590 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/HibiscusPlugin.java @@ -3,6 +3,10 @@ package me.lojosho.hibiscuscommons; import com.jeff_media.updatechecker.UpdateCheckSource; import com.jeff_media.updatechecker.UpdateChecker; import lombok.Getter; +import lombok.Setter; +import me.lojosho.hibiscuscommons.packets.DefaultPacketInterface; +import me.lojosho.hibiscuscommons.packets.PacketInterface; +import me.lojosho.hibiscuscommons.plugins.SubPlugins; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; @@ -20,6 +24,8 @@ public abstract class HibiscusPlugin extends JavaPlugin { private boolean onLatestVersion = true; @Getter private boolean disabled = false; + @Getter @Setter + private PacketInterface packetInterface = new DefaultPacketInterface(); protected HibiscusPlugin() { this(-1); @@ -47,6 +53,8 @@ public abstract class HibiscusPlugin extends JavaPlugin { return; } + SubPlugins.addSubPlugin(this); + if (bstats > 0) { Metrics metrics = new Metrics(this, bstats); } @@ -88,6 +96,7 @@ public abstract class HibiscusPlugin extends JavaPlugin { @Override public final void onDisable() { disabled = true; + SubPlugins.removeSubPlugin(this); onEnd(); } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/listener/PlayerConnectionEvent.java b/common/src/main/java/me/lojosho/hibiscuscommons/listener/PlayerConnectionEvent.java new file mode 100644 index 0000000..cdc5636 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/listener/PlayerConnectionEvent.java @@ -0,0 +1,15 @@ +package me.lojosho.hibiscuscommons.listener; + +import me.lojosho.hibiscuscommons.nms.NMSHandlers; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class PlayerConnectionEvent implements Listener { + + @EventHandler(ignoreCancelled = false, priority = EventPriority.LOW) + public void onPlayerJoin(PlayerJoinEvent event) { + NMSHandlers.getHandler().getUtilHandler().handleChannelOpen(event.getPlayer()); + } +} diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSUtils.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSUtils.java index 87ef60e..d21a566 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSUtils.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSUtils.java @@ -2,6 +2,7 @@ package me.lojosho.hibiscuscommons.nms; import org.bukkit.Color; import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -18,4 +19,8 @@ public interface NMSUtils { ItemStack setColor(@NotNull ItemStack itemStack, Color color); + default void handleChannelOpen(@NotNull Player player) { + + } + } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/DefaultPacketInterface.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/DefaultPacketInterface.java new file mode 100644 index 0000000..a63f9b2 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/DefaultPacketInterface.java @@ -0,0 +1,5 @@ +package me.lojosho.hibiscuscommons.packets; + +public class DefaultPacketInterface implements PacketInterface { + // Overrides nothing +} diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketAction.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketAction.java new file mode 100644 index 0000000..3ec1098 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketAction.java @@ -0,0 +1,7 @@ +package me.lojosho.hibiscuscommons.packets; + +public enum PacketAction { + NOTHING, + CHANGED, + CANCELLED, +} diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java new file mode 100644 index 0000000..df16073 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java @@ -0,0 +1,48 @@ +package me.lojosho.hibiscuscommons.packets; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Map; + +public interface PacketInterface { + + default PacketAction writeContainerContent(@NotNull Player player, Integer windowId, @NotNull List slotData) { + return PacketAction.NOTHING; + } + + default PacketAction writeSlotContent(@NotNull Player player, Integer windowId, Integer slot, @NotNull ItemStack itemStack) { + return PacketAction.NOTHING; + } + + default PacketAction writeEquipmentContent(@NotNull Player player, @NotNull Map armor) { + return PacketAction.NOTHING; + } + + default PacketAction writePassengerContent(@NotNull Player player, Integer owner, List passengers) { + return PacketAction.NOTHING; + } + + default PacketAction readInventoryClick(@NotNull Player player, Integer clickType, Integer slotNumber) { + return PacketAction.NOTHING; + // Override + } + + default PacketAction readPlayerAction(@NotNull Player player, Integer actionType) { + return PacketAction.NOTHING; + // Override + } + + default PacketAction readPlayerArm(@NotNull Player player) { + return PacketAction.NOTHING; + // Override + } + + default PacketAction readEntityHandle(@NotNull Player player) { + return PacketAction.NOTHING; + // Override + } +} diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/plugins/SubPlugins.java b/common/src/main/java/me/lojosho/hibiscuscommons/plugins/SubPlugins.java new file mode 100644 index 0000000..a4ca256 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/plugins/SubPlugins.java @@ -0,0 +1,29 @@ +package me.lojosho.hibiscuscommons.plugins; + +import com.google.common.collect.ImmutableList; +import me.lojosho.hibiscuscommons.HibiscusPlugin; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class SubPlugins { + + private static final List SUB_PLUGINS = new ArrayList<>(); + + @NotNull + public static List getSubPlugins() { + return ImmutableList.copyOf(SUB_PLUGINS); + } + + @ApiStatus.Internal + public static void addSubPlugin(@NotNull HibiscusPlugin plugin) { + SUB_PLUGINS.add(plugin); + } + + @ApiStatus.Internal + public static void removeSubPlugin(@NotNull HibiscusPlugin plugin) { + SUB_PLUGINS.remove(plugin); + } +} diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSCommon.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSCommon.java index 0043389..124c5a5 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSCommon.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSCommon.java @@ -13,5 +13,4 @@ public class NMSCommon { ServerPlayerConnection connection = serverPlayer.connection; connection.send(packet); } - } diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java new file mode 100644 index 0000000..0282afa --- /dev/null +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java @@ -0,0 +1,223 @@ +package me.lojosho.hibiscuscommons.nms.v1_21_R5; + +import com.mojang.datafixers.util.Pair; +import io.netty.channel.ChannelDuplexHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; +import lombok.Getter; +import me.lojosho.hibiscuscommons.nms.NMSHandlers; +import me.lojosho.hibiscuscommons.packets.PacketAction; +import me.lojosho.hibiscuscommons.plugins.SubPlugins; +import me.lojosho.hibiscuscommons.util.MessagesUtil; +import net.minecraft.core.NonNullList; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.*; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.item.ItemStack; +import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +public class NMSPacketChannel extends ChannelDuplexHandler { + + @Getter + private final Player player; + + public NMSPacketChannel(Player player) { + this.player = player; + } + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + if (!(msg instanceof Packet packet)) { + super.write(ctx, msg, promise); + return; + } + + switch (packet) { + case ClientboundContainerSetContentPacket setContentPacket -> msg = handleMenuChange(setContentPacket); + case ClientboundContainerSetSlotPacket setSlotPacket -> msg = handleSlotChange(setSlotPacket); + case ClientboundSetEquipmentPacket equipmentPacket -> msg = handlePlayerEquipment(equipmentPacket); + case ClientboundSetPassengersPacket passengerPacket -> msg = handlePassengerSet(passengerPacket); + default -> {} + } + + if (msg == null) return; + else super.write(ctx, msg, promise); + } + + private Packet handleMenuChange(@NotNull ClientboundContainerSetContentPacket packet) { + MessagesUtil.sendDebugMessages("Menu Initial "); + + Integer windowId = packet.containerId(); + NonNullList slotData = NonNullList.create(); + slotData.addAll(packet.items()); + + List bukkitItems = slotData.stream().map(CraftItemStack::asBukkitCopy).toList(); + + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + SubPlugins.getSubPlugins().forEach(plugin -> { + + PacketAction pluginAction = plugin.getPacketInterface().writeContainerContent(player, windowId, bukkitItems); + if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + + }); + + List nmsItems = bukkitItems.stream().map(CraftItemStack::asNMSCopy).toList(); + + if (action.get() == PacketAction.CANCELLED) return null; + if (action.get() == PacketAction.NOTHING) return packet; + return new ClientboundContainerSetContentPacket(0, packet.stateId(), nmsItems, packet.carriedItem()); + } + + private Packet handleSlotChange(@NotNull ClientboundContainerSetSlotPacket packet) { + MessagesUtil.sendDebugMessages("SetSlot Initial "); + + Integer windowId = packet.getContainerId(); + Integer slot = packet.getSlot(); + ItemStack item = packet.getItem(); + + org.bukkit.inventory.ItemStack bukkitItem = CraftItemStack.asBukkitCopy(item); + + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + SubPlugins.getSubPlugins().forEach(plugin -> { + + PacketAction pluginAction = plugin.getPacketInterface().writeSlotContent(player, windowId, slot, bukkitItem); + if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + + }); + + if (action.get() == PacketAction.CANCELLED) return null; + if (action.get() == PacketAction.NOTHING) return packet; + + final ItemStack nmsItem = CraftItemStack.asNMSCopy(bukkitItem); + + return new ClientboundContainerSetSlotPacket(0, packet.getStateId(), slot, nmsItem); + } + + private Packet handlePlayerEquipment(@NotNull ClientboundSetEquipmentPacket packet) { + final List> armor = packet.getSlots(); + final HashMap bukkitArmor = new HashMap<>(); + for (Pair piece : armor) { + EquipmentSlot slot = CraftEquipmentSlot.getSlot(piece.getFirst()); + org.bukkit.inventory.ItemStack itemStack = CraftItemStack.asBukkitCopy(piece.getSecond()); + bukkitArmor.put(slot, itemStack); + } + + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + SubPlugins.getSubPlugins().forEach(plugin -> { + + PacketAction pluginAction = plugin.getPacketInterface().writeEquipmentContent(player, bukkitArmor); + if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + + }); + + if (action.get() == PacketAction.CANCELLED) return null; + if (action.get() == PacketAction.NOTHING) return packet; + + List> newArmor = new ArrayList<>(); + for (Map.Entry entry : bukkitArmor.entrySet()) { + net.minecraft.world.entity.EquipmentSlot slot = CraftEquipmentSlot.getNMS(entry.getKey()); + ItemStack itemStack = CraftItemStack.asNMSCopy(entry.getValue()); + newArmor.add(new Pair<>(slot, itemStack)); + } + + return new ClientboundSetEquipmentPacket(packet.getEntity(), newArmor); + } + + private Packet handlePassengerSet(@NotNull ClientboundSetPassengersPacket packet) { + Integer ownerId = packet.getVehicle(); + List passengers = Arrays.stream(packet.getPassengers()).boxed().collect(Collectors.toList()); + MessagesUtil.sendDebugMessages("Mount Packet Sent - Read - EntityID: " + ownerId); + + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + SubPlugins.getSubPlugins().forEach(plugin -> { + + PacketAction pluginAction = plugin.getPacketInterface().writePassengerContent(player, ownerId, passengers); + if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + + }); + + if (action.get() == PacketAction.CANCELLED) return null; + if (action.get() == PacketAction.NOTHING) return packet; + return (Packet) NMSHandlers.getHandler().getPacketHandler().createMountPacket(ownerId, passengers.stream().mapToInt(Integer::intValue).toArray()); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (!(msg instanceof Packet packet)) { + super.channelRead(ctx, msg); + return; + } + + switch (packet) { + case ServerboundContainerClickPacket clickPacket -> msg = handleInventoryClick(clickPacket); + case ServerboundPlayerActionPacket playerActionPacket -> msg = handlePlayerAction(playerActionPacket); + case ServerboundSwingPacket swingPacket -> msg = handlePlayerArm(swingPacket); + case ServerboundUseItemOnPacket useItemOnPacket -> msg = handleEntityUse(useItemOnPacket); + default -> {} + } + + if (msg == null) return; + else super.channelRead(ctx, msg); + } + + private Packet handleInventoryClick(@NotNull ServerboundContainerClickPacket packet) { + ClickType clickType = packet.clickType(); + int slotClicked = packet.slotNum(); + + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + SubPlugins.getSubPlugins().forEach(plugin -> { + + PacketAction pluginAction = plugin.getPacketInterface().readInventoryClick(player, clickType.id(), slotClicked); + if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + + }); + if (action.get() == PacketAction.CANCELLED) return null; + return packet; + } + + private Packet handlePlayerAction(ServerboundPlayerActionPacket packet) { + ServerboundPlayerActionPacket.Action playerAction = packet.getAction(); + + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + SubPlugins.getSubPlugins().forEach(plugin -> { + + PacketAction pluginAction = plugin.getPacketInterface().readPlayerAction(player, playerAction.ordinal()); + if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + + }); + if (action.get() == PacketAction.CANCELLED) return null; + return packet; + } + + private Packet handlePlayerArm(ServerboundSwingPacket packet) { + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + SubPlugins.getSubPlugins().forEach(plugin -> { + + PacketAction pluginAction = plugin.getPacketInterface().readPlayerArm(player); + if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + + }); + if (action.get() == PacketAction.CANCELLED) return null; + return packet; + } + + private Packet handleEntityUse(ServerboundUseItemOnPacket packet) { + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + SubPlugins.getSubPlugins().forEach(plugin -> { + + PacketAction pluginAction = plugin.getPacketInterface().readEntityHandle(player); + if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + + }); + if (action.get() == PacketAction.CANCELLED) return null; + return packet; + } +} \ No newline at end of file diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSUtils.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSUtils.java index c7bdce4..ac20859 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSUtils.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSUtils.java @@ -1,12 +1,17 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R5; +import io.netty.channel.Channel; +import io.netty.channel.ChannelPipeline; import net.minecraft.core.component.DataComponents; +import net.minecraft.network.Connection; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.component.DyedItemColor; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -51,4 +56,16 @@ public class NMSUtils extends NMSCommon implements me.lojosho.hibiscuscommons.nm } return null; } + + @Override + public void handleChannelOpen(@NotNull Player player) { + Channel channel = ((CraftPlayer) player).getHandle().connection.connection.channel; + ChannelPipeline pipeline = channel.pipeline(); + + NMSPacketChannel channelHandler = new NMSPacketChannel(player); + for (String key : pipeline.toMap().keySet()) { + if (!(pipeline.get(key) instanceof Connection)) continue; + pipeline.addBefore(key, "hibiscus_channel_handler", channelHandler); + } + } } From 7865b8b372e70ec2466e3cf3077d9a4c1a8bf02b Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 26 Jun 2025 12:48:21 -0500 Subject: [PATCH 10/12] feat: start moving to wrappers to help with read/write with packets --- .../packets/PacketInterface.java | 17 ++++--- .../wrapper/ContainerContentWrapper.java | 20 +++++++++ .../wrapper/EntityEquipmentWrapper.java | 19 ++++++++ .../packets/wrapper/PassengerWrapper.java | 19 ++++++++ .../packets/wrapper/SlotContentWrapper.java | 20 +++++++++ .../nms/v1_21_R5/NMSPacketChannel.java | 45 +++++++++++-------- 6 files changed, 113 insertions(+), 27 deletions(-) create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/ContainerContentWrapper.java create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/EntityEquipmentWrapper.java create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PassengerWrapper.java create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/SlotContentWrapper.java diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java index df16073..47b53ec 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java @@ -1,28 +1,27 @@ package me.lojosho.hibiscuscommons.packets; +import me.lojosho.hibiscuscommons.packets.wrapper.ContainerContentWrapper; +import me.lojosho.hibiscuscommons.packets.wrapper.EntityEquipmentWrapper; +import me.lojosho.hibiscuscommons.packets.wrapper.PassengerWrapper; +import me.lojosho.hibiscuscommons.packets.wrapper.SlotContentWrapper; import org.bukkit.entity.Player; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; -import java.util.List; -import java.util.Map; - public interface PacketInterface { - default PacketAction writeContainerContent(@NotNull Player player, Integer windowId, @NotNull List slotData) { + default PacketAction writeContainerContent(@NotNull Player player, ContainerContentWrapper wrapper) { return PacketAction.NOTHING; } - default PacketAction writeSlotContent(@NotNull Player player, Integer windowId, Integer slot, @NotNull ItemStack itemStack) { + default PacketAction writeSlotContent(@NotNull Player player, SlotContentWrapper wrapper) { return PacketAction.NOTHING; } - default PacketAction writeEquipmentContent(@NotNull Player player, @NotNull Map armor) { + default PacketAction writeEquipmentContent(@NotNull Player player, EntityEquipmentWrapper wrapper) { return PacketAction.NOTHING; } - default PacketAction writePassengerContent(@NotNull Player player, Integer owner, List passengers) { + default PacketAction writePassengerContent(@NotNull Player player, PassengerWrapper wrapper) { return PacketAction.NOTHING; } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/ContainerContentWrapper.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/ContainerContentWrapper.java new file mode 100644 index 0000000..65f54ad --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/ContainerContentWrapper.java @@ -0,0 +1,20 @@ +package me.lojosho.hibiscuscommons.packets.wrapper; + +import lombok.Getter; +import lombok.Setter; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +@Getter @Setter +public class ContainerContentWrapper { + + private Integer windowId; + private List slotData; + + public ContainerContentWrapper(@NotNull Integer windowId, @NotNull List slotData) { + this.windowId = windowId; + this.slotData = slotData; + } +} diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/EntityEquipmentWrapper.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/EntityEquipmentWrapper.java new file mode 100644 index 0000000..a0b18f2 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/EntityEquipmentWrapper.java @@ -0,0 +1,19 @@ +package me.lojosho.hibiscuscommons.packets.wrapper; + +import lombok.Getter; +import lombok.Setter; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +@Getter @Setter +public class EntityEquipmentWrapper { + + private Map armor; + + public EntityEquipmentWrapper(@NotNull Map armor) { + this.armor = armor; + } +} diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PassengerWrapper.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PassengerWrapper.java new file mode 100644 index 0000000..b36fa12 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PassengerWrapper.java @@ -0,0 +1,19 @@ +package me.lojosho.hibiscuscommons.packets.wrapper; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +@Getter @Setter +public class PassengerWrapper { + + private int owner; + private List passengers; + + public PassengerWrapper(@NotNull Integer owner, @NotNull List passengers) { + this.owner = owner; + this.passengers = passengers; + } +} diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/SlotContentWrapper.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/SlotContentWrapper.java new file mode 100644 index 0000000..588e5a7 --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/SlotContentWrapper.java @@ -0,0 +1,20 @@ +package me.lojosho.hibiscuscommons.packets.wrapper; + +import lombok.Getter; +import lombok.Setter; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +@Setter @Getter +public class SlotContentWrapper { + + private Integer windowId; + private int slot; + private ItemStack itemStack; + + public SlotContentWrapper(Integer windowId, Integer slot, @NotNull ItemStack itemStack) { + this.windowId = windowId; + this.slot = slot; + this.itemStack = itemStack; + } +} diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java index 0282afa..243798b 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java @@ -7,6 +7,10 @@ import io.netty.channel.ChannelPromise; import lombok.Getter; import me.lojosho.hibiscuscommons.nms.NMSHandlers; import me.lojosho.hibiscuscommons.packets.PacketAction; +import me.lojosho.hibiscuscommons.packets.wrapper.ContainerContentWrapper; +import me.lojosho.hibiscuscommons.packets.wrapper.EntityEquipmentWrapper; +import me.lojosho.hibiscuscommons.packets.wrapper.PassengerWrapper; +import me.lojosho.hibiscuscommons.packets.wrapper.SlotContentWrapper; import me.lojosho.hibiscuscommons.plugins.SubPlugins; import me.lojosho.hibiscuscommons.util.MessagesUtil; import net.minecraft.core.NonNullList; @@ -64,8 +68,8 @@ public class NMSPacketChannel extends ChannelDuplexHandler { AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); SubPlugins.getSubPlugins().forEach(plugin -> { - PacketAction pluginAction = plugin.getPacketInterface().writeContainerContent(player, windowId, bukkitItems); - if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + PacketAction pluginAction = plugin.getPacketInterface().writeContainerContent(player, new ContainerContentWrapper(windowId, bukkitItems)); + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); @@ -88,9 +92,8 @@ public class NMSPacketChannel extends ChannelDuplexHandler { AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); SubPlugins.getSubPlugins().forEach(plugin -> { - PacketAction pluginAction = plugin.getPacketInterface().writeSlotContent(player, windowId, slot, bukkitItem); - if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); - + PacketAction pluginAction = plugin.getPacketInterface().writeSlotContent(player, new SlotContentWrapper(windowId, slot, bukkitItem)); + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); if (action.get() == PacketAction.CANCELLED) return null; @@ -102,27 +105,33 @@ public class NMSPacketChannel extends ChannelDuplexHandler { } private Packet handlePlayerEquipment(@NotNull ClientboundSetEquipmentPacket packet) { - final List> armor = packet.getSlots(); - final HashMap bukkitArmor = new HashMap<>(); - for (Pair piece : armor) { + final List> nmsArmor = packet.getSlots(); + HashMap bukkitArmor = new HashMap<>(); + for (Pair piece : nmsArmor) { EquipmentSlot slot = CraftEquipmentSlot.getSlot(piece.getFirst()); org.bukkit.inventory.ItemStack itemStack = CraftItemStack.asBukkitCopy(piece.getSecond()); bukkitArmor.put(slot, itemStack); } + final var finalArmor = bukkitArmor; + AtomicReference> armor = new AtomicReference<>(new HashMap<>()); + AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); SubPlugins.getSubPlugins().forEach(plugin -> { - PacketAction pluginAction = plugin.getPacketInterface().writeEquipmentContent(player, bukkitArmor); - if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); - + EntityEquipmentWrapper wrapper = new EntityEquipmentWrapper(finalArmor); + PacketAction pluginAction = plugin.getPacketInterface().writeEquipmentContent(player, wrapper); + if (pluginAction != PacketAction.NOTHING) { + armor.set(wrapper.getArmor()); + action.set(pluginAction); + } }); if (action.get() == PacketAction.CANCELLED) return null; if (action.get() == PacketAction.NOTHING) return packet; List> newArmor = new ArrayList<>(); - for (Map.Entry entry : bukkitArmor.entrySet()) { + for (Map.Entry entry : armor.get().entrySet()) { net.minecraft.world.entity.EquipmentSlot slot = CraftEquipmentSlot.getNMS(entry.getKey()); ItemStack itemStack = CraftItemStack.asNMSCopy(entry.getValue()); newArmor.add(new Pair<>(slot, itemStack)); @@ -139,8 +148,8 @@ public class NMSPacketChannel extends ChannelDuplexHandler { AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); SubPlugins.getSubPlugins().forEach(plugin -> { - PacketAction pluginAction = plugin.getPacketInterface().writePassengerContent(player, ownerId, passengers); - if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + PacketAction pluginAction = plugin.getPacketInterface().writePassengerContent(player, new PassengerWrapper(ownerId, passengers)); + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); @@ -176,7 +185,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { SubPlugins.getSubPlugins().forEach(plugin -> { PacketAction pluginAction = plugin.getPacketInterface().readInventoryClick(player, clickType.id(), slotClicked); - if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); if (action.get() == PacketAction.CANCELLED) return null; @@ -190,7 +199,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { SubPlugins.getSubPlugins().forEach(plugin -> { PacketAction pluginAction = plugin.getPacketInterface().readPlayerAction(player, playerAction.ordinal()); - if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); if (action.get() == PacketAction.CANCELLED) return null; @@ -202,7 +211,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { SubPlugins.getSubPlugins().forEach(plugin -> { PacketAction pluginAction = plugin.getPacketInterface().readPlayerArm(player); - if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); if (action.get() == PacketAction.CANCELLED) return null; @@ -214,7 +223,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { SubPlugins.getSubPlugins().forEach(plugin -> { PacketAction pluginAction = plugin.getPacketInterface().readEntityHandle(player); - if (pluginAction != PacketAction.NOTHING) action.set(PacketAction.CANCELLED); + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); if (action.get() == PacketAction.CANCELLED) return null; From ee96da9abd399e34b40dbeaf18dbae936ebb5f48 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 26 Jun 2025 14:43:04 -0500 Subject: [PATCH 11/12] feat: latest changes and wrappers --- .../packets/PacketInterface.java | 17 +++--- .../wrapper/EntityEquipmentWrapper.java | 4 +- .../wrapper/InventoryClickWrapper.java | 17 ++++++ .../packets/wrapper/PlayerActionWrapper.java | 14 +++++ .../nms/v1_21_R5/NMSPacketChannel.java | 58 +++++++++---------- .../nms/v1_21_R5/NMSPackets.java | 1 + 6 files changed, 68 insertions(+), 43 deletions(-) create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/InventoryClickWrapper.java create mode 100644 common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PlayerActionWrapper.java diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java index 47b53ec..df61dd4 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/PacketInterface.java @@ -1,36 +1,33 @@ package me.lojosho.hibiscuscommons.packets; -import me.lojosho.hibiscuscommons.packets.wrapper.ContainerContentWrapper; -import me.lojosho.hibiscuscommons.packets.wrapper.EntityEquipmentWrapper; -import me.lojosho.hibiscuscommons.packets.wrapper.PassengerWrapper; -import me.lojosho.hibiscuscommons.packets.wrapper.SlotContentWrapper; +import me.lojosho.hibiscuscommons.packets.wrapper.*; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; public interface PacketInterface { - default PacketAction writeContainerContent(@NotNull Player player, ContainerContentWrapper wrapper) { + default PacketAction writeContainerContent(@NotNull Player player, @NotNull ContainerContentWrapper wrapper) { return PacketAction.NOTHING; } - default PacketAction writeSlotContent(@NotNull Player player, SlotContentWrapper wrapper) { + default PacketAction writeSlotContent(@NotNull Player player, @NotNull SlotContentWrapper wrapper) { return PacketAction.NOTHING; } - default PacketAction writeEquipmentContent(@NotNull Player player, EntityEquipmentWrapper wrapper) { + default PacketAction writeEquipmentContent(@NotNull Player player, @NotNull EntityEquipmentWrapper wrapper) { return PacketAction.NOTHING; } - default PacketAction writePassengerContent(@NotNull Player player, PassengerWrapper wrapper) { + default PacketAction writePassengerContent(@NotNull Player player, @NotNull PassengerWrapper wrapper) { return PacketAction.NOTHING; } - default PacketAction readInventoryClick(@NotNull Player player, Integer clickType, Integer slotNumber) { + default PacketAction readInventoryClick(@NotNull Player player, @NotNull InventoryClickWrapper wrapper) { return PacketAction.NOTHING; // Override } - default PacketAction readPlayerAction(@NotNull Player player, Integer actionType) { + default PacketAction readPlayerAction(@NotNull Player player, @NotNull PlayerActionWrapper wrapper) { return PacketAction.NOTHING; // Override } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/EntityEquipmentWrapper.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/EntityEquipmentWrapper.java index a0b18f2..0c8667d 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/EntityEquipmentWrapper.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/EntityEquipmentWrapper.java @@ -11,9 +11,11 @@ import java.util.Map; @Getter @Setter public class EntityEquipmentWrapper { + private int entityId; private Map armor; - public EntityEquipmentWrapper(@NotNull Map armor) { + public EntityEquipmentWrapper(int entityId, @NotNull Map armor) { + this.entityId = entityId; this.armor = armor; } } diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/InventoryClickWrapper.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/InventoryClickWrapper.java new file mode 100644 index 0000000..7eded2f --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/InventoryClickWrapper.java @@ -0,0 +1,17 @@ +package me.lojosho.hibiscuscommons.packets.wrapper; + +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +@Getter @Setter +public class InventoryClickWrapper { + + private int clickType; + private int slotNumber; + + public InventoryClickWrapper(@NotNull Integer clickType, @NotNull Integer slotNumber) { + this.clickType = clickType; + this.slotNumber = slotNumber; + } +} diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PlayerActionWrapper.java b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PlayerActionWrapper.java new file mode 100644 index 0000000..b3475fe --- /dev/null +++ b/common/src/main/java/me/lojosho/hibiscuscommons/packets/wrapper/PlayerActionWrapper.java @@ -0,0 +1,14 @@ +package me.lojosho.hibiscuscommons.packets.wrapper; + +import lombok.Getter; +import lombok.Setter; + +@Getter @Setter +public class PlayerActionWrapper { + + private String actionType; + + public PlayerActionWrapper(String actionType) { + this.actionType = actionType; + } +} diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java index 243798b..adba04f 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java @@ -7,10 +7,7 @@ import io.netty.channel.ChannelPromise; import lombok.Getter; import me.lojosho.hibiscuscommons.nms.NMSHandlers; import me.lojosho.hibiscuscommons.packets.PacketAction; -import me.lojosho.hibiscuscommons.packets.wrapper.ContainerContentWrapper; -import me.lojosho.hibiscuscommons.packets.wrapper.EntityEquipmentWrapper; -import me.lojosho.hibiscuscommons.packets.wrapper.PassengerWrapper; -import me.lojosho.hibiscuscommons.packets.wrapper.SlotContentWrapper; +import me.lojosho.hibiscuscommons.packets.wrapper.*; import me.lojosho.hibiscuscommons.plugins.SubPlugins; import me.lojosho.hibiscuscommons.util.MessagesUtil; import net.minecraft.core.NonNullList; @@ -66,46 +63,47 @@ public class NMSPacketChannel extends ChannelDuplexHandler { List bukkitItems = slotData.stream().map(CraftItemStack::asBukkitCopy).toList(); AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + ContainerContentWrapper wrapper = new ContainerContentWrapper(windowId, bukkitItems); SubPlugins.getSubPlugins().forEach(plugin -> { - PacketAction pluginAction = plugin.getPacketInterface().writeContainerContent(player, new ContainerContentWrapper(windowId, bukkitItems)); + PacketAction pluginAction = plugin.getPacketInterface().writeContainerContent(player, wrapper); if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); - }); - List nmsItems = bukkitItems.stream().map(CraftItemStack::asNMSCopy).toList(); - if (action.get() == PacketAction.CANCELLED) return null; if (action.get() == PacketAction.NOTHING) return packet; + List nmsItems = wrapper.getSlotData().stream().map(CraftItemStack::asNMSCopy).toList(); return new ClientboundContainerSetContentPacket(0, packet.stateId(), nmsItems, packet.carriedItem()); } private Packet handleSlotChange(@NotNull ClientboundContainerSetSlotPacket packet) { MessagesUtil.sendDebugMessages("SetSlot Initial "); - Integer windowId = packet.getContainerId(); - Integer slot = packet.getSlot(); - ItemStack item = packet.getItem(); + final int windowId = packet.getContainerId(); + final int slot = packet.getSlot(); + final ItemStack item = packet.getItem(); org.bukkit.inventory.ItemStack bukkitItem = CraftItemStack.asBukkitCopy(item); AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); - SubPlugins.getSubPlugins().forEach(plugin -> { + SlotContentWrapper wrapper = new SlotContentWrapper(windowId, slot, bukkitItem); - PacketAction pluginAction = plugin.getPacketInterface().writeSlotContent(player, new SlotContentWrapper(windowId, slot, bukkitItem)); + SubPlugins.getSubPlugins().forEach(plugin -> { + PacketAction pluginAction = plugin.getPacketInterface().writeSlotContent(player, wrapper); if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); if (action.get() == PacketAction.CANCELLED) return null; if (action.get() == PacketAction.NOTHING) return packet; - final ItemStack nmsItem = CraftItemStack.asNMSCopy(bukkitItem); + final ItemStack nmsItem = CraftItemStack.asNMSCopy(wrapper.getItemStack()); - return new ClientboundContainerSetSlotPacket(0, packet.getStateId(), slot, nmsItem); + return new ClientboundContainerSetSlotPacket(0, packet.getStateId(), wrapper.getSlot(), nmsItem); } private Packet handlePlayerEquipment(@NotNull ClientboundSetEquipmentPacket packet) { final List> nmsArmor = packet.getSlots(); + final int entity = packet.getEntity(); HashMap bukkitArmor = new HashMap<>(); for (Pair piece : nmsArmor) { EquipmentSlot slot = CraftEquipmentSlot.getSlot(piece.getFirst()); @@ -113,25 +111,20 @@ public class NMSPacketChannel extends ChannelDuplexHandler { bukkitArmor.put(slot, itemStack); } - final var finalArmor = bukkitArmor; - AtomicReference> armor = new AtomicReference<>(new HashMap<>()); - AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); - SubPlugins.getSubPlugins().forEach(plugin -> { + EntityEquipmentWrapper wrapper = new EntityEquipmentWrapper(entity, bukkitArmor); - EntityEquipmentWrapper wrapper = new EntityEquipmentWrapper(finalArmor); + SubPlugins.getSubPlugins().forEach(plugin -> { PacketAction pluginAction = plugin.getPacketInterface().writeEquipmentContent(player, wrapper); - if (pluginAction != PacketAction.NOTHING) { - armor.set(wrapper.getArmor()); - action.set(pluginAction); - } + if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); if (action.get() == PacketAction.CANCELLED) return null; if (action.get() == PacketAction.NOTHING) return packet; + List> newArmor = new ArrayList<>(); - for (Map.Entry entry : armor.get().entrySet()) { + for (Map.Entry entry : wrapper.getArmor().entrySet()) { net.minecraft.world.entity.EquipmentSlot slot = CraftEquipmentSlot.getNMS(entry.getKey()); ItemStack itemStack = CraftItemStack.asNMSCopy(entry.getValue()); newArmor.add(new Pair<>(slot, itemStack)); @@ -141,16 +134,17 @@ public class NMSPacketChannel extends ChannelDuplexHandler { } private Packet handlePassengerSet(@NotNull ClientboundSetPassengersPacket packet) { - Integer ownerId = packet.getVehicle(); + int ownerId = packet.getVehicle(); List passengers = Arrays.stream(packet.getPassengers()).boxed().collect(Collectors.toList()); MessagesUtil.sendDebugMessages("Mount Packet Sent - Read - EntityID: " + ownerId); AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); + PassengerWrapper wrapper = new PassengerWrapper(ownerId, passengers); SubPlugins.getSubPlugins().forEach(plugin -> { - - PacketAction pluginAction = plugin.getPacketInterface().writePassengerContent(player, new PassengerWrapper(ownerId, passengers)); - if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); - + PacketAction pluginAction = plugin.getPacketInterface().writePassengerContent(player, wrapper); + if (pluginAction != PacketAction.NOTHING) { + action.set(pluginAction); + } }); if (action.get() == PacketAction.CANCELLED) return null; @@ -184,7 +178,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); SubPlugins.getSubPlugins().forEach(plugin -> { - PacketAction pluginAction = plugin.getPacketInterface().readInventoryClick(player, clickType.id(), slotClicked); + PacketAction pluginAction = plugin.getPacketInterface().readInventoryClick(player, new InventoryClickWrapper(clickType.id(), slotClicked)); if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); @@ -198,7 +192,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); SubPlugins.getSubPlugins().forEach(plugin -> { - PacketAction pluginAction = plugin.getPacketInterface().readPlayerAction(player, playerAction.ordinal()); + PacketAction pluginAction = plugin.getPacketInterface().readPlayerAction(player, new PlayerActionWrapper(playerAction.name())); if (pluginAction != PacketAction.NOTHING) action.set(pluginAction); }); diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java index 88cbc39..16905be 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java @@ -251,6 +251,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. passenger.setId(id); return passenger; }).toList(); + fakeNmsEntity.setId(mountId); fakeNmsEntity.passengers = ImmutableList.copyOf(passengers); ClientboundSetPassengersPacket packet = new ClientboundSetPassengersPacket(fakeNmsEntity); fakeNmsEntity.passengers = ImmutableList.of(); From f93d73ee7994dc7fb85218b6a022373fd00c68b6 Mon Sep 17 00:00:00 2001 From: LoJoSho Date: Thu, 26 Jun 2025 15:10:54 -0500 Subject: [PATCH 12/12] fix: interact packet not on correct packet --- .../java/me/lojosho/hibiscuscommons/nms/NMSPackets.java | 9 +++++---- .../hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java | 4 ++-- .../lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java | 9 +++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java index 8d21795..5ae2311 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java @@ -5,10 +5,7 @@ import it.unimi.dsi.fastutil.ints.IntList; import net.kyori.adventure.text.Component; import org.bukkit.GameMode; import org.bukkit.Location; -import org.bukkit.entity.Display; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.ItemDisplay; -import org.bukkit.entity.Player; +import org.bukkit.entity.*; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -43,6 +40,10 @@ public interface NMSPackets { void sendSlotUpdate(Player player, int slot); + default void sendLookAtPacket(int entityId, Location location, List sendTo) { + + } + void sendEquipmentSlotUpdate( int entityId, org.bukkit.inventory.EquipmentSlot slot, diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java index adba04f..3f6b626 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPacketChannel.java @@ -163,7 +163,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { case ServerboundContainerClickPacket clickPacket -> msg = handleInventoryClick(clickPacket); case ServerboundPlayerActionPacket playerActionPacket -> msg = handlePlayerAction(playerActionPacket); case ServerboundSwingPacket swingPacket -> msg = handlePlayerArm(swingPacket); - case ServerboundUseItemOnPacket useItemOnPacket -> msg = handleEntityUse(useItemOnPacket); + case ServerboundInteractPacket interactPacket -> msg = handleInteract(interactPacket); default -> {} } @@ -212,7 +212,7 @@ public class NMSPacketChannel extends ChannelDuplexHandler { return packet; } - private Packet handleEntityUse(ServerboundUseItemOnPacket packet) { + private Packet handleInteract(ServerboundInteractPacket packet) { AtomicReference action = new AtomicReference<>(PacketAction.NOTHING); SubPlugins.getSubPlugins().forEach(plugin -> { diff --git a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java index 16905be..8c3cc00 100644 --- a/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java +++ b/v1_21_R5/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R5/NMSPackets.java @@ -14,6 +14,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.minecraft.advancements.Advancement; import net.minecraft.advancements.AdvancementHolder; +import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.*; import net.minecraft.network.syncher.EntityDataSerializers; @@ -126,6 +127,14 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. sendPacket(player, packet); } + @Override + public void sendLookAtPacket(int entityId, Location location, List sendTo) { + fakeNmsEntity.setId(entityId); + fakeNmsEntity.getBukkitEntity().teleport(location); + ClientboundPlayerLookAtPacket packet = new ClientboundPlayerLookAtPacket(EntityAnchorArgument.Anchor.EYES, fakeNmsEntity, EntityAnchorArgument.Anchor.EYES); + for (Player p : sendTo) sendPacket(p, packet); + } + @Override public void sendRotateHeadPacket(int entityId, Location location, List sendTo) { fakeNmsEntity.setId(entityId);