From 6d32e654bbd5612ce603f65207091a6e04792f3f Mon Sep 17 00:00:00 2001
From: zimzaza4 <3625282098@qq.com>
Date: Sun, 24 Sep 2023 02:54:39 +0800
Subject: [PATCH] well
---
common/pom.xml | 12 +++
.../common/camera/data/CameraPreset.java | 83 ++++++++++++++++
.../geyserutils/common/camera/data/Color.java | 16 +++
.../geyserutils/common/camera/data/Ease.java | 26 +++++
.../common/camera/data/EaseType.java | 48 +++++++++
.../geyserutils/common/camera/data/Pos.java | 16 +++
.../geyserutils/common/camera/data/Rot.java | 15 +++
.../geyserutils/common/camera/data/Time.java | 16 +++
.../camera/instruction/ClearInstruction.java | 17 ++++
.../camera/instruction/FadeInstruction.java | 20 ++++
.../camera/instruction/Instruction.java | 7 ++
.../camera/instruction/SetInstruction.java | 25 +++++
.../common/manager/PacketManager.java | 5 +
.../CameraInstructionCustomPayloadPacket.java | 11 +++
geyser/pom.xml | 2 +-
.../geyserutils/geyser/GeyserUtils.java | 71 ++++++++++++-
.../geyser/camera/CameraPresetDefinition.java | 32 ++++++
.../geyserutils/geyser/camera/Converter.java | 99 +++++++++++++++++++
.../translator/NPCFormResponseTranslator.java | 1 -
.../geyserutils/spigot/api/PlayerUtils.java | 9 ++
.../geyserutils/velocity/GeyserUtils.java | 1 +
21 files changed, 529 insertions(+), 3 deletions(-)
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/CameraPreset.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Color.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Ease.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/EaseType.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Pos.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Rot.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Time.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/ClearInstruction.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/FadeInstruction.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/Instruction.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/SetInstruction.java
create mode 100644 common/src/main/java/me/zimzaza4/geyserutils/common/packet/CameraInstructionCustomPayloadPacket.java
create mode 100644 geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/CameraPresetDefinition.java
create mode 100644 geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/Converter.java
diff --git a/common/pom.xml b/common/pom.xml
index 15646cc..db42047 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -71,6 +71,18 @@
jackson-databind
2.15.2
+
+ org.jetbrains
+ annotations
+ 24.0.1
+ compile
+
+
+ org.jetbrains
+ annotations
+ 24.0.1
+ compile
+
\ No newline at end of file
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
new file mode 100644
index 0000000..c1ea7d5
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/CameraPreset.java
@@ -0,0 +1,83 @@
+package me.zimzaza4.geyserutils.common.camera.data;
+
+import lombok.Builder;
+import lombok.Getter;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+@Getter
+public class CameraPreset {
+ private static final Map PRESETS = new TreeMap<>();
+
+ public static Map getPresets() {
+ return PRESETS;
+ }
+
+ public static CameraPreset getPreset(String identifier) {
+ return getPresets().get(identifier);
+ }
+
+ public static void registerCameraPresets(CameraPreset... presets) {
+ for (var preset : presets) {
+ if (PRESETS.containsKey(preset.getIdentifier()))
+ throw new IllegalArgumentException("Camera preset " + preset.getIdentifier() + " already exists!");
+ PRESETS.put(preset.getIdentifier(), preset);
+ }
+ int id = 0;
+ //重新分配id
+ for (var preset : presets) {
+ preset.id = id++;
+ }
+ }
+
+ public static CameraPreset FIRST_PERSON;
+ public static CameraPreset FREE;
+ public static CameraPreset THIRD_PERSON;
+ public static CameraPreset THIRD_PERSON_FRONT;
+
+ public static void load() {
+ FIRST_PERSON = CameraPreset.builder()
+ .identifier("minecraft:first_person")
+ .build();
+ FREE = CameraPreset.builder()
+ .identifier("minecraft:free")
+ .pos(new Pos(0, 0, 0))
+ .rot(new Rot(0, 0))
+ .build();
+ THIRD_PERSON = CameraPreset.builder()
+ .identifier("minecraft:third_person")
+ .build();
+ THIRD_PERSON_FRONT = CameraPreset.builder()
+ .identifier("minecraft:third_person_front")
+ .build();
+
+ registerCameraPresets(FIRST_PERSON, FREE, THIRD_PERSON, THIRD_PERSON_FRONT);
+ }
+
+ private String identifier;
+ @Getter
+ private String inheritFrom;
+ @Getter
+ @Nullable
+ private Pos pos;
+ @Getter
+ @Nullable
+ private Rot rot;
+
+ @Getter
+ private int id;
+
+ @Builder
+ public CameraPreset(String identifier, String inheritFrom, @Nullable Pos pos, @Nullable Rot rot) {
+ this.identifier = identifier;
+ this.inheritFrom = inheritFrom != null ? inheritFrom : "";
+ this.pos = pos;
+ this.rot = rot;
+ }
+
+ protected CameraPreset() {
+
+ }
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Color.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Color.java
new file mode 100644
index 0000000..2c82bee
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Color.java
@@ -0,0 +1,16 @@
+package me.zimzaza4.geyserutils.common.camera.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(fluent = true)
+@Data
+public class Color {
+ float r;
+ float g;
+ float b;
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Ease.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Ease.java
new file mode 100644
index 0000000..2368f4e
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Ease.java
@@ -0,0 +1,26 @@
+package me.zimzaza4.geyserutils.common.camera.data;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@NoArgsConstructor
+@Accessors(fluent = true)
+@Data
+public class Ease {
+
+ float time;
+ int easeType;
+
+ public Ease(float time, EaseType easeType) {
+ this.time = time;
+ this.easeType = easeType.getIndex();
+ }
+
+ public Ease easeType(EaseType easeType) {
+ this.easeType = easeType.getIndex();
+ return this;
+ }
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/EaseType.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/EaseType.java
new file mode 100644
index 0000000..f4ece98
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/EaseType.java
@@ -0,0 +1,48 @@
+package me.zimzaza4.geyserutils.common.camera.data;
+
+import lombok.Getter;
+
+@Getter
+public enum EaseType {
+ LINEAR("linear",0),
+ SPRING("spring",1),
+ EASE_IN_SINE("in_sine",2),
+ EASE_OUT_SINE("out_sine",3),
+ EASE_IN_OUT_SINE("in_out_sine",4),
+ EASE_IN_QUAD("in_quad",5),
+ EASE_OUT_QUAD("out_quad",6),
+ EASE_IN_OUT_QUAD("in_out_quad",7),
+ EASE_IN_CUBIC("in_cubic",8),
+ EASE_OUT_CUBIC("out_cubic",9),
+ EASE_IN_OUT_CUBIC("in_out_cubic",10),
+ EASE_IN_QUART("in_quart",11),
+ EASE_OUT_QUART("out_quart",12),
+ EASE_IN_OUT_QUART("in_out_quart",13),
+ EASE_IN_QUINT("in_quint",14),
+ EASE_OUT_QUINT("out_quint",15),
+ EASE_IN_OUT_QUINT("in_out_quint",16),
+ EASE_IN_EXPO("in_expo",17),
+ EASE_OUT_EXPO("out_expo",18),
+ EASE_IN_OUT_EXPO("in_out_expo",19),
+ EASE_IN_CIRC("in_circ",20),
+ EASE_OUT_CIRC("out_circ",21),
+ EASE_IN_OUT_CIRC("in_out_circ",22),
+ EASE_IN_BACK("in_back",23),
+ EASE_OUT_BACK("out_back",24),
+ EASE_IN_OUT_BACK("in_out_back",25),
+ EASE_IN_ELASTIC("in_elastic",26),
+ EASE_OUT_ELASTIC("out_elastic",27),
+ EASE_IN_OUT_ELASTIC("in_out_elastic",28),
+ EASE_IN_BOUNCE("in_bounce",29),
+ EASE_OUT_BOUNCE("out_bounce",30),
+ EASE_IN_OUT_BOUNCE("in_out_bounce",31);
+
+
+ private final String type;
+ private final int index;
+ EaseType(String type, int index) {
+ this.type = type;
+ this.index = index;
+ }
+
+}
\ No newline at end of file
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Pos.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Pos.java
new file mode 100644
index 0000000..f24080d
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Pos.java
@@ -0,0 +1,16 @@
+package me.zimzaza4.geyserutils.common.camera.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(fluent = true)
+@Data
+public class Pos {
+ float x;
+ float y;
+ float z;
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Rot.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Rot.java
new file mode 100644
index 0000000..a4eade3
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Rot.java
@@ -0,0 +1,15 @@
+package me.zimzaza4.geyserutils.common.camera.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(fluent = true)
+@Data
+public class Rot {
+ float x;
+ float y;
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Time.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Time.java
new file mode 100644
index 0000000..76f5f5f
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/data/Time.java
@@ -0,0 +1,16 @@
+package me.zimzaza4.geyserutils.common.camera.data;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(fluent = true)
+@Data
+public class Time {
+ float fadeIn;
+ float hold;
+ float fadeOut;
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/ClearInstruction.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/ClearInstruction.java
new file mode 100644
index 0000000..7987ee6
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/ClearInstruction.java
@@ -0,0 +1,17 @@
+package me.zimzaza4.geyserutils.common.camera.instruction;
+
+import lombok.Getter;
+
+@Getter
+public class ClearInstruction implements Instruction {
+ private static final ClearInstruction INSTANCE = new ClearInstruction();
+ private final int clear = 1;
+
+ private ClearInstruction() {}
+
+ public static ClearInstruction instance() {
+ return INSTANCE;
+ }
+
+
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/FadeInstruction.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/FadeInstruction.java
new file mode 100644
index 0000000..009841f
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/FadeInstruction.java
@@ -0,0 +1,20 @@
+package me.zimzaza4.geyserutils.common.camera.instruction;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import me.zimzaza4.geyserutils.common.camera.data.Color;
+import me.zimzaza4.geyserutils.common.camera.data.Time;
+import org.jetbrains.annotations.Nullable;
+
+@Builder
+@AllArgsConstructor
+@Getter
+public class FadeInstruction implements Instruction {
+ @Nullable
+ private Color color;
+ @Nullable
+ private Time time;
+
+ protected FadeInstruction() {}
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/Instruction.java b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/Instruction.java
new file mode 100644
index 0000000..05b4133
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/Instruction.java
@@ -0,0 +1,7 @@
+package me.zimzaza4.geyserutils.common.camera.instruction;
+
+import java.io.Serializable;
+
+public interface Instruction extends Serializable {
+
+}
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
new file mode 100644
index 0000000..9aef37d
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/camera/instruction/SetInstruction.java
@@ -0,0 +1,25 @@
+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.camera.data.Rot;
+import org.jetbrains.annotations.Nullable;
+
+@AllArgsConstructor
+@Builder
+@Getter
+public class SetInstruction implements Instruction {
+
+ @Nullable
+ private Ease ease;
+ @Nullable
+ private Pos pos;
+ @Nullable
+ private Rot rot;
+ @Nullable
+ private Pos facing;
+ private CameraPreset preset;
+ protected SetInstruction() {}
+}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/manager/PacketManager.java b/common/src/main/java/me/zimzaza4/geyserutils/common/manager/PacketManager.java
index 311535c..41cbe6c 100644
--- a/common/src/main/java/me/zimzaza4/geyserutils/common/manager/PacketManager.java
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/manager/PacketManager.java
@@ -1,9 +1,13 @@
package me.zimzaza4.geyserutils.common.manager;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator;
import me.zimzaza4.geyserutils.common.packet.CustomPayloadPacket;
@@ -18,6 +22,7 @@ public class PacketManager {
public PacketManager() {
objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.EVERYTHING, JsonTypeInfo.As.PROPERTY);
+ objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
}
diff --git a/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CameraInstructionCustomPayloadPacket.java b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CameraInstructionCustomPayloadPacket.java
new file mode 100644
index 0000000..5148c6e
--- /dev/null
+++ b/common/src/main/java/me/zimzaza4/geyserutils/common/packet/CameraInstructionCustomPayloadPacket.java
@@ -0,0 +1,11 @@
+package me.zimzaza4.geyserutils.common.packet;
+
+import lombok.Getter;
+import lombok.Setter;
+import me.zimzaza4.geyserutils.common.camera.instruction.Instruction;
+
+@Setter
+@Getter
+public class CameraInstructionCustomPayloadPacket extends CustomPayloadPacket {
+ private Instruction instruction;
+}
diff --git a/geyser/pom.xml b/geyser/pom.xml
index aeb4aac..c4f8967 100644
--- a/geyser/pom.xml
+++ b/geyser/pom.xml
@@ -85,7 +85,7 @@
org.geysermc.geyser
core
- 2.1.2-SNAPSHOT
+ 2.2.0-SNAPSHOT
provided
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 7d7aee4..2bed535 100644
--- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java
+++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/GeyserUtils.java
@@ -6,18 +6,29 @@ import com.github.steveice10.packetlib.Session;
import com.github.steveice10.packetlib.event.session.SessionAdapter;
import com.github.steveice10.packetlib.packet.Packet;
import lombok.Getter;
+import me.zimzaza4.geyserutils.common.camera.data.CameraPreset;
+import me.zimzaza4.geyserutils.common.camera.instruction.ClearInstruction;
+import me.zimzaza4.geyserutils.common.camera.instruction.FadeInstruction;
+import me.zimzaza4.geyserutils.common.camera.instruction.SetInstruction;
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.util.CustomPayloadPacketUtils;
+import me.zimzaza4.geyserutils.geyser.camera.CameraPresetDefinition;
+import me.zimzaza4.geyserutils.geyser.camera.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.common.DefinitionRegistry;
+import org.cloudburstmc.protocol.common.NamedDefinition;
import org.geysermc.event.subscribe.Subscribe;
+import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.bedrock.camera.CameraShake;
import org.geysermc.geyser.api.event.bedrock.SessionJoinEvent;
import org.geysermc.geyser.api.event.lifecycle.GeyserPostInitializeEvent;
@@ -28,20 +39,36 @@ import org.geysermc.geyser.session.GeyserSession;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
public class GeyserUtils implements Extension {
+
+ NbtMap CLEAR_INSTRUCTION_TAG = NbtMap.builder().putByte("clear", Integer.valueOf(1).byteValue()).build();
@Getter
public static PacketManager packetManager;
@Subscribe
public void onLoad(GeyserPostInitializeEvent event) {
packetManager = new PacketManager();
+ CameraPreset.load();
Registries.BEDROCK_PACKET_TRANSLATORS.register(NpcRequestPacket.class, new NPCFormResponseTranslator());
+
+ Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
+
+ for (GeyserSession session : GeyserImpl.getInstance().onlineConnections()) {
+ sendCameraPresets(session);
+ }
+
+ }, 10, 10, TimeUnit.SECONDS);
+
+
}
@Subscribe
public void onSessionJoin(SessionJoinEvent event) {
if (event.connection() instanceof GeyserSession session) {
+ sendCameraPresets(session);
session.getDownstream().getSession().addListener(new SessionAdapter() {
@Override
public void packetReceived(Session tcpSession, Packet packet) {
@@ -111,11 +138,53 @@ public class GeyserUtils implements Extension {
}
}
session.sendUpstreamPacket(animateEntityPacket);
+ } else if (customPacket instanceof CameraInstructionCustomPayloadPacket cameraInstructionPacket) {
+ CameraInstructionPacket bedrockPacket = new CameraInstructionPacket();
+ if (cameraInstructionPacket.getInstruction() instanceof SetInstruction instruction) {
+ bedrockPacket.setSetInstruction(Converter.serializeSetInstruction(instruction));
+ } else if (cameraInstructionPacket.getInstruction() instanceof FadeInstruction instruction) {
+ bedrockPacket.setFadeInstruction(Converter.serializeFadeInstruction(instruction));
+ } else if (cameraInstructionPacket.getInstruction() instanceof ClearInstruction){
+ bedrockPacket.setClear(true);
+ }
+ session.sendUpstreamPacket(bedrockPacket);
}
}
}
}
});
+
}
+
+
+ }
+
+ public static void sendCameraPresets(GeyserSession session) {
+ if (session.getUpstream().getCodecHelper().getCameraPresetDefinitions() == null) {
+
+ session.getUpstream().getCodecHelper().setCameraPresetDefinitions(new DefinitionRegistry<>() {
+ @Override
+ public NamedDefinition getDefinition(int i) {
+ for (CameraPreset preset : CameraPreset.getPresets().values()) {
+ if (preset.getId() == i) {
+ return new CameraPresetDefinition(preset.getIdentifier(), i);
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public boolean isRegistered(NamedDefinition namedDefinition) {
+ return CameraPreset.getPreset(namedDefinition.getIdentifier()) != null;
+ }
+ });
+ }
+ CameraPresetsPacket pk = new CameraPresetsPacket();
+ for (CameraPreset preset : CameraPreset.getPresets().values()) {
+ pk.getPresets().add(Converter.serializeCameraPreset(preset));
+ }
+
+ session.sendUpstreamPacket(pk);
}
}
diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/CameraPresetDefinition.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/CameraPresetDefinition.java
new file mode 100644
index 0000000..8c19bd7
--- /dev/null
+++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/CameraPresetDefinition.java
@@ -0,0 +1,32 @@
+package me.zimzaza4.geyserutils.geyser.camera;
+
+import lombok.AllArgsConstructor;
+import org.cloudburstmc.protocol.common.NamedDefinition;
+
+import java.util.Map;
+
+
+@AllArgsConstructor
+public class CameraPresetDefinition implements NamedDefinition {
+ private String identifier;
+ private int id;
+
+
+ @Override
+ public String getIdentifier() {
+ return identifier;
+ }
+
+ @Override
+ public int getRuntimeId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return "CameraPresetDefinition{" +
+ "identifier='" + identifier + '\'' +
+ ", id=" + id +
+ '}';
+ }
+}
diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/Converter.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/Converter.java
new file mode 100644
index 0000000..32f7e0c
--- /dev/null
+++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/camera/Converter.java
@@ -0,0 +1,99 @@
+package me.zimzaza4.geyserutils.geyser.camera;
+
+import me.zimzaza4.geyserutils.common.camera.data.*;
+import me.zimzaza4.geyserutils.common.camera.instruction.FadeInstruction;
+import me.zimzaza4.geyserutils.common.camera.instruction.SetInstruction;
+import org.cloudburstmc.math.vector.Vector2f;
+import org.cloudburstmc.math.vector.Vector3f;
+import org.cloudburstmc.protocol.bedrock.data.camera.CameraAudioListener;
+import org.cloudburstmc.protocol.bedrock.data.camera.CameraEase;
+import org.cloudburstmc.protocol.bedrock.data.camera.CameraFadeInstruction;
+import org.cloudburstmc.protocol.bedrock.data.camera.CameraSetInstruction;
+import org.cloudburstmc.protocol.common.util.OptionalBoolean;
+
+public class Converter {
+
+ public static org.cloudburstmc.protocol.bedrock.data.camera.CameraPreset serializeCameraPreset(CameraPreset preset) {
+ org.cloudburstmc.protocol.bedrock.data.camera.CameraPreset cbPreset = new org.cloudburstmc.protocol.bedrock.data.camera.CameraPreset();
+
+ cbPreset.setIdentifier(preset.getIdentifier());
+
+ cbPreset.setParentPreset(preset.getInheritFrom());
+
+ cbPreset.setListener(CameraAudioListener.PLAYER);
+
+ cbPreset.setPlayEffect(OptionalBoolean.of(true));
+
+ if (preset.getPos() != null) {
+ cbPreset.setPos(serializePos(preset.getPos()));
+ }
+ if (preset.getRot() != null) {
+ cbPreset.setPitch(preset.getRot().x());
+ cbPreset.setYaw(preset.getRot().y());
+ }
+
+
+ return cbPreset;
+ }
+
+ public static java.awt.Color serializeColor(Color color) {
+ return new java.awt.Color(color.r(), color.g(), color.b());
+ }
+
+ public static CameraSetInstruction.EaseData serializeEase(Ease ease) {
+ return new CameraSetInstruction.EaseData(CameraEase.values()[ease.easeType()], ease.time());
+ }
+
+ public static CameraFadeInstruction.TimeData serializeTime(Time time) {
+ return new CameraFadeInstruction.TimeData(time.fadeIn(), time.hold(), time.fadeOut());
+ }
+
+
+ public static Vector3f serializePos(Pos pos) {
+ return Vector3f.from(pos.x(), pos.y(), pos.z());
+ }
+
+ public static Vector2f serializeRot(Rot rot) {
+ return Vector2f.from(rot.x(), rot.y());
+ }
+
+
+ public static CameraFadeInstruction serializeFadeInstruction(FadeInstruction instruction) {
+ CameraFadeInstruction cbInstruction = new CameraFadeInstruction();
+
+ if (instruction.getColor() != null) {
+ cbInstruction.setColor(serializeColor(instruction.getColor()));
+ }
+ if (instruction.getTime() != null) {
+ cbInstruction.setTimeData(serializeTime(instruction.getTime()));
+ }
+
+ return cbInstruction;
+
+ }
+
+ public static CameraSetInstruction serializeSetInstruction(SetInstruction instruction) {
+
+ CameraSetInstruction cbInstruction = new CameraSetInstruction();
+
+ if (instruction.getEase() != null) {
+ cbInstruction.setEase(serializeEase(instruction.getEase()));
+ }
+ if (instruction.getPos() != null) {
+ cbInstruction.setPos(serializePos(instruction.getPos()));
+ }
+ if (instruction.getRot() != null) {
+ cbInstruction.setRot(serializeRot(instruction.getRot()));
+ }
+ if (instruction.getFacing() != null) {
+ cbInstruction.setFacing(serializePos(instruction.getFacing()));
+ }
+
+
+ cbInstruction.setDefaultPreset(OptionalBoolean.of(false));
+ cbInstruction.setPreset(new CameraPresetDefinition(instruction.getPreset().getIdentifier(), instruction.getPreset().getId()));
+ return cbInstruction;
+
+ }
+
+}
diff --git a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/translator/NPCFormResponseTranslator.java b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/translator/NPCFormResponseTranslator.java
index daea08e..cfaf013 100644
--- a/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/translator/NPCFormResponseTranslator.java
+++ b/geyser/src/main/java/me/zimzaza4/geyserutils/geyser/translator/NPCFormResponseTranslator.java
@@ -29,7 +29,6 @@ public class NPCFormResponseTranslator extends PacketTranslator