diff --git a/build.gradle.kts b/build.gradle.kts index 38fb801..00e40be 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") @@ -97,6 +97,7 @@ allprojects { compileOnly("com.github.Xiao-MoMi:Custom-Fishing:2.2.26") compileOnly("com.ticxo.modelengine:ModelEngine:R4.0.2") compileOnly("com.comphenix.protocol:ProtocolLib:5.3.0") + compileOnly("org.joml:joml:1.10.5") // Lombok <3 annotationProcessor("org.projectlombok:lombok:1.18.34") 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..088009c 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java @@ -1,15 +1,24 @@ 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 { + static int POSITION_INTERPOLATION_DURATION = 2; + void sendSlotUpdate( Player player, int slot @@ -51,4 +60,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/gradle.properties b/gradle.properties index 3a834b4..d36e203 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -userdevVersion=2.0.0-beta.8 \ No newline at end of file +userdevVersion=2.0.0-beta.11 \ No newline at end of file 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..b153ced 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,56 @@ 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<>(10, EntityDataSerializers.INT, POSITION_INTERPOLATION_DURATION)); + 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..ffa83ca 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,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<>(10, EntityDataSerializers.INT, POSITION_INTERPOLATION_DURATION)); + 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..ac711e2 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,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<>(10, EntityDataSerializers.INT, POSITION_INTERPOLATION_DURATION)); + 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..80093b0 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,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<>(10, EntityDataSerializers.INT, POSITION_INTERPOLATION_DURATION)); + 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..861c811 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,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<>(10, EntityDataSerializers.INT, POSITION_INTERPOLATION_DURATION)); + 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); + } }