diff --git a/api-internal/pom.xml b/api-internal/pom.xml index f4df5edd..e733e895 100644 --- a/api-internal/pom.xml +++ b/api-internal/pom.xml @@ -16,6 +16,16 @@ + + org.spongepowered + configurate-core + 4.2.0 + + + org.spongepowered + configurate-yaml + 4.2.0 + com.google.code.gson gson @@ -33,6 +43,20 @@ 1.18.30 provided + + + + org.junit.jupiter + junit-jupiter + 5.11.4 + test + + + org.mockito + mockito-core + 5.18.0 + test + diff --git a/api-internal/src/main/java/at/pavlov/internal/adapters/CannonSerializingManager.java b/api-internal/src/main/java/at/pavlov/internal/adapters/CannonSerializingManager.java new file mode 100644 index 00000000..745fac8e --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/adapters/CannonSerializingManager.java @@ -0,0 +1,12 @@ +package at.pavlov.internal.adapters; + +import at.pavlov.internal.Key; +import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; +import org.spongepowered.configurate.serialize.TypeSerializerCollection; + +public class CannonSerializingManager { + public static final TypeSerializerCollection serializerCollection = TypeSerializerCollection.defaults().childBuilder() + .register(Key.class, new KeySerializer()) + .register(CustomProjectileDefinition.class, new CustomProjectileDefinitionSerializer()) + .build(); +} diff --git a/api-internal/src/main/java/at/pavlov/internal/adapters/CustomProjectileDefinitionSerializer.java b/api-internal/src/main/java/at/pavlov/internal/adapters/CustomProjectileDefinitionSerializer.java new file mode 100644 index 00000000..e8bc133f --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/adapters/CustomProjectileDefinitionSerializer.java @@ -0,0 +1,51 @@ +package at.pavlov.internal.adapters; + +import at.pavlov.internal.Key; +import at.pavlov.internal.key.registries.Registries; +import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; +import at.pavlov.internal.projectile.definition.ProjectilePhysics; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.configurate.ConfigurationNode; +import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.serialize.TypeSerializer; + +import java.lang.reflect.Type; + +public class CustomProjectileDefinitionSerializer implements TypeSerializer { + + @Override + public CustomProjectileDefinition deserialize(@NotNull Type type, ConfigurationNode node) throws SerializationException { + // Use the node's key as the projectile key + Key key = Key.from(node.key().toString()); // top-level key + Key entityKey = Key.from(node.node("entity").getString("SNOWBALL")); + + // Get default projectile physics if entityKey not registered + ProjectilePhysics dpd = Registries.DEFAULT_PROJECTILE_DEFINITION_REGISTRY.of(entityKey); + if (dpd == null) { + dpd = ProjectilePhysics.DEFAULT; + } + + // Build the CustomProjectileDefinition + return CustomProjectileDefinition.builder() + .key(key) + .entityKey(entityKey) + .constantAcceleration(node.node("constantAcceleration").get(Double.class, dpd.getConstantAcceleration())) + .gravity(node.node("gravity").getDouble(dpd.getGravity())) + .drag(node.node("drag").getDouble(dpd.getDrag())) + .waterDrag(node.node("waterDrag").getDouble(dpd.getWaterDrag())) + .glowing(node.node("glowing").getBoolean(false)) + .onFire(node.node("onFire").getBoolean(false)) + .charged(node.node("charged").getBoolean(false)) + .critical(node.node("critical").getBoolean(false)) + .material(Key.from(node.node("material").getString("SNOWBALL"))) + .customModelData(node.node("customModelData").get(Integer.class, (Integer) null)) + .build(); + } + + @Override + public void serialize(@NotNull Type type, CustomProjectileDefinition obj, @NotNull ConfigurationNode node) throws SerializationException { + // Not needed, can throw UnsupportedOperationException if you never serialize + throw new UnsupportedOperationException("Serialization not supported for this deserializer"); + } +} + diff --git a/api-internal/src/main/java/at/pavlov/internal/adapters/KeySerializer.java b/api-internal/src/main/java/at/pavlov/internal/adapters/KeySerializer.java new file mode 100644 index 00000000..e51f7b1e --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/adapters/KeySerializer.java @@ -0,0 +1,28 @@ +package at.pavlov.internal.adapters; + +import at.pavlov.internal.Key; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.configurate.ConfigurationNode; +import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.serialize.TypeSerializer; + +import java.lang.reflect.Type; + +public class KeySerializer implements TypeSerializer { + + @Override + public Key deserialize(@NotNull Type type, ConfigurationNode node) throws SerializationException { + String value = node.getString(); + if (value == null || !value.contains(":")) { + throw new SerializationException("Invalid Key format, expected namespace:key"); + } + String[] parts = value.split(":", 2); + return new Key(parts[0], parts[1]); + } + + @Override + public void serialize(@NotNull Type type, Key obj, @NotNull ConfigurationNode node) throws SerializationException { + if (obj == null) return; + node.set(obj.full()); + } +} diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/CustomProjectileDefinition.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/CustomProjectileDefinition.java index b3a3971a..2187bc4f 100644 --- a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/CustomProjectileDefinition.java +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/CustomProjectileDefinition.java @@ -1,56 +1,33 @@ package at.pavlov.internal.projectile.definition; import at.pavlov.internal.Key; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; +import lombok.*; import org.jetbrains.annotations.Nullable; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; @Getter @Builder +@EqualsAndHashCode +@ConfigSerializable +@NoArgsConstructor @AllArgsConstructor public class CustomProjectileDefinition implements ProjectilePhysics { - private final Key key; // for the name of the custom projectile definition - private final Key entityKey; + private Key key; // for the name of the custom projectile definition + private Key entityKey; - private final Double constantAcceleration; + private Double constantAcceleration; - private final double gravity; - private final double drag; - private final double waterDrag; + private double gravity; + private double drag; + private double waterDrag; - private final boolean glowing; + private boolean glowing; - private final boolean onFire; // visual fire for projectile - private final boolean charged; // works for wither skeletons - private final boolean critical; // for arrows and tridents + private boolean onFire; // visual fire for projectile + private boolean charged; // works for wither skeletons + private boolean critical; // for arrows and tridents //for throwable projectiles only - private final @Nullable Key material; - private final @Nullable Integer customModelData; - - /* - @Override - public double getGravity() { - return fromKey().getGravity(); - } - - @Override - public double getDrag() { - return fromKey().getDrag(); - } - - @Override - public double getWaterDrag() { - return fromKey().getWaterDrag(); - } - - private @NotNull ProjectilePhysics fromKey() { - DefaultProjectileDefinition value = Registries.DEFAULT_PROJECTILE_DEFINITION_REGISTRY.of(entityKey); - if (value == null) { - return ProjectilePhysics.DEFAULT; - } - - return value; - }*/ + private @Nullable Key material; + private @Nullable Integer customModelData; } diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/DefaultProjectileDefinition.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/DefaultProjectileDefinition.java index 4051e26c..cc387cf0 100644 --- a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/DefaultProjectileDefinition.java +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/DefaultProjectileDefinition.java @@ -1,20 +1,22 @@ package at.pavlov.internal.projectile.definition; import at.pavlov.internal.Key; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; +import lombok.*; import org.jetbrains.annotations.NotNull; +import org.spongepowered.configurate.objectmapping.ConfigSerializable; @Getter @Builder +@ConfigSerializable +@EqualsAndHashCode +@NoArgsConstructor @AllArgsConstructor public class DefaultProjectileDefinition implements ProjectilePhysics { - private final @NotNull Key key; // for the entity type - private final Double constantAcceleration; - private final double gravity; - private final double drag; - private final double waterDrag; + private @NotNull Key key; // for the entity type + private Double constantAcceleration; + private double gravity; + private double drag; + private double waterDrag; @Override public Key getEntityKey() { diff --git a/api-internal/src/test/java/adapters/CustomProjectileDefinitionSerializerTest.java b/api-internal/src/test/java/adapters/CustomProjectileDefinitionSerializerTest.java new file mode 100644 index 00000000..eba7c738 --- /dev/null +++ b/api-internal/src/test/java/adapters/CustomProjectileDefinitionSerializerTest.java @@ -0,0 +1,11 @@ +package adapters; + +import org.junit.jupiter.api.Test; + +public class CustomProjectileDefinitionSerializerTest { + + @Test + void deserialize() throws Exception { + // todo: make testing + } +}