From a9b28dd6e5bb69f17d8e553fd699a48d5f755a62 Mon Sep 17 00:00:00 2001 From: Logan <37521985+LoJoSho@users.noreply.github.com> Date: Sat, 6 Sep 2025 23:13:02 -0500 Subject: [PATCH] feat: move all packet sending to be async --- .../hibiscuscommons/nms/NMSPackets.java | 5 ++ .../nms/v1_20_R4/NMSCommon.java | 24 ++++++++-- .../nms/v1_20_R4/NMSPackets.java | 45 +++++++++++++++++- .../nms/v1_21_R1/NMSCommon.java | 24 ++++++++-- .../nms/v1_21_R1/NMSPackets.java | 45 +++++++++++++++++- .../nms/v1_21_R2/NMSCommon.java | 24 ++++++++-- .../nms/v1_21_R2/NMSPackets.java | 45 +++++++++++++++++- .../nms/v1_21_R3/NMSCommon.java | 24 ++++++++-- .../nms/v1_21_R3/NMSPackets.java | 46 ++++++++++++++++++- .../nms/v1_21_R4/NMSCommon.java | 24 ++++++++-- .../nms/v1_21_R4/NMSPackets.java | 45 +++++++++++++++++- .../nms/v1_21_R5/NMSCommon.java | 25 ++++++++-- .../nms/v1_21_R5/NMSPackets.java | 46 ++++++++++++++++++- 13 files changed, 386 insertions(+), 36 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 a476db9..4fdd474 100644 --- a/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java +++ b/common/src/main/java/me/lojosho/hibiscuscommons/nms/NMSPackets.java @@ -97,5 +97,10 @@ public interface NMSPackets { void sendToastPacket(Player player, ItemStack icon, Component title, Component description); + void sendInvisibleParticleCloud(int entityId, Location location, UUID uuid, List sendTo); + + // The mask here is for is the armorstand is on fire or not. + void sendInvisibleArmorstand(int entityId, Location location, UUID uuid, byte mask, List sendTo); + Object createMountPacket(int entityId, int[] passengerIds); } diff --git a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSCommon.java b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSCommon.java index 0fa2d1e..5d876d7 100644 --- a/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSCommon.java +++ b/v1_20_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_20_R4/NMSCommon.java @@ -1,17 +1,33 @@ package me.lojosho.hibiscuscommons.nms.v1_20_R4; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import net.minecraft.network.protocol.Packet; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerPlayerConnection; +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class NMSCommon { - public void sendPacket(Player player, Packet packet) { - ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - ServerPlayerConnection connection = serverPlayer.connection; - connection.send(packet); + public void sendPacket(@NotNull Player player, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(packet); + }); } + public void sendPacket(@NotNull List players, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + for (Player p : players) { + ServerPlayer serverPlayer = ((CraftPlayer) p).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(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 0ff338a..28b2b27 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 @@ -57,10 +57,16 @@ 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 final Map CLOUD_EFFECT_INVISIBLE_DATA_VALUES = Map.of(0, (byte) 0x20, 8, 0f); // For cloud effects 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) { + ClientboundSetEntityDataPacket packet = getSharedEntityPacket(entityId, dataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + private ClientboundSetEntityDataPacket getSharedEntityPacket(int entityId, Map dataValues) { List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { int index = entry.getKey(); Number value = entry.getValue(); @@ -73,8 +79,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. }; }).collect(Collectors.toList()); - ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); - for (Player player : sendTo) sendPacket(player, packet); + return new ClientboundSetEntityDataPacket(entityId, nmsDataValues); } @Override @@ -467,4 +472,40 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. fakeNmsEntity.passengers = ImmutableList.of(); return packet; } + @Override + public void sendInvisibleParticleCloud(int entityId, Location location, UUID uuid, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD; + 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 spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, CLOUD_EFFECT_INVISIBLE_DATA_VALUES); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } + + public void sendInvisibleArmorstand(int entityId, Location location, UUID uuid, byte mask, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.ARMOR_STAND; + 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; + + final ClientboundAddEntityPacket spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + + final Map dataValues = Map.of(0, mask, 15, (byte) 0x10); + final ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, dataValues); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } } diff --git a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSCommon.java b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSCommon.java index d612c94..f56884e 100644 --- a/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSCommon.java +++ b/v1_21_R1/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R1/NMSCommon.java @@ -1,17 +1,33 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R1; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import net.minecraft.network.protocol.Packet; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerPlayerConnection; +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class NMSCommon { - public void sendPacket(Player player, Packet packet) { - ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - ServerPlayerConnection connection = serverPlayer.connection; - connection.send(packet); + public void sendPacket(@NotNull Player player, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(packet); + }); } + public void sendPacket(@NotNull List players, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + for (Player p : players) { + ServerPlayer serverPlayer = ((CraftPlayer) p).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(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 2c1076e..0281ced 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 @@ -59,10 +59,16 @@ 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 final Map CLOUD_EFFECT_INVISIBLE_DATA_VALUES = Map.of(0, (byte) 0x20, 8, 0f); // For cloud effects 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) { + ClientboundSetEntityDataPacket packet = getSharedEntityPacket(entityId, dataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + private ClientboundSetEntityDataPacket getSharedEntityPacket(int entityId, Map dataValues) { List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { int index = entry.getKey(); Number value = entry.getValue(); @@ -75,8 +81,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. }; }).collect(Collectors.toList()); - ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); - for (Player player : sendTo) sendPacket(player, packet); + return new ClientboundSetEntityDataPacket(entityId, nmsDataValues); } @Override @@ -469,4 +474,40 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. fakeNmsEntity.passengers = ImmutableList.of(); return packet; } + @Override + public void sendInvisibleParticleCloud(int entityId, Location location, UUID uuid, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD; + 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 spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, CLOUD_EFFECT_INVISIBLE_DATA_VALUES); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } + + public void sendInvisibleArmorstand(int entityId, Location location, UUID uuid, byte mask, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.ARMOR_STAND; + 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; + + final ClientboundAddEntityPacket spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + + final Map dataValues = Map.of(0, mask, 15, (byte) 0x10); + final ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, dataValues); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } } diff --git a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSCommon.java b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSCommon.java index 6fedb0e..e5c6251 100644 --- a/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSCommon.java +++ b/v1_21_R2/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R2/NMSCommon.java @@ -1,17 +1,33 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R2; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import net.minecraft.network.protocol.Packet; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerPlayerConnection; +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class NMSCommon { - public void sendPacket(Player player, Packet packet) { - ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - ServerPlayerConnection connection = serverPlayer.connection; - connection.send(packet); + public void sendPacket(@NotNull Player player, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(packet); + }); } + public void sendPacket(@NotNull List players, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + for (Player p : players) { + ServerPlayer serverPlayer = ((CraftPlayer) p).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(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 5a0bf0b..5a0f490 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 @@ -60,10 +60,16 @@ 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 final Map CLOUD_EFFECT_INVISIBLE_DATA_VALUES = Map.of(0, (byte) 0x20, 8, 0f); // For cloud effects 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) { + ClientboundSetEntityDataPacket packet = getSharedEntityPacket(entityId, dataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + private ClientboundSetEntityDataPacket getSharedEntityPacket(int entityId, Map dataValues) { List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { int index = entry.getKey(); Number value = entry.getValue(); @@ -76,8 +82,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. }; }).collect(Collectors.toList()); - ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); - for (Player player : sendTo) sendPacket(player, packet); + return new ClientboundSetEntityDataPacket(entityId, nmsDataValues); } @Override @@ -467,4 +472,40 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. fakeNmsEntity.passengers = ImmutableList.of(); return packet; } + @Override + public void sendInvisibleParticleCloud(int entityId, Location location, UUID uuid, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD; + 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 spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, CLOUD_EFFECT_INVISIBLE_DATA_VALUES); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } + + public void sendInvisibleArmorstand(int entityId, Location location, UUID uuid, byte mask, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.ARMOR_STAND; + 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; + + final ClientboundAddEntityPacket spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + + final Map dataValues = Map.of(0, mask, 15, (byte) 0x10); + final ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, dataValues); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } } diff --git a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSCommon.java b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSCommon.java index 8796861..6243a8a 100644 --- a/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSCommon.java +++ b/v1_21_R3/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R3/NMSCommon.java @@ -1,17 +1,33 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R3; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import net.minecraft.network.protocol.Packet; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerPlayerConnection; +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class NMSCommon { - public void sendPacket(Player player, Packet packet) { - ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - ServerPlayerConnection connection = serverPlayer.connection; - connection.send(packet); + public void sendPacket(@NotNull Player player, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(packet); + }); } + public void sendPacket(@NotNull List players, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + for (Player p : players) { + ServerPlayer serverPlayer = ((CraftPlayer) p).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(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 5548c47..432e9fb 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 @@ -60,10 +60,16 @@ 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 final Map CLOUD_EFFECT_INVISIBLE_DATA_VALUES = Map.of(0, (byte) 0x20, 8, 0f); // For cloud effects 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) { + ClientboundSetEntityDataPacket packet = getSharedEntityPacket(entityId, dataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + private ClientboundSetEntityDataPacket getSharedEntityPacket(int entityId, Map dataValues) { List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { int index = entry.getKey(); Number value = entry.getValue(); @@ -76,8 +82,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. }; }).collect(Collectors.toList()); - ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); - for (Player player : sendTo) sendPacket(player, packet); + return new ClientboundSetEntityDataPacket(entityId, nmsDataValues); } @Override @@ -502,4 +507,41 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. fakeNmsEntity.passengers = ImmutableList.of(); return packet; } + + @Override + public void sendInvisibleParticleCloud(int entityId, Location location, UUID uuid, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD; + 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 spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, CLOUD_EFFECT_INVISIBLE_DATA_VALUES); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } + + public void sendInvisibleArmorstand(int entityId, Location location, UUID uuid, byte mask, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.ARMOR_STAND; + 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; + + final ClientboundAddEntityPacket spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + + final Map dataValues = Map.of(0, mask, 15, (byte) 0x10); + final ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, dataValues); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } } diff --git a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSCommon.java b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSCommon.java index 1f2fdba..db885dd 100644 --- a/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSCommon.java +++ b/v1_21_R4/src/main/java/me/lojosho/hibiscuscommons/nms/v1_21_R4/NMSCommon.java @@ -1,17 +1,33 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R4; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import net.minecraft.network.protocol.Packet; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerPlayerConnection; +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class NMSCommon { - public void sendPacket(Player player, Packet packet) { - ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - ServerPlayerConnection connection = serverPlayer.connection; - connection.send(packet); + public void sendPacket(@NotNull Player player, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(packet); + }); } + public void sendPacket(@NotNull List players, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + for (Player p : players) { + ServerPlayer serverPlayer = ((CraftPlayer) p).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(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 cd4fa45..44639db 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 @@ -60,10 +60,16 @@ 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 final Map CLOUD_EFFECT_INVISIBLE_DATA_VALUES = Map.of(0, (byte) 0x20, 8, 0f); // For cloud effects 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) { + ClientboundSetEntityDataPacket packet = getSharedEntityPacket(entityId, dataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + private ClientboundSetEntityDataPacket getSharedEntityPacket(int entityId, Map dataValues) { List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { int index = entry.getKey(); Number value = entry.getValue(); @@ -76,8 +82,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. }; }).collect(Collectors.toList()); - ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); - for (Player player : sendTo) sendPacket(player, packet); + return new ClientboundSetEntityDataPacket(entityId, nmsDataValues); } @Override @@ -503,4 +508,40 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. fakeNmsEntity.passengers = ImmutableList.of(); return packet; } + @Override + public void sendInvisibleParticleCloud(int entityId, Location location, UUID uuid, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD; + 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 spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, CLOUD_EFFECT_INVISIBLE_DATA_VALUES); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } + + public void sendInvisibleArmorstand(int entityId, Location location, UUID uuid, byte mask, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.ARMOR_STAND; + 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; + + final ClientboundAddEntityPacket spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + + final Map dataValues = Map.of(0, mask, 15, (byte) 0x10); + final ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, dataValues); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } } 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 124c5a5..de8bf0e 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 @@ -1,16 +1,33 @@ package me.lojosho.hibiscuscommons.nms.v1_21_R5; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import net.minecraft.network.protocol.Packet; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerPlayerConnection; +import org.bukkit.Bukkit; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; public class NMSCommon { - public void sendPacket(Player player, Packet packet) { - ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); - ServerPlayerConnection connection = serverPlayer.connection; - connection.send(packet); + public void sendPacket(@NotNull Player player, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + ServerPlayer serverPlayer = ((CraftPlayer) player).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(packet); + }); + } + + public void sendPacket(@NotNull List players, @NotNull Packet packet) { + Bukkit.getAsyncScheduler().runNow(HibiscusCommonsPlugin.getInstance(), (task) -> { + for (Player p : players) { + ServerPlayer serverPlayer = ((CraftPlayer) p).getHandle(); + ServerPlayerConnection connection = serverPlayer.connection; + connection.send(packet); + } + }); } } 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 61be102..691b1c1 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 @@ -57,10 +57,16 @@ 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 final Map CLOUD_EFFECT_INVISIBLE_DATA_VALUES = Map.of(0, (byte) 0x20, 8, 0f); // For cloud effects 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) { + ClientboundSetEntityDataPacket packet = getSharedEntityPacket(entityId, dataValues); + for (Player player : sendTo) sendPacket(player, packet); + } + + private ClientboundSetEntityDataPacket getSharedEntityPacket(int entityId, Map dataValues) { List> nmsDataValues = dataValues.entrySet().stream().map(entry -> { int index = entry.getKey(); Number value = entry.getValue(); @@ -73,8 +79,7 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. }; }).collect(Collectors.toList()); - ClientboundSetEntityDataPacket packet = new ClientboundSetEntityDataPacket(entityId, nmsDataValues); - for (Player player : sendTo) sendPacket(player, packet); + return new ClientboundSetEntityDataPacket(entityId, nmsDataValues); } @Override @@ -500,4 +505,41 @@ public class NMSPackets extends NMSCommon implements me.lojosho.hibiscuscommons. fakeNmsEntity.passengers = ImmutableList.of(); return packet; } + + @Override + public void sendInvisibleParticleCloud(int entityId, Location location, UUID uuid, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.AREA_EFFECT_CLOUD; + 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 spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, CLOUD_EFFECT_INVISIBLE_DATA_VALUES); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } + + public void sendInvisibleArmorstand(int entityId, Location location, UUID uuid, byte mask, List sendTo) { + net.minecraft.world.entity.EntityType nmsEntityType = net.minecraft.world.entity.EntityType.ARMOR_STAND; + 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; + + final ClientboundAddEntityPacket spawnPacket = new ClientboundAddEntityPacket(entityId, uuid, x, y, z, yaw, pitch, nmsEntityType, 0, velocity, headYaw); + + final Map dataValues = Map.of(0, mask, 15, (byte) 0x10); + final ClientboundSetEntityDataPacket dataPacket = getSharedEntityPacket(entityId, dataValues); + + ClientboundBundlePacket bundlePacket = new ClientboundBundlePacket(List.of(spawnPacket, dataPacket)); + sendPacket(sendTo, bundlePacket); + } }