diff --git a/build.gradle.kts b/build.gradle.kts index 38fb801..531a00c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } group = "me.lojosho" -version = "0.5.5${getGitCommitHash()}" +version = "0.6.0${getGitCommitHash()}" allprojects { apply(plugin = "java") 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 99725a3..d17b864 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java @@ -1,12 +1,19 @@ package me.lojosho.hibiscuscommons.nms; +import it.unimi.dsi.fastutil.ints.IntList; 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.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import org.joml.Quaternionf; +import org.joml.Vector3f; import java.util.HashMap; import java.util.List; +import java.util.UUID; public interface NMSPackets { @@ -51,4 +58,18 @@ public interface NMSPackets { 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); + + void sendEntityDestroyPacket(IntList entityIds, List sendTo); + + void sendItemDisplayMetadata(int entityId, + Vector3f translation, + Vector3f scale, + Quaternionf rotationLeft, + Quaternionf rotationRight, + Display.Billboard billboard, + int blockLight, int skyLight, float viewRange, float width, float height, + ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack, + List sendTo); } 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 5ce0e7c..b633426 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 @@ -2,28 +2,36 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R3; import com.mojang.datafixers.util.Pair; import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntList; 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.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; +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.Location; import org.bukkit.craftbukkit.v1_20_R3.CraftEquipmentSlot; +import org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntityType; import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_20_R3.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.inventory.ItemStack; +import org.joml.Quaternionf; +import org.joml.Vector3f; import java.lang.reflect.Constructor; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { @@ -235,4 +243,55 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } } + + + @Override + public void sendSpawnEntityPacket(int entityId, UUID uuid, EntityType entityType, Location location, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = CraftEntityType.bukkitToMinecraft(entityType); + double x = location.getX(); + double y = location.getY(); + double z = location.getZ(); + float yaw = location.getYaw(); + float pitch = location.getPitch(); + Vec3 velocity = Vec3.ZERO; + float headYaw = 0f; + + ClientboundAddEntityPacket packet = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendEntityDestroyPacket(IntList entityIds, List sendTo) { + ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(entityIds); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendItemDisplayMetadata(int entityId, + Vector3f translation, + Vector3f scale, + Quaternionf rotationLeft, + Quaternionf rotationRight, + Display.Billboard billboard, + int blockLight, int skyLight, float viewRange, float width, float height, + ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack, + List sendTo) { + + List> dataValues = new ArrayList<>(); + dataValues.add(new SynchedEntityData.DataValue<>(11, EntityDataSerializers.VECTOR3, translation)); + dataValues.add(new SynchedEntityData.DataValue<>(12, EntityDataSerializers.VECTOR3, scale)); + dataValues.add(new SynchedEntityData.DataValue<>(13, EntityDataSerializers.QUATERNION, rotationLeft)); + dataValues.add(new SynchedEntityData.DataValue<>(14, EntityDataSerializers.QUATERNION, rotationRight)); + dataValues.add(new SynchedEntityData.DataValue<>(15, EntityDataSerializers.BYTE, (byte) billboard.ordinal())); + dataValues.add(new SynchedEntityData.DataValue<>(16, EntityDataSerializers.INT, (blockLight << 4 | skyLight << 20))); + dataValues.add(new SynchedEntityData.DataValue<>(17, EntityDataSerializers.FLOAT, viewRange)); + dataValues.add(new SynchedEntityData.DataValue<>(20, EntityDataSerializers.FLOAT, width)); + dataValues.add(new SynchedEntityData.DataValue<>(21, EntityDataSerializers.FLOAT, height)); + + dataValues.add(new SynchedEntityData.DataValue<>(23, EntityDataSerializers.ITEM_STACK, CraftItemStack.asNMSCopy(itemStack))); + dataValues.add(new SynchedEntityData.DataValue<>(24, EntityDataSerializers.BYTE, (byte) transform.ordinal())); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); + 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 627173f..41c7e68 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,28 +2,36 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R4; import com.mojang.datafixers.util.Pair; import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntList; 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.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; +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.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.inventory.ItemStack; +import org.joml.Quaternionf; +import org.joml.Vector3f; import java.lang.reflect.Constructor; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { @@ -234,4 +242,54 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } } + + + @Override + public void sendSpawnEntityPacket(int entityId, UUID uuid, EntityType entityType, Location location, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = CraftEntityType.bukkitToMinecraft(entityType); + double x = location.getX(); + double y = location.getY(); + double z = location.getZ(); + float yaw = location.getYaw(); + float pitch = location.getPitch(); + Vec3 velocity = Vec3.ZERO; + float headYaw = 0f; + + ClientboundAddEntityPacket packet = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendEntityDestroyPacket(IntList entityIds, List sendTo) { + ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(entityIds); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendItemDisplayMetadata(int entityId, + Vector3f translation, + Vector3f scale, + Quaternionf rotationLeft, + Quaternionf rotationRight, + Display.Billboard billboard, + int blockLight, int skyLight, float viewRange, float width, float height, + ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack, + List sendTo) { + + List> dataValues = new ArrayList<>(); + dataValues.add(new SynchedEntityData.DataValue<>(11, EntityDataSerializers.VECTOR3, translation)); + dataValues.add(new SynchedEntityData.DataValue<>(12, EntityDataSerializers.VECTOR3, scale)); + dataValues.add(new SynchedEntityData.DataValue<>(13, EntityDataSerializers.QUATERNION, rotationLeft)); + dataValues.add(new SynchedEntityData.DataValue<>(14, EntityDataSerializers.QUATERNION, rotationRight)); + dataValues.add(new SynchedEntityData.DataValue<>(15, EntityDataSerializers.BYTE, (byte) billboard.ordinal())); + dataValues.add(new SynchedEntityData.DataValue<>(16, EntityDataSerializers.INT, (blockLight << 4 | skyLight << 20))); + dataValues.add(new SynchedEntityData.DataValue<>(17, EntityDataSerializers.FLOAT, viewRange)); + dataValues.add(new SynchedEntityData.DataValue<>(20, EntityDataSerializers.FLOAT, width)); + dataValues.add(new SynchedEntityData.DataValue<>(21, EntityDataSerializers.FLOAT, height)); + dataValues.add(new SynchedEntityData.DataValue<>(23, EntityDataSerializers.ITEM_STACK, CraftItemStack.asNMSCopy(itemStack))); + dataValues.add(new SynchedEntityData.DataValue<>(24, EntityDataSerializers.BYTE, (byte) transform.ordinal())); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); + 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 e6e22e6..3e1b3eb 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,28 +1,37 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R1; +import com.mojang.datafixers.kinds.Const; import com.mojang.datafixers.util.Pair; import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntList; 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.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Inventory; +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.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.inventory.ItemStack; +import org.joml.Quaternionf; +import org.joml.Vector3f; import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { @@ -32,6 +41,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. static Constructor cameraConstructor; static Constructor lookAtConstructor; static Constructor rotationConstructor; + static Constructor spawnConstructor; static { try { @@ -70,7 +80,6 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. } catch (Exception e) { e.printStackTrace(); } - } @@ -243,4 +252,53 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } } + + @Override + public void sendSpawnEntityPacket(int entityId, UUID uuid, EntityType entityType, Location location, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = CraftEntityType.bukkitToMinecraft(entityType); + double x = location.getX(); + double y = location.getY(); + double z = location.getZ(); + float yaw = location.getYaw(); + float pitch = location.getPitch(); + Vec3 velocity = Vec3.ZERO; + float headYaw = 0f; + + ClientboundAddEntityPacket packet = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendEntityDestroyPacket(IntList entityIds, List sendTo) { + ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(entityIds); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendItemDisplayMetadata(int entityId, + Vector3f translation, + Vector3f scale, + Quaternionf rotationLeft, + Quaternionf rotationRight, + Display.Billboard billboard, + int blockLight, int skyLight, float viewRange, float width, float height, + ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack, + List sendTo) { + + List> dataValues = new ArrayList<>(); + dataValues.add(new SynchedEntityData.DataValue<>(11, EntityDataSerializers.VECTOR3, translation)); + dataValues.add(new SynchedEntityData.DataValue<>(12, EntityDataSerializers.VECTOR3, scale)); + dataValues.add(new SynchedEntityData.DataValue<>(13, EntityDataSerializers.QUATERNION, rotationLeft)); + dataValues.add(new SynchedEntityData.DataValue<>(14, EntityDataSerializers.QUATERNION, rotationRight)); + dataValues.add(new SynchedEntityData.DataValue<>(15, EntityDataSerializers.BYTE, (byte) billboard.ordinal())); + dataValues.add(new SynchedEntityData.DataValue<>(16, EntityDataSerializers.INT, (blockLight << 4 | skyLight << 20))); + dataValues.add(new SynchedEntityData.DataValue<>(17, EntityDataSerializers.FLOAT, viewRange)); + dataValues.add(new SynchedEntityData.DataValue<>(20, EntityDataSerializers.FLOAT, width)); + dataValues.add(new SynchedEntityData.DataValue<>(21, EntityDataSerializers.FLOAT, height)); + dataValues.add(new SynchedEntityData.DataValue<>(23, EntityDataSerializers.ITEM_STACK, CraftItemStack.asNMSCopy(itemStack))); + dataValues.add(new SynchedEntityData.DataValue<>(24, EntityDataSerializers.BYTE, (byte) transform.ordinal())); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); + 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 8054e6c..0a6b2d1 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,9 +2,12 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R2; import com.mojang.datafixers.util.Pair; import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntList; 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.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; @@ -14,20 +17,24 @@ 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.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.inventory.ItemStack; +import org.joml.Quaternionf; +import org.joml.Vector3f; import java.lang.reflect.Constructor; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { @@ -223,4 +230,54 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } } + + + @Override + public void sendSpawnEntityPacket(int entityId, UUID uuid, EntityType entityType, Location location, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = CraftEntityType.bukkitToMinecraft(entityType); + double x = location.getX(); + double y = location.getY(); + double z = location.getZ(); + float yaw = location.getYaw(); + float pitch = location.getPitch(); + Vec3 velocity = Vec3.ZERO; + float headYaw = 0f; + + ClientboundAddEntityPacket packet = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendEntityDestroyPacket(IntList entityIds, List sendTo) { + ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(entityIds); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendItemDisplayMetadata(int entityId, + Vector3f translation, + Vector3f scale, + Quaternionf rotationLeft, + Quaternionf rotationRight, + Display.Billboard billboard, + int blockLight, int skyLight, float viewRange, float width, float height, + ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack, + List sendTo) { + + List> dataValues = new ArrayList<>(); + dataValues.add(new SynchedEntityData.DataValue<>(11, EntityDataSerializers.VECTOR3, translation)); + dataValues.add(new SynchedEntityData.DataValue<>(12, EntityDataSerializers.VECTOR3, scale)); + dataValues.add(new SynchedEntityData.DataValue<>(13, EntityDataSerializers.QUATERNION, rotationLeft)); + dataValues.add(new SynchedEntityData.DataValue<>(14, EntityDataSerializers.QUATERNION, rotationRight)); + dataValues.add(new SynchedEntityData.DataValue<>(15, EntityDataSerializers.BYTE, (byte) billboard.ordinal())); + dataValues.add(new SynchedEntityData.DataValue<>(16, EntityDataSerializers.INT, (blockLight << 4 | skyLight << 20))); + dataValues.add(new SynchedEntityData.DataValue<>(17, EntityDataSerializers.FLOAT, viewRange)); + dataValues.add(new SynchedEntityData.DataValue<>(20, EntityDataSerializers.FLOAT, width)); + dataValues.add(new SynchedEntityData.DataValue<>(21, EntityDataSerializers.FLOAT, height)); + dataValues.add(new SynchedEntityData.DataValue<>(23, EntityDataSerializers.ITEM_STACK, CraftItemStack.asNMSCopy(itemStack))); + dataValues.add(new SynchedEntityData.DataValue<>(24, EntityDataSerializers.BYTE, (byte) transform.ordinal())); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); + 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 62a741b..6b8cb10 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 @@ -2,9 +2,12 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R3; import com.mojang.datafixers.util.Pair; import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntList; 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.server.level.ServerPlayer; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.PositionMoveRotation; @@ -14,20 +17,24 @@ 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.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.inventory.ItemStack; +import org.joml.Quaternionf; +import org.joml.Vector3f; import java.lang.reflect.Constructor; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; +import java.util.*; public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons.nms.NMSPackets { @@ -223,4 +230,54 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. e.printStackTrace(); } } + + + @Override + public void sendSpawnEntityPacket(int entityId, UUID uuid, EntityType entityType, Location location, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = CraftEntityType.bukkitToMinecraft(entityType); + double x = location.getX(); + double y = location.getY(); + double z = location.getZ(); + float yaw = location.getYaw(); + float pitch = location.getPitch(); + Vec3 velocity = Vec3.ZERO; + float headYaw = 0f; + + ClientboundAddEntityPacket packet = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendEntityDestroyPacket(IntList entityIds, List sendTo) { + ClientboundRemoveEntitiesPacket packet = new ClientboundRemoveEntitiesPacket(entityIds); + for (Player p : sendTo) sendPacket(p, packet); + } + + @Override + public void sendItemDisplayMetadata(int entityId, + Vector3f translation, + Vector3f scale, + Quaternionf rotationLeft, + Quaternionf rotationRight, + Display.Billboard billboard, + int blockLight, int skyLight, float viewRange, float width, float height, + ItemDisplay.ItemDisplayTransform transform, ItemStack itemStack, + List sendTo) { + + List> dataValues = new ArrayList<>(); + dataValues.add(new SynchedEntityData.DataValue<>(11, EntityDataSerializers.VECTOR3, translation)); + dataValues.add(new SynchedEntityData.DataValue<>(12, EntityDataSerializers.VECTOR3, scale)); + dataValues.add(new SynchedEntityData.DataValue<>(13, EntityDataSerializers.QUATERNION, rotationLeft)); + dataValues.add(new SynchedEntityData.DataValue<>(14, EntityDataSerializers.QUATERNION, rotationRight)); + dataValues.add(new SynchedEntityData.DataValue<>(15, EntityDataSerializers.BYTE, (byte) billboard.ordinal())); + dataValues.add(new SynchedEntityData.DataValue<>(16, EntityDataSerializers.INT, (blockLight << 4 | skyLight << 20))); + dataValues.add(new SynchedEntityData.DataValue<>(17, EntityDataSerializers.FLOAT, viewRange)); + dataValues.add(new SynchedEntityData.DataValue<>(20, EntityDataSerializers.FLOAT, width)); + dataValues.add(new SynchedEntityData.DataValue<>(21, EntityDataSerializers.FLOAT, height)); + dataValues.add(new SynchedEntityData.DataValue<>(23, EntityDataSerializers.ITEM_STACK, CraftItemStack.asNMSCopy(itemStack))); + dataValues.add(new SynchedEntityData.DataValue<>(24, EntityDataSerializers.BYTE, (byte) transform.ordinal())); + + ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, dataValues); + for (Player p : sendTo) sendPacket(p, packet); + } }