diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/CameraPreset.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/CameraPreset.java index c1ea7d5..ade4efa 100644 --- a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/CameraPreset.java +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/CameraPreset.java @@ -2,6 +2,7 @@ package me.zimzaza4.geyserutils.common.camera.data; import lombok.Builder; import lombok.Getter; +import me.zimzaza4.geyserutils.common.util.Pos; import org.jetbrains.annotations.Nullable; import java.util.Map; diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/SetInstruction.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/SetInstruction.java index 9aef37d..9be687f 100644 --- a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/SetInstruction.java +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/SetInstruction.java @@ -3,7 +3,7 @@ package me.zimzaza4.geyserutils.common.camera.instruction; import lombok.*; import me.zimzaza4.geyserutils.common.camera.data.CameraPreset; import me.zimzaza4.geyserutils.common.camera.data.Ease; -import me.zimzaza4.geyserutils.common.camera.data.Pos; +import me.zimzaza4.geyserutils.common.util.Pos; import me.zimzaza4.geyserutils.common.camera.data.Rot; import org.jetbrains.annotations.Nullable; diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CustomParticleEffectPayloadPacket.java b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CustomParticleEffectPayloadPacket.java new file mode 100644 index 0000000..f6e58fe --- /dev/null +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CustomParticleEffectPayloadPacket.java @@ -0,0 +1,22 @@ +package me.zimzaza4.geyserutils.common.packet; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; +import me.zimzaza4.geyserutils.common.animation.Animation; +import me.zimzaza4.geyserutils.common.packet.CustomPayloadPacket; +import me.zimzaza4.geyserutils.common.particle.CustomParticle; +import me.zimzaza4.geyserutils.common.util.Pos; +import org.jetbrains.annotations.Nullable; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +@Setter +public class CustomParticleEffectPayloadPacket extends CustomPayloadPacket { + private CustomParticle particle; + private Pos pos; + +} diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/particle/CustomParticle.java b/common/src/main/java/me/zimzaza4/geyserutils/common/particle/CustomParticle.java new file mode 100644 index 0000000..caa623c --- /dev/null +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/particle/CustomParticle.java @@ -0,0 +1,21 @@ +package me.zimzaza4.geyserutils.common.particle; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; +import me.zimzaza4.geyserutils.common.util.Pos; +import org.jetbrains.annotations.Nullable; + +@AllArgsConstructor +@NoArgsConstructor +@Accessors(fluent = true) +@Getter +@Setter +public class CustomParticle { + private Pos position; + private String identifier; + @Nullable + private String molangVariablesJson; +} diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Pos.java b/common/src/main/java/me/zimzaza4/geyserutils/common/util/Pos.java similarity index 83% rename from common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Pos.java rename to common/src/main/java/me/zimzaza4/geyserutils/common/util/Pos.java index f24080d..4debef9 100644 --- a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Pos.java +++ b/common/src/main/java/me/zimzaza4/geyserutils/common/util/Pos.java @@ -1,4 +1,4 @@ -package me.zimzaza4.geyserutils.common.camera.data; +package me.zimzaza4.geyserutils.common.util; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java index 5d4b51c..00173a8 100644 --- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java @@ -14,17 +14,15 @@ import me.zimzaza4.geyserutils.common.channel.GeyserUtilsChannels; import me.zimzaza4.geyserutils.common.form.element.NpcDialogueButton; import me.zimzaza4.geyserutils.common.manager.PacketManager; import me.zimzaza4.geyserutils.common.packet.*; +import me.zimzaza4.geyserutils.common.packet.CustomParticleEffectPayloadPacket; import me.zimzaza4.geyserutils.geyser.camera.CameraPresetDefinition; -import me.zimzaza4.geyserutils.geyser.camera.Converter; +import me.zimzaza4.geyserutils.geyser.util.Converter; import me.zimzaza4.geyserutils.geyser.form.NpcDialogueForm; import me.zimzaza4.geyserutils.geyser.form.NpcDialogueForms; import me.zimzaza4.geyserutils.geyser.form.element.Button; import me.zimzaza4.geyserutils.geyser.translator.NPCFormResponseTranslator; import org.cloudburstmc.nbt.NbtMap; -import org.cloudburstmc.protocol.bedrock.packet.AnimateEntityPacket; -import org.cloudburstmc.protocol.bedrock.packet.CameraInstructionPacket; -import org.cloudburstmc.protocol.bedrock.packet.CameraPresetsPacket; -import org.cloudburstmc.protocol.bedrock.packet.NpcRequestPacket; +import org.cloudburstmc.protocol.bedrock.packet.*; import org.cloudburstmc.protocol.common.DefinitionRegistry; import org.cloudburstmc.protocol.common.NamedDefinition; import org.geysermc.event.subscribe.Subscribe; @@ -36,9 +34,11 @@ import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.entity.type.Entity; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.util.DimensionUtils; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; @@ -147,6 +147,13 @@ public class GeyserUtils implements Extension { bedrockPacket.setClear(true); } session.sendUpstreamPacket(bedrockPacket); + } else if (customPacket instanceof CustomParticleEffectPayloadPacket customParticleEffectPacket) { + SpawnParticleEffectPacket spawnParticleEffectPacket = new SpawnParticleEffectPacket(); + spawnParticleEffectPacket.setDimensionId(DimensionUtils.javaToBedrock(session.getDimension())); + spawnParticleEffectPacket.setPosition(Converter.serializePos(customParticleEffectPacket.getPos())); + spawnParticleEffectPacket.setIdentifier(customParticleEffectPacket.getParticle().identifier()); + spawnParticleEffectPacket.setMolangVariablesJson(Optional.ofNullable(customParticleEffectPacket.getParticle().molangVariablesJson())); + session.sendUpstreamPacket(spawnParticleEffectPacket); } } } diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/Converter.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/util/Converter.java similarity index 95% rename from geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/Converter.java rename to geyser/src/main/java/me/zimzaza4/geyserutils/geyser/util/Converter.java index 32f7e0c..bf7db1c 100644 --- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/Converter.java +++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/util/Converter.java @@ -1,8 +1,10 @@ -package me.zimzaza4.geyserutils.geyser.camera; +package me.zimzaza4.geyserutils.geyser.util; import me.zimzaza4.geyserutils.common.camera.data.*; import me.zimzaza4.geyserutils.common.camera.instruction.FadeInstruction; import me.zimzaza4.geyserutils.common.camera.instruction.SetInstruction; +import me.zimzaza4.geyserutils.common.util.Pos; +import me.zimzaza4.geyserutils.geyser.camera.CameraPresetDefinition; import org.cloudburstmc.math.vector.Vector2f; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.camera.CameraAudioListener; diff --git a/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java b/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java index c9c2c5b..b667994 100644 --- a/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java +++ b/spigot/src/main/java/me/zimzaza4/geyserutils/spigot/api/PlayerUtils.java @@ -6,8 +6,11 @@ import me.zimzaza4.geyserutils.common.channel.GeyserUtilsChannels; import me.zimzaza4.geyserutils.common.packet.AnimateEntityCustomPayloadPacket; import me.zimzaza4.geyserutils.common.packet.CameraInstructionCustomPayloadPacket; import me.zimzaza4.geyserutils.common.packet.CameraShakeCustomPayloadPacket; -import me.zimzaza4.geyserutils.common.util.CustomPayloadPacketUtils; +import me.zimzaza4.geyserutils.common.packet.CustomParticleEffectPayloadPacket; +import me.zimzaza4.geyserutils.common.particle.CustomParticle; +import me.zimzaza4.geyserutils.common.util.Pos; import me.zimzaza4.geyserutils.spigot.GeyserUtils; +import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -44,4 +47,12 @@ public class PlayerUtils { player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); } + + public static void sendCustomParticle(Player player, Location location, CustomParticle particle) { + CustomParticleEffectPayloadPacket packet = new CustomParticleEffectPayloadPacket(); + packet.setParticle(particle); + packet.setPos(new Pos((float) location.getX(), (float) location.getY(), (float) location.getZ())); + player.sendPluginMessage(GeyserUtils.getInstance(), GeyserUtilsChannels.MAIN, GeyserUtils.getPacketManager().encodePacket(packet)); + + } }