From 5d39091321d4deddbc85b626881be0fad5314c3e Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 19:45:53 +0200 Subject: [PATCH 01/24] Create registries and handling --- .../pavlov/internal/registries/KeyHolder.java | 7 +++ .../internal/registries/Registries.java | 4 ++ .../pavlov/internal/registries/Registry.java | 49 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/Registries.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/Registry.java diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java new file mode 100644 index 00000000..aafbc688 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java @@ -0,0 +1,7 @@ +package at.pavlov.internal.registries; + +import at.pavlov.internal.Key; + +public interface KeyHolder { + Key key(); +} diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java b/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java new file mode 100644 index 00000000..58f16b67 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java @@ -0,0 +1,4 @@ +package at.pavlov.internal.registries; + +public class Registries { +} diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java new file mode 100644 index 00000000..4b4967f9 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java @@ -0,0 +1,49 @@ +package at.pavlov.internal.registries; + +import at.pavlov.internal.Key; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class Registry { + private final Map map = new HashMap<>(); + + public Registry(Supplier> args) { + Collection<@NotNull T> arguments = args.get(); + for (T arg : arguments) { + register(arg); + } + } + + public @Nullable T of(@Nullable Key key) { + if (key == null) { + return null; + } + + return map.get(key); + } + + public @Nullable T of(@Nullable String string) { + if (string == null) { + return null; + } + + return of(Key.from(string)); + } + + @SafeVarargs + public final void register(@NotNull T... entries) { + for (T entry : entries) { + map.put(entry.key(), entry); + } + } + + public void register(Supplier<@NotNull T> entry) { + T result = entry.get(); + map.put(result.key(), result); + } +} From e6a6ee732d257d6d8597b594c0fed65be00db58d Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 20:18:54 +0200 Subject: [PATCH 02/24] Add getConstantAccelerationPower --- .../cannons/container/MovingObject.java | 50 ++++++++++++++++--- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java index abcd75b8..fb8beacb 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java @@ -32,12 +32,36 @@ public MovingObject(Location loc, Vector vel, Key entityType) { public void updateProjectileLocation(boolean inWater) { double drag = getDrag(inWater); double gravity = getGravity(); - //update location + + // 1. Move based on current velocity this.loc.add(this.vel); - //slow down projectile + + // 2. Apply drag to velocity this.vel.multiply(drag); - //apply gravity + + // 3. Apply gravity this.vel.subtract(new Vector(0, gravity, 0)); + + // 4. Apply constant acceleration if present + Double accelerationPower = getConstantAccelerationPower(); + if (accelerationPower != null) { + Vector acceleration = vel.clone().normalize().multiply(accelerationPower); + this.vel.add(acceleration); + } + } + + /** + * Returns the constant acceleration power for projectiles that use it (e.g., fireballs). + * Returns null if the entity does not use constant acceleration. + * + * @return the acceleration power (e.g., 0.1) or null if not applicable + */ + public Double getConstantAccelerationPower() { + return switch (entityType.full()) { + case "minecraft:fireball", "minecraft:small_fireball", "minecraft:dragon_fireball", + "minecraft:wither_skull", "minecraft:shulker_bullet" -> 0.1; // vanilla default + default -> null; + }; } /** @@ -91,18 +115,28 @@ public double getDrag(boolean inWater) { } /** - * reverts and update of the projectile position + * Reverts an update of the projectile position. * - * @param inWater the projectile is in water + * @param inWater true if the projectile is in water */ public void revertProjectileLocation(boolean inWater) { double drag = getDrag(inWater); double gravity = getGravity(); - //apply gravity + + // 1. Revert constant acceleration if present + Double accelerationPower = getConstantAccelerationPower(); + if (accelerationPower != null) { + Vector acceleration = vel.clone().normalize().multiply(accelerationPower); + this.vel.subtract(acceleration); + } + + // 2. Revert gravity this.vel.add(new Vector(0, gravity, 0)); - //slow down projectile + + // 3. Revert drag this.vel.multiply(1.0 / drag); - //update location + + // 4. Revert movement this.loc.subtract(this.vel); } From 9cff6cd0f959909657e4722e14bfeb2804fcd7a4 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 20:27:28 +0200 Subject: [PATCH 03/24] Add exceptions --- .../main/java/at/pavlov/internal/registries/Registry.java | 8 ++++++++ .../at/pavlov/internal/registries/RegistryDuplicate.java | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/RegistryDuplicate.java diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java index 4b4967f9..fad79b91 100644 --- a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java +++ b/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java @@ -38,12 +38,20 @@ public Registry(Supplier> args) { @SafeVarargs public final void register(@NotNull T... entries) { for (T entry : entries) { + if (map.containsKey(entry.key())) { + throw new RegistryDuplicate("Duplicate key in registry of class: " + entry.getClass()); + } + map.put(entry.key(), entry); } } public void register(Supplier<@NotNull T> entry) { T result = entry.get(); + if (map.containsKey(result.key())) { + throw new RegistryDuplicate("Duplicate key in registry of class: " + entry.getClass()); + } + map.put(result.key(), result); } } diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/RegistryDuplicate.java b/api-internal/src/main/java/at/pavlov/internal/registries/RegistryDuplicate.java new file mode 100644 index 00000000..e42647cd --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/registries/RegistryDuplicate.java @@ -0,0 +1,7 @@ +package at.pavlov.internal.registries; + +public class RegistryDuplicate extends RuntimeException { + public RegistryDuplicate(String message) { + super(message); + } +} From c308ac94cda7f8ea5f69f9fe6cbdb4e361b9f1a2 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 20:37:00 +0200 Subject: [PATCH 04/24] Add interfaces --- .../projectile/definition/EntityKeyHolder.java | 7 +++++++ .../projectile/definition/ProjectilePhysics.java | 10 ++++++++++ .../java/at/pavlov/internal/registries/KeyHolder.java | 2 +- .../java/at/pavlov/internal/registries/Registry.java | 8 ++++---- 4 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 api-internal/src/main/java/at/pavlov/internal/projectile/definition/EntityKeyHolder.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/EntityKeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/EntityKeyHolder.java new file mode 100644 index 00000000..c67cfc08 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/EntityKeyHolder.java @@ -0,0 +1,7 @@ +package at.pavlov.internal.projectile.definition; + +import at.pavlov.internal.Key; + +public interface EntityKeyHolder { + Key getEntityKey(); +} diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java new file mode 100644 index 00000000..4c515383 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java @@ -0,0 +1,10 @@ +package at.pavlov.internal.projectile.definition; + +import at.pavlov.internal.registries.KeyHolder; + +public interface ProjectilePhysics extends KeyHolder, EntityKeyHolder { + Double getConstantAcceleration(); + double getGravity(); + double getDrag(); + double getWaterDrag(); +} diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java index aafbc688..e32caa41 100644 --- a/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java +++ b/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java @@ -3,5 +3,5 @@ import at.pavlov.internal.Key; public interface KeyHolder { - Key key(); + Key getKey(); } diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java index fad79b91..c4d89700 100644 --- a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java +++ b/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java @@ -38,20 +38,20 @@ public Registry(Supplier> args) { @SafeVarargs public final void register(@NotNull T... entries) { for (T entry : entries) { - if (map.containsKey(entry.key())) { + if (map.containsKey(entry.getKey())) { throw new RegistryDuplicate("Duplicate key in registry of class: " + entry.getClass()); } - map.put(entry.key(), entry); + map.put(entry.getKey(), entry); } } public void register(Supplier<@NotNull T> entry) { T result = entry.get(); - if (map.containsKey(result.key())) { + if (map.containsKey(result.getKey())) { throw new RegistryDuplicate("Duplicate key in registry of class: " + entry.getClass()); } - map.put(result.key(), result); + map.put(result.getKey(), result); } } From d669b89d6cb444d3638480bf0d27db45ed37bf4e Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 20:37:04 +0200 Subject: [PATCH 05/24] Add classes --- .../CustomProjectileDefinition.java | 19 +++++++++++++++ .../DefaultProjectileDefinition.java | 23 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 api-internal/src/main/java/at/pavlov/internal/projectile/definition/CustomProjectileDefinition.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/projectile/definition/DefaultProjectileDefinition.java 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 new file mode 100644 index 00000000..54d906de --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/CustomProjectileDefinition.java @@ -0,0 +1,19 @@ +package at.pavlov.internal.projectile.definition; + +import at.pavlov.internal.Key; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor +public class CustomProjectileDefinition implements ProjectilePhysics { + private final Key key; // for the name of the custom projectile definition + private final Key entityKey; + + private final Double constantAcceleration; + private final double gravity; + private final double drag; + private final double waterDrag; +} 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 new file mode 100644 index 00000000..4051e26c --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/DefaultProjectileDefinition.java @@ -0,0 +1,23 @@ +package at.pavlov.internal.projectile.definition; + +import at.pavlov.internal.Key; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +@Getter +@Builder +@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; + + @Override + public Key getEntityKey() { + return key; + } +} From 013f8d6f01ef8780a79ffb6feb4660077c367c6a Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 20:38:30 +0200 Subject: [PATCH 06/24] Move Key related stuff --- .../java/at/pavlov/internal/armor/BaseArmorHolder.java | 2 +- .../main/java/at/pavlov/internal/armor/BaseArmorPiece.java | 2 +- .../at/pavlov/internal/container/SpawnMaterialHolder.java | 2 +- .../main/java/at/pavlov/internal/key/EntityKeyHolder.java | 5 +++++ .../src/main/java/at/pavlov/internal/{ => key}/Key.java | 2 +- .../src/main/java/at/pavlov/internal/key/KeyHolder.java | 5 +++++ .../java/at/pavlov/internal/key/registries/Registries.java | 4 ++++ .../at/pavlov/internal/{ => key}/registries/Registry.java | 5 +++-- .../internal/{ => key}/registries/RegistryDuplicate.java | 2 +- .../projectile/definition/CustomProjectileDefinition.java | 2 +- .../projectile/definition/DefaultProjectileDefinition.java | 2 +- .../internal/projectile/definition/EntityKeyHolder.java | 7 ------- .../internal/projectile/definition/ProjectilePhysics.java | 3 ++- .../main/java/at/pavlov/internal/registries/KeyHolder.java | 7 ------- .../java/at/pavlov/internal/registries/Registries.java | 4 ---- cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java | 2 +- .../src/main/java/at/pavlov/cannons/CreateExplosion.java | 2 +- .../main/java/at/pavlov/cannons/armor/ItemArmorPiece.java | 2 +- .../src/main/java/at/pavlov/cannons/cannon/Cannon.java | 2 +- .../main/java/at/pavlov/cannons/cannon/CannonDesign.java | 2 +- .../main/java/at/pavlov/cannons/cannon/DesignStorage.java | 2 +- .../java/at/pavlov/cannons/container/MovingObject.java | 2 +- .../java/at/pavlov/cannons/exchange/ExchangeLoader.java | 2 +- .../main/java/at/pavlov/cannons/projectile/Projectile.java | 2 +- .../at/pavlov/cannons/projectile/ProjectileStorage.java | 2 +- 25 files changed, 36 insertions(+), 38 deletions(-) create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/EntityKeyHolder.java rename api-internal/src/main/java/at/pavlov/internal/{ => key}/Key.java (97%) create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/KeyHolder.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java rename api-internal/src/main/java/at/pavlov/internal/{ => key}/registries/Registry.java (92%) rename api-internal/src/main/java/at/pavlov/internal/{ => key}/registries/RegistryDuplicate.java (76%) delete mode 100644 api-internal/src/main/java/at/pavlov/internal/projectile/definition/EntityKeyHolder.java delete mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java delete mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/Registries.java diff --git a/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorHolder.java b/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorHolder.java index ce03a47a..b663bdb7 100644 --- a/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorHolder.java +++ b/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorHolder.java @@ -1,6 +1,6 @@ package at.pavlov.internal.armor; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import org.jetbrains.annotations.NotNull; import java.util.Arrays; diff --git a/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorPiece.java b/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorPiece.java index fc87438b..f7ec325d 100644 --- a/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorPiece.java +++ b/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorPiece.java @@ -1,6 +1,6 @@ package at.pavlov.internal.armor; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; public interface BaseArmorPiece { BaseArmorPiece EMPTY = new BaseArmorPiece() { diff --git a/api-internal/src/main/java/at/pavlov/internal/container/SpawnMaterialHolder.java b/api-internal/src/main/java/at/pavlov/internal/container/SpawnMaterialHolder.java index 06ae40e5..196ec408 100644 --- a/api-internal/src/main/java/at/pavlov/internal/container/SpawnMaterialHolder.java +++ b/api-internal/src/main/java/at/pavlov/internal/container/SpawnMaterialHolder.java @@ -1,7 +1,7 @@ package at.pavlov.internal.container; import at.pavlov.internal.CLogger; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import at.pavlov.internal.MaxMinRandom; import lombok.Getter; import lombok.Setter; diff --git a/api-internal/src/main/java/at/pavlov/internal/key/EntityKeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/key/EntityKeyHolder.java new file mode 100644 index 00000000..7b00d2a2 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/EntityKeyHolder.java @@ -0,0 +1,5 @@ +package at.pavlov.internal.key; + +public interface EntityKeyHolder { + Key getEntityKey(); +} diff --git a/api-internal/src/main/java/at/pavlov/internal/Key.java b/api-internal/src/main/java/at/pavlov/internal/key/Key.java similarity index 97% rename from api-internal/src/main/java/at/pavlov/internal/Key.java rename to api-internal/src/main/java/at/pavlov/internal/key/Key.java index e49a47d9..cdfe1064 100644 --- a/api-internal/src/main/java/at/pavlov/internal/Key.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/Key.java @@ -1,4 +1,4 @@ -package at.pavlov.internal; +package at.pavlov.internal.key; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; diff --git a/api-internal/src/main/java/at/pavlov/internal/key/KeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/key/KeyHolder.java new file mode 100644 index 00000000..ba80be3d --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/KeyHolder.java @@ -0,0 +1,5 @@ +package at.pavlov.internal.key; + +public interface KeyHolder { + Key getKey(); +} diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java new file mode 100644 index 00000000..054ef7a8 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java @@ -0,0 +1,4 @@ +package at.pavlov.internal.key.registries; + +public class Registries { +} diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java similarity index 92% rename from api-internal/src/main/java/at/pavlov/internal/registries/Registry.java rename to api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java index c4d89700..30bd93ca 100644 --- a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java @@ -1,6 +1,7 @@ -package at.pavlov.internal.registries; +package at.pavlov.internal.key.registries; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; +import at.pavlov.internal.key.KeyHolder; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/RegistryDuplicate.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryDuplicate.java similarity index 76% rename from api-internal/src/main/java/at/pavlov/internal/registries/RegistryDuplicate.java rename to api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryDuplicate.java index e42647cd..e6597f6d 100644 --- a/api-internal/src/main/java/at/pavlov/internal/registries/RegistryDuplicate.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryDuplicate.java @@ -1,4 +1,4 @@ -package at.pavlov.internal.registries; +package at.pavlov.internal.key.registries; public class RegistryDuplicate extends RuntimeException { public RegistryDuplicate(String message) { 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 54d906de..815a3c17 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,6 +1,6 @@ package at.pavlov.internal.projectile.definition; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; 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..b10c22ab 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,6 +1,6 @@ package at.pavlov.internal.projectile.definition; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/EntityKeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/EntityKeyHolder.java deleted file mode 100644 index c67cfc08..00000000 --- a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/EntityKeyHolder.java +++ /dev/null @@ -1,7 +0,0 @@ -package at.pavlov.internal.projectile.definition; - -import at.pavlov.internal.Key; - -public interface EntityKeyHolder { - Key getEntityKey(); -} diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java index 4c515383..025174f6 100644 --- a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java @@ -1,6 +1,7 @@ package at.pavlov.internal.projectile.definition; -import at.pavlov.internal.registries.KeyHolder; +import at.pavlov.internal.key.EntityKeyHolder; +import at.pavlov.internal.key.KeyHolder; public interface ProjectilePhysics extends KeyHolder, EntityKeyHolder { Double getConstantAcceleration(); diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java deleted file mode 100644 index e32caa41..00000000 --- a/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java +++ /dev/null @@ -1,7 +0,0 @@ -package at.pavlov.internal.registries; - -import at.pavlov.internal.Key; - -public interface KeyHolder { - Key getKey(); -} diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java b/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java deleted file mode 100644 index 58f16b67..00000000 --- a/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java +++ /dev/null @@ -1,4 +0,0 @@ -package at.pavlov.internal.registries; - -public class Registries { -} diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java index 98a7cdae..467cc9a8 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java @@ -1,6 +1,6 @@ package at.pavlov.cannons; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import at.pavlov.internal.enums.FakeBlockType; import at.pavlov.cannons.Enum.InteractAction; import at.pavlov.cannons.Enum.MessageEnum; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/CreateExplosion.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/CreateExplosion.java index 218f3239..3303df1d 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/CreateExplosion.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/CreateExplosion.java @@ -9,7 +9,7 @@ import at.pavlov.internal.container.DeathCause; import at.pavlov.cannons.container.SoundHolder; import at.pavlov.cannons.container.SpawnEntityHolder; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import at.pavlov.internal.container.SpawnMaterialHolder; import at.pavlov.cannons.dao.AsyncTaskManager; import at.pavlov.cannons.event.CannonDamageEvent; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java index 8044dfd3..806f842d 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java @@ -1,6 +1,6 @@ package at.pavlov.cannons.armor; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import at.pavlov.internal.armor.BaseArmorHolder; import at.pavlov.internal.armor.BaseArmorPiece; import com.cryptomorin.xseries.XEnchantment; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java index 95c7a6dd..feea322c 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java @@ -28,7 +28,7 @@ import at.pavlov.cannons.utils.CannonsUtil; import at.pavlov.cannons.utils.InventoryManagement; import at.pavlov.cannons.utils.SoundUtils; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.Validate; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonDesign.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonDesign.java index 65eb8260..acdb79cf 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonDesign.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonDesign.java @@ -6,7 +6,7 @@ import at.pavlov.cannons.container.SoundHolder; import at.pavlov.cannons.exchange.BExchanger; import at.pavlov.cannons.projectile.Projectile; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import lombok.Data; import org.bukkit.Location; import org.bukkit.Material; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/DesignStorage.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/DesignStorage.java index 3971c6e3..56858467 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/DesignStorage.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/DesignStorage.java @@ -11,7 +11,7 @@ import at.pavlov.cannons.utils.DesignComparator; import at.pavlov.cannons.utils.ParseUtils; import at.pavlov.internal.Exchanger; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java index fb8beacb..bfc837ed 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java @@ -1,6 +1,6 @@ package at.pavlov.cannons.container; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import com.cryptomorin.xseries.XEntityType; import lombok.Data; import org.bukkit.Bukkit; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/exchange/ExchangeLoader.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/exchange/ExchangeLoader.java index ce9b69f1..a72a0070 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/exchange/ExchangeLoader.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/exchange/ExchangeLoader.java @@ -3,7 +3,7 @@ import at.pavlov.cannons.Cannons; import at.pavlov.cannons.hooks.VaultHook; import at.pavlov.internal.Exchanger; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.jetbrains.annotations.ApiStatus; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java index fbb6ff36..94e482ae 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java @@ -5,7 +5,7 @@ import at.pavlov.cannons.container.ItemHolder; import at.pavlov.cannons.container.SoundHolder; import at.pavlov.cannons.container.SpawnEntityHolder; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import at.pavlov.internal.container.SpawnMaterialHolder; import at.pavlov.internal.projectile.ProjectileProperties; import at.pavlov.internal.projectile.data.ClusterExplosionData; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java index 3daac1d2..7711c4ff 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java @@ -8,7 +8,7 @@ import at.pavlov.cannons.utils.CannonsUtil; import at.pavlov.cannons.utils.FileUtils; import at.pavlov.cannons.utils.ParseUtils; -import at.pavlov.internal.Key; +import at.pavlov.internal.key.Key; import at.pavlov.internal.projectile.ProjectileProperties; import lombok.Getter; import org.bukkit.Bukkit; From 2b35e6838935c1d949c76d8bee7a0d560121425b Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 21:00:07 +0200 Subject: [PATCH 07/24] Add collections constructor --- api-internal/src/main/java/at/pavlov/internal/key/Key.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/api-internal/src/main/java/at/pavlov/internal/key/Key.java b/api-internal/src/main/java/at/pavlov/internal/key/Key.java index cdfe1064..cd63d8cb 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/Key.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/Key.java @@ -3,6 +3,8 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.Collection; import java.util.Locale; import java.util.regex.Pattern; @@ -40,6 +42,10 @@ public static Key from(String compositeKey) { return new Key(strings[0].trim(), strings[1].trim()); } + public static Collection from(Collection collection) { + return collection.stream().map(Key::from).toList(); + } + public String full() { return namespace + ":" + key; } From 1c0af02777c5cdf6922c5d424aeb84dca8bab3b7 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 21:03:22 +0200 Subject: [PATCH 08/24] No args for empty ones --- .../main/java/at/pavlov/internal/key/registries/Registry.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java index 30bd93ca..97742156 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java @@ -2,6 +2,7 @@ import at.pavlov.internal.key.Key; import at.pavlov.internal.key.KeyHolder; +import lombok.NoArgsConstructor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -10,6 +11,7 @@ import java.util.Map; import java.util.function.Supplier; +@NoArgsConstructor public class Registry { private final Map map = new HashMap<>(); From 6e619d161e177759b3ef863d8bd890adae023175 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 21:03:52 +0200 Subject: [PATCH 09/24] Add more specific fields --- .../definition/CustomProjectileDefinition.java | 9 +++++++++ 1 file changed, 9 insertions(+) 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 815a3c17..d75d176f 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 @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import org.jetbrains.annotations.Nullable; @Getter @Builder @@ -16,4 +17,12 @@ public class CustomProjectileDefinition implements ProjectilePhysics { private final double gravity; private final double drag; private final double waterDrag; + + private final boolean onFire; // visual fire for projectile + private final boolean charged; // works for wither skeletons + private final boolean critical; // for arrows and tridents + + //for throwable projectiles only + private final @Nullable Key material; + private final @Nullable Integer customModelData; } From 86760817ab5d0683f5f9dca2832dec202f2189ff Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 21:30:32 +0200 Subject: [PATCH 10/24] Add DEFAULT to ProjectilePhysics --- .../definition/ProjectilePhysics.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java index 025174f6..4bb6e8b6 100644 --- a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java @@ -1,9 +1,42 @@ package at.pavlov.internal.projectile.definition; import at.pavlov.internal.key.EntityKeyHolder; +import at.pavlov.internal.key.Key; import at.pavlov.internal.key.KeyHolder; public interface ProjectilePhysics extends KeyHolder, EntityKeyHolder { + ProjectilePhysics DEFAULT = new ProjectilePhysics() { + @Override + public Double getConstantAcceleration() { + return null; + } + + @Override + public double getGravity() { + return 0.03; + } + + @Override + public double getDrag() { + return 0.99; + } + + @Override + public double getWaterDrag() { + return 0.8; + } + + @Override + public Key getEntityKey() { + return null; + } + + @Override + public Key getKey() { + return null; + } + }; + Double getConstantAcceleration(); double getGravity(); double getDrag(); From 385d01a47e32af14ddf044add8acad300a5f6a37 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 21:30:52 +0200 Subject: [PATCH 11/24] Add default value handling --- .../internal/key/registries/Registry.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java index 97742156..c481d4f4 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java @@ -13,7 +13,7 @@ @NoArgsConstructor public class Registry { - private final Map map = new HashMap<>(); + protected final Map map = new HashMap<>(); public Registry(Supplier> args) { Collection<@NotNull T> arguments = args.get(); @@ -22,6 +22,22 @@ public Registry(Supplier> args) { } } + public @NotNull T of(@Nullable Key key, @NotNull T defaultValue) { + if (key == null) { + return defaultValue; + } + + return map.getOrDefault(key, defaultValue); + } + + public @NotNull T of(@Nullable String string, @NotNull T defaultValue) { + if (string == null) { + return defaultValue; + } + + return of(Key.from(string), defaultValue); + } + public @Nullable T of(@Nullable Key key) { if (key == null) { return null; From 68662146418529f6e4762dbfe4776ca6bf9544b7 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 18 Jun 2025 21:34:29 +0200 Subject: [PATCH 12/24] Add PROJECTILE_PHYSICS registry --- .../internal/key/registries/Registries.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java index 054ef7a8..59427169 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java @@ -1,4 +1,62 @@ package at.pavlov.internal.key.registries; +import at.pavlov.internal.key.Key; +import at.pavlov.internal.projectile.definition.DefaultProjectileDefinition; +import at.pavlov.internal.projectile.definition.ProjectilePhysics; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + public class Registries { + public static final Registry PROJECTILE_PHYSICS = new Registry<>(() -> { + List toAdd = new ArrayList<>(); + + Collection fireballs = Key.from( + List.of("minecraft:fireball", "minecraft:small_fireball", "minecraft:dragon_fireball", "minecraft:wither_skull", "minecraft:shulker_bullet") + ); + for (Key fireball : fireballs) { + toAdd.add( + DefaultProjectileDefinition.builder() + .gravity(0.0) + .drag(0.95) + .waterDrag(0.95) + .constantAcceleration(0.1) + .key(fireball) + .build() + ); + } + + Collection arrows = Key.from(List.of("minecraft:arrow", "minecraft:spectral_arrow")); + for (Key arrow : arrows) { + toAdd.add( + DefaultProjectileDefinition.builder() + .gravity(0.05) + .drag(0.99) + .waterDrag(0.6) + .key(arrow) + .build() + ); + } + + toAdd.add( + DefaultProjectileDefinition.builder() + .gravity(0.05) + .drag(0.99) + .waterDrag(0.99) + .key(Key.mc("trident")) + .build() + ); + + toAdd.add( + DefaultProjectileDefinition.builder() + .gravity(0.0) + .drag(1.0) + .waterDrag(1.0) + .key(Key.mc("breeze_wind_charge")) + .build() + ); + + return toAdd; + }); } From 4cfbe80a4c347775d2096b454e8968c3ba0d99da Mon Sep 17 00:00:00 2001 From: Intybyte Date: Thu, 19 Jun 2025 22:06:17 +0200 Subject: [PATCH 13/24] Good and working --- .../internal/key/registries/Registries.java | 94 ++++++++------ .../internal/key/registries/Registry.java | 119 ++++++++++++++---- .../key/registries/RegistryAccess.java | 34 +++++ .../key/registries/RegistryDuplicate.java | 7 -- .../SharedRegistryKeyValidator.java | 28 +++++ .../exceptions/RegistryDuplicate.java | 7 ++ .../exceptions/RegistryException.java | 7 ++ .../registries/exceptions/RegistryFrozen.java | 7 ++ .../exceptions/RegistryValidator.java | 8 ++ .../CustomProjectileDefinition.java | 35 +++++- .../definition/ProjectilePhysics.java | 45 +++++++ .../main/java/at/pavlov/cannons/Aiming.java | 4 +- .../main/java/at/pavlov/cannons/Cannons.java | 2 + .../java/at/pavlov/cannons/cannon/Cannon.java | 6 +- .../at/pavlov/cannons/commands/Commands.java | 2 + .../cannons/container/MovingObject.java | 89 +++---------- .../cannons/projectile/FlyingProjectile.java | 2 +- .../pavlov/cannons/projectile/Projectile.java | 12 +- .../cannons/projectile/ProjectileManager.java | 71 ++++++++--- .../cannons/projectile/ProjectileStorage.java | 2 +- .../ProjectileDefinitionLoader.java | 55 ++++++++ .../main/resources/projectile_definitions.yml | 28 +++++ 22 files changed, 494 insertions(+), 170 deletions(-) create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryAccess.java delete mode 100644 api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryDuplicate.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/registries/SharedRegistryKeyValidator.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryDuplicate.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryException.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryFrozen.java create mode 100644 api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryValidator.java create mode 100644 cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java create mode 100644 cannons-bukkit/src/main/resources/projectile_definitions.yml diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java index 59427169..78a5fb92 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java @@ -1,6 +1,7 @@ package at.pavlov.internal.key.registries; import at.pavlov.internal.key.Key; +import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; import at.pavlov.internal.projectile.definition.DefaultProjectileDefinition; import at.pavlov.internal.projectile.definition.ProjectilePhysics; @@ -9,54 +10,67 @@ import java.util.List; public class Registries { - public static final Registry PROJECTILE_PHYSICS = new Registry<>(() -> { - List toAdd = new ArrayList<>(); + public static final Registry.Composite PROJECTILE_PHYSICS; + public static final Registry CUSTOM_PROJECTILE_DEFINITION; + public static final Registry DEFAULT_PROJECTILE_DEFINITION_REGISTRY; + + static { + CUSTOM_PROJECTILE_DEFINITION = new Registry<>(); + DEFAULT_PROJECTILE_DEFINITION_REGISTRY = new Registry<>(() -> { + List toAdd = new ArrayList<>(); + + Collection fireballs = Key.from( + List.of("minecraft:fireball", "minecraft:small_fireball", "minecraft:dragon_fireball", "minecraft:wither_skull", "minecraft:shulker_bullet") + ); + for (Key fireball : fireballs) { + toAdd.add( + DefaultProjectileDefinition.builder() + .gravity(0.0) + .drag(0.95) + .waterDrag(0.95) + .constantAcceleration(0.1) + .key(fireball) + .build() + ); + } + + Collection arrows = Key.from(List.of("minecraft:arrow", "minecraft:spectral_arrow")); + for (Key arrow : arrows) { + toAdd.add( + DefaultProjectileDefinition.builder() + .gravity(0.05) + .drag(0.99) + .waterDrag(0.6) + .key(arrow) + .build() + ); + } - Collection fireballs = Key.from( - List.of("minecraft:fireball", "minecraft:small_fireball", "minecraft:dragon_fireball", "minecraft:wither_skull", "minecraft:shulker_bullet") - ); - for (Key fireball : fireballs) { toAdd.add( DefaultProjectileDefinition.builder() - .gravity(0.0) - .drag(0.95) - .waterDrag(0.95) - .constantAcceleration(0.1) - .key(fireball) + .gravity(0.05) + .drag(0.99) + .waterDrag(0.99) + .key(Key.mc("trident")) .build() ); - } - Collection arrows = Key.from(List.of("minecraft:arrow", "minecraft:spectral_arrow")); - for (Key arrow : arrows) { toAdd.add( DefaultProjectileDefinition.builder() - .gravity(0.05) - .drag(0.99) - .waterDrag(0.6) - .key(arrow) + .gravity(0.0) + .drag(1.0) + .waterDrag(1.0) + .key(Key.mc("breeze_wind_charge")) .build() ); - } - - toAdd.add( - DefaultProjectileDefinition.builder() - .gravity(0.05) - .drag(0.99) - .waterDrag(0.99) - .key(Key.mc("trident")) - .build() - ); - - toAdd.add( - DefaultProjectileDefinition.builder() - .gravity(0.0) - .drag(1.0) - .waterDrag(1.0) - .key(Key.mc("breeze_wind_charge")) - .build() - ); - - return toAdd; - }); + + return toAdd; + }); + SharedRegistryKeyValidator validator = new SharedRegistryKeyValidator<>(CUSTOM_PROJECTILE_DEFINITION, DEFAULT_PROJECTILE_DEFINITION_REGISTRY); + CUSTOM_PROJECTILE_DEFINITION.setValidator(validator); + DEFAULT_PROJECTILE_DEFINITION_REGISTRY.setValidator(validator); + DEFAULT_PROJECTILE_DEFINITION_REGISTRY.setFrozen(true); + + PROJECTILE_PHYSICS = new Registry.Composite<>(CUSTOM_PROJECTILE_DEFINITION, DEFAULT_PROJECTILE_DEFINITION_REGISTRY); + } } diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java index c481d4f4..80c6b4d7 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java @@ -2,18 +2,83 @@ import at.pavlov.internal.key.Key; import at.pavlov.internal.key.KeyHolder; +import at.pavlov.internal.key.registries.exceptions.RegistryDuplicate; +import at.pavlov.internal.key.registries.exceptions.RegistryFrozen; +import at.pavlov.internal.key.registries.exceptions.RegistryValidator; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Supplier; @NoArgsConstructor -public class Registry { +public class Registry implements RegistryAccess { protected final Map map = new HashMap<>(); + @Setter + @Getter + protected boolean frozen = false; + @Setter + protected @NotNull RegistryValidator validator = (key, value) -> {}; + + public static class Composite implements RegistryAccess { + protected final List> list = new ArrayList<>(); + + @SafeVarargs + public Composite(Registry... args) { + list.addAll(Arrays.asList(args)); + } + + @Override + public boolean has(@NotNull Key key) { + for (var registry : list) { + if (registry.map.containsKey(key)) { + return true; + } + } + + return false; + } + + @Override + public @NotNull T of(@Nullable Key key, @NotNull T defaultValue) { + if (key == null) { + return defaultValue; + } + + for (var registry : list) { + T value = registry.map.get(key); + if (value != null) { + return value; + } + } + + return defaultValue; + } + + @Override + public @Nullable T of(@Nullable Key key) { + if (key == null) { + return null; + } + + for (var registry : list) { + T value = registry.map.get(key); + if (value != null) { + return value; + } + } + + return null; + } + } public Registry(Supplier> args) { Collection<@NotNull T> arguments = args.get(); @@ -22,6 +87,12 @@ public Registry(Supplier> args) { } } + @Override + public boolean has(@NotNull Key key) { + return map.containsKey(key); + } + + @Override public @NotNull T of(@Nullable Key key, @NotNull T defaultValue) { if (key == null) { return defaultValue; @@ -30,14 +101,7 @@ public Registry(Supplier> args) { return map.getOrDefault(key, defaultValue); } - public @NotNull T of(@Nullable String string, @NotNull T defaultValue) { - if (string == null) { - return defaultValue; - } - - return of(Key.from(string), defaultValue); - } - + @Override public @Nullable T of(@Nullable Key key) { if (key == null) { return null; @@ -46,31 +110,44 @@ public Registry(Supplier> args) { return map.get(key); } - public @Nullable T of(@Nullable String string) { - if (string == null) { - return null; - } - - return of(Key.from(string)); - } - @SafeVarargs public final void register(@NotNull T... entries) { + if (frozen) { + throw new RegistryFrozen("Can't register key for frozen registry"); + } + for (T entry : entries) { - if (map.containsKey(entry.getKey())) { + Key key = entry.getKey(); + if (map.containsKey(key)) { throw new RegistryDuplicate("Duplicate key in registry of class: " + entry.getClass()); } - map.put(entry.getKey(), entry); + try { + validator.test(key, entry); + map.put(key, entry); + } catch (Exception e) { + e.printStackTrace(); + } } } public void register(Supplier<@NotNull T> entry) { + if (frozen) { + throw new RegistryFrozen("Can't register key for frozen registry"); + } + T result = entry.get(); - if (map.containsKey(result.getKey())) { + Key key = result.getKey(); + validator.test(key, result); + + if (map.containsKey(key)) { throw new RegistryDuplicate("Duplicate key in registry of class: " + entry.getClass()); } - map.put(result.getKey(), result); + map.put(key, result); + } + + public void clear() { + map.clear(); } } diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryAccess.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryAccess.java new file mode 100644 index 00000000..3be7090c --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryAccess.java @@ -0,0 +1,34 @@ +package at.pavlov.internal.key.registries; + +import at.pavlov.internal.key.Key; +import at.pavlov.internal.key.KeyHolder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface RegistryAccess { + boolean has(@NotNull Key key); + + default boolean has(@NotNull String key) { + return has(Key.from(key)); + } + + @NotNull T of(@Nullable Key key, @NotNull T defaultValue); + + default @NotNull T of(@Nullable String string, @NotNull T defaultValue) { + if (string == null) { + return defaultValue; + } + + return of(Key.from(string), defaultValue); + } + + @Nullable T of(@Nullable Key key); + + default @Nullable T of(@Nullable String string) { + if (string == null) { + return null; + } + + return of(Key.from(string)); + } +} diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryDuplicate.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryDuplicate.java deleted file mode 100644 index e6597f6d..00000000 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryDuplicate.java +++ /dev/null @@ -1,7 +0,0 @@ -package at.pavlov.internal.key.registries; - -public class RegistryDuplicate extends RuntimeException { - public RegistryDuplicate(String message) { - super(message); - } -} diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/SharedRegistryKeyValidator.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/SharedRegistryKeyValidator.java new file mode 100644 index 00000000..e7b90b22 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/SharedRegistryKeyValidator.java @@ -0,0 +1,28 @@ +package at.pavlov.internal.key.registries; + +import at.pavlov.internal.key.Key; +import at.pavlov.internal.key.KeyHolder; +import at.pavlov.internal.key.registries.exceptions.RegistryException; +import at.pavlov.internal.key.registries.exceptions.RegistryValidator; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SharedRegistryKeyValidator implements RegistryValidator { + private final List> list = new ArrayList<>(); + + @SafeVarargs + public SharedRegistryKeyValidator(RegistryAccess... registries) { + list.addAll(Arrays.asList(registries)); + } + + @Override + public void test(Key key, T value) throws RegistryException { + for (RegistryAccess registry : list) { + if (registry.has(key)) { + throw new RegistryException("Duplicate key detected across registries: " + key); + } + } + } +} diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryDuplicate.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryDuplicate.java new file mode 100644 index 00000000..b1457cca --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryDuplicate.java @@ -0,0 +1,7 @@ +package at.pavlov.internal.key.registries.exceptions; + +public class RegistryDuplicate extends RegistryException { + public RegistryDuplicate(String message) { + super(message); + } +} diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryException.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryException.java new file mode 100644 index 00000000..04bab5e2 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryException.java @@ -0,0 +1,7 @@ +package at.pavlov.internal.key.registries.exceptions; + +public class RegistryException extends RuntimeException { + public RegistryException(String message) { + super(message); + } +} diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryFrozen.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryFrozen.java new file mode 100644 index 00000000..0d632d30 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryFrozen.java @@ -0,0 +1,7 @@ +package at.pavlov.internal.key.registries.exceptions; + +public class RegistryFrozen extends RegistryException { + public RegistryFrozen(String message) { + super(message); + } +} diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryValidator.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryValidator.java new file mode 100644 index 00000000..fb7586c2 --- /dev/null +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryValidator.java @@ -0,0 +1,8 @@ +package at.pavlov.internal.key.registries.exceptions; + +import at.pavlov.internal.key.Key; +import at.pavlov.internal.key.KeyHolder; + +public interface RegistryValidator { + void test(Key key, T value) throws RegistryException; +} 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 d75d176f..5fb76bf5 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,9 +1,11 @@ package at.pavlov.internal.projectile.definition; import at.pavlov.internal.key.Key; +import at.pavlov.internal.key.registries.Registries; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @Getter @@ -14,9 +16,12 @@ public class CustomProjectileDefinition implements ProjectilePhysics { private final Key entityKey; private final Double constantAcceleration; - private final double gravity; - private final double drag; - private final double waterDrag; + //TODO continue after exams, also try setting setGravity false and see if these work smoothly + //private final double gravity; + //private final double drag; + //private final double waterDrag; + + private final boolean glowing; private final boolean onFire; // visual fire for projectile private final boolean charged; // works for wither skeletons @@ -25,4 +30,28 @@ public class CustomProjectileDefinition implements ProjectilePhysics { //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; + } } diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java index 4bb6e8b6..3a4a2a3d 100644 --- a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java @@ -37,8 +37,53 @@ public Key getKey() { } }; + /** + * Returns the constant acceleration power for projectiles that use it (e.g., fireballs). + * Returns null if the entity does not use constant acceleration. + * + * @return the acceleration power (e.g., 0.1) or null if not applicable + */ Double getConstantAcceleration(); + + /** + * Returns a normalized positive value of the gravity, used with Vector#subtract, + * higher values mean the projectile falls faster (duh) + * + * @return gravity to subtract to a specific entity type matching vanilla implementation + */ double getGravity(); + + + // they got some real PhD Physicists at mojang so instead of calling it drag + // in their code it is called 'getInertia' even if it handled like its opposite. + // in case someone else has to work on this and a new projectile entity needs to be added + // now you know where to go on paper's internal code. + + /** + * Returns a value between 0 and 1.0, a small float means that the projectile + * will get slowed down, whereas a high number will not change much the original vector, + * used with Vector#multiply. + *
+ * Drag force is a mechanical force that opposes the motion of an object moving through a fluid. + * + * + * @return drag multiplier for a specific entity matching vanilla implementation + */ double getDrag(); + + /** + * Returns a value between 0 and 1.0, a small float means that the projectile + * will get slowed down, whereas a high number will not change much the original vector, + * used with Vector#multiply. + *
+ * Drag force is a mechanical force that opposes the motion of an object moving through a fluid. + * + * + * @return drag multiplier for a specific entity matching vanilla implementation + */ double getWaterDrag(); + + default double getDrag(boolean inWater) { + return inWater ? this.getWaterDrag() : this.getDrag(); + } } diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java index 467cc9a8..00a2a56e 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java @@ -866,7 +866,7 @@ private boolean verifyTargetSolution(Cannon cannon, Target target, double maxdis Location muzzle = cannon.getMuzzle(); Vector vel = cannon.getTargetVector(); - MovingObject predictor = new MovingObject(muzzle, vel, cannon.getProjectileEntityKey()); + MovingObject predictor = new MovingObject(muzzle, vel, cannon.getProjectileDefinitionKey()); Vector start = muzzle.toVector(); int maxInterations = 500; @@ -1251,7 +1251,7 @@ public Location impactPredictor(Cannon cannon) { Location muzzle = cannon.getMuzzle(); Vector vel = cannon.getFiringVector(false, false); - MovingObject predictor = new MovingObject(muzzle, vel, cannon.getProjectileEntityKey()); + MovingObject predictor = new MovingObject(muzzle, vel, cannon.getProjectileDefinitionKey()); Vector start = muzzle.toVector(); //make a few iterations until we hit something diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/Cannons.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/Cannons.java index f0f5aa8b..75a70f8a 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/Cannons.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/Cannons.java @@ -27,6 +27,7 @@ import at.pavlov.cannons.projectile.Projectile; import at.pavlov.cannons.projectile.ProjectileManager; import at.pavlov.cannons.projectile.ProjectileStorage; +import at.pavlov.cannons.projectile.definitions.ProjectileDefinitionLoader; import at.pavlov.cannons.scheduler.FakeBlockHandler; import at.pavlov.cannons.scheduler.ProjectileObserver; import at.pavlov.cannons.utils.CannonSelector; @@ -157,6 +158,7 @@ public void onDisable() { } public void onEnable() { + ProjectileDefinitionLoader.load(); long startTime = System.nanoTime(); pm = getServer().getPluginManager(); if (!pm.isPluginEnabled("WorldEdit")) { diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java index feea322c..62518b32 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java @@ -1735,12 +1735,12 @@ public EntityType getProjectileEntityType() { return EntityType.SNOWBALL; } - public Key getProjectileEntityKey() { + public Key getProjectileDefinitionKey() { if (ammoLoadingData.getLoadedProjectile() != null) { - return ammoLoadingData.getLoadedProjectile().getProjectileEntityKey(); + return ammoLoadingData.getLoadedProjectile().getProjectileDefinitionKey(); } if (firingData.getLastFiredProjectile() != null) { - return firingData.getLastFiredProjectile().getProjectileEntityKey(); + return firingData.getLastFiredProjectile().getProjectileDefinitionKey(); } return Key.mc("snowball"); } diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/commands/Commands.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/commands/Commands.java index 9f67c556..a5b57894 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/commands/Commands.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/commands/Commands.java @@ -17,6 +17,7 @@ import at.pavlov.cannons.dao.PersistenceDatabase; import at.pavlov.cannons.projectile.Projectile; import at.pavlov.cannons.projectile.ProjectileStorage; +import at.pavlov.cannons.projectile.definitions.ProjectileDefinitionLoader; import at.pavlov.cannons.utils.CannonSelector; import at.pavlov.cannons.utils.CannonsUtil; import co.aikar.commands.BaseCommand; @@ -72,6 +73,7 @@ public static void onHelpCommand(Player sender) { @CommandPermission("cannons.admin.reload") public static void onReload(CommandSender sender) { myConfig.loadConfig(); + ProjectileDefinitionLoader.reload(); DesignStorage.getInstance().loadCannonDesigns(); ProjectileStorage.getInstance().loadProjectiles(); CannonManager.getInstance().updateCannons(); diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java index bfc837ed..e4f86785 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java @@ -1,12 +1,15 @@ package at.pavlov.cannons.container; import at.pavlov.internal.key.Key; +import at.pavlov.internal.key.registries.Registries; +import at.pavlov.internal.projectile.definition.ProjectilePhysics; import com.cryptomorin.xseries.XEntityType; import lombok.Data; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.EntityType; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -15,13 +18,15 @@ private UUID world; private Vector loc; private Vector vel; - private final Key entityType; + private final Key projectileKey; + private final @NotNull ProjectilePhysics physics; - public MovingObject(Location loc, Vector vel, Key entityType) { - world = loc.getWorld().getUID(); + public MovingObject(Location loc, Vector vel, Key projectileKey) { + this.world = loc.getWorld().getUID(); this.loc = loc.toVector(); this.vel = vel; - this.entityType = entityType; + this.projectileKey = projectileKey; + this.physics = Registries.PROJECTILE_PHYSICS.of(projectileKey, ProjectilePhysics.DEFAULT); } /** @@ -30,8 +35,8 @@ public MovingObject(Location loc, Vector vel, Key entityType) { * @param inWater the projectile is in water */ public void updateProjectileLocation(boolean inWater) { - double drag = getDrag(inWater); - double gravity = getGravity(); + double drag = this.physics.getDrag(inWater); + double gravity = this.physics.getGravity(); // 1. Move based on current velocity this.loc.add(this.vel); @@ -43,88 +48,24 @@ public void updateProjectileLocation(boolean inWater) { this.vel.subtract(new Vector(0, gravity, 0)); // 4. Apply constant acceleration if present - Double accelerationPower = getConstantAccelerationPower(); + Double accelerationPower = this.physics.getConstantAcceleration(); if (accelerationPower != null) { Vector acceleration = vel.clone().normalize().multiply(accelerationPower); this.vel.add(acceleration); } } - /** - * Returns the constant acceleration power for projectiles that use it (e.g., fireballs). - * Returns null if the entity does not use constant acceleration. - * - * @return the acceleration power (e.g., 0.1) or null if not applicable - */ - public Double getConstantAccelerationPower() { - return switch (entityType.full()) { - case "minecraft:fireball", "minecraft:small_fireball", "minecraft:dragon_fireball", - "minecraft:wither_skull", "minecraft:shulker_bullet" -> 0.1; // vanilla default - default -> null; - }; - } - - /** - * Returns a normalized positive value of the gravity, used with Vector#subtract, - * higher values mean the projectile falls faster (duh) - * - * @return gravity to subtract to a specific entity type matching vanilla implementation - */ - public double getGravity() { - final EntityType breezeWindCharge = XEntityType.BREEZE_WIND_CHARGE.get(); - if (breezeWindCharge != null && entityType.matches(breezeWindCharge.getKey().toString())) { - return 0.0; - } - - return switch (entityType.full()) { - case "minecraft:arrow", "minecraft:trident", "minecraft:spectral_arrow" -> 0.05; - case "minecraft:fireball", "minecraft:small_fireball", "minecraft:dragon_fireball", - "minecraft:wither_skull", "minecraft:shulker_bullet" -> 0.0; - default -> 0.03; - }; - } - - /** - * Returns a value between 0 and 1.0, a small float means that the projectile - * will get slowed down, whereas a high number will not change much the original vector, - * used with Vector#multiply. - *
- * Drag force is a mechanical force that opposes the motion of an object moving through a fluid. - * - * @param inWater the projectile is in water, in this case the drag is stronger - * - * @return drag multiplier for a specific entity matching vanilla implementation - */ - // they got some real PhD Physicists at mojang so instead of calling it drag - // in their code it is called 'getInertia' even if it handled like its opposite. - // in case someone else has to work on this and a new projectile entity needs to be added - // now you know where to go on paper's internal code. - public double getDrag(boolean inWater) { - final EntityType breezeWindCharge = XEntityType.BREEZE_WIND_CHARGE.get(); - if (breezeWindCharge != null && entityType.matches(breezeWindCharge.getKey().toString())) { - return 1.0; - } - - return switch (entityType.full()) { - case "minecraft:arrow", "minecraft:spectral_arrow" -> inWater ? 0.6 : 0.99; - case "minecraft:fireball", "minecraft:small_fireball", "minecraft:dragon_fireball", - "minecraft:wither_skull", "minecraft:shulker_bullet" -> 0.95; - case "minecraft:trident" -> 0.99; - default -> inWater ? 0.8 : 0.99; // Water Drag - Air Drag - }; - } - /** * Reverts an update of the projectile position. * * @param inWater true if the projectile is in water */ public void revertProjectileLocation(boolean inWater) { - double drag = getDrag(inWater); - double gravity = getGravity(); + double drag = this.physics.getDrag(inWater); + double gravity = this.physics.getGravity(); // 1. Revert constant acceleration if present - Double accelerationPower = getConstantAccelerationPower(); + Double accelerationPower = this.physics.getConstantAcceleration(); if (accelerationPower != null) { Vector acceleration = vel.clone().normalize().multiply(accelerationPower); this.vel.subtract(acceleration); diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/FlyingProjectile.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/FlyingProjectile.java index c80ab2a7..7d68c024 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/FlyingProjectile.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/FlyingProjectile.java @@ -61,7 +61,7 @@ public FlyingProjectile(Projectile projectile, org.bukkit.entity.Projectile proj //set location and speed Location new_loc = projectile_entity.getLocation(); - predictor = new MovingObject(new_loc, projectile_entity.getVelocity(), projectile.getProjectileEntityKey()); + predictor = new MovingObject(new_loc, projectile_entity.getVelocity(), projectile.getProjectileDefinitionKey()); this.lastSmokeTrailLocation = new_loc; } diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java index 94e482ae..68114e07 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java @@ -7,9 +7,11 @@ import at.pavlov.cannons.container.SpawnEntityHolder; import at.pavlov.internal.key.Key; import at.pavlov.internal.container.SpawnMaterialHolder; +import at.pavlov.internal.key.registries.Registries; import at.pavlov.internal.projectile.ProjectileProperties; import at.pavlov.internal.projectile.data.ClusterExplosionData; import at.pavlov.internal.projectile.data.ExplosionData; +import at.pavlov.internal.projectile.definition.ProjectilePhysics; import com.cryptomorin.xseries.XEntityType; import lombok.Getter; import lombok.Setter; @@ -32,9 +34,15 @@ public class Projectile implements Cloneable { //properties of the cannonball @Getter @Setter - private Key projectileEntityKey; + private Key projectileDefinitionKey; public EntityType getProjectileEntity() { - return XEntityType.of(projectileEntityKey.full()).get().get(); + ProjectilePhysics pp = Registries.PROJECTILE_PHYSICS.of(projectileDefinitionKey); + if (pp == null) { + Cannons.getPlugin().getLogger().severe(projectileID + " -> invalid projectile key"); + return EntityType.SNOWBALL; + } + + return XEntityType.of(pp.getEntityKey().full()).get().get(); } private boolean projectileOnFire; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileManager.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileManager.java index c1d5bfbf..0f38efc3 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileManager.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileManager.java @@ -4,13 +4,22 @@ import at.pavlov.cannons.CreateExplosion; import at.pavlov.cannons.Enum.ProjectileCause; import at.pavlov.cannons.dao.AsyncTaskManager; +import at.pavlov.internal.key.registries.Registries; +import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; import org.apache.commons.lang3.Validate; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.entity.AbstractArrow; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.entity.ThrowableProjectile; +import org.bukkit.entity.WitherSkull; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -51,22 +60,7 @@ public org.bukkit.entity.Projectile spawnProjectile(Projectile projectile, UUID spawnLoc.setPitch((float) (Math.acos(velocity.getY()/v)*180.0/Math.PI - 90)); spawnLoc.setYaw((float) (Math.atan2(velocity.getZ(),velocity.getX())*180.0/Math.PI - 90)); - Entity pEntity = world.spawnEntity(spawnLoc, projectile.getProjectileEntity()); - - //calculate firing vector - pEntity.setVelocity(velocity); - - org.bukkit.entity.Projectile projectileEntity; - try - { - projectileEntity = (org.bukkit.entity.Projectile) pEntity; - } - catch(Exception e) - { - plugin.logDebug("Can't convert EntityType " + pEntity.getType() + " to projectile. Using additional Snowball"); - projectileEntity = (org.bukkit.entity.Projectile) world.spawnEntity(spawnLoc, EntityType.SNOWBALL); - projectileEntity.setVelocity(velocity); - } + org.bukkit.entity.Projectile projectileEntity = spawnProjectile(projectile, spawnLoc, velocity, world); if (projectile.isProjectileOnFire()) projectileEntity.setFireTicks(100); @@ -86,6 +80,51 @@ public org.bukkit.entity.Projectile spawnProjectile(Projectile projectile, UUID return projectileEntity; } + private org.bukkit.entity.@NotNull Projectile spawnProjectile(Projectile projectile, Location spawnLoc, Vector velocity, World world) { + Entity pEntity = world.spawnEntity(spawnLoc, projectile.getProjectileEntity()); + + //calculate firing vector + pEntity.setVelocity(velocity); + + org.bukkit.entity.Projectile projectileEntity; + try { + projectileEntity = (org.bukkit.entity.Projectile) pEntity; + } catch(Exception e) { + plugin.logDebug("Can't convert EntityType " + pEntity.getType() + " to projectile. Using additional Snowball"); + projectileEntity = (org.bukkit.entity.Projectile) world.spawnEntity(spawnLoc, EntityType.SNOWBALL); + projectileEntity.setVelocity(velocity); + } + + CustomProjectileDefinition definition = Registries.CUSTOM_PROJECTILE_DEFINITION.of(projectile.getProjectileDefinitionKey()); + if (definition == null) { + return projectileEntity; + } + + projectileEntity.setVisualFire(definition.isOnFire()); + projectileEntity.setGlowing(definition.isGlowing()); + + if (projectileEntity instanceof WitherSkull witherSkull) { + witherSkull.setCharged(definition.isCharged()); + } else if (projectileEntity instanceof AbstractArrow arrow) { + arrow.setCritical(definition.isCritical()); + } else if (projectileEntity instanceof ThrowableProjectile throwable) { + Material material = Material.matchMaterial(definition.getMaterial().full()); + if (material == null) { + plugin.logSevere("In custom projectile: " + definition.getKey().full() + " the material key is invalid."); + material = Material.SNOWBALL; + } + + ItemStack stack = new ItemStack(material); + + ItemMeta meta = stack.getItemMeta(); + meta.setCustomModelData(definition.getCustomModelData()); + stack.setItemMeta(meta); + + throwable.setItem(stack); + } + + return projectileEntity; + } /** diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java index 7711c4ff..3a388422 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java @@ -212,7 +212,7 @@ private Projectile loadYml(String ymlFile) projectile.setLoadingItem(new ItemHolder(projectileConfig.getString("general.loadingItem", "minecraft:cobblestone"))); //cannonball - projectile.setProjectileEntityKey(Key.from(projectileConfig.getString("cannonball.entityType", "SNOWBALL"))); + projectile.setProjectileDefinitionKey(Key.from(projectileConfig.getString("cannonball.entityType", "SNOWBALL"))); projectile.setProjectileOnFire(projectileConfig.getBoolean("cannonball.isOnFire", false)); projectile.setVelocity(projectileConfig.getDouble("cannonball.velocity", 1.0)); if (projectile.getVelocity() < 0.01) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java new file mode 100644 index 00000000..c9e81ac5 --- /dev/null +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java @@ -0,0 +1,55 @@ +package at.pavlov.cannons.projectile.definitions; + +import at.pavlov.cannons.Cannons; +import at.pavlov.internal.key.Key; +import at.pavlov.internal.key.registries.Registries; +import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; + +public class ProjectileDefinitionLoader { + public static void reload() { + Registries.CUSTOM_PROJECTILE_DEFINITION.clear(); + load(); + } + + public static void load() { + var pl = Cannons.getPlugin(); + var path = new File(pl.getDataFolder(), "projectile_definitions.yml"); + if (!path.exists()) { + pl.saveResource("projectile_definitions.yml", false); + } + + YamlConfiguration cfg = YamlConfiguration.loadConfiguration(path); + for (String node : cfg.getKeys(false)) { + loadEntry(cfg, node); + } + } + + private static void loadEntry(YamlConfiguration cfg, String node) { + ConfigurationSection section = cfg.getConfigurationSection(node); + if (section == null) { + throw new RuntimeException("Impossible but alr"); + } + + Key key = Key.from(node); + CustomProjectileDefinition definition = CustomProjectileDefinition.builder() + .key(key) + .entityKey(Key.from(section.getString("entity", "SNOWBALL"))) + .constantAcceleration(section.getObject("constantAcceleration", Double.class, null)) + //.gravity(section.getDouble("gravity", 0.03)) + //.drag(section.getDouble("drag", 0.99)) + //.waterDrag(section.getDouble("waterDrag", 0.8)) + .glowing(section.getBoolean("glowing")) + .onFire(section.getBoolean("onFire")) + .charged(section.getBoolean("charged")) + .critical(section.getBoolean("critical")) + .material(Key.from(section.getString("material", "SNOWBALL"))) + .customModelData(section.getObject("customModelData", Integer.class, null)) + .build(); + + Registries.CUSTOM_PROJECTILE_DEFINITION.register(definition); + } +} diff --git a/cannons-bukkit/src/main/resources/projectile_definitions.yml b/cannons-bukkit/src/main/resources/projectile_definitions.yml new file mode 100644 index 00000000..84a59725 --- /dev/null +++ b/cannons-bukkit/src/main/resources/projectile_definitions.yml @@ -0,0 +1,28 @@ +# Quick tutorial on how to make a projectile definition +# ":": # you can put anything as long as there is a semicolon in the middle, this will identify the projectile +# entity: "SNOWBALL" # snowball if null, any entity name, these are all valid https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/entity/EntityType.html +# +# # these fields are unused due to them being handled badly by minecraft, maybe will be useful in the future +# constantAcceleration: 0.1 # stuff like fireball that will travel forever have this +# +# glowing: false # makes the thing glow +# +# # projectile specific stuff +# onFire: true # defaults to false, whatever or not make it incendiary +# charged: false # works only for wither skulls, makes it charged +# critical: false # works for arrows and tridents, makes the try visible +# +# # this stuff is for throwable projectiles only, such as snowballs +# material: SNOWBALL # you can set any material https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html +# customModelData: 123 # must be an integer, texturepack magic number goes here + + +"minecraft:blaze_shot": + entity: "SNOWBALL" + + onFire: true + +"minecraft:charged_wither_skull": + entity: "WITHER_SKULL" + + charged: true \ No newline at end of file From 15935e20d546e06d5a3e7f2de88b22a5a4f00182 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Thu, 19 Jun 2025 22:48:44 +0200 Subject: [PATCH 14/24] Special handling for projectiles with custom projectile gravity & drag --- .../definition/CustomProjectileDefinition.java | 9 +++++---- .../projectile/definition/ProjectilePhysics.java | 11 +++++++++++ .../pavlov/cannons/projectile/ProjectileManager.java | 11 +++++++++++ .../definitions/ProjectileDefinitionLoader.java | 6 +++--- 4 files changed, 30 insertions(+), 7 deletions(-) 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 5fb76bf5..757d50fd 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 @@ -17,9 +17,9 @@ public class CustomProjectileDefinition implements ProjectilePhysics { private final Double constantAcceleration; //TODO continue after exams, also try setting setGravity false and see if these work smoothly - //private final double gravity; - //private final double drag; - //private final double waterDrag; + private final double gravity; + private final double drag; + private final double waterDrag; private final boolean glowing; @@ -31,6 +31,7 @@ public class CustomProjectileDefinition implements ProjectilePhysics { private final @Nullable Key material; private final @Nullable Integer customModelData; + /* @Override public double getGravity() { return fromKey().getGravity(); @@ -53,5 +54,5 @@ public double getWaterDrag() { } return value; - } + }*/ } diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java index 3a4a2a3d..c36ae8b7 100644 --- a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java @@ -4,6 +4,8 @@ import at.pavlov.internal.key.Key; import at.pavlov.internal.key.KeyHolder; +import java.util.Objects; + public interface ProjectilePhysics extends KeyHolder, EntityKeyHolder { ProjectilePhysics DEFAULT = new ProjectilePhysics() { @Override @@ -86,4 +88,13 @@ public Key getKey() { default double getDrag(boolean inWater) { return inWater ? this.getWaterDrag() : this.getDrag(); } + + default boolean matches(ProjectilePhysics other) { + if (other == null) return false; + + return Objects.equals(this.getConstantAcceleration(), other.getConstantAcceleration()) && + Double.compare(this.getGravity(), other.getGravity()) == 0 && + Double.compare(this.getDrag(), other.getDrag()) == 0 && + Double.compare(this.getWaterDrag(), other.getWaterDrag()) == 0; + } } diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileManager.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileManager.java index 0f38efc3..e07a97c8 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileManager.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileManager.java @@ -6,6 +6,8 @@ import at.pavlov.cannons.dao.AsyncTaskManager; import at.pavlov.internal.key.registries.Registries; import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; +import at.pavlov.internal.projectile.definition.DefaultProjectileDefinition; +import at.pavlov.internal.projectile.definition.ProjectilePhysics; import org.apache.commons.lang3.Validate; import org.bukkit.Location; import org.bukkit.Material; @@ -103,6 +105,15 @@ public org.bukkit.entity.Projectile spawnProjectile(Projectile projectile, UUID projectileEntity.setVisualFire(definition.isOnFire()); projectileEntity.setGlowing(definition.isGlowing()); + ProjectilePhysics defaultCase = Registries.DEFAULT_PROJECTILE_DEFINITION_REGISTRY.of(definition.getEntityKey()); + if (defaultCase == null) { + defaultCase = ProjectilePhysics.DEFAULT; + } + + if (!defaultCase.matches(definition)) { + projectileEntity.setGravity(false); + } + if (projectileEntity instanceof WitherSkull witherSkull) { witherSkull.setCharged(definition.isCharged()); } else if (projectileEntity instanceof AbstractArrow arrow) { diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java index c9e81ac5..d15628c8 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java @@ -39,9 +39,9 @@ private static void loadEntry(YamlConfiguration cfg, String node) { .key(key) .entityKey(Key.from(section.getString("entity", "SNOWBALL"))) .constantAcceleration(section.getObject("constantAcceleration", Double.class, null)) - //.gravity(section.getDouble("gravity", 0.03)) - //.drag(section.getDouble("drag", 0.99)) - //.waterDrag(section.getDouble("waterDrag", 0.8)) + .gravity(section.getDouble("gravity", 0.03)) + .drag(section.getDouble("drag", 0.99)) + .waterDrag(section.getDouble("waterDrag", 0.8)) .glowing(section.getBoolean("glowing")) .onFire(section.getBoolean("onFire")) .charged(section.getBoolean("charged")) From 157111e7b54d76a60c7c0546b4ed3dfe75ad7c7a Mon Sep 17 00:00:00 2001 From: Intybyte Date: Fri, 20 Jun 2025 17:25:00 +0200 Subject: [PATCH 15/24] Optimize imports --- api-internal/src/main/java/at/pavlov/internal/key/Key.java | 1 - .../projectile/definition/CustomProjectileDefinition.java | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/api-internal/src/main/java/at/pavlov/internal/key/Key.java b/api-internal/src/main/java/at/pavlov/internal/key/Key.java index cd63d8cb..f627ab7d 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/Key.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/Key.java @@ -3,7 +3,6 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.Collection; import java.util.Locale; import java.util.regex.Pattern; 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 757d50fd..6e84a0ec 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,11 +1,9 @@ package at.pavlov.internal.projectile.definition; import at.pavlov.internal.key.Key; -import at.pavlov.internal.key.registries.Registries; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @Getter @@ -16,7 +14,7 @@ public class CustomProjectileDefinition implements ProjectilePhysics { private final Key entityKey; private final Double constantAcceleration; - //TODO continue after exams, also try setting setGravity false and see if these work smoothly + private final double gravity; private final double drag; private final double waterDrag; From 57677e360b9c2b8da66b7169c1a8370ca2182787 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Fri, 20 Jun 2025 17:47:32 +0200 Subject: [PATCH 16/24] Let's keep this here so to no break any API yet --- .../src/main/java/at/pavlov/internal/{key => }/Key.java | 2 +- .../main/java/at/pavlov/internal/armor/BaseArmorHolder.java | 2 +- .../main/java/at/pavlov/internal/armor/BaseArmorPiece.java | 2 +- .../at/pavlov/internal/container/SpawnMaterialHolder.java | 2 +- .../src/main/java/at/pavlov/internal/key/EntityKeyHolder.java | 2 ++ .../src/main/java/at/pavlov/internal/key/KeyHolder.java | 2 ++ .../java/at/pavlov/internal/key/registries/Registries.java | 2 +- .../main/java/at/pavlov/internal/key/registries/Registry.java | 2 +- .../at/pavlov/internal/key/registries/RegistryAccess.java | 2 +- .../internal/key/registries/SharedRegistryKeyValidator.java | 2 +- .../internal/key/registries/exceptions/RegistryValidator.java | 2 +- .../projectile/definition/CustomProjectileDefinition.java | 2 +- .../projectile/definition/DefaultProjectileDefinition.java | 2 +- .../internal/projectile/definition/ProjectilePhysics.java | 2 +- cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java | 2 +- .../src/main/java/at/pavlov/cannons/CreateExplosion.java | 2 +- .../src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java | 2 +- .../src/main/java/at/pavlov/cannons/cannon/Cannon.java | 2 +- .../src/main/java/at/pavlov/cannons/cannon/CannonDesign.java | 2 +- .../src/main/java/at/pavlov/cannons/cannon/DesignStorage.java | 2 +- .../main/java/at/pavlov/cannons/container/MovingObject.java | 4 +--- .../main/java/at/pavlov/cannons/exchange/ExchangeLoader.java | 2 +- .../main/java/at/pavlov/cannons/projectile/Projectile.java | 2 +- .../java/at/pavlov/cannons/projectile/ProjectileStorage.java | 2 +- .../projectile/definitions/ProjectileDefinitionLoader.java | 2 +- 25 files changed, 27 insertions(+), 25 deletions(-) rename api-internal/src/main/java/at/pavlov/internal/{key => }/Key.java (98%) diff --git a/api-internal/src/main/java/at/pavlov/internal/key/Key.java b/api-internal/src/main/java/at/pavlov/internal/Key.java similarity index 98% rename from api-internal/src/main/java/at/pavlov/internal/key/Key.java rename to api-internal/src/main/java/at/pavlov/internal/Key.java index f627ab7d..e617b9a3 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/Key.java +++ b/api-internal/src/main/java/at/pavlov/internal/Key.java @@ -1,4 +1,4 @@ -package at.pavlov.internal.key; +package at.pavlov.internal; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; diff --git a/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorHolder.java b/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorHolder.java index b663bdb7..ce03a47a 100644 --- a/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorHolder.java +++ b/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorHolder.java @@ -1,6 +1,6 @@ package at.pavlov.internal.armor; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import org.jetbrains.annotations.NotNull; import java.util.Arrays; diff --git a/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorPiece.java b/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorPiece.java index f7ec325d..fc87438b 100644 --- a/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorPiece.java +++ b/api-internal/src/main/java/at/pavlov/internal/armor/BaseArmorPiece.java @@ -1,6 +1,6 @@ package at.pavlov.internal.armor; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; public interface BaseArmorPiece { BaseArmorPiece EMPTY = new BaseArmorPiece() { diff --git a/api-internal/src/main/java/at/pavlov/internal/container/SpawnMaterialHolder.java b/api-internal/src/main/java/at/pavlov/internal/container/SpawnMaterialHolder.java index 196ec408..06ae40e5 100644 --- a/api-internal/src/main/java/at/pavlov/internal/container/SpawnMaterialHolder.java +++ b/api-internal/src/main/java/at/pavlov/internal/container/SpawnMaterialHolder.java @@ -1,7 +1,7 @@ package at.pavlov.internal.container; import at.pavlov.internal.CLogger; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.MaxMinRandom; import lombok.Getter; import lombok.Setter; diff --git a/api-internal/src/main/java/at/pavlov/internal/key/EntityKeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/key/EntityKeyHolder.java index 7b00d2a2..2af429cc 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/EntityKeyHolder.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/EntityKeyHolder.java @@ -1,5 +1,7 @@ package at.pavlov.internal.key; +import at.pavlov.internal.Key; + public interface EntityKeyHolder { Key getEntityKey(); } diff --git a/api-internal/src/main/java/at/pavlov/internal/key/KeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/key/KeyHolder.java index ba80be3d..50e335f4 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/KeyHolder.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/KeyHolder.java @@ -1,5 +1,7 @@ package at.pavlov.internal.key; +import at.pavlov.internal.Key; + public interface KeyHolder { Key getKey(); } diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java index 78a5fb92..b2824a4a 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java @@ -1,6 +1,6 @@ package at.pavlov.internal.key.registries; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; import at.pavlov.internal.projectile.definition.DefaultProjectileDefinition; import at.pavlov.internal.projectile.definition.ProjectilePhysics; diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java index 80c6b4d7..11fe25e6 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registry.java @@ -1,6 +1,6 @@ package at.pavlov.internal.key.registries; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.key.KeyHolder; import at.pavlov.internal.key.registries.exceptions.RegistryDuplicate; import at.pavlov.internal.key.registries.exceptions.RegistryFrozen; diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryAccess.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryAccess.java index 3be7090c..8f09bc89 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryAccess.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/RegistryAccess.java @@ -1,6 +1,6 @@ package at.pavlov.internal.key.registries; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.key.KeyHolder; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/SharedRegistryKeyValidator.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/SharedRegistryKeyValidator.java index e7b90b22..d03a1301 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/SharedRegistryKeyValidator.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/SharedRegistryKeyValidator.java @@ -1,6 +1,6 @@ package at.pavlov.internal.key.registries; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.key.KeyHolder; import at.pavlov.internal.key.registries.exceptions.RegistryException; import at.pavlov.internal.key.registries.exceptions.RegistryValidator; diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryValidator.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryValidator.java index fb7586c2..561f75ac 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryValidator.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/exceptions/RegistryValidator.java @@ -1,6 +1,6 @@ package at.pavlov.internal.key.registries.exceptions; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.key.KeyHolder; public interface RegistryValidator { 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 6e84a0ec..b3a3971a 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,6 +1,6 @@ package at.pavlov.internal.projectile.definition; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; 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 b10c22ab..4051e26c 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,6 +1,6 @@ package at.pavlov.internal.projectile.definition; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java index c36ae8b7..9a8a2c54 100644 --- a/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java +++ b/api-internal/src/main/java/at/pavlov/internal/projectile/definition/ProjectilePhysics.java @@ -1,7 +1,7 @@ package at.pavlov.internal.projectile.definition; import at.pavlov.internal.key.EntityKeyHolder; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.key.KeyHolder; import java.util.Objects; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java index 00a2a56e..a1ccf4f8 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/Aiming.java @@ -1,6 +1,6 @@ package at.pavlov.cannons; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.enums.FakeBlockType; import at.pavlov.cannons.Enum.InteractAction; import at.pavlov.cannons.Enum.MessageEnum; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/CreateExplosion.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/CreateExplosion.java index 3303df1d..218f3239 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/CreateExplosion.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/CreateExplosion.java @@ -9,7 +9,7 @@ import at.pavlov.internal.container.DeathCause; import at.pavlov.cannons.container.SoundHolder; import at.pavlov.cannons.container.SpawnEntityHolder; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.container.SpawnMaterialHolder; import at.pavlov.cannons.dao.AsyncTaskManager; import at.pavlov.cannons.event.CannonDamageEvent; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java index 806f842d..8044dfd3 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/armor/ItemArmorPiece.java @@ -1,6 +1,6 @@ package at.pavlov.cannons.armor; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.armor.BaseArmorHolder; import at.pavlov.internal.armor.BaseArmorPiece; import com.cryptomorin.xseries.XEnchantment; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java index 62518b32..348113ac 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java @@ -28,7 +28,7 @@ import at.pavlov.cannons.utils.CannonsUtil; import at.pavlov.cannons.utils.InventoryManagement; import at.pavlov.cannons.utils.SoundUtils; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.Validate; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonDesign.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonDesign.java index acdb79cf..65eb8260 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonDesign.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonDesign.java @@ -6,7 +6,7 @@ import at.pavlov.cannons.container.SoundHolder; import at.pavlov.cannons.exchange.BExchanger; import at.pavlov.cannons.projectile.Projectile; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import lombok.Data; import org.bukkit.Location; import org.bukkit.Material; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/DesignStorage.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/DesignStorage.java index 56858467..3971c6e3 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/DesignStorage.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/DesignStorage.java @@ -11,7 +11,7 @@ import at.pavlov.cannons.utils.DesignComparator; import at.pavlov.cannons.utils.ParseUtils; import at.pavlov.internal.Exchanger; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java index e4f86785..d688180b 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/container/MovingObject.java @@ -1,13 +1,11 @@ package at.pavlov.cannons.container; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.key.registries.Registries; import at.pavlov.internal.projectile.definition.ProjectilePhysics; -import com.cryptomorin.xseries.XEntityType; import lombok.Data; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.entity.EntityType; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/exchange/ExchangeLoader.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/exchange/ExchangeLoader.java index a72a0070..ce9b69f1 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/exchange/ExchangeLoader.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/exchange/ExchangeLoader.java @@ -3,7 +3,7 @@ import at.pavlov.cannons.Cannons; import at.pavlov.cannons.hooks.VaultHook; import at.pavlov.internal.Exchanger; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.jetbrains.annotations.ApiStatus; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java index 68114e07..d3495bde 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/Projectile.java @@ -5,7 +5,7 @@ import at.pavlov.cannons.container.ItemHolder; import at.pavlov.cannons.container.SoundHolder; import at.pavlov.cannons.container.SpawnEntityHolder; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.container.SpawnMaterialHolder; import at.pavlov.internal.key.registries.Registries; import at.pavlov.internal.projectile.ProjectileProperties; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java index 3a388422..e51027e2 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/ProjectileStorage.java @@ -8,7 +8,7 @@ import at.pavlov.cannons.utils.CannonsUtil; import at.pavlov.cannons.utils.FileUtils; import at.pavlov.cannons.utils.ParseUtils; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.projectile.ProjectileProperties; import lombok.Getter; import org.bukkit.Bukkit; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java index d15628c8..a7a0c608 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java @@ -1,7 +1,7 @@ package at.pavlov.cannons.projectile.definitions; import at.pavlov.cannons.Cannons; -import at.pavlov.internal.key.Key; +import at.pavlov.internal.Key; import at.pavlov.internal.key.registries.Registries; import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; import org.bukkit.configuration.ConfigurationSection; From 4e21b27e122ee28275f2cbf109260ce3a6fcc329 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Sun, 6 Jul 2025 19:17:12 +0200 Subject: [PATCH 17/24] Remove unused --- .../pavlov/internal/registries/KeyHolder.java | 7 --- .../internal/registries/Registries.java | 4 -- .../pavlov/internal/registries/Registry.java | 49 ------------------- 3 files changed, 60 deletions(-) delete mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java delete mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/Registries.java delete mode 100644 api-internal/src/main/java/at/pavlov/internal/registries/Registry.java diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java b/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java deleted file mode 100644 index aafbc688..00000000 --- a/api-internal/src/main/java/at/pavlov/internal/registries/KeyHolder.java +++ /dev/null @@ -1,7 +0,0 @@ -package at.pavlov.internal.registries; - -import at.pavlov.internal.Key; - -public interface KeyHolder { - Key key(); -} diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java b/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java deleted file mode 100644 index 58f16b67..00000000 --- a/api-internal/src/main/java/at/pavlov/internal/registries/Registries.java +++ /dev/null @@ -1,4 +0,0 @@ -package at.pavlov.internal.registries; - -public class Registries { -} diff --git a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java b/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java deleted file mode 100644 index 4b4967f9..00000000 --- a/api-internal/src/main/java/at/pavlov/internal/registries/Registry.java +++ /dev/null @@ -1,49 +0,0 @@ -package at.pavlov.internal.registries; - -import at.pavlov.internal.Key; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Supplier; - -public class Registry { - private final Map map = new HashMap<>(); - - public Registry(Supplier> args) { - Collection<@NotNull T> arguments = args.get(); - for (T arg : arguments) { - register(arg); - } - } - - public @Nullable T of(@Nullable Key key) { - if (key == null) { - return null; - } - - return map.get(key); - } - - public @Nullable T of(@Nullable String string) { - if (string == null) { - return null; - } - - return of(Key.from(string)); - } - - @SafeVarargs - public final void register(@NotNull T... entries) { - for (T entry : entries) { - map.put(entry.key(), entry); - } - } - - public void register(Supplier<@NotNull T> entry) { - T result = entry.get(); - map.put(result.key(), result); - } -} From db729f07c3711f38d2356809ea719d3530302367 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Tue, 22 Jul 2025 11:40:03 +0200 Subject: [PATCH 18/24] Use default entity values if not specified --- .../definitions/ProjectileDefinitionLoader.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java index a7a0c608..6303d2f8 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java @@ -4,6 +4,7 @@ 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.DefaultProjectileDefinition; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; @@ -35,13 +36,19 @@ private static void loadEntry(YamlConfiguration cfg, String node) { } Key key = Key.from(node); + Key entityKey = Key.from(section.getString("entity", "SNOWBALL")); + DefaultProjectileDefinition dpd = Registries.DEFAULT_PROJECTILE_DEFINITION_REGISTRY.of(entityKey); + if (dpd == null) { + throw new RuntimeException("Default Projectile Definition not found, invalid entity?"); + } + CustomProjectileDefinition definition = CustomProjectileDefinition.builder() .key(key) - .entityKey(Key.from(section.getString("entity", "SNOWBALL"))) + .entityKey(entityKey) .constantAcceleration(section.getObject("constantAcceleration", Double.class, null)) - .gravity(section.getDouble("gravity", 0.03)) - .drag(section.getDouble("drag", 0.99)) - .waterDrag(section.getDouble("waterDrag", 0.8)) + .gravity(section.getDouble("gravity", dpd.getGravity())) + .drag(section.getDouble("drag", dpd.getDrag())) + .waterDrag(section.getDouble("waterDrag", dpd.getWaterDrag())) .glowing(section.getBoolean("glowing")) .onFire(section.getBoolean("onFire")) .charged(section.getBoolean("charged")) From b6952e356df2e5a8cfd3827c1ccb551f4a8581bd Mon Sep 17 00:00:00 2001 From: Intybyte Date: Tue, 22 Jul 2025 11:43:41 +0200 Subject: [PATCH 19/24] Fix --- .../projectile/definitions/ProjectileDefinitionLoader.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java index 6303d2f8..7c896f7f 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java @@ -5,6 +5,7 @@ import at.pavlov.internal.key.registries.Registries; import at.pavlov.internal.projectile.definition.CustomProjectileDefinition; import at.pavlov.internal.projectile.definition.DefaultProjectileDefinition; +import at.pavlov.internal.projectile.definition.ProjectilePhysics; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; @@ -37,9 +38,9 @@ private static void loadEntry(YamlConfiguration cfg, String node) { Key key = Key.from(node); Key entityKey = Key.from(section.getString("entity", "SNOWBALL")); - DefaultProjectileDefinition dpd = Registries.DEFAULT_PROJECTILE_DEFINITION_REGISTRY.of(entityKey); + ProjectilePhysics dpd = Registries.DEFAULT_PROJECTILE_DEFINITION_REGISTRY.of(entityKey); if (dpd == null) { - throw new RuntimeException("Default Projectile Definition not found, invalid entity?"); + dpd = ProjectilePhysics.DEFAULT; } CustomProjectileDefinition definition = CustomProjectileDefinition.builder() From 05b8ccd753e01f17e522e9be696d847101f3eb16 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Tue, 22 Jul 2025 11:44:53 +0200 Subject: [PATCH 20/24] Forgot you --- .../projectile/definitions/ProjectileDefinitionLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java index 7c896f7f..0bbc1008 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/projectile/definitions/ProjectileDefinitionLoader.java @@ -46,7 +46,7 @@ private static void loadEntry(YamlConfiguration cfg, String node) { CustomProjectileDefinition definition = CustomProjectileDefinition.builder() .key(key) .entityKey(entityKey) - .constantAcceleration(section.getObject("constantAcceleration", Double.class, null)) + .constantAcceleration(section.getObject("constantAcceleration", Double.class, dpd.getConstantAcceleration())) .gravity(section.getDouble("gravity", dpd.getGravity())) .drag(section.getDouble("drag", dpd.getDrag())) .waterDrag(section.getDouble("waterDrag", dpd.getWaterDrag())) From 63c8a6222fd58b6f96755dab58143e0ecfa3685a Mon Sep 17 00:00:00 2001 From: Intybyte Date: Tue, 22 Jul 2025 11:46:46 +0200 Subject: [PATCH 21/24] Update comment wiki --- .../src/main/resources/projectile_definitions.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cannons-bukkit/src/main/resources/projectile_definitions.yml b/cannons-bukkit/src/main/resources/projectile_definitions.yml index 84a59725..d8581564 100644 --- a/cannons-bukkit/src/main/resources/projectile_definitions.yml +++ b/cannons-bukkit/src/main/resources/projectile_definitions.yml @@ -2,8 +2,12 @@ # ":": # you can put anything as long as there is a semicolon in the middle, this will identify the projectile # entity: "SNOWBALL" # snowball if null, any entity name, these are all valid https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/entity/EntityType.html # -# # these fields are unused due to them being handled badly by minecraft, maybe will be useful in the future -# constantAcceleration: 0.1 # stuff like fireball that will travel forever have this +# # these fields are used to change how the projectiles behave, +# # however options different from default values can behave in a "sluggish" way +# constantAcceleration: 0.1 # optional, stuff like fireball that will travel forever have this, default is null or 0 for snowballs +# gravity: 0.03 +# drag: 0.99 # high drag means the projectile looses less speed, so a low drag will mean that the projectile will slow down faster +# waterDrag: 0.8 # same as drag but for water and/or liquids # # glowing: false # makes the thing glow # From 904cef406792b0922c026147f1db9b17fb019fb2 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Tue, 22 Jul 2025 14:16:58 +0200 Subject: [PATCH 22/24] Faster builder --- .../internal/key/registries/Registries.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java index b2824a4a..40c16898 100644 --- a/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java +++ b/api-internal/src/main/java/at/pavlov/internal/key/registries/Registries.java @@ -22,25 +22,27 @@ public class Registries { Collection fireballs = Key.from( List.of("minecraft:fireball", "minecraft:small_fireball", "minecraft:dragon_fireball", "minecraft:wither_skull", "minecraft:shulker_bullet") ); + var fireballBuilder = DefaultProjectileDefinition.builder() + .gravity(0.0) + .drag(0.95) + .waterDrag(0.95) + .constantAcceleration(0.1); for (Key fireball : fireballs) { toAdd.add( - DefaultProjectileDefinition.builder() - .gravity(0.0) - .drag(0.95) - .waterDrag(0.95) - .constantAcceleration(0.1) + fireballBuilder .key(fireball) .build() ); } Collection arrows = Key.from(List.of("minecraft:arrow", "minecraft:spectral_arrow")); + var arrowBuilder = DefaultProjectileDefinition.builder() + .gravity(0.05) + .drag(0.99) + .waterDrag(0.6); for (Key arrow : arrows) { toAdd.add( - DefaultProjectileDefinition.builder() - .gravity(0.05) - .drag(0.99) - .waterDrag(0.6) + arrowBuilder .key(arrow) .build() ); From f9f55dbb35f701954b7ed5db200e7b01d8734f84 Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 23 Jul 2025 10:35:25 +0200 Subject: [PATCH 23/24] Fix warning --- .../src/main/java/at/pavlov/cannons/utils/CannonsUtil.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/utils/CannonsUtil.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/utils/CannonsUtil.java index 7c628db7..7fe713b1 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/utils/CannonsUtil.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/utils/CannonsUtil.java @@ -233,7 +233,12 @@ public static Location findSurface(Location start, Vector direction) { //int length = (int) (direction.length()*3); Cannons.logSDebug("World: " + world + " Start vector: " + start.toVector() + " Normalized direction: " + direction.clone().normalize()); - BlockIterator iter = new BlockIterator(world, start.toVector(), direction.clone().normalize(), 0, 10); + BlockIterator iter; + try { + iter = new BlockIterator(world, start.toVector(), direction.clone().normalize(), 0, 10); + } catch (Exception e) { //main face is null whatever this thing is whining about + return start; + } //try to find a surface of the while (iter.hasNext()) From 5914c23478f710aaca2ec4380a8e28522abc71cb Mon Sep 17 00:00:00 2001 From: Intybyte Date: Wed, 23 Jul 2025 10:40:21 +0200 Subject: [PATCH 24/24] Add description --- cannons-bukkit/src/main/resources/projectile_definitions.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/cannons-bukkit/src/main/resources/projectile_definitions.yml b/cannons-bukkit/src/main/resources/projectile_definitions.yml index d8581564..f45113ba 100644 --- a/cannons-bukkit/src/main/resources/projectile_definitions.yml +++ b/cannons-bukkit/src/main/resources/projectile_definitions.yml @@ -4,6 +4,7 @@ # # # these fields are used to change how the projectiles behave, # # however options different from default values can behave in a "sluggish" way +# # if not set, they will use the default values of the entity # constantAcceleration: 0.1 # optional, stuff like fireball that will travel forever have this, default is null or 0 for snowballs # gravity: 0.03 # drag: 0.99 # high drag means the projectile looses less speed, so a low drag will mean that the projectile will slow down faster