From 306ac27f5e5044aadc441892b835742d20d924c9 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 17 Jun 2025 22:39:15 -0700 Subject: [PATCH 1/4] toVector3d() --- .../skript/bukkitutil/PaperEntityUtils.java | 37 +++--- .../skript/classes/data/BukkitClasses.java | 40 +++--- .../classes/data/DefaultComparators.java | 37 +++--- .../classes/data/DefaultConverters.java | 9 +- .../skript/classes/data/DefaultFunctions.java | 20 +-- .../classes/data/DefaultOperations.java | 36 ++---- .../conditions/CondIsVectorNormalized.java | 9 +- .../ch/njol/skript/effects/EffKnockback.java | 14 +- .../java/ch/njol/skript/effects/EffLook.java | 21 ++- .../java/ch/njol/skript/effects/EffPush.java | 9 +- .../njol/skript/expressions/ExprBlocks.java | 29 ++--- .../skript/expressions/ExprDirection.java | 59 +++++---- .../njol/skript/expressions/ExprFacing.java | 10 +- .../expressions/ExprLocationFromVector.java | 21 ++- .../expressions/ExprLocationVectorOffset.java | 24 ++-- .../ExprMinecartDerailedFlyingVelocity.java | 79 +++++------- .../expressions/ExprVectorAngleBetween.java | 17 ++- .../ExprVectorBetweenLocations.java | 21 ++- .../expressions/ExprVectorCrossProduct.java | 29 ++--- .../expressions/ExprVectorCylindrical.java | 16 +-- .../expressions/ExprVectorDotProduct.java | 19 ++- .../expressions/ExprVectorFromDirection.java | 14 +- .../skript/expressions/ExprVectorFromXYZ.java | 19 ++- .../ExprVectorFromYawAndPitch.java | 12 +- .../skript/expressions/ExprVectorLength.java | 25 ++-- .../expressions/ExprVectorNormalize.java | 26 ++-- .../expressions/ExprVectorOfLocation.java | 21 ++- .../expressions/ExprVectorProjection.java | 24 ++-- .../skript/expressions/ExprVectorRandom.java | 14 +- .../expressions/ExprVectorSpherical.java | 16 +-- .../expressions/ExprVectorSquaredLength.java | 7 +- .../njol/skript/expressions/ExprVelocity.java | 28 ++-- .../skript/expressions/ExprXYZComponent.java | 33 +++-- .../njol/skript/expressions/ExprYawPitch.java | 57 ++++---- .../hooks/regions/PreciousStonesHook.java | 36 ++---- .../skript/hooks/regions/WorldGuardHook.java | 37 +++--- .../skript/registrations/DefaultClasses.java | 13 +- .../ch/njol/skript/sections/EffSecShoot.java | 4 +- src/main/java/ch/njol/skript/util/AABB.java | 59 +++++---- .../njol/skript/util/BlockLineIterator.java | 6 +- .../java/ch/njol/skript/util/Direction.java | 53 ++++---- src/main/java/ch/njol/util/Math2.java | 10 +- src/main/java/ch/njol/util/VectorMath.java | 122 ------------------ ...DisplayTransformationScaleTranslation.java | 26 ++-- .../skript/bukkit/misc/effects/EffRotate.java | 21 +-- .../expressions/ExprQuaternionAxisAngle.java | 12 +- .../bukkit/misc/expressions/ExprRotate.java | 21 +-- .../rotation/NonMutatingVectorRotator.java | 26 ++-- .../bukkit/misc/rotation/VectorRotator.java | 26 ++-- 49 files changed, 579 insertions(+), 745 deletions(-) delete mode 100644 src/main/java/ch/njol/util/VectorMath.java diff --git a/src/main/java/ch/njol/skript/bukkitutil/PaperEntityUtils.java b/src/main/java/ch/njol/skript/bukkitutil/PaperEntityUtils.java index b488fcbc9a7..b63c3c07c3d 100644 --- a/src/main/java/ch/njol/skript/bukkitutil/PaperEntityUtils.java +++ b/src/main/java/ch/njol/skript/bukkitutil/PaperEntityUtils.java @@ -1,7 +1,10 @@ package ch.njol.skript.bukkitutil; -import java.util.EnumSet; - +import ch.njol.skript.Skript; +import com.destroystokyo.paper.entity.ai.Goal; +import com.destroystokyo.paper.entity.ai.GoalKey; +import com.destroystokyo.paper.entity.ai.GoalType; +import io.papermc.paper.entity.LookAnchor; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.NamespacedKey; @@ -12,12 +15,7 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; -import com.destroystokyo.paper.entity.ai.Goal; -import com.destroystokyo.paper.entity.ai.GoalKey; -import com.destroystokyo.paper.entity.ai.GoalType; - -import ch.njol.skript.Skript; -import io.papermc.paper.entity.LookAnchor; +import java.util.EnumSet; public class PaperEntityUtils { @@ -67,9 +65,9 @@ public static void lookAt(Object target, @Nullable Float headRotationSpeed, @Nul return; } for (LivingEntity entity : entities) { - if (!(entity instanceof Mob)) + if (!(entity instanceof Mob mob)) continue; - mobLookAt(target, headRotationSpeed, maxHeadPitch, (Mob) entity); + mobLookAt(target, headRotationSpeed, maxHeadPitch, mob); } } @@ -94,19 +92,18 @@ public static void lookAt(LookAnchor entityAnchor, Object target, @Nullable Floa } if (entity instanceof Player) { Player player = (Player) entity; - if (target instanceof Vector) { - Vector vector = (Vector) target; + if (target instanceof Vector vector) { player.lookAt(player.getEyeLocation().add(vector), LookAnchor.EYES); player.lookAt(player.getEyeLocation().add(vector), LookAnchor.FEET); - } else if (target instanceof Location) { - player.lookAt((Location) target, LookAnchor.EYES); - player.lookAt((Location) target, LookAnchor.FEET); - } else if (target instanceof Entity) { - player.lookAt((Entity) target, LookAnchor.EYES, entityAnchor); - player.lookAt((Entity) target, LookAnchor.FEET, entityAnchor); + } else if (target instanceof Location location) { + player.lookAt(location, LookAnchor.EYES); + player.lookAt(location, LookAnchor.FEET); + } else if (target instanceof Entity targetEntity) { + player.lookAt(targetEntity, LookAnchor.EYES, entityAnchor); + player.lookAt(targetEntity, LookAnchor.FEET, entityAnchor); } - } else if (entity instanceof Mob) { - mobLookAt(target, headRotationSpeed, maxHeadPitch, (Mob) entity); + } else if (entity instanceof Mob mob) { + mobLookAt(target, headRotationSpeed, maxHeadPitch, mob); } } } diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 9dbb5b00004..7b6e757aeea 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -57,8 +57,8 @@ import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.util.CachedServerIcon; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import java.io.StreamCorruptedException; import java.util.*; @@ -396,18 +396,18 @@ public Location deserialize(final String s) { }) .cloner(Location::clone)); - Classes.registerClass(new ClassInfo<>(Vector.class, "vector") + Classes.registerClass(new ClassInfo<>(Vector3d.class, "vector") .user("vectors?") .name("Vector") .description("Vector is a collection of numbers. In Minecraft, 3D vectors are used to express velocities of entities.") .usage("vector(x, y, z)") .examples("") .since("2.2-dev23") - .defaultExpression(new EventValueExpression<>(Vector.class)) - .parser(new Parser() { + .defaultExpression(new EventValueExpression<>(Vector3d.class)) + .parser(new Parser() { @Override @Nullable - public Vector parse(final String s, final ParseContext context) { + public Vector3d parse(final String s, final ParseContext context) { return null; } @@ -417,38 +417,38 @@ public boolean canParse(final ParseContext context) { } @Override - public String toString(final Vector vec, final int flags) { - return "x: " + Skript.toString(vec.getX()) + ", y: " + Skript.toString(vec.getY()) + ", z: " + Skript.toString(vec.getZ()); + public String toString(final Vector3d vec, final int flags) { + return "x: " + Skript.toString(vec.x()) + ", y: " + Skript.toString(vec.y()) + ", z: " + Skript.toString(vec.z()); } @Override - public String toVariableNameString(final Vector vec) { - return "vector:" + vec.getX() + "," + vec.getY() + "," + vec.getZ(); + public String toVariableNameString(final Vector3d vec) { + return "vector:" + vec.x() + "," + vec.y() + "," + vec.z(); } @Override - public String getDebugMessage(final Vector vec) { - return "(" + vec.getX() + "," + vec.getY() + "," + vec.getZ() + ")"; + public String getDebugMessage(final Vector3d vec) { + return "(" + vec.x() + "," + vec.y() + "," + vec.z() + ")"; } }) - .serializer(new Serializer() { + .serializer(new Serializer() { @Override - public Fields serialize(Vector o) { + public Fields serialize(Vector3d o) { Fields f = new Fields(); - f.putPrimitive("x", o.getX()); - f.putPrimitive("y", o.getY()); - f.putPrimitive("z", o.getZ()); + f.putPrimitive("x", o.x()); + f.putPrimitive("y", o.y()); + f.putPrimitive("z", o.z()); return f; } @Override - public void deserialize(Vector o, Fields f) { + public void deserialize(Vector3d o, Fields f) { assert false; } @Override - public Vector deserialize(final Fields f) throws StreamCorruptedException { - return new Vector(f.getPrimitive("x", double.class), f.getPrimitive("y", double.class), f.getPrimitive("z", double.class)); + public Vector3d deserialize(final Fields f) throws StreamCorruptedException { + return new Vector3d(f.getPrimitive("x", double.class), f.getPrimitive("y", double.class), f.getPrimitive("z", double.class)); } @Override @@ -461,7 +461,7 @@ protected boolean canBeInstantiated() { return false; } }) - .cloner(Vector::clone)); + .cloner(Vector3d::new)); Classes.registerClass(new ClassInfo<>(World.class, "world") .user("worlds?") diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java index 5a19241e211..5aff960d132 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultComparators.java @@ -10,17 +10,7 @@ import ch.njol.skript.entity.BoatData; import ch.njol.skript.entity.EntityData; import ch.njol.skript.entity.RabbitData; -import ch.njol.skript.util.BlockUtils; -import ch.njol.skript.util.Color; -import ch.njol.skript.util.Date; -import ch.njol.skript.util.EnchantmentType; -import ch.njol.skript.util.Experience; -import ch.njol.skript.util.GameruleValue; -import ch.njol.skript.util.StructureType; -import ch.njol.skript.util.Time; -import ch.njol.skript.util.Timeperiod; -import ch.njol.skript.util.Timespan; -import ch.njol.skript.util.WeatherType; +import ch.njol.skript.util.*; import ch.njol.skript.util.slot.EquipmentSlot; import ch.njol.skript.util.slot.Slot; import ch.njol.skript.util.slot.SlotWithIndex; @@ -41,6 +31,8 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; +import org.joml.Vector3d; import org.skriptlang.skript.lang.comparator.Comparator; import org.skriptlang.skript.lang.comparator.Comparators; import org.skriptlang.skript.lang.comparator.Relation; @@ -619,12 +611,12 @@ public boolean supportsOrdering() { }); // Location - Location - Comparators.registerComparator(Location.class, Location.class, new Comparator() { + Comparators.registerComparator(Location.class, Location.class, new Comparator<>() { @Override public Relation compare(Location first, Location second) { return Relation.get( - // compare worlds - Objects.equals(first.getWorld(), second.getWorld()) && + // compare worlds + Objects.equals(first.getWorld(), second.getWorld()) && // compare xyz coords first.toVector().equals(second.toVector()) && // normalize yaw and pitch to [-180, 180) and [-90, 90] respectively @@ -633,13 +625,20 @@ public Relation compare(Location first, Location second) { Location.normalizePitch(first.getPitch()) == Location.normalizePitch(second.getPitch()) ); } - - @Override - public boolean supportsOrdering() { - return false; - } }); + // Vectors + + double vectorEpsilon = 0.000001; // vectors often are made from float sources, so can't use 1e-10. + Comparators.registerComparator(Vector3d.class, Vector3d.class, (a, b) -> Relation.get( + Math.abs(a.x - b.x) < vectorEpsilon + && Math.abs(a.y - b.y) < vectorEpsilon + && Math.abs(a.z - b.z) < vectorEpsilon)); + Comparators.registerComparator(Vector.class, Vector3d.class, (a, b) -> Relation.get( + Math.abs(a.getX() - b.x) < vectorEpsilon + && Math.abs(a.getY() - b.y) < vectorEpsilon + && Math.abs(a.getZ() - b.z) < vectorEpsilon)); + // Potion Effect Type Comparators.registerComparator(PotionEffectType.class, PotionEffectType.class, (one, two) -> Relation.get(one.equals(two))); diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultConverters.java b/src/main/java/ch/njol/skript/classes/data/DefaultConverters.java index f6af95098bb..3df5570f039 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultConverters.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultConverters.java @@ -35,6 +35,7 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.UnknownNullability; +import org.joml.Vector3d; import org.skriptlang.skript.lang.converter.Converter; import org.skriptlang.skript.lang.converter.Converters; import org.skriptlang.skript.lang.script.Script; @@ -267,8 +268,12 @@ public void setAmount(Number amount) { // Enchantment - EnchantmentType Converters.registerConverter(Enchantment.class, EnchantmentType.class, e -> new EnchantmentType(e, -1)); - // Vector - Direction - Converters.registerConverter(Vector.class, Direction.class, Direction::new); + // Vector3d - Vector + Converters.registerConverter(Vector3d.class, Vector.class, Vector::fromJOML, Converter.NO_RIGHT_CHAINING); + Converters.registerConverter(Vector.class, Vector3d.class, Vector::toVector3d); + + // Vector3d - Direction + Converters.registerConverter(Vector3d.class, Direction.class, Direction::new); // EnchantmentOffer - EnchantmentType Converters.registerConverter(EnchantmentOffer.class, EnchantmentType.class, eo -> new EnchantmentType(eo.getEnchantment(), eo.getEnchantmentLevel())); diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index 1020ce60888..da8b9947536 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -17,10 +17,10 @@ import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import org.joml.AxisAngle4f; import org.joml.Quaternionf; +import org.joml.Vector3d; import org.joml.Vector3f; import java.math.BigDecimal; @@ -462,17 +462,17 @@ public Date[] executeSimple(Object[][] params) { .examples("date(2014, 10, 1) # 0:00, 1st October 2014", "date(1990, 3, 5, 14, 30) # 14:30, 5th May 1990", "date(1999, 12, 31, 23, 59, 59, 999, -3*60, 0) # almost year 2000 in parts of Brazil (-3 hours offset, no DST)") .since("2.2")); - Functions.registerFunction(new SimpleJavaFunction("vector", new Parameter[] { + Functions.registerFunction(new SimpleJavaFunction<>("vector", new Parameter[]{ new Parameter<>("x", DefaultClasses.NUMBER, true, null), new Parameter<>("y", DefaultClasses.NUMBER, true, null), new Parameter<>("z", DefaultClasses.NUMBER, true, null) }, DefaultClasses.VECTOR, true) { @Override - public Vector[] executeSimple(Object[][] params) { - return new Vector[] {new Vector( - ((Number)params[0][0]).doubleValue(), - ((Number)params[1][0]).doubleValue(), - ((Number)params[2][0]).doubleValue() + public Vector3d[] executeSimple(Object[][] params) { + return new Vector3d[]{new Vector3d( + ((Number) params[0][0]).doubleValue(), + ((Number) params[1][0]).doubleValue(), + ((Number) params[2][0]).doubleValue() )}; } @@ -649,10 +649,10 @@ public Quaternionf[] executeSimple(Object[][] params) { @Override public Quaternionf[] executeSimple(Object[][] params) { float angle = (float) (((Number) params[0][0]).floatValue() / 180 * Math.PI); - Vector v = ((Vector) params[1][0]); - if (v.isZero() || !Double.isFinite(v.getX()) || !Double.isFinite(v.getY()) || !Double.isFinite(v.getZ())) + Vector3d v = ((Vector3d) params[1][0]); + if (Math2.vectorIsZero(v) || !v.isFinite()) return new Quaternionf[0]; - Vector3f axis = ((Vector) params[1][0]).toVector3f(); + Vector3f axis = new Vector3f((Vector3d) params[1][0]); return CollectionUtils.array(new Quaternionf(new AxisAngle4f(angle, axis))); } }) diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultOperations.java b/src/main/java/ch/njol/skript/classes/data/DefaultOperations.java index 3dde01cc5bf..7f66f90cf16 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultOperations.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultOperations.java @@ -4,7 +4,7 @@ import ch.njol.skript.util.Timespan; import ch.njol.skript.util.Timespan.TimePeriod; import ch.njol.skript.util.Utils; -import org.bukkit.util.Vector; +import org.joml.Vector3d; import org.skriptlang.skript.lang.arithmetic.Arithmetics; import org.skriptlang.skript.lang.arithmetic.Operator; @@ -64,30 +64,22 @@ public class DefaultOperations { Arithmetics.registerDefaultValue(Number.class, () -> 0L); // Vector - Vector - Arithmetics.registerOperation(Operator.ADDITION, Vector.class, (left, right) -> left.clone().add(right)); - Arithmetics.registerOperation(Operator.SUBTRACTION, Vector.class, (left, right) -> left.clone().subtract(right)); - Arithmetics.registerOperation(Operator.MULTIPLICATION, Vector.class, (left, right) -> left.clone().multiply(right)); - Arithmetics.registerOperation(Operator.DIVISION, Vector.class, (left, right) -> left.clone().divide(right)); - Arithmetics.registerDifference(Vector.class, - (left, right) -> new Vector(Math.abs(left.getX() - right.getX()), Math.abs(left.getY() - right.getY()), Math.abs(left.getZ() - right.getZ()))); - Arithmetics.registerDefaultValue(Vector.class, Vector::new); + Arithmetics.registerOperation(Operator.ADDITION, Vector3d.class, (left, right) -> left.add(right, new Vector3d())); + Arithmetics.registerOperation(Operator.SUBTRACTION, Vector3d.class, (left, right) -> left.sub(right, new Vector3d())); + Arithmetics.registerOperation(Operator.MULTIPLICATION, Vector3d.class, (left, right) -> left.mul(right, new Vector3d())); + Arithmetics.registerOperation(Operator.DIVISION, Vector3d.class, (left, right) -> left.div(right, new Vector3d())); + Arithmetics.registerDifference(Vector3d.class, + (left, right) -> new Vector3d(Math.abs(left.x() - right.x()), Math.abs(left.y() - right.y()), Math.abs(left.z() - right.z()))); + Arithmetics.registerDefaultValue(Vector3d.class, Vector3d::new); // Vector - Number // Number - Vector - Arithmetics.registerOperation(Operator.MULTIPLICATION, Vector.class, Number.class, (left, right) -> left.clone().multiply(right.doubleValue()), (left, right) -> { - double number = left.doubleValue(); - Vector leftVector = new Vector(number, number, number); - return leftVector.multiply(right); - }); - Arithmetics.registerOperation(Operator.DIVISION, Vector.class, Number.class, (left, right) -> { - double number = right.doubleValue(); - Vector rightVector = new Vector(number, number, number); - return left.clone().divide(rightVector); - }, (left, right) -> { - double number = left.doubleValue(); - Vector leftVector = new Vector(number, number, number); - return leftVector.divide(right); - }); + Arithmetics.registerOperation(Operator.MULTIPLICATION, Vector3d.class, Number.class, + (left, right) -> left.mul(right.doubleValue(), new Vector3d()), + (left, right) -> right.mul(left.doubleValue(), new Vector3d())); + Arithmetics.registerOperation(Operator.DIVISION, Vector3d.class, Number.class, + (left, right) -> left.div(right.doubleValue(), new Vector3d()), + (left, right) -> new Vector3d(left.doubleValue()).div(right)); // Timespan - Timespan Arithmetics.registerOperation(Operator.ADDITION, Timespan.class, Timespan::add); diff --git a/src/main/java/ch/njol/skript/conditions/CondIsVectorNormalized.java b/src/main/java/ch/njol/skript/conditions/CondIsVectorNormalized.java index 7c4851d8470..c496b726f1e 100644 --- a/src/main/java/ch/njol/skript/conditions/CondIsVectorNormalized.java +++ b/src/main/java/ch/njol/skript/conditions/CondIsVectorNormalized.java @@ -1,25 +1,26 @@ package ch.njol.skript.conditions; +import ch.njol.skript.Skript; import ch.njol.skript.conditions.base.PropertyCondition; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; -import org.bukkit.util.Vector; +import org.joml.Vector3d; @Name("Is Normalized") @Description("Checks whether a vector is normalized i.e. length of 1") @Examples("vector of player's location is normalized") @Since("2.5.1") -public class CondIsVectorNormalized extends PropertyCondition { +public class CondIsVectorNormalized extends PropertyCondition { static { register(CondIsVectorNormalized.class, "normalized", "vectors"); } @Override - public boolean check(Vector vector) { - return vector.isNormalized(); + public boolean check(Vector3d vector) { + return Math.abs(vector.lengthSquared() - 1) < Skript.EPSILON; } @Override diff --git a/src/main/java/ch/njol/skript/effects/EffKnockback.java b/src/main/java/ch/njol/skript/effects/EffKnockback.java index de43ed17322..437f3974539 100644 --- a/src/main/java/ch/njol/skript/effects/EffKnockback.java +++ b/src/main/java/ch/njol/skript/effects/EffKnockback.java @@ -1,11 +1,7 @@ package ch.njol.skript.effects; import ch.njol.skript.Skript; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; -import ch.njol.skript.doc.Since; +import ch.njol.skript.doc.*; import ch.njol.skript.lang.Effect; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; @@ -13,8 +9,8 @@ import ch.njol.util.Kleenean; import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Knockback") @Description("Apply the same velocity as a knockback to living entities in a direction. Mechanics such as knockback resistance will be factored in.") @@ -53,11 +49,11 @@ protected void execute(Event event) { double strength = this.strength != null ? this.strength.getOptionalSingle(event).orElse(1).doubleValue() : 1.0; for (LivingEntity livingEntity : entities.getArray(event)) { - Vector directionVector = direction.getDirection(livingEntity); + Vector3d directionVector = direction.getDirection(livingEntity); // Flip the direction, because LivingEntity#knockback() takes the direction of the source of the knockback, // not the direction of the actual knockback. - directionVector.multiply(-1); - livingEntity.knockback(strength, directionVector.getX(), directionVector.getZ()); + directionVector.negate(); + livingEntity.knockback(strength, directionVector.x(), directionVector.z()); // ensure velocity is sent to client livingEntity.setVelocity(livingEntity.getVelocity()); } diff --git a/src/main/java/ch/njol/skript/effects/EffLook.java b/src/main/java/ch/njol/skript/effects/EffLook.java index 5b88d37a9a4..df6c1a9ba7f 100644 --- a/src/main/java/ch/njol/skript/effects/EffLook.java +++ b/src/main/java/ch/njol/skript/effects/EffLook.java @@ -1,23 +1,20 @@ package ch.njol.skript.effects; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Mob; -import org.bukkit.event.Event; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.bukkitutil.PaperEntityUtils; -import ch.njol.skript.doc.Description; -import ch.njol.skript.doc.Examples; -import ch.njol.skript.doc.Name; -import ch.njol.skript.doc.RequiredPlugins; -import ch.njol.skript.doc.Since; +import ch.njol.skript.doc.*; import ch.njol.skript.lang.Effect; import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; import io.papermc.paper.entity.LookAnchor; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Mob; +import org.bukkit.event.Event; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Look At") @Description("Forces the mob(s) or player(s) to look at an entity, vector or location. Vanilla max head pitches range from 10 to 50.") @@ -88,6 +85,8 @@ protected void execute(Event event) { Object object = target.getSingle(event); if (object == null) return; + if (object instanceof Vector3d vector) + object = Vector.fromJOML(vector); Float speed = this.speed == null ? null : this.speed.getOptionalSingle(event).map(Number::floatValue).orElse(null); Float maxPitch = this.maxPitch == null ? null : this.maxPitch.getOptionalSingle(event).map(Number::floatValue).orElse(null); diff --git a/src/main/java/ch/njol/skript/effects/EffPush.java b/src/main/java/ch/njol/skript/effects/EffPush.java index ef407b70bd1..adfe1cf55cc 100644 --- a/src/main/java/ch/njol/skript/effects/EffPush.java +++ b/src/main/java/ch/njol/skript/effects/EffPush.java @@ -14,6 +14,7 @@ import org.bukkit.event.Event; import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Push") @Description("Push entities around.") @@ -50,14 +51,14 @@ protected void execute(Event event) { return; Entity[] entities = this.entities.getArray(event); for (Entity entity : entities) { - Vector pushDirection = direction.getDirection(entity); + Vector3d pushDirection = direction.getDirection(entity); if (speed != null) - pushDirection.normalize().multiply(speed.doubleValue()); - if (!(Double.isFinite(pushDirection.getX()) && Double.isFinite(pushDirection.getY()) && Double.isFinite(pushDirection.getZ()))) { + pushDirection.normalize(speed.doubleValue()); + if (!pushDirection.isFinite()) { // Some component of the mod vector is not finite, so just stop return; } - entity.setVelocity(entity.getVelocity().add(pushDirection)); + entity.setVelocity(entity.getVelocity().add(Vector.fromJOML(pushDirection))); } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprBlocks.java b/src/main/java/ch/njol/skript/expressions/ExprBlocks.java index ae96c454b44..ddb63122a1f 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprBlocks.java +++ b/src/main/java/ch/njol/skript/expressions/ExprBlocks.java @@ -1,16 +1,5 @@ package ch.njol.skript.expressions; -import java.util.Iterator; - -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - -import com.google.common.collect.Lists; - import ch.njol.skript.Skript; import ch.njol.skript.SkriptConfig; import ch.njol.skript.doc.Description; @@ -25,7 +14,17 @@ import ch.njol.skript.util.BlockLineIterator; import ch.njol.skript.util.Direction; import ch.njol.util.Kleenean; +import ch.njol.util.Math2; import ch.njol.util.coll.iterator.ArrayIterator; +import com.google.common.collect.Lists; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; + +import java.util.Iterator; @Name("Blocks") @Description({"Blocks relative to other blocks or between other blocks.", @@ -136,16 +135,16 @@ public Iterator iterator(Event event) { Direction direction = this.direction.getSingle(event); if (direction == null || location.getWorld() == null) return null; - Vector vector = object != location + Vector3d vector = object != location ? direction.getDirection((Block) object) : direction.getDirection(location); // Cannot be zero. - if (vector.getX() == 0 && vector.getY() == 0 && vector.getZ() == 0) + if (Math2.vectorIsZero(vector)) return null; // start block + (max - 1) == max int distance = SkriptConfig.maxTargetBlockDistance.value() - 1; - if (this.direction instanceof ExprDirection) { - Expression numberExpression = ((ExprDirection) this.direction).amount; + if (this.direction instanceof ExprDirection exprDirection) { + Expression numberExpression = exprDirection.amount; if (numberExpression != null) { Number number = numberExpression.getSingle(event); if (number != null) diff --git a/src/main/java/ch/njol/skript/expressions/ExprDirection.java b/src/main/java/ch/njol/skript/expressions/ExprDirection.java index 0e64f2f43f8..d1f99a3c462 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprDirection.java +++ b/src/main/java/ch/njol/skript/expressions/ExprDirection.java @@ -1,13 +1,5 @@ package ch.njol.skript.expressions; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -20,6 +12,13 @@ import ch.njol.skript.util.Direction; import ch.njol.util.Kleenean; import ch.njol.util.Math2; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; /** * @author Peter Güttinger @@ -72,7 +71,7 @@ public class ExprDirection extends SimpleExpression { Expression amount; @Nullable - private Vector direction; + private Vector3d direction; @Nullable private ExprDirection next; @@ -89,11 +88,11 @@ public boolean init(final Expression[] exprs, final int matchedPattern, final amount = (Expression) exprs[0]; switch (matchedPattern) { case 0: - direction = new Vector(byMark[parseResult.mark].getModX(), byMark[parseResult.mark].getModY(), byMark[parseResult.mark].getModZ()); + direction = new Vector3d(byMark[parseResult.mark].getModX(), byMark[parseResult.mark].getModY(), byMark[parseResult.mark].getModZ()); if (exprs[1] != null) { - if (!(exprs[1] instanceof ExprDirection) || ((ExprDirection) exprs[1]).direction == null) + if (!(exprs[1] instanceof ExprDirection exprDirection) || exprDirection.direction == null) return false; - next = (ExprDirection) exprs[1]; + next = exprDirection; } break; case 1: @@ -112,64 +111,64 @@ public boolean init(final Expression[] exprs, final int matchedPattern, final @Override @Nullable - protected Direction[] get(final Event e) { - final Number n = amount != null ? amount.getSingle(e) : 1; - if (n == null) + protected Direction[] get(Event event) { + Number amountNum = this.amount != null ? this.amount.getSingle(event) : 1; + if (amountNum == null) return new Direction[0]; - final double ln = n.doubleValue(); + double length = amountNum.doubleValue(); if (direction != null) { - final Vector v = direction.clone().multiply(ln); + Vector3d v = direction.mul(length, new Vector3d()); ExprDirection d = next; while (d != null) { - final Number n2 = d.amount != null ? d.amount.getSingle(e) : 1; + final Number n2 = d.amount != null ? d.amount.getSingle(event) : 1; if (n2 == null) return new Direction[0]; assert d.direction != null; // checked in init() - v.add(d.direction.clone().multiply(n2.doubleValue())); + v.add(d.direction.mul(n2.doubleValue()), new Vector3d()); d = d.next; } assert v != null; return new Direction[] {new Direction(v)}; } else if (relativeTo != null) { - final Object o = relativeTo.getSingle(e); + final Object o = relativeTo.getSingle(event); if (o == null) return new Direction[0]; if (o instanceof Block) { final BlockFace f = Direction.getFacing((Block) o); if (f == BlockFace.SELF || horizontal && (f == BlockFace.UP || f == BlockFace.DOWN)) return new Direction[] {Direction.ZERO}; - return new Direction[] {new Direction(f, ln)}; + return new Direction[] {new Direction(f, length)}; } else { final Location l = ((Entity) o).getLocation(); if (!horizontal) { if (!facing) { - final Vector v = l.getDirection().normalize().multiply(ln); + Vector3d v = l.getDirection().toVector3d().normalize(length); assert v != null; return new Direction[] {new Direction(v)}; } final double pitch = Direction.pitchToRadians(l.getPitch()); assert pitch >= -Math.PI / 2 && pitch <= Math.PI / 2; if (pitch > Math.PI / 4) - return new Direction[] {new Direction(new double[] {0, ln, 0})}; + return new Direction[] {new Direction(new double[] {0, length, 0})}; if (pitch < -Math.PI / 4) - return new Direction[] {new Direction(new double[] {0, -ln, 0})}; + return new Direction[] {new Direction(new double[] {0, -length, 0})}; } double yaw = Direction.yawToRadians(l.getYaw()); if (horizontal && !facing) { - return new Direction[] {new Direction(new double[] {Math.cos(yaw) * ln, 0, Math.sin(yaw) * ln})}; + return new Direction[] {new Direction(new double[] {Math.cos(yaw) * length, 0, Math.sin(yaw) * length})}; } yaw = Math2.mod(yaw, 2 * Math.PI); if (yaw >= Math.PI / 4 && yaw < 3 * Math.PI / 4) - return new Direction[] {new Direction(new double[] {0, 0, ln})}; + return new Direction[] {new Direction(new double[] {0, 0, length})}; if (yaw >= 3 * Math.PI / 4 && yaw < 5 * Math.PI / 4) - return new Direction[] {new Direction(new double[] {-ln, 0, 0})}; + return new Direction[] {new Direction(new double[] {-length, 0, 0})}; if (yaw >= 5 * Math.PI / 4 && yaw < 7 * Math.PI / 4) - return new Direction[] {new Direction(new double[] {0, 0, -ln})}; + return new Direction[] {new Direction(new double[] {0, 0, -length})}; assert yaw >= 0 && yaw < Math.PI / 4 || yaw >= 7 * Math.PI / 4 && yaw < 2 * Math.PI; - return new Direction[] {new Direction(new double[] {ln, 0, 0})}; + return new Direction[] {new Direction(new double[] {length, 0, 0})}; } } else { - return new Direction[] {new Direction(horizontal ? Direction.IGNORE_PITCH : 0, yaw, ln)}; + return new Direction[] {new Direction(horizontal ? Direction.IGNORE_PITCH : 0, yaw, length)}; } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprFacing.java b/src/main/java/ch/njol/skript/expressions/ExprFacing.java index 6b21e748a7c..deb3523320c 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprFacing.java +++ b/src/main/java/ch/njol/skript/expressions/ExprFacing.java @@ -16,8 +16,8 @@ import org.bukkit.block.data.BlockData; import org.bukkit.entity.LivingEntity; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; /** * @author Peter Güttinger @@ -89,18 +89,18 @@ public void change(final Event e, final @Nullable Object[] delta, final ChangeMo if (b == null) return; BlockData data = b.getBlockData(); - if (data instanceof org.bukkit.block.data.Directional) { - ((org.bukkit.block.data.Directional) data).setFacing(toBlockFace(((Direction) delta[0]).getDirection(b))); + if (data instanceof org.bukkit.block.data.Directional directional) { + directional.setFacing(toBlockFace(((Direction) delta[0]).getDirection(b))); b.setBlockData(data, false); } } - private static BlockFace toBlockFace(final Vector dir) { + private static BlockFace toBlockFace(final Vector3d dir) { // dir.normalize(); BlockFace r = null; double d = Double.MAX_VALUE; for (final BlockFace f : BlockFace.values()) { - final double a = Math.pow(f.getModX() - dir.getX(), 2) + Math.pow(f.getModY() - dir.getY(), 2) + Math.pow(f.getModZ() - dir.getZ(), 2); + final double a = Math.pow(f.getModX() - dir.x(), 2) + Math.pow(f.getModY() - dir.y(), 2) + Math.pow(f.getModZ() - dir.z(), 2); if (a < d) { d = a; r = f; diff --git a/src/main/java/ch/njol/skript/expressions/ExprLocationFromVector.java b/src/main/java/ch/njol/skript/expressions/ExprLocationFromVector.java index d4c2b0545ef..0501613f6c4 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprLocationFromVector.java +++ b/src/main/java/ch/njol/skript/expressions/ExprLocationFromVector.java @@ -1,22 +1,21 @@ package ch.njol.skript.expressions; import ch.njol.skript.Skript; -import ch.njol.skript.lang.ExpressionType; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; - import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.ExpressionType; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.event.Event; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; /** * @author bi0qaw @@ -39,7 +38,7 @@ public class ExprLocationFromVector extends SimpleExpression { } @SuppressWarnings("null") - private Expression vector; + private Expression vector; @SuppressWarnings("null") private Expression world; @@ -53,7 +52,7 @@ public class ExprLocationFromVector extends SimpleExpression { public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { if (exprs.length > 3) hasDirection = true; - vector = (Expression) exprs[0]; + vector = (Expression) exprs[0]; world = (Expression) exprs[1]; if (hasDirection) { yaw = (Expression) exprs[2]; @@ -65,7 +64,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @SuppressWarnings("null") @Override protected Location[] get(Event event) { - Vector vector = this.vector.getSingle(event); + Vector3d vector = this.vector.getSingle(event); World world = this.world.getSingle(event); if (vector == null || world == null) return null; @@ -76,9 +75,9 @@ protected Location[] get(Event event) { Number pitch = this.pitch.getSingle(event); if (yaw == null && pitch == null) break direction; - return CollectionUtils.array(vector.toLocation(world, yaw == null ? 0 : yaw.floatValue(), pitch == null ? 0 : pitch.floatValue())); + return CollectionUtils.array(new Location(world, vector.x, vector.y, vector.z, yaw == null ? 0 : yaw.floatValue(), pitch == null ? 0 : pitch.floatValue())); } - return CollectionUtils.array(vector.toLocation(world)); + return CollectionUtils.array(new Location(world, vector.x, vector.y, vector.z)); } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprLocationVectorOffset.java b/src/main/java/ch/njol/skript/expressions/ExprLocationVectorOffset.java index 1526165ecd7..7730443fedd 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprLocationVectorOffset.java +++ b/src/main/java/ch/njol/skript/expressions/ExprLocationVectorOffset.java @@ -1,10 +1,5 @@ package ch.njol.skript.expressions; -import org.bukkit.Location; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -16,6 +11,10 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.Location; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; /** @@ -37,26 +36,27 @@ public class ExprLocationVectorOffset extends SimpleExpression { private Expression location; @SuppressWarnings("null") - private Expression vectors; + private Expression vectors; @Override @SuppressWarnings({"unchecked", "null"}) public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { location = (Expression) exprs[0]; - vectors = (Expression) exprs[1]; + vectors = (Expression) exprs[1]; return true; } @SuppressWarnings("null") @Override - protected Location[] get(Event e) { - Location l = location.getSingle(e); + protected Location[] get(Event event) { + Location l = location.getSingle(event); if (l == null) return null; Location clone = l.clone(); - for (Vector v : vectors.getArray(e)) - clone.add(v); - return CollectionUtils.array(clone); + Vector3d sum = new Vector3d(); + for (Vector3d v : vectors.getArray(event)) + sum.add(v); + return CollectionUtils.array(clone.add(sum.x, sum.y, sum.z)); } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprMinecartDerailedFlyingVelocity.java b/src/main/java/ch/njol/skript/expressions/ExprMinecartDerailedFlyingVelocity.java index f109a65dc6f..c3e31e1d6f3 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprMinecartDerailedFlyingVelocity.java +++ b/src/main/java/ch/njol/skript/expressions/ExprMinecartDerailedFlyingVelocity.java @@ -1,11 +1,5 @@ package ch.njol.skript.expressions; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Minecart; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -16,16 +10,22 @@ import ch.njol.skript.lang.SkriptParser; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Minecart; +import org.bukkit.event.Event; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Minecart Derailed / Flying Velocity") @Description("The velocity of a minecart as soon as it has been derailed or as soon as it starts flying.") @Examples({"on right click on minecart:", "\tset derailed velocity of event-entity to vector 2, 10, 2"}) @Since("2.5.1") -public class ExprMinecartDerailedFlyingVelocity extends SimplePropertyExpression { +public class ExprMinecartDerailedFlyingVelocity extends SimplePropertyExpression { static { - register(ExprMinecartDerailedFlyingVelocity.class, Vector.class, + register(ExprMinecartDerailedFlyingVelocity.class, Vector3d.class, "[minecart] (1¦derailed|2¦flying) velocity", "entities"); } @@ -39,51 +39,45 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Nullable @Override - public Vector convert(Entity entity) { - if (entity instanceof Minecart) { - Minecart mc = (Minecart) entity; - return flying ? mc.getFlyingVelocityMod() : mc.getDerailedVelocityMod(); - } + public Vector3d convert(Entity entity) { + if (entity instanceof Minecart minecart) + return (flying ? minecart.getFlyingVelocityMod() : minecart.getDerailedVelocityMod()).toVector3d(); return null; } @Nullable @Override public Class[] acceptChange(ChangeMode mode) { - switch (mode) { - case SET: - case ADD: - case REMOVE: - return CollectionUtils.array(Vector.class); - default: - return null; - } + return switch (mode) { + case SET, ADD, REMOVE -> CollectionUtils.array(Vector3d.class); + default -> null; + }; } @Override public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { if (delta != null) { + assert delta[0] != null; + Vector vector = Vector.fromJOML((Vector3d) delta[0]); if (flying) { switch (mode) { case SET: for (Entity entity : getExpr().getArray(e)) { - if (entity instanceof Minecart) - ((Minecart) entity).setFlyingVelocityMod((Vector) delta[0]); + if (entity instanceof Minecart minecart) + minecart.setFlyingVelocityMod(vector); } break; case ADD: for (Entity entity : getExpr().getArray(e)) { - if (entity instanceof Minecart) { - Minecart minecart = (Minecart) entity; - minecart.setFlyingVelocityMod(((Vector) delta[0]).add(minecart.getFlyingVelocityMod())); + if (entity instanceof Minecart minecart) { + minecart.setFlyingVelocityMod(minecart.getFlyingVelocityMod().add(vector)); } } break; case REMOVE: for (Entity entity : getExpr().getArray(e)) { - if (entity instanceof Minecart) { - Minecart minecart = (Minecart) entity; - minecart.setFlyingVelocityMod(((Vector) delta[0]).subtract(minecart.getFlyingVelocityMod())); + if (entity instanceof Minecart minecart) { + minecart.setFlyingVelocityMod(minecart.getFlyingVelocityMod().subtract(vector)); } } break; @@ -94,23 +88,21 @@ public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { switch (mode) { case SET: for (Entity entity : getExpr().getArray(e)) { - if (entity instanceof Minecart) - ((Minecart) entity).setDerailedVelocityMod((Vector) delta[0]); + if (entity instanceof Minecart minecart) + minecart.setDerailedVelocityMod(vector); } break; case ADD: for (Entity entity : getExpr().getArray(e)) { - if (entity instanceof Minecart) { - Minecart minecart = (Minecart) entity; - minecart.setDerailedVelocityMod(((Vector) delta[0]).add(minecart.getDerailedVelocityMod())); + if (entity instanceof Minecart minecart) { + minecart.setDerailedVelocityMod(minecart.getDerailedVelocityMod().add(vector)); } } break; case REMOVE: for (Entity entity : getExpr().getArray(e)) { - if (entity instanceof Minecart) { - Minecart minecart = (Minecart) entity; - minecart.setDerailedVelocityMod(((Vector) delta[0]).subtract(minecart.getDerailedVelocityMod())); + if (entity instanceof Minecart minecart) { + minecart.setDerailedVelocityMod(minecart.getDerailedVelocityMod().subtract(vector)); } } break; @@ -120,16 +112,15 @@ public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { } } } - + @Override - protected String getPropertyName() { - return (flying ? "flying" : "derailed") + " velocity"; + public Class getReturnType() { + return Vector3d.class; } - - + @Override - public Class getReturnType() { - return Vector.class; + protected String getPropertyName() { + return (flying ? "flying" : "derailed") + " velocity"; } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorAngleBetween.java b/src/main/java/ch/njol/skript/expressions/ExprVectorAngleBetween.java index 126260c1abf..490c430d3f0 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorAngleBetween.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorAngleBetween.java @@ -10,10 +10,11 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; +import ch.njol.util.Math2; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Angle Between") @Description("Gets the angle between two vectors.") @@ -29,24 +30,26 @@ public class ExprVectorAngleBetween extends SimpleExpression { } @SuppressWarnings("null") - private Expression first, second; + private Expression first, second; @SuppressWarnings({"unchecked", "null"}) @Override public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - first = (Expression) exprs[0]; - second = (Expression) exprs[1]; + first = (Expression) exprs[0]; + second = (Expression) exprs[1]; return true; } @Override @SuppressWarnings("null") protected Number[] get(Event event) { - Vector first = this.first.getSingle(event); - Vector second = this.second.getSingle(event); + Vector3d first = this.first.getSingle(event); + Vector3d second = this.second.getSingle(event); if (first == null || second == null) return null; - return CollectionUtils.array(first.angle(second) * RAD_TO_DEG); + if (Math2.vectorIsZero(first) || Math2.vectorIsZero(second)) + return CollectionUtils.array(Double.NaN); + return CollectionUtils.array((float) first.angle(second) * RAD_TO_DEG); } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorBetweenLocations.java b/src/main/java/ch/njol/skript/expressions/ExprVectorBetweenLocations.java index fbc7b37165d..10a441f6108 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorBetweenLocations.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorBetweenLocations.java @@ -1,10 +1,5 @@ package ch.njol.skript.expressions; -import org.bukkit.Location; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -16,15 +11,19 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.Location; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Vector Between Locations") @Description("Creates a vector between two locations.") @Examples("set {_v} to vector between {_loc1} and {_loc2}") @Since("2.2-dev28") -public class ExprVectorBetweenLocations extends SimpleExpression { +public class ExprVectorBetweenLocations extends SimpleExpression { static { - Skript.registerExpression(ExprVectorBetweenLocations.class, Vector.class, ExpressionType.COMBINED, + Skript.registerExpression(ExprVectorBetweenLocations.class, Vector3d.class, ExpressionType.COMBINED, "[the] vector (from|between) %location% (to|and) %location%"); } @@ -41,12 +40,12 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @SuppressWarnings("null") - protected Vector[] get(Event event) { + protected Vector3d[] get(Event event) { Location from = this.from.getSingle(event); Location to = this.to.getSingle(event); if (from == null || to == null) return null; - return CollectionUtils.array(new Vector(to.getX() - from.getX(), to.getY() - from.getY(), to.getZ() - from.getZ())); + return CollectionUtils.array(new Vector3d(to.getX() - from.getX(), to.getY() - from.getY(), to.getZ() - from.getZ())); } @Override @@ -54,8 +53,8 @@ public boolean isSingle() { return true; } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorCrossProduct.java b/src/main/java/ch/njol/skript/expressions/ExprVectorCrossProduct.java index 03f7f70b148..2e1b763ae59 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorCrossProduct.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorCrossProduct.java @@ -1,9 +1,5 @@ package ch.njol.skript.expressions; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -15,36 +11,39 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Cross Product") @Description("Gets the cross product between two vectors.") @Examples("send \"%vector 1, 0, 0 cross vector 0, 1, 0%\"") @Since("2.2-dev28") -public class ExprVectorCrossProduct extends SimpleExpression { +public class ExprVectorCrossProduct extends SimpleExpression { static { - Skript.registerExpression(ExprVectorCrossProduct.class, Vector.class, ExpressionType.COMBINED, "%vector% cross %vector%"); + Skript.registerExpression(ExprVectorCrossProduct.class, Vector3d.class, ExpressionType.COMBINED, "%vector% cross %vector%"); } @SuppressWarnings("null") - private Expression first, second; + private Expression first, second; @Override @SuppressWarnings({"unchecked", "null"}) public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - first = (Expression) exprs[0]; - second = (Expression) exprs[1]; + first = (Expression) exprs[0]; + second = (Expression) exprs[1]; return true; } @Override @SuppressWarnings("null") - protected Vector[] get(Event event) { - Vector first = this.first.getSingle(event); - Vector second = this.second.getSingle(event); + protected Vector3d[] get(Event event) { + Vector3d first = this.first.getSingle(event); + Vector3d second = this.second.getSingle(event); if (first == null || second == null) return null; - return CollectionUtils.array(first.clone().crossProduct(second)); + return CollectionUtils.array(first.cross(second, new Vector3d())); } @Override @@ -53,8 +52,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorCylindrical.java b/src/main/java/ch/njol/skript/expressions/ExprVectorCylindrical.java index 3f2a3822aff..6c0b25e6aae 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorCylindrical.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorCylindrical.java @@ -12,8 +12,8 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Cylindrical Shape") @Description("Forms a 'cylindrical shaped' vector using yaw to manipulate the current point.") @@ -23,12 +23,12 @@ "set {_v} to cylindrical vector radius 1, yaw 90, height 2" }) @Since("2.2-dev28") -public class ExprVectorCylindrical extends SimpleExpression { +public class ExprVectorCylindrical extends SimpleExpression { private static final double DEG_TO_RAD = Math.PI / 180; static { - Skript.registerExpression(ExprVectorCylindrical.class, Vector.class, ExpressionType.SIMPLE, + Skript.registerExpression(ExprVectorCylindrical.class, Vector3d.class, ExpressionType.SIMPLE, "[a] [new] cylindrical vector [from|with] [radius] %number%, [yaw] %number%(,[ and]| and) [height] %number%"); } @@ -46,7 +46,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @SuppressWarnings("null") - protected Vector[] get(Event event) { + protected Vector3d[] get(Event event) { Number radius = this.radius.getSingle(event); Number yaw = this.yaw.getSingle(event); Number height = this.height.getSingle(event); @@ -61,8 +61,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override @@ -71,12 +71,12 @@ public String toString(@Nullable Event event, boolean debug) { yaw.toString(event, debug) + " and height " + height.toString(event, debug); } - public static Vector fromCylindricalCoordinates(double radius, double phi, double height) { + public static Vector3d fromCylindricalCoordinates(double radius, double phi, double height) { double r = Math.abs(radius); double p = phi * DEG_TO_RAD; double x = r * Math.cos(p); double z = r * Math.sin(p); - return new Vector(x, height, z); + return new Vector3d(x, height, z); } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorDotProduct.java b/src/main/java/ch/njol/skript/expressions/ExprVectorDotProduct.java index b4a860b0d63..e14cbb5f2a1 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorDotProduct.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorDotProduct.java @@ -1,9 +1,5 @@ package ch.njol.skript.expressions; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -15,6 +11,9 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Dot Product") @Description("Gets the dot product between two vectors.") @@ -27,24 +26,24 @@ public class ExprVectorDotProduct extends SimpleExpression { } @SuppressWarnings("null") - private Expression first, second; + private Expression first, second; @Override @SuppressWarnings({"unchecked", "null"}) public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - first = (Expression) exprs[0]; - second = (Expression) exprs[1]; + first = (Expression) exprs[0]; + second = (Expression) exprs[1]; return true; } @Override @SuppressWarnings("null") protected Number[] get(Event event) { - Vector first = this.first.getSingle(event); - Vector second = this.second.getSingle(event); + Vector3d first = this.first.getSingle(event); + Vector3d second = this.second.getSingle(event); if (first == null || second == null) return null; - return CollectionUtils.array(first.getX() * second.getX() + first.getY() * second.getY() + first.getZ() * second.getZ()); + return CollectionUtils.array(first.dot(second)); } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorFromDirection.java b/src/main/java/ch/njol/skript/expressions/ExprVectorFromDirection.java index 7c02614f8aa..f1bcc09db5b 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorFromDirection.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorFromDirection.java @@ -12,8 +12,8 @@ import ch.njol.skript.util.Direction; import ch.njol.util.Kleenean; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Create from Direction") @Description({ @@ -28,10 +28,10 @@ "set {_v::*} to vectors from north, south, east, and west" }) @Since("2.8.0") -public class ExprVectorFromDirection extends SimpleExpression { +public class ExprVectorFromDirection extends SimpleExpression { static { - Skript.registerExpression(ExprVectorFromDirection.class, Vector.class, ExpressionType.PROPERTY, + Skript.registerExpression(ExprVectorFromDirection.class, Vector3d.class, ExpressionType.PROPERTY, "vector[s] [from] %directions%", "%directions% vector[s]"); } @@ -52,10 +52,10 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @Nullable - protected Vector[] get(Event event) { + protected Vector3d[] get(Event event) { return direction.stream(event) .map(Direction::getDirection) - .toArray(Vector[]::new); + .toArray(Vector3d[]::new); } @Override @@ -64,8 +64,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorFromXYZ.java b/src/main/java/ch/njol/skript/expressions/ExprVectorFromXYZ.java index cfc5d67de21..c976f7ccca8 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorFromXYZ.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorFromXYZ.java @@ -1,9 +1,5 @@ package ch.njol.skript.expressions; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -15,15 +11,18 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Create from XYZ") @Description("Creates a vector from x, y and z values.") @Examples("set {_v} to vector 0, 1, 0") @Since("2.2-dev28") -public class ExprVectorFromXYZ extends SimpleExpression { +public class ExprVectorFromXYZ extends SimpleExpression { static { - Skript.registerExpression(ExprVectorFromXYZ.class, Vector.class, ExpressionType.COMBINED, + Skript.registerExpression(ExprVectorFromXYZ.class, Vector3d.class, ExpressionType.COMBINED, "[a] [new] vector [(from|at|to)] %number%,[ ]%number%(,[ ]| and )%number%"); } @@ -41,13 +40,13 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @SuppressWarnings("null") - protected Vector[] get(Event event) { + protected Vector3d[] get(Event event) { Number x = this.x.getSingle(event); Number y = this.y.getSingle(event); Number z = this.z.getSingle(event); if (x == null || y == null || z == null) return null; - return CollectionUtils.array(new Vector(x.doubleValue(), y.doubleValue(), z.doubleValue())); + return CollectionUtils.array(new Vector3d(x.doubleValue(), y.doubleValue(), z.doubleValue())); } @Override @@ -56,8 +55,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorFromYawAndPitch.java b/src/main/java/ch/njol/skript/expressions/ExprVectorFromYawAndPitch.java index 5bfe334e027..45387a9dee4 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorFromYawAndPitch.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorFromYawAndPitch.java @@ -12,8 +12,8 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import static ch.njol.skript.expressions.ExprYawPitch.fromYawAndPitch; @@ -21,10 +21,10 @@ @Description("Creates a vector from a yaw and pitch value.") @Examples("set {_v} to vector from yaw 45 and pitch 45") @Since("2.2-dev28") -public class ExprVectorFromYawAndPitch extends SimpleExpression { +public class ExprVectorFromYawAndPitch extends SimpleExpression { static { - Skript.registerExpression(ExprVectorFromYawAndPitch.class, Vector.class, ExpressionType.COMBINED, + Skript.registerExpression(ExprVectorFromYawAndPitch.class, Vector3d.class, ExpressionType.COMBINED, "[a] [new] vector (from|with) yaw %number% and pitch %number%", "[a] [new] vector (from|with) pitch %number% and yaw %number%"); } @@ -40,7 +40,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } @Override - protected Vector[] get(Event event) { + protected Vector3d[] get(Event event) { Number skriptYaw = yaw.getSingle(event); Number skriptPitch = pitch.getSingle(event); if (skriptYaw == null || skriptPitch == null) @@ -56,8 +56,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorLength.java b/src/main/java/ch/njol/skript/expressions/ExprVectorLength.java index 6311d02579f..859089f46f4 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorLength.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorLength.java @@ -7,10 +7,11 @@ import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; import ch.njol.skript.lang.Expression; +import ch.njol.util.Math2; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import java.util.function.Function; @@ -23,7 +24,7 @@ "send \"%standard length of {_v}%\"" }) @Since("2.2-dev28") -public class ExprVectorLength extends SimplePropertyExpression { +public class ExprVectorLength extends SimplePropertyExpression { static { register(ExprVectorLength.class, Number.class, "(vector|standard|normal) length[s]", "vectors"); @@ -31,7 +32,7 @@ public class ExprVectorLength extends SimplePropertyExpression { @Override @SuppressWarnings("unused") - public Number convert(Vector vector) { + public Number convert(Vector3d vector) { return vector.length(); } @@ -48,7 +49,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { assert delta != null; double deltaLength = ((Number) delta[0]).doubleValue(); - Function changeFunction; + Function changeFunction; switch (mode) { case REMOVE: deltaLength = -deltaLength; @@ -57,13 +58,11 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { final double finalDeltaLength = deltaLength; final double finalDeltaLengthSquared = deltaLength * deltaLength; changeFunction = vector -> { - if (vector.isZero() || (finalDeltaLength < 0 && vector.lengthSquared() < finalDeltaLengthSquared)) { + if (Math2.vectorIsZero(vector) || (finalDeltaLength < 0 && vector.lengthSquared() < finalDeltaLengthSquared)) { vector.zero(); } else { double newLength = finalDeltaLength + vector.length(); - if (!vector.isNormalized()) - vector.normalize(); - vector.multiply(newLength); + vector.normalize(newLength); } return vector; }; @@ -71,12 +70,10 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { case SET: final double finalDeltaLength1 = deltaLength; changeFunction = vector -> { - if (finalDeltaLength1 < 0 || vector.isZero()) { + if (finalDeltaLength1 < 0 || Math2.vectorIsZero(vector)) { vector.zero(); } else { - if (!vector.isNormalized()) - vector.normalize(); - vector.multiply(finalDeltaLength1); + vector.normalize(finalDeltaLength1); } return vector; }; @@ -85,8 +82,8 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { return; } - //noinspection unchecked,DataFlowIssue - ((Expression) getExpr()).changeInPlace(event, changeFunction); + // noinspection unchecked + ((Expression) getExpr()).changeInPlace(event, changeFunction); } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorNormalize.java b/src/main/java/ch/njol/skript/expressions/ExprVectorNormalize.java index a320b92ddae..5cf4cc25096 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorNormalize.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorNormalize.java @@ -10,43 +10,43 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; +import ch.njol.util.Math2; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Normalized") @Description("Returns the same vector but with length 1.") @Examples("set {_v} to normalized {_v}") @Since("2.2-dev28") -public class ExprVectorNormalize extends SimpleExpression { +public class ExprVectorNormalize extends SimpleExpression { static { - Skript.registerExpression(ExprVectorNormalize.class, Vector.class, ExpressionType.COMBINED, + Skript.registerExpression(ExprVectorNormalize.class, Vector3d.class, ExpressionType.COMBINED, "normalize[d] %vector%", "%vector% normalized"); } @SuppressWarnings("null") - private Expression vector; + private Expression vector; @Override @SuppressWarnings({"unchecked", "null"}) public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - vector = (Expression) exprs[0]; + vector = (Expression) exprs[0]; return true; } @Override @SuppressWarnings("null") - protected Vector[] get(Event event) { - Vector vector = this.vector.getSingle(event); + protected Vector3d[] get(Event event) { + Vector3d vector = this.vector.getSingle(event); if (vector == null) return null; - vector = vector.clone(); - if (!vector.isZero() && !vector.isNormalized()) - vector.normalize(); - return CollectionUtils.array(vector); + if (Math2.vectorIsZero(vector)) + return CollectionUtils.array(new Vector3d()); + return CollectionUtils.array(vector.normalize(new Vector3d())); } @Override @@ -55,8 +55,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorOfLocation.java b/src/main/java/ch/njol/skript/expressions/ExprVectorOfLocation.java index ccb29c5386f..5ec60bd61e9 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorOfLocation.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorOfLocation.java @@ -1,10 +1,5 @@ package ch.njol.skript.expressions; -import org.bukkit.Location; -import org.bukkit.event.Event; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; @@ -16,15 +11,19 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; +import org.bukkit.Location; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Vector from Location") @Description("Creates a vector from a location.") @Examples("set {_v} to vector of {_loc}") @Since("2.2-dev28") -public class ExprVectorOfLocation extends SimpleExpression { +public class ExprVectorOfLocation extends SimpleExpression { static { - Skript.registerExpression(ExprVectorOfLocation.class, Vector.class, ExpressionType.PROPERTY, + Skript.registerExpression(ExprVectorOfLocation.class, Vector3d.class, ExpressionType.PROPERTY, "[the] vector (of|from|to) %location%", "%location%'s vector"); } @@ -41,11 +40,11 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @SuppressWarnings("null") - protected Vector[] get(Event event) { + protected Vector3d[] get(Event event) { Location location = this.location.getSingle(event); if (location == null) return null; - return CollectionUtils.array(location.toVector()); + return CollectionUtils.array(location.toVector().toVector3d()); } @Override @@ -54,8 +53,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorProjection.java b/src/main/java/ch/njol/skript/expressions/ExprVectorProjection.java index 7fff00f8846..0db95cde423 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorProjection.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorProjection.java @@ -11,38 +11,38 @@ import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Vector Projection") @Description("An expression to get the vector projection of two vectors.") @Examples("set {_projection} to vector projection of vector(1, 2, 3) onto vector(4, 4, 4)") @Since("2.8.0") -public class ExprVectorProjection extends SimpleExpression { +public class ExprVectorProjection extends SimpleExpression { static { - Skript.registerExpression(ExprVectorProjection.class, Vector.class, ExpressionType.COMBINED, "[vector] projection [of] %vector% on[to] %vector%"); + Skript.registerExpression(ExprVectorProjection.class, Vector3d.class, ExpressionType.COMBINED, "[vector] projection [of] %vector% on[to] %vector%"); } - private Expression left, right; + private Expression left, right; @Override @SuppressWarnings("unchecked") public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { - this.left = (Expression) exprs[0]; - this.right = (Expression) exprs[1]; + this.left = (Expression) exprs[0]; + this.right = (Expression) exprs[1]; return true; } @Override @Nullable - protected Vector[] get(Event event) { - Vector left = this.left.getOptionalSingle(event).orElse(new Vector()); - Vector right = this.right.getOptionalSingle(event).orElse(new Vector()); + protected Vector3d[] get(Event event) { + Vector3d left = this.left.getOptionalSingle(event).orElse(new Vector3d()); + Vector3d right = this.right.getOptionalSingle(event).orElse(new Vector3d()); double dot = left.dot(right); double length = right.lengthSquared(); double scalar = dot / length; - return new Vector[] {right.clone().multiply(scalar)}; + return new Vector3d[] {right.mul(scalar, new Vector3d())}; } @Override @@ -51,8 +51,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorRandom.java b/src/main/java/ch/njol/skript/expressions/ExprVectorRandom.java index fe8bbd9380a..007539a16ca 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorRandom.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorRandom.java @@ -12,8 +12,8 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import java.util.Random; @@ -21,12 +21,12 @@ @Description("Creates a random unit vector.") @Examples("set {_v} to a random vector") @Since("2.2-dev28, 2.7 (signed components)") -public class ExprVectorRandom extends SimpleExpression { +public class ExprVectorRandom extends SimpleExpression { private static final Random RANDOM = new Random(); static { - Skript.registerExpression(ExprVectorRandom.class, Vector.class, ExpressionType.SIMPLE, "[a] random vector"); + Skript.registerExpression(ExprVectorRandom.class, Vector3d.class, ExpressionType.SIMPLE, "[a] random vector"); } @Override @@ -35,10 +35,10 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } @Override - protected Vector[] get(Event event) { + protected Vector3d[] get(Event event) { // Generating uniform random numbers leads to bias towards the corners of the cube. // Gaussian distribution is radially symmetric, so it avoids this bias. - return CollectionUtils.array(new Vector(RANDOM.nextGaussian(), RANDOM.nextGaussian(), RANDOM.nextGaussian()).normalize()); + return CollectionUtils.array(new Vector3d(RANDOM.nextGaussian(), RANDOM.nextGaussian(), RANDOM.nextGaussian()).normalize()); } @Override @@ -47,8 +47,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorSpherical.java b/src/main/java/ch/njol/skript/expressions/ExprVectorSpherical.java index 877b1c0bd64..85e3215f6ba 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorSpherical.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorSpherical.java @@ -12,8 +12,8 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Vectors - Spherical Shape") @Description("Forms a 'spherical shaped' vector using yaw and pitch to manipulate the current point.") @@ -23,12 +23,12 @@ "set {_v} to spherical vector radius 1, yaw 45, pitch 90" }) @Since("2.2-dev28") -public class ExprVectorSpherical extends SimpleExpression { +public class ExprVectorSpherical extends SimpleExpression { private static final double DEG_TO_RAD = Math.PI / 180; static { - Skript.registerExpression(ExprVectorSpherical.class, Vector.class, ExpressionType.SIMPLE, + Skript.registerExpression(ExprVectorSpherical.class, Vector3d.class, ExpressionType.SIMPLE, "[a] [new] spherical vector [(from|with)] [radius] %number%, [yaw] %number%(,[ and]| and) [pitch] %number%"); } @@ -46,7 +46,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override @SuppressWarnings("null") - protected Vector[] get(Event event) { + protected Vector3d[] get(Event event) { Number radius = this.radius.getSingle(event); Number yaw = this.yaw.getSingle(event); Number pitch = this.pitch.getSingle(event); @@ -62,8 +62,8 @@ public boolean isSingle() { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override @@ -72,7 +72,7 @@ public String toString(@Nullable Event event, boolean debug) { " and pitch" + pitch.toString(event, debug); } - public static Vector fromSphericalCoordinates(double radius, double theta, double phi) { + public static Vector3d fromSphericalCoordinates(double radius, double theta, double phi) { double r = Math.abs(radius); double t = theta * DEG_TO_RAD; double p = phi * DEG_TO_RAD; @@ -80,7 +80,7 @@ public static Vector fromSphericalCoordinates(double radius, double theta, doubl double x = r * sinp * Math.cos(t); double y = r * Math.cos(p); double z = r * sinp * Math.sin(t); - return new Vector(x, y, z); + return new Vector3d(x, y, z); } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprVectorSquaredLength.java b/src/main/java/ch/njol/skript/expressions/ExprVectorSquaredLength.java index 3812f910bd8..7558b1435e2 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprVectorSquaredLength.java +++ b/src/main/java/ch/njol/skript/expressions/ExprVectorSquaredLength.java @@ -1,18 +1,17 @@ package ch.njol.skript.expressions; -import org.bukkit.util.Vector; - import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; import ch.njol.skript.expressions.base.SimplePropertyExpression; +import org.joml.Vector3d; @Name("Vectors - Squared Length") @Description("Gets the squared length of a vector.") @Examples("send \"%squared length of vector 1, 2, 3%\"") @Since("2.2-dev28") -public class ExprVectorSquaredLength extends SimplePropertyExpression { +public class ExprVectorSquaredLength extends SimplePropertyExpression { static { register(ExprVectorSquaredLength.class, Number.class, "squared length[s]", "vectors"); @@ -20,7 +19,7 @@ public class ExprVectorSquaredLength extends SimplePropertyExpression { +public class ExprVelocity extends SimplePropertyExpression { static { - register(ExprVelocity.class, Vector.class, "velocit(y|ies)", "entities"); + register(ExprVelocity.class, Vector3d.class, "velocit(y|ies)", "entities"); } @Override @Nullable - public Vector convert(Entity e) { - return e.getVelocity(); + public Vector3d convert(Entity e) { + return e.getVelocity().toVector3d(); } @Override @@ -37,7 +38,7 @@ public Vector convert(Entity e) { @SuppressWarnings("null") public Class[] acceptChange(ChangeMode mode) { if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET || mode == ChangeMode.DELETE || mode == ChangeMode.RESET)) - return CollectionUtils.array(Vector.class); + return CollectionUtils.array(Vector3d.class); return null; } @@ -45,36 +46,35 @@ public Class[] acceptChange(ChangeMode mode) { @SuppressWarnings("null") public void change(Event e, @Nullable Object[] delta, ChangeMode mode) { assert mode == ChangeMode.DELETE || mode == ChangeMode.RESET || delta != null; + Vector vector = delta == null ? new Vector() : Vector.fromJOML((Vector3d) delta[0]); for (final Entity entity : getExpr().getArray(e)) { if (entity == null) return; switch (mode) { case ADD: - entity.setVelocity(entity.getVelocity().add((Vector) delta[0])); + entity.setVelocity(entity.getVelocity().add(vector)); break; case REMOVE: - entity.setVelocity(entity.getVelocity().subtract((Vector) delta[0])); + entity.setVelocity(entity.getVelocity().subtract(vector)); break; case REMOVE_ALL: break; case DELETE: case RESET: - entity.setVelocity(new Vector()); - break; case SET: - entity.setVelocity((Vector) delta[0]); + entity.setVelocity(vector); } } } @Override - protected String getPropertyName() { - return "velocity"; + public Class getReturnType() { + return Vector3d.class; } @Override - public Class getReturnType() { - return Vector.class; + protected String getPropertyName() { + return "velocity"; } } diff --git a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java index 336009020d1..d3826c6b98a 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java +++ b/src/main/java/ch/njol/skript/expressions/ExprXYZComponent.java @@ -1,7 +1,6 @@ package ch.njol.skript.expressions; import ch.njol.skript.Skript; -import ch.njol.skript.classes.Changer; import ch.njol.skript.classes.Changer.ChangeMode; import ch.njol.skript.classes.Changer.ChangerUtils; import ch.njol.skript.doc.Description; @@ -14,10 +13,10 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Quaternionf; +import org.joml.Vector3d; import java.util.Locale; @@ -67,12 +66,12 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override public @Nullable Number convert(Object object) { - if (object instanceof Vector vector) { + if (object instanceof Vector3d vector) { return switch (axis) { case W -> null; - case X -> vector.getX(); - case Y -> vector.getY(); - case Z -> vector.getZ(); + case X -> vector.x(); + case Y -> vector.y(); + case Z -> vector.z(); }; } else if (object instanceof Quaternionf quaternion) { return switch (axis) { @@ -90,9 +89,9 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye if ((mode == ChangeMode.ADD || mode == ChangeMode.REMOVE || mode == ChangeMode.SET)) { boolean acceptsChange; if (IS_RUNNING_1194) { - acceptsChange = ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class, Quaternionf.class); + acceptsChange = ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector3d.class, Quaternionf.class); } else { - acceptsChange = ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class); + acceptsChange = ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector3d.class); } if (acceptsChange) return CollectionUtils.array(Number.class); @@ -106,11 +105,11 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { final double value = ((Number) delta[0]).doubleValue(); // for covering the edge cases such as an expression that returns a Vector but can only be set to a Quaternions - boolean acceptsVectors = ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector.class); + boolean acceptsVectors = ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Vector3d.class); boolean acceptsQuaternions = ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class); getExpr().changeInPlace(event, object -> { - if (acceptsVectors && object instanceof Vector vector) { + if (acceptsVectors && object instanceof Vector3d vector) { changeVector(vector, axis, value, mode); } else if (acceptsQuaternions && object instanceof Quaternionf quaternion) { changeQuaternion(quaternion, axis, (float) value, mode); @@ -126,7 +125,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { * @param value the value to modify by * @param mode the change mode to determine the modification type */ - private static void changeVector(Vector vector, Axis axis, double value, ChangeMode mode) { + private static void changeVector(Vector3d vector, Axis axis, double value, ChangeMode mode) { if (axis == Axis.W) return; switch (mode) { @@ -135,16 +134,16 @@ private static void changeVector(Vector vector, Axis axis, double value, ChangeM //$FALL-THROUGH$ case ADD: switch (axis) { - case X -> vector.setX(vector.getX() + value); - case Y -> vector.setY(vector.getY() + value); - case Z -> vector.setZ(vector.getZ() + value); + case X -> vector.x += value; + case Y -> vector.y += value; + case Z -> vector.z += value; } break; case SET: switch (axis) { - case X -> vector.setX(value); - case Y -> vector.setY(value); - case Z -> vector.setZ(value); + case X -> vector.x = value; + case Y -> vector.y = value; + case Z -> vector.z = value; } break; default: diff --git a/src/main/java/ch/njol/skript/expressions/ExprYawPitch.java b/src/main/java/ch/njol/skript/expressions/ExprYawPitch.java index b28558338b5..28e472e9964 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprYawPitch.java +++ b/src/main/java/ch/njol/skript/expressions/ExprYawPitch.java @@ -13,9 +13,9 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; @Name("Yaw / Pitch") @Description({ @@ -55,8 +55,8 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye @Override public Float convert(Object object) { - if (object instanceof Entity) { - Location location = ((Entity) object).getLocation(); + if (object instanceof Entity entity) { + Location location = entity.getLocation(); return usesYaw ? normalizeYaw(location.getYaw()) : location.getPitch(); @@ -64,7 +64,7 @@ public Float convert(Object object) { return usesYaw ? normalizeYaw(location.getYaw()) : location.getPitch(); - } else if (object instanceof Vector vector) { + } else if (object instanceof Vector3d vector) { return usesYaw ? skriptYaw((getYaw(vector))) : skriptPitch(getPitch(vector)); @@ -77,16 +77,11 @@ public Class[] acceptChange(ChangeMode mode) { if (Player.class.isAssignableFrom(getExpr().getReturnType()) && !SUPPORTS_PLAYERS) return null; - switch (mode) { - case SET: - case ADD: - case REMOVE: - return CollectionUtils.array(Number.class); - case RESET: - return new Class[0]; - default: - return null; - } + return switch (mode) { + case SET, ADD, REMOVE -> CollectionUtils.array(Number.class); + case RESET -> new Class[0]; + default -> null; + }; } @Override @@ -98,12 +93,12 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) { if (object instanceof Player && !SUPPORTS_PLAYERS) continue; - if (object instanceof Entity) { - changeForEntity((Entity) object, value, mode); - } else if (object instanceof Location) { - changeForLocation(((Location) object), value, mode); - } else if (object instanceof Vector) { - changeForVector(((Vector) object), value, mode); + if (object instanceof Entity entity) { + changeForEntity(entity, value, mode); + } else if (object instanceof Location location) { + changeForLocation(location, value, mode); + } else if (object instanceof Vector3d vector3d) { + changeForVector(vector3d, value, mode); } } } @@ -170,7 +165,7 @@ private void changeForLocation(Location location, float value, ChangeMode mode) } } - private void changeForVector(Vector vector, float value, ChangeMode mode) { + private void changeForVector(Vector3d vector, float value, ChangeMode mode) { float yaw = getYaw(vector); float pitch = getPitch(vector); switch (mode) { @@ -191,8 +186,8 @@ private void changeForVector(Vector vector, float value, ChangeMode mode) { else pitch = fromSkriptPitch(value); } - Vector newVector = fromYawAndPitch(yaw, pitch).multiply(vector.length()); - vector.copy(newVector); + Vector3d newVector = fromYawAndPitch(yaw, pitch).mul(vector.length()); + vector.set(newVector); } private static float normalizeYaw(float yaw) { @@ -212,30 +207,30 @@ protected String getPropertyName() { // TODO Mark as private next version after VectorMath deletion @ApiStatus.Internal - public static Vector fromYawAndPitch(float yaw, float pitch) { + public static Vector3d fromYawAndPitch(float yaw, float pitch) { double y = Math.sin(pitch * DEG_TO_RAD); double div = Math.cos(pitch * DEG_TO_RAD); double x = Math.cos(yaw * DEG_TO_RAD); double z = Math.sin(yaw * DEG_TO_RAD); x *= div; z *= div; - return new Vector(x,y,z); + return new Vector3d(x,y,z); } // TODO Mark as private next version after VectorMath deletion @ApiStatus.Internal - public static float getYaw(Vector vector) { - if (((Double) vector.getX()).equals((double) 0) && ((Double) vector.getZ()).equals((double) 0)){ + public static float getYaw(Vector3d vector) { + if (((Double) vector.x()).equals((double) 0) && ((Double) vector.z()).equals((double) 0)){ return 0; } - return (float) (Math.atan2(vector.getZ(), vector.getX()) * RAD_TO_DEG); + return (float) (Math.atan2(vector.z(), vector.x()) * RAD_TO_DEG); } // TODO Mark as private next version after VectorMath deletion @ApiStatus.Internal - public static float getPitch(Vector vector) { - double xy = Math.sqrt(vector.getX() * vector.getX() + vector.getZ() * vector.getZ()); - return (float) (Math.atan(vector.getY() / xy) * RAD_TO_DEG); + public static float getPitch(Vector3d vector) { + double xy = Math.sqrt(vector.x() * vector.x() + vector.z() * vector.z()); + return (float) (Math.atan(vector.y() / xy) * RAD_TO_DEG); } // TODO Mark as private next version after VectorMath deletion diff --git a/src/main/java/ch/njol/skript/hooks/regions/PreciousStonesHook.java b/src/main/java/ch/njol/skript/hooks/regions/PreciousStonesHook.java index 82e8a318e1e..9b21f30b62d 100644 --- a/src/main/java/ch/njol/skript/hooks/regions/PreciousStonesHook.java +++ b/src/main/java/ch/njol/skript/hooks/regions/PreciousStonesHook.java @@ -1,19 +1,12 @@ package ch.njol.skript.hooks.regions; -import static ch.njol.skript.variables.Variables.yggdrasil; - -import java.io.IOException; -import java.io.NotSerializableException; -import java.io.StreamCorruptedException; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - +import ch.njol.skript.hooks.regions.classes.Region; +import ch.njol.skript.util.AABB; +import ch.njol.yggdrasil.Fields; +import ch.njol.yggdrasil.YggdrasilID; +import net.sacredlabyrinth.Phaed.PreciousStones.PreciousStones; +import net.sacredlabyrinth.Phaed.PreciousStones.field.Field; +import net.sacredlabyrinth.Phaed.PreciousStones.field.FieldFlag; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.OfflinePlayer; @@ -23,13 +16,12 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; -import ch.njol.skript.hooks.regions.classes.Region; -import ch.njol.skript.util.AABB; -import ch.njol.yggdrasil.Fields; -import ch.njol.yggdrasil.YggdrasilID; -import net.sacredlabyrinth.Phaed.PreciousStones.PreciousStones; -import net.sacredlabyrinth.Phaed.PreciousStones.field.Field; -import net.sacredlabyrinth.Phaed.PreciousStones.field.FieldFlag; +import java.io.IOException; +import java.io.NotSerializableException; +import java.io.StreamCorruptedException; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class PreciousStonesHook extends RegionsPlugin { @@ -122,7 +114,7 @@ public Collection getOwners() { @Override public Iterator getBlocks() { final List vectors = field.getCorners(); - return new AABB(Bukkit.getWorld(field.getWorld()), vectors.get(0), vectors.get(7)).iterator(); + return new AABB(Bukkit.getWorld(field.getWorld()), vectors.get(0).toVector3d(), vectors.get(7).toVector3d()).iterator(); } @Override diff --git a/src/main/java/ch/njol/skript/hooks/regions/WorldGuardHook.java b/src/main/java/ch/njol/skript/hooks/regions/WorldGuardHook.java index 7dc975b4acd..5e922abb9b5 100644 --- a/src/main/java/ch/njol/skript/hooks/regions/WorldGuardHook.java +++ b/src/main/java/ch/njol/skript/hooks/regions/WorldGuardHook.java @@ -1,31 +1,11 @@ package ch.njol.skript.hooks.regions; -import java.io.IOException; -import java.io.NotSerializableException; -import java.io.StreamCorruptedException; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.UUID; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.entity.Player; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.Nullable; - import ch.njol.skript.Skript; import ch.njol.skript.hooks.regions.classes.Region; import ch.njol.skript.util.AABB; import ch.njol.skript.variables.Variables; import ch.njol.yggdrasil.Fields; import ch.njol.yggdrasil.YggdrasilID; - import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldguard.WorldGuard; @@ -35,6 +15,19 @@ import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.RegionQuery; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; + +import java.io.IOException; +import java.io.NotSerializableException; +import java.io.StreamCorruptedException; +import java.util.*; public class WorldGuardHook extends RegionsPlugin { @@ -119,8 +112,8 @@ public Collection getOwners() { @Override public Iterator getBlocks() { final BlockVector3 min = region.getMinimumPoint(), max = region.getMaximumPoint(); - return new AABB(world, new Vector(min.getBlockX(), min.getBlockY(), min.getBlockZ()), - new Vector(max.getBlockX(), max.getBlockY(), max.getBlockZ())).iterator(); + return new AABB(world, new Vector3d(min.getBlockX(), min.getBlockY(), min.getBlockZ()), + new Vector3d(max.getBlockX(), max.getBlockY(), max.getBlockZ())).iterator(); } @Override diff --git a/src/main/java/ch/njol/skript/registrations/DefaultClasses.java b/src/main/java/ch/njol/skript/registrations/DefaultClasses.java index 54f6842e44b..ed844bc347f 100644 --- a/src/main/java/ch/njol/skript/registrations/DefaultClasses.java +++ b/src/main/java/ch/njol/skript/registrations/DefaultClasses.java @@ -1,16 +1,15 @@ package ch.njol.skript.registrations; +import ch.njol.skript.classes.ClassInfo; +import ch.njol.skript.util.Color; +import ch.njol.skript.util.Date; +import ch.njol.skript.util.Timespan; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; - -import ch.njol.skript.classes.ClassInfo; -import ch.njol.skript.util.Color; -import ch.njol.skript.util.Date; -import ch.njol.skript.util.Timespan; +import org.joml.Vector3d; // When using these fields, be aware all ClassInfo's must be registered! public class DefaultClasses { @@ -26,7 +25,7 @@ public class DefaultClasses { // Bukkit public static ClassInfo OFFLINE_PLAYER = getClassInfo(OfflinePlayer.class); public static ClassInfo LOCATION = getClassInfo(Location.class); - public static ClassInfo VECTOR = getClassInfo(Vector.class); + public static ClassInfo VECTOR = getClassInfo(Vector3d.class); public static ClassInfo PLAYER = getClassInfo(Player.class); public static ClassInfo WORLD = getClassInfo(World.class); diff --git a/src/main/java/ch/njol/skript/sections/EffSecShoot.java b/src/main/java/ch/njol/skript/sections/EffSecShoot.java index f8ca2d11734..045ce499e3c 100644 --- a/src/main/java/ch/njol/skript/sections/EffSecShoot.java +++ b/src/main/java/ch/njol/skript/sections/EffSecShoot.java @@ -215,7 +215,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye Entity finalProjectile = null; Vector vector; if (shooter instanceof LivingEntity livingShooter) { - vector = finalDirection.getDirection(livingShooter.getLocation()).multiply(finalVelocity.doubleValue()); + vector = Vector.fromJOML(finalDirection.getDirection(livingShooter.getLocation()).mul(finalVelocity.doubleValue())); //noinspection rawtypes Consumer afterSpawn = afterSpawn(event, entityData, livingShooter, vector); Class type = entityData.getType(); @@ -248,7 +248,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye finalProjectile = caseUsage.shootHandler(entityData, livingShooter, shooterLoc, type, vector, afterSpawn); } } else { - vector = finalDirection.getDirection((Location) shooter).multiply(finalVelocity.doubleValue()); + vector = Vector.fromJOML(finalDirection.getDirection((Location) shooter).mul(finalVelocity.doubleValue())); if (trigger != null) { //noinspection unchecked,rawtypes entityData.spawn((Location) shooter, (Consumer) afterSpawn(event, entityData, null, vector)); diff --git a/src/main/java/ch/njol/skript/util/AABB.java b/src/main/java/ch/njol/skript/util/AABB.java index 87a6e09fa2b..ae076533831 100644 --- a/src/main/java/ch/njol/skript/util/AABB.java +++ b/src/main/java/ch/njol/skript/util/AABB.java @@ -1,18 +1,17 @@ package ch.njol.skript.util; -import java.util.Iterator; -import java.util.NoSuchElementException; - +import ch.njol.skript.Skript; import ch.njol.skript.bukkitutil.WorldUtils; +import ch.njol.util.Math2; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; -import ch.njol.skript.Skript; -import ch.njol.util.Math2; +import java.util.Iterator; +import java.util.NoSuchElementException; /** * AABB = Axis-Aligned Bounding Box @@ -22,7 +21,7 @@ public class AABB implements Iterable { final World world; - final Vector lowerBound, upperBound; + final Vector3d lowerBound, upperBound; // private final static Vector EPSILON = new Vector(Skript.EPSILON, Skript.EPSILON, Skript.EPSILON); @@ -31,16 +30,16 @@ public AABB(final Location l1, final Location l2) { if (l1.getWorld() != l2.getWorld()) throw new IllegalArgumentException("Locations must be in the same world"); world = l1.getWorld(); - lowerBound = new Vector(Math.min(l1.getBlockX(), l2.getBlockX()), Math.min(l1.getBlockY(), l2.getBlockY()), Math.min(l1.getBlockZ(), l2.getBlockZ())); - upperBound = new Vector(Math.max(l1.getBlockX(), l2.getBlockX()), Math.max(l1.getBlockY(), l2.getBlockY()), Math.max(l1.getBlockZ(), l2.getBlockZ())); + lowerBound = new Vector3d(Math.min(l1.getBlockX(), l2.getBlockX()), Math.min(l1.getBlockY(), l2.getBlockY()), Math.min(l1.getBlockZ(), l2.getBlockZ())); + upperBound = new Vector3d(Math.max(l1.getBlockX(), l2.getBlockX()), Math.max(l1.getBlockY(), l2.getBlockY()), Math.max(l1.getBlockZ(), l2.getBlockZ())); } public AABB(final Block b1, final Block b2) { if (b1.getWorld() != b2.getWorld()) throw new IllegalArgumentException("Blocks must be in the same world"); world = b1.getWorld(); - lowerBound = new Vector(Math.min(b1.getX(), b2.getX()), Math.min(b1.getY(), b2.getY()), Math.min(b1.getZ(), b2.getZ())); - upperBound = new Vector(Math.max(b1.getX(), b2.getX()), Math.max(b1.getY(), b2.getY()), Math.max(b1.getZ(), b2.getZ())); + lowerBound = new Vector3d(Math.min(b1.getX(), b2.getX()), Math.min(b1.getY(), b2.getY()), Math.min(b1.getZ(), b2.getZ())); + upperBound = new Vector3d(Math.max(b1.getX(), b2.getX()), Math.max(b1.getY(), b2.getY()), Math.max(b1.getZ(), b2.getZ())); } @SuppressWarnings("null") @@ -48,37 +47,37 @@ public AABB(final Location center, final double rX, final double rY, final doubl assert rX >= 0 && rY >= 0 && rZ >= 0 : rX + "," + rY + "," + rY; world = center.getWorld(); int min = WorldUtils.getWorldMinHeight(world); - lowerBound = new Vector(center.getX() - rX, Math.max(center.getY() - rY, min), center.getZ() - rZ); - upperBound = new Vector(center.getX() + rX, Math.min(center.getY() + rY, world.getMaxHeight() - 1), center.getZ() + rZ); + lowerBound = new Vector3d(center.getX() - rX, Math.max(center.getY() - rY, min), center.getZ() - rZ); + upperBound = new Vector3d(center.getX() + rX, Math.min(center.getY() + rY, world.getMaxHeight() - 1), center.getZ() + rZ); } - - public AABB(final World w, final Vector v1, final Vector v2) { + + public AABB(final World w, final Vector3d v1, final Vector3d v2) { world = w; - lowerBound = new Vector(Math.min(v1.getX(), v2.getX()), Math.min(v1.getY(), v2.getY()), Math.min(v1.getZ(), v2.getZ())); - upperBound = new Vector(Math.max(v1.getX(), v2.getX()), Math.max(v1.getY(), v2.getY()), Math.max(v1.getZ(), v2.getZ())); + lowerBound = v1.min(v2, new Vector3d()); + upperBound = v1.max(v2, new Vector3d()); } public AABB(final Chunk c) { world = c.getWorld(); int min = WorldUtils.getWorldMinHeight(world); - lowerBound = c.getBlock(0, min, 0).getLocation().toVector(); - upperBound = c.getBlock(15, world.getMaxHeight() - 1, 15).getLocation().toVector(); + lowerBound = c.getBlock(0, min, 0).getLocation().toVector().toVector3d(); + upperBound = c.getBlock(15, world.getMaxHeight() - 1, 15).getLocation().toVector().toVector3d(); } public boolean contains(final Location l) { if (l.getWorld() != world) return false; - return lowerBound.getX() - Skript.EPSILON < l.getX() && l.getX() < upperBound.getX() + Skript.EPSILON - && lowerBound.getY() - Skript.EPSILON < l.getY() && l.getY() < upperBound.getY() + Skript.EPSILON - && lowerBound.getZ() - Skript.EPSILON < l.getZ() && l.getZ() < upperBound.getZ() + Skript.EPSILON; + return lowerBound.x() - Skript.EPSILON < l.getX() && l.getX() < upperBound.x() + Skript.EPSILON + && lowerBound.y() - Skript.EPSILON < l.getY() && l.getY() < upperBound.y() + Skript.EPSILON + && lowerBound.z() - Skript.EPSILON < l.getZ() && l.getZ() < upperBound.z() + Skript.EPSILON; } public boolean contains(final Block b) { return contains(b.getLocation()) && contains(b.getLocation().add(1, 1, 1)); } - public Vector getDimensions() { - return upperBound.clone().subtract(lowerBound); + public Vector3d getDimensions() { + return upperBound.sub(lowerBound, new Vector3d()); } public World getWorld() { @@ -91,12 +90,12 @@ public World getWorld() { @Override public Iterator iterator() { return new Iterator() { - private final int minX = (int) Math2.ceil(lowerBound.getX()); - private final int minY = (int) Math2.ceil(lowerBound.getY()); - private final int minZ = (int) Math2.ceil(lowerBound.getZ()); - private final int maxX = (int) Math2.floor(upperBound.getX()); - private final int maxY = (int) Math2.floor(upperBound.getY()); - private final int maxZ = (int) Math2.floor(upperBound.getZ()); + private final int minX = (int) Math2.ceil(lowerBound.x()); + private final int minY = (int) Math2.ceil(lowerBound.y()); + private final int minZ = (int) Math2.ceil(lowerBound.z()); + private final int maxX = (int) Math2.floor(upperBound.x()); + private final int maxY = (int) Math2.floor(upperBound.y()); + private final int maxZ = (int) Math2.floor(upperBound.z()); private int x = minX - 1; // next() increases x by one immediately private int y = minY; diff --git a/src/main/java/ch/njol/skript/util/BlockLineIterator.java b/src/main/java/ch/njol/skript/util/BlockLineIterator.java index ff686e01f4e..6c24235bd04 100644 --- a/src/main/java/ch/njol/skript/util/BlockLineIterator.java +++ b/src/main/java/ch/njol/skript/util/BlockLineIterator.java @@ -51,8 +51,8 @@ public BlockLineIterator(@NotNull Block start, @NotNull Block end) { * @param direction direction to travel in * @param distance maximum distance to travel */ - public BlockLineIterator(Location start, @NotNull Vector direction, double distance) { - this(start, start.clone().add(direction.clone().normalize().multiply(distance))); + public BlockLineIterator(Location start, @NotNull Vector3d direction, double distance) { + this(start, start.clone().add(Vector.fromJOML(direction.normalize(distance, new Vector3d())))); } /** @@ -60,7 +60,7 @@ public BlockLineIterator(Location start, @NotNull Vector direction, double dista * @param direction direction to travel in * @param distance maximum distance to travel */ - public BlockLineIterator(@NotNull Block start, Vector direction, double distance) { + public BlockLineIterator(@NotNull Block start, Vector3d direction, double distance) { this(start.getLocation().toCenterLocation(), direction, distance); } diff --git a/src/main/java/ch/njol/skript/util/Direction.java b/src/main/java/ch/njol/skript/util/Direction.java index 69105346198..c3e7653344c 100644 --- a/src/main/java/ch/njol/skript/util/Direction.java +++ b/src/main/java/ch/njol/skript/util/Direction.java @@ -20,6 +20,7 @@ import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import java.io.StreamCorruptedException; import java.lang.reflect.Field; @@ -85,60 +86,60 @@ public Direction(final double pitch, final double yaw, final double length) { } public Direction(final BlockFace f, final double length) { - this(new Vector(f.getModX(), f.getModY(), f.getModZ()).normalize().multiply(length)); + this(new Vector3d(f.getModX(), f.getModY(), f.getModZ()).normalize().mul(length)); } - public Direction(final Vector v) { + public Direction(final Vector3d v) { relative = false; - pitchOrX = v.getX(); - yawOrY = v.getY(); - lengthOrZ = v.getZ(); + pitchOrX = v.x(); + yawOrY = v.y(); + lengthOrZ = v.z(); } public Location getRelative(final Location l) { - return l.clone().add(getDirection(l)); + return l.clone().add(Vector.fromJOML(getDirection(l))); } public Location getRelative(final Entity e) { - return e.getLocation().add(getDirection(e.getLocation())); + return e.getLocation().add(Vector.fromJOML(getDirection(e.getLocation()))); } public Location getRelative(final Block b) { - return b.getLocation().add(getDirection(b)); + return b.getLocation().add(Vector.fromJOML(getDirection(b))); } /* * Used to get a vector from a direction without anything to be relative to. * Any relative directions will be relative to 0 degrees pitch and yaw. */ - public Vector getDirection() { + public Vector3d getDirection() { if (!relative) - return new Vector(pitchOrX, yawOrY, lengthOrZ); + return new Vector3d(pitchOrX, yawOrY, lengthOrZ); return getDirection(0, 0); } - public Vector getDirection(final Location l) { + public Vector3d getDirection(final Location l) { if (!relative) - return new Vector(pitchOrX, yawOrY, lengthOrZ); + return new Vector3d(pitchOrX, yawOrY, lengthOrZ); return getDirection(pitchOrX == IGNORE_PITCH ? 0 : pitchToRadians(l.getPitch()), yawToRadians(l.getYaw())); } - public Vector getDirection(final Entity e) { + public Vector3d getDirection(final Entity e) { return getDirection(e.getLocation()); } - public Vector getDirection(Block b) { + public Vector3d getDirection(Block b) { if (!relative) - return new Vector(pitchOrX, yawOrY, lengthOrZ); + return new Vector3d(pitchOrX, yawOrY, lengthOrZ); BlockFace blockFace = getFacing(b); return getDirection(pitchOrX == IGNORE_PITCH ? 0 : blockFace.getModZ() * Math.PI / 2 /* only up and down have a z mod */, Math.atan2(blockFace.getModZ(), blockFace.getModX())); } - private Vector getDirection(final double p, final double y) { + private Vector3d getDirection(final double p, final double y) { if (pitchOrX == IGNORE_PITCH) - return new Vector(Math.cos(y + yawOrY) * lengthOrZ, 0, Math.sin(y + yawOrY) * lengthOrZ); + return new Vector3d(Math.cos(y + yawOrY) * lengthOrZ, 0, Math.sin(y + yawOrY) * lengthOrZ); final double lxz = Math.cos(p + pitchOrX) * lengthOrZ; - return new Vector(Math.cos(y + yawOrY) * lxz, Math.sin(p + pitchOrX) * Math.cos(yawOrY) * lengthOrZ, Math.sin(y + yawOrY) * lxz); + return new Vector3d(Math.cos(y + yawOrY) * lxz, Math.sin(p + pitchOrX) * Math.cos(yawOrY) * lengthOrZ, Math.sin(y + yawOrY) * lxz); } @Override @@ -231,9 +232,9 @@ public static BlockFace getFacing(final Location l, final boolean horizontal) { return getFacing(yaw, pitch); } - public static BlockFace getFacing(final Vector v, final boolean horizontal) { - final double pitch = horizontal ? 0 : Math.atan2(v.getY(), Math.sqrt(Math.pow(v.getX(), 2) + Math.pow(v.getZ(), 2))); - final double yaw = Math.atan2(v.getZ(), v.getX()); + public static BlockFace getFacing(final Vector3d v, final boolean horizontal) { + final double pitch = horizontal ? 0 : Math.atan2(v.y(), Math.sqrt(Math.pow(v.x(), 2) + Math.pow(v.z(), 2))); + final double yaw = Math.atan2(v.z(), v.x()); return getFacing(yaw, pitch); } @@ -245,7 +246,7 @@ public static Location[] getRelatives(final Block[] blocks, final Direction[] di for (int i = 0; i < blocks.length; i++) { r[i] = blocks[i].getLocation(); for (int j = 0; j < directions.length; j++) { - r[i].add(directions[j].getDirection(blocks[i])); + r[i].add(Vector.fromJOML(directions[j].getDirection(blocks[i]))); } } return r; @@ -259,7 +260,7 @@ public static Location[] getRelatives(final Location[] locations, final Directio for (int i = 0; i < locations.length; i++) { r[i] = locations[i].clone(); for (int j = 0; j < directions.length; j++) { - r[i].add(directions[j].getDirection(locations[i])); + r[i].add(Vector.fromJOML(directions[j].getDirection(locations[i]))); } } return r; @@ -300,10 +301,10 @@ public static String toString(final double[] mod) { return toString(mod, absoluteDirections); } - public static String toString(final Vector dir) { - if (dir.getX() == 0 && dir.getY() == 0 && dir.getZ() == 0) + public static String toString(Vector3d dir) { + if (dir.x() == 0 && dir.y() == 0 && dir.z() == 0) return Language.get("directions.at"); - return toString(new double[] {dir.getX(), dir.getY(), dir.getZ()}, absoluteDirections); + return toString(new double[] {dir.x(), dir.y(), dir.z()}, absoluteDirections); } @SuppressWarnings("null") diff --git a/src/main/java/ch/njol/util/Math2.java b/src/main/java/ch/njol/util/Math2.java index 6029be12027..3994162530e 100644 --- a/src/main/java/ch/njol/util/Math2.java +++ b/src/main/java/ch/njol/util/Math2.java @@ -1,10 +1,8 @@ package ch.njol.util; import ch.njol.skript.Skript; -import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval; import org.jetbrains.annotations.ApiStatus; - -import java.util.Arrays; +import org.joml.Vector3d; /** * This class is not to be used by addons. In the future methods may @@ -163,4 +161,10 @@ public static long multiplyClamped(long x, long y) { return result; } + public static boolean vectorIsZero(Vector3d vector) { + return Math.abs(vector.x) < Skript.EPSILON && + Math.abs(vector.y) < Skript.EPSILON && + Math.abs(vector.z) < Skript.EPSILON; + } + } diff --git a/src/main/java/ch/njol/util/VectorMath.java b/src/main/java/ch/njol/util/VectorMath.java deleted file mode 100644 index 000be2af7bf..00000000000 --- a/src/main/java/ch/njol/util/VectorMath.java +++ /dev/null @@ -1,122 +0,0 @@ -package ch.njol.util; - -import ch.njol.skript.expressions.ExprVectorCylindrical; -import ch.njol.skript.expressions.ExprVectorFromYawAndPitch; -import ch.njol.skript.expressions.ExprVectorSpherical; -import ch.njol.skript.expressions.ExprYawPitch; -import org.bukkit.util.Vector; - -@Deprecated(since = "2.10.0", forRemoval = true) -public final class VectorMath { - - public static final double PI = Math.PI; - public static final double HALF_PI = PI / 2; - public static final double DEG_TO_RAD = Math.PI / 180; - public static final double RAD_TO_DEG = 180 / Math.PI; - - private VectorMath() {} - - public static Vector fromSphericalCoordinates(double radius, double theta, double phi) { - return ExprVectorSpherical.fromSphericalCoordinates(radius, theta, phi); - } - - public static Vector fromCylindricalCoordinates(double radius, double phi, double height) { - return ExprVectorCylindrical.fromCylindricalCoordinates(radius, phi, height); - } - - public static Vector fromYawAndPitch(float yaw, float pitch) { - return ExprYawPitch.fromYawAndPitch(yaw, pitch); - } - - public static float getYaw(Vector vector) { - return ExprYawPitch.getYaw(vector); - } - - public static float getPitch(Vector vector) { - return ExprYawPitch.getPitch(vector); - } - - public static Vector rotX(Vector vector, double angle) { - double sin = Math.sin(angle * DEG_TO_RAD); - double cos = Math.cos(angle * DEG_TO_RAD); - Vector vy = new Vector(0, cos, -sin); - Vector vz = new Vector(0, sin, cos); - Vector clone = vector.clone(); - vector.setY(clone.dot(vy)); - vector.setZ(clone.dot(vz)); - return vector; - } - - public static Vector rotY(Vector vector, double angle) { - double sin = Math.sin(angle * DEG_TO_RAD); - double cos = Math.cos(angle * DEG_TO_RAD); - Vector vx = new Vector(cos, 0, sin); - Vector vz = new Vector(-sin, 0, cos); - Vector clone = vector.clone(); - vector.setX(clone.dot(vx)); - vector.setZ(clone.dot(vz)); - return vector; - } - - public static Vector rotZ(Vector vector, double angle) { - double sin = Math.sin(angle * DEG_TO_RAD); - double cos = Math.cos(angle * DEG_TO_RAD); - Vector vx = new Vector(cos, -sin, 0); - Vector vy = new Vector(sin, cos, 0); - Vector clone = vector.clone(); - vector.setX(clone.dot(vx)); - vector.setY(clone.dot(vy)); - return vector; - } - - public static Vector rot(Vector vector, Vector axis, double angle) { - double sin = Math.sin(angle * DEG_TO_RAD); - double cos = Math.cos(angle * DEG_TO_RAD); - Vector a = axis.clone().normalize(); - double ax = a.getX(); - double ay = a.getY(); - double az = a.getZ(); - Vector rotx = new Vector(cos+ax*ax*(1-cos), ax*ay*(1-cos)-az*sin, ax*az*(1-cos)+ay*sin); - Vector roty = new Vector(ay*ax*(1-cos)+az*sin, cos+ay*ay*(1-cos), ay*az*(1-cos)-ax*sin); - Vector rotz = new Vector(az*ax*(1-cos)-ay*sin, az*ay*(1-cos)+ax*sin, cos+az*az*(1-cos)); - double x = rotx.dot(vector); - double y = roty.dot(vector); - double z = rotz.dot(vector); - vector.setX(x).setY(y).setZ(z); - return vector; - } - - public static float skriptYaw(float yaw) { - return ExprYawPitch.skriptYaw(yaw); - } - - public static float skriptPitch(float pitch) { - return ExprYawPitch.skriptPitch(pitch); - } - - public static float fromSkriptYaw(float yaw) { - return ExprYawPitch.fromSkriptYaw(yaw); - } - - public static float fromSkriptPitch(float pitch) { - return ExprYawPitch.fromSkriptPitch(pitch); - } - - public static float wrapAngleDeg(float angle) { - return ExprVectorFromYawAndPitch.wrapAngleDeg(angle); - } - - public static void copyVector(Vector vector1, Vector vector2) { - vector1.copy(vector2); - } - - /** - * Check whether or not each component of this vector is equal to 0. - *
Replaces {@code Vector#isZero()} since that method was added in spigot 1.19.3 - * @return true if equal to zero, false if at least one component is non-zero - */ - public static boolean isZero(Vector vector) { - return (vector.getX() == 0 && vector.getY() == 0 && vector.getZ() == 0); - } - -} diff --git a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java index 2f28bbca976..e8ab787d3c3 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java +++ b/src/main/java/org/skriptlang/skript/bukkit/displays/generic/ExprDisplayTransformationScaleTranslation.java @@ -13,18 +13,18 @@ import org.bukkit.entity.Display; import org.bukkit.event.Event; import org.bukkit.util.Transformation; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import org.joml.Vector3d; import org.joml.Vector3f; @Name("Display Transformation Scale/Translation") @Description("Returns or changes the transformation scale or translation of displays.") @Examples("set transformation translation of display to vector from -0.5, -0.5, -0.5 # Center the display in the same position as a block") @Since("2.10") -public class ExprDisplayTransformationScaleTranslation extends SimplePropertyExpression { +public class ExprDisplayTransformationScaleTranslation extends SimplePropertyExpression { static { - register(ExprDisplayTransformationScaleTranslation.class, Vector.class, "(display|[display] transformation) (:scale|translation)", "displays"); + register(ExprDisplayTransformationScaleTranslation.class, Vector3d.class, "(display|[display] transformation) (:scale|translation)", "displays"); } private boolean scale; @@ -36,26 +36,26 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye } @Override - public @Nullable Vector convert(Display display) { + public @Nullable Vector3d convert(Display display) { Transformation transformation = display.getTransformation(); - return Vector.fromJOML(scale ? transformation.getScale() : transformation.getTranslation()); + return new Vector3d(scale ? transformation.getScale() : transformation.getTranslation()); } public Class @Nullable [] acceptChange(ChangeMode mode) { return switch (mode) { - case SET, RESET -> CollectionUtils.array(Vector.class); + case SET, RESET -> CollectionUtils.array(Vector3d.class); default -> null; }; } @Override public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { - Vector3f vector = null; - if (mode == ChangeMode.RESET) - vector = scale ? new Vector3f(1F, 1F, 1F) : new Vector3f(0F, 0F, 0F); + Vector3f vector = new Vector3f(); + if (mode == ChangeMode.RESET && scale) + vector.set(1F, 1F, 1F); if (delta != null) - vector = ((Vector) delta[0]).toVector3f(); - if (vector == null || !vector.isFinite()) + vector.set((Vector3d) delta[0]); + if (!vector.isFinite()) return; for (Display display : getExpr().getArray(event)) { Transformation transformation = display.getTransformation(); @@ -70,8 +70,8 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { } @Override - public Class getReturnType() { - return Vector.class; + public Class getReturnType() { + return Vector3d.class; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java index 0fb51b6adca..a5edab5275a 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java @@ -9,13 +9,14 @@ import ch.njol.skript.lang.Expression; import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.util.Kleenean; +import ch.njol.util.Math2; import org.bukkit.entity.Display; import org.bukkit.event.Event; import org.bukkit.util.Transformation; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Quaternionf; +import org.joml.Vector3d; import org.joml.Vector3f; import org.skriptlang.skript.bukkit.misc.rotation.DisplayRotator; import org.skriptlang.skript.bukkit.misc.rotation.QuaternionRotator; @@ -60,7 +61,7 @@ public class EffRotate extends Effect { private Expression toRotate; private @UnknownNullability Expression angle; - private @UnknownNullability Expression vector; + private @UnknownNullability Expression vector; private @UnknownNullability Axis axis; private @UnknownNullability Expression x, y, z; @@ -81,7 +82,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye axis = Axis.valueOf(axisString); } case 2 -> { - vector = (Expression) exprs[1]; + vector = (Expression) exprs[1]; angle = (Expression) exprs[2]; axis = Axis.ARBITRARY; } @@ -134,20 +135,20 @@ protected void execute(Event event) { if (Double.isInfinite(radAngle) || Double.isNaN(radAngle)) return; - Rotator vectorRotator; + Rotator vectorRotator; Rotator quaternionRotator; Rotator displayRotator; if (axis == Axis.ARBITRARY) { // rotate around arbitrary axis - Vector axis = vector.getSingle(event); - if (axis == null || axis.isZero()) + Vector3d axis = vector.getSingle(event); + if (axis == null || Math2.vectorIsZero(axis)) return; axis.normalize(); - Vector3f jomlAxis = axis.toVector3f(); + Vector3f v3fAxis = new Vector3f(axis); vectorRotator = new VectorRotator(Axis.ARBITRARY, axis, radAngle); - quaternionRotator = new QuaternionRotator(Axis.LOCAL_ARBITRARY, jomlAxis, (float) radAngle); - displayRotator = new DisplayRotator(Axis.LOCAL_ARBITRARY, jomlAxis, (float) radAngle); + quaternionRotator = new QuaternionRotator(Axis.LOCAL_ARBITRARY, v3fAxis, (float) radAngle); + displayRotator = new DisplayRotator(Axis.LOCAL_ARBITRARY, v3fAxis, (float) radAngle); } else { vectorRotator = new VectorRotator(axis, radAngle); quaternionRotator = new QuaternionRotator(axis, (float) radAngle); @@ -155,7 +156,7 @@ protected void execute(Event event) { } for (Object object : toRotate.getArray(event)) { - if (object instanceof Vector vectorToRotate) { + if (object instanceof Vector3d vectorToRotate) { vectorRotator.rotate(vectorToRotate); } else if (object instanceof Quaternionf quaternion) { quaternionRotator.rotate(quaternion); diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java index 4b0d130ec77..b179445b290 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprQuaternionAxisAngle.java @@ -13,11 +13,11 @@ import ch.njol.util.Kleenean; import ch.njol.util.coll.CollectionUtils; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import org.joml.AxisAngle4f; import org.joml.Math; import org.joml.Quaternionf; +import org.joml.Vector3d; @Name("Rotation Axis/Angle") @Description({ @@ -53,7 +53,7 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is AxisAngle4f axisAngle = new AxisAngle4f(); axisAngle.set(from); if (isAxis) - return new Vector(axisAngle.x, axisAngle.y, axisAngle.z); + return new Vector3d(axisAngle.x, axisAngle.y, axisAngle.z); return (float) (axisAngle.angle * 180 / Math.PI); } @@ -62,7 +62,7 @@ public boolean init(Expression[] expressions, int matchedPattern, Kleenean is return switch (mode) { case ADD, SET, REMOVE -> { if (Changer.ChangerUtils.acceptsChange(getExpr(), ChangeMode.SET, Quaternionf.class)) - yield CollectionUtils.array(isAxis ? Vector.class : Number.class); + yield CollectionUtils.array(isAxis ? Vector3d.class : Number.class); yield null; } default -> null; @@ -74,10 +74,10 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { assert delta != null; // reset/delete not supported Quaternionf[] quaternions = getExpr().getArray(event); AxisAngle4f axisAngle = new AxisAngle4f(); - if (isAxis && delta[0] instanceof Vector vector) { + if (isAxis && delta[0] instanceof Vector3d vector) { for (Quaternionf quaternion : quaternions) { axisAngle.set(quaternion); - axisAngle.set(axisAngle.angle, (float) vector.getX(), (float) vector.getY(), (float) vector.getZ()); + axisAngle.set(axisAngle.angle, (float) vector.x(), (float) vector.y(), (float) vector.z()); quaternion.set(axisAngle); } } else if (delta[0] instanceof Number number) { @@ -93,7 +93,7 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { @Override public Class getReturnType() { - return isAxis ? Vector.class : Float.class; + return isAxis ? Vector3d.class : Float.class; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java index 3bd938012de..a20236c1bba 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -10,11 +10,12 @@ import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.lang.util.SimpleExpression; import ch.njol.util.Kleenean; +import ch.njol.util.Math2; import org.bukkit.event.Event; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Quaternionf; +import org.joml.Vector3d; import org.joml.Vector3f; import org.skriptlang.skript.bukkit.misc.rotation.NonMutatingQuaternionRotator; import org.skriptlang.skript.bukkit.misc.rotation.NonMutatingVectorRotator; @@ -55,7 +56,7 @@ public class ExprRotate extends SimpleExpression { private Expression toRotate; private @UnknownNullability Expression angle; - private @UnknownNullability Expression vector; + private @UnknownNullability Expression vector; private @UnknownNullability Axis axis; private @UnknownNullability Expression x, y, z; @@ -76,7 +77,7 @@ public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelaye axis = Axis.valueOf(axisString); } case 2 -> { - vector = (Expression) exprs[1]; + vector = (Expression) exprs[1]; angle = (Expression) exprs[2]; axis = Axis.ARBITRARY; } @@ -117,18 +118,18 @@ protected Object[] get(Event event) { if (Double.isInfinite(radAngle) || Double.isNaN(radAngle)) return new Object[0]; - Rotator vectorRotator; + Rotator vectorRotator; Rotator quaternionRotator; if (axis == Axis.ARBITRARY) { // rotate around arbitrary axis - Vector axis = vector.getSingle(event); - if (axis == null || axis.isZero()) + Vector3d axis = vector.getSingle(event); + if (axis == null || Math2.vectorIsZero(axis)) return new Object[0]; axis.normalize(); - Vector3f jomlAxis = axis.toVector3f(); + Vector3f v3fAxis = new Vector3f(axis); vectorRotator = new NonMutatingVectorRotator(Axis.ARBITRARY, axis, radAngle); - quaternionRotator = new NonMutatingQuaternionRotator(Axis.LOCAL_ARBITRARY, jomlAxis, (float) radAngle); + quaternionRotator = new NonMutatingQuaternionRotator(Axis.LOCAL_ARBITRARY, v3fAxis, (float) radAngle); } else { vectorRotator = new NonMutatingVectorRotator(axis, radAngle); quaternionRotator = new NonMutatingQuaternionRotator(axis, (float) radAngle); @@ -136,7 +137,7 @@ protected Object[] get(Event event) { return toRotate.stream(event) .map(object -> { - if (object instanceof Vector vectorToRotate) { + if (object instanceof Vector3d vectorToRotate) { return vectorRotator.rotate(vectorToRotate); } else if (object instanceof Quaternionf quaternion) { return quaternionRotator.rotate(quaternion); @@ -159,7 +160,7 @@ public Class getReturnType() { @Override public Class[] possibleReturnTypes() { - return new Class[]{Quaternionf.class, Vector.class}; + return new Class[]{Quaternionf.class, Vector3d.class}; } @Override diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java index e39c5d179e4..29de7ebc1d4 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/NonMutatingVectorRotator.java @@ -1,42 +1,42 @@ package org.skriptlang.skript.bukkit.misc.rotation; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Contract; +import org.joml.Vector3d; import java.util.function.Function; /** - * Rotates {@link Vector}s around the X, Y, and Z axes, as well as any arbitrary axis. + * Rotates {@link Vector3d}s around the X, Y, and Z axes, as well as any arbitrary axis. * Does not support local axes. * Returns new vector objects rather than mutating the input vector. */ -public class NonMutatingVectorRotator implements Rotator { +public class NonMutatingVectorRotator implements Rotator { - private final Function rotator; + private final Function rotator; public NonMutatingVectorRotator(Axis axis, double angle) { this.rotator = switch (axis) { - case X -> (input) -> input.clone().rotateAroundX(angle); - case Y -> (input) -> input.clone().rotateAroundY(angle); - case Z -> (input) -> input.clone().rotateAroundZ(angle); + case X -> (input) -> input.rotateX(angle, new Vector3d()); + case Y -> (input) -> input.rotateY(angle, new Vector3d()); + case Z -> (input) -> input.rotateZ(angle, new Vector3d()); case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires additional data. Use a different constructor."); case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } - public NonMutatingVectorRotator(Axis axis, Vector vector, double angle) { + public NonMutatingVectorRotator(Axis axis, Vector3d vector, double angle) { this.rotator = switch (axis) { - case X -> (input) -> input.clone().rotateAroundX(angle); - case Y -> (input) -> input.clone().rotateAroundY(angle); - case Z -> (input) -> input.clone().rotateAroundZ(angle); - case ARBITRARY -> (input) -> input.clone().rotateAroundNonUnitAxis(vector, angle); + case X -> (input) -> input.rotateX(angle, new Vector3d()); + case Y -> (input) -> input.rotateY(angle, new Vector3d()); + case Z -> (input) -> input.rotateZ(angle, new Vector3d()); + case ARBITRARY -> (input) -> input.rotateAxis(angle, vector.x, vector.y, vector.z, new Vector3d()); case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } @Override @Contract("_ -> new") - public Vector rotate(Vector input) { + public Vector3d rotate(Vector3d input) { return rotator.apply(input); } diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java index 82760fe0fe2..f4904a8a25d 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/rotation/VectorRotator.java @@ -1,41 +1,41 @@ package org.skriptlang.skript.bukkit.misc.rotation; -import org.bukkit.util.Vector; import org.jetbrains.annotations.Contract; +import org.joml.Vector3d; import java.util.function.Function; /** - * Rotates {@link Vector}s around the X, Y, and Z axes, as well as any arbitrary axis. + * Rotates {@link Vector3d}s around the X, Y, and Z axes, as well as any arbitrary axis. * Does not support local axes. */ -public class VectorRotator implements Rotator { +public class VectorRotator implements Rotator { - private final Function rotator; + private final Function rotator; public VectorRotator(Axis axis, double angle) { this.rotator = switch (axis) { - case X -> (input) -> input.rotateAroundX(angle); - case Y -> (input) -> input.rotateAroundY(angle); - case Z -> (input) -> input.rotateAroundZ(angle); + case X -> (input) -> input.rotateX(angle); + case Y -> (input) -> input.rotateY(angle); + case Z -> (input) -> input.rotateZ(angle); case ARBITRARY -> throw new UnsupportedOperationException("Rotation around the " + axis + " axis requires additional data. Use a different constructor."); case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } - public VectorRotator(Axis axis, Vector vector, double angle) { + public VectorRotator(Axis axis, Vector3d vector, double angle) { this.rotator = switch (axis) { - case X -> (input) -> input.rotateAroundX(angle); - case Y -> (input) -> input.rotateAroundY(angle); - case Z -> (input) -> input.rotateAroundZ(angle); - case ARBITRARY -> (input) -> input.rotateAroundNonUnitAxis(vector, angle); + case X -> (input) -> input.rotateX(angle); + case Y -> (input) -> input.rotateY(angle); + case Z -> (input) -> input.rotateZ(angle); + case ARBITRARY -> (input) -> input.rotateAxis(angle, vector.x, vector.y, vector.z); case LOCAL_ARBITRARY, LOCAL_X, LOCAL_Y, LOCAL_Z -> (input) -> input; }; } @Override @Contract("_ -> param1") - public Vector rotate(Vector input) { + public Vector3d rotate(Vector3d input) { return rotator.apply(input); } From 9d7fd69d74a836bf94a941de59d23c4720cf4c19 Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:21:46 -0700 Subject: [PATCH 2/4] Move vector classinfo --- .../skript/classes/data/BukkitClasses.java | 68 ------------------- .../njol/skript/classes/data/JavaClasses.java | 68 +++++++++++++++++++ 2 files changed, 68 insertions(+), 68 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 7b6e757aeea..7cf2dd598cc 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -58,7 +58,6 @@ import org.bukkit.potion.PotionEffectType; import org.bukkit.util.CachedServerIcon; import org.jetbrains.annotations.Nullable; -import org.joml.Vector3d; import java.io.StreamCorruptedException; import java.util.*; @@ -396,73 +395,6 @@ public Location deserialize(final String s) { }) .cloner(Location::clone)); - Classes.registerClass(new ClassInfo<>(Vector3d.class, "vector") - .user("vectors?") - .name("Vector") - .description("Vector is a collection of numbers. In Minecraft, 3D vectors are used to express velocities of entities.") - .usage("vector(x, y, z)") - .examples("") - .since("2.2-dev23") - .defaultExpression(new EventValueExpression<>(Vector3d.class)) - .parser(new Parser() { - @Override - @Nullable - public Vector3d parse(final String s, final ParseContext context) { - return null; - } - - @Override - public boolean canParse(final ParseContext context) { - return false; - } - - @Override - public String toString(final Vector3d vec, final int flags) { - return "x: " + Skript.toString(vec.x()) + ", y: " + Skript.toString(vec.y()) + ", z: " + Skript.toString(vec.z()); - } - - @Override - public String toVariableNameString(final Vector3d vec) { - return "vector:" + vec.x() + "," + vec.y() + "," + vec.z(); - } - - @Override - public String getDebugMessage(final Vector3d vec) { - return "(" + vec.x() + "," + vec.y() + "," + vec.z() + ")"; - } - }) - .serializer(new Serializer() { - @Override - public Fields serialize(Vector3d o) { - Fields f = new Fields(); - f.putPrimitive("x", o.x()); - f.putPrimitive("y", o.y()); - f.putPrimitive("z", o.z()); - return f; - } - - @Override - public void deserialize(Vector3d o, Fields f) { - assert false; - } - - @Override - public Vector3d deserialize(final Fields f) throws StreamCorruptedException { - return new Vector3d(f.getPrimitive("x", double.class), f.getPrimitive("y", double.class), f.getPrimitive("z", double.class)); - } - - @Override - public boolean mustSyncDeserialization() { - return false; - } - - @Override - protected boolean canBeInstantiated() { - return false; - } - }) - .cloner(Vector3d::new)); - Classes.registerClass(new ClassInfo<>(World.class, "world") .user("worlds?") .name("World") diff --git a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java index d2011548fd9..6ea493dd8c4 100644 --- a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java @@ -18,6 +18,7 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; +import org.joml.Vector3d; import java.io.StreamCorruptedException; import java.util.UUID; @@ -303,6 +304,73 @@ public boolean mustSyncDeserialization() { } })); + Classes.registerClass(new ClassInfo<>(Vector3d.class, "vector") + .user("vectors?") + .name("Vector") + .description("Vector is a collection of numbers. In Minecraft, 3D vectors are used to express velocities of entities.") + .usage("vector(x, y, z)") + .examples("") + .since("2.2-dev23") + .defaultExpression(new EventValueExpression<>(Vector3d.class)) + .parser(new Parser() { + @Override + @Nullable + public Vector3d parse(final String s, final ParseContext context) { + return null; + } + + @Override + public boolean canParse(final ParseContext context) { + return false; + } + + @Override + public String toString(final Vector3d vec, final int flags) { + return "x: " + Skript.toString(vec.x()) + ", y: " + Skript.toString(vec.y()) + ", z: " + Skript.toString(vec.z()); + } + + @Override + public String toVariableNameString(final Vector3d vec) { + return "vector:" + vec.x() + "," + vec.y() + "," + vec.z(); + } + + @Override + public String getDebugMessage(final Vector3d vec) { + return "(" + vec.x() + "," + vec.y() + "," + vec.z() + ")"; + } + }) + .serializer(new Serializer<>() { + @Override + public Fields serialize(Vector3d o) { + Fields f = new Fields(); + f.putPrimitive("x", o.x()); + f.putPrimitive("y", o.y()); + f.putPrimitive("z", o.z()); + return f; + } + + @Override + public void deserialize(Vector3d o, Fields f) { + assert false; + } + + @Override + public Vector3d deserialize(final Fields f) throws StreamCorruptedException { + return new Vector3d(f.getPrimitive("x", double.class), f.getPrimitive("y", double.class), f.getPrimitive("z", double.class)); + } + + @Override + public boolean mustSyncDeserialization() { + return false; + } + + @Override + protected boolean canBeInstantiated() { + return false; + } + }) + .cloner(Vector3d::new)); + // joml type - for display entities if (Skript.classExists("org.joml.Quaternionf")) Classes.registerClass(new ClassInfo<>(Quaternionf.class, "quaternion") From 239793f4cba62a80db29c750150cd548f170fd3e Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:33:09 -0700 Subject: [PATCH 3/4] don't use newer 3f constructor --- src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java | 2 +- .../org/skriptlang/skript/bukkit/misc/effects/EffRotate.java | 2 +- .../skriptlang/skript/bukkit/misc/expressions/ExprRotate.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java index da8b9947536..6b6c74059e3 100644 --- a/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java +++ b/src/main/java/ch/njol/skript/classes/data/DefaultFunctions.java @@ -652,7 +652,7 @@ public Quaternionf[] executeSimple(Object[][] params) { Vector3d v = ((Vector3d) params[1][0]); if (Math2.vectorIsZero(v) || !v.isFinite()) return new Quaternionf[0]; - Vector3f axis = new Vector3f((Vector3d) params[1][0]); + Vector3f axis = new Vector3f((float) v.x, (float) v.y, (float) v.z); return CollectionUtils.array(new Quaternionf(new AxisAngle4f(angle, axis))); } }) diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java index a5edab5275a..8a105cc9e11 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/effects/EffRotate.java @@ -145,7 +145,7 @@ protected void execute(Event event) { if (axis == null || Math2.vectorIsZero(axis)) return; axis.normalize(); - Vector3f v3fAxis = new Vector3f(axis); + Vector3f v3fAxis = new Vector3f((float) axis.x, (float) axis.y, (float) axis.z); vectorRotator = new VectorRotator(Axis.ARBITRARY, axis, radAngle); quaternionRotator = new QuaternionRotator(Axis.LOCAL_ARBITRARY, v3fAxis, (float) radAngle); displayRotator = new DisplayRotator(Axis.LOCAL_ARBITRARY, v3fAxis, (float) radAngle); diff --git a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java index a20236c1bba..e97995ff2ba 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java +++ b/src/main/java/org/skriptlang/skript/bukkit/misc/expressions/ExprRotate.java @@ -127,7 +127,7 @@ protected Object[] get(Event event) { if (axis == null || Math2.vectorIsZero(axis)) return new Object[0]; axis.normalize(); - Vector3f v3fAxis = new Vector3f(axis); + Vector3f v3fAxis = new Vector3f((float) axis.x, (float) axis.y, (float) axis.z); vectorRotator = new NonMutatingVectorRotator(Axis.ARBITRARY, axis, radAngle); quaternionRotator = new NonMutatingQuaternionRotator(Axis.LOCAL_ARBITRARY, v3fAxis, (float) radAngle); } else { From ad3b085a49da689eff504f9fa39effd7215bb94d Mon Sep 17 00:00:00 2001 From: sovdee <10354869+sovdeeth@users.noreply.github.com> Date: Thu, 19 Jun 2025 13:01:14 -0700 Subject: [PATCH 4/4] Requested changes --- .../njol/skript/classes/data/JavaClasses.java | 124 ++++++++++-------- .../njol/skript/expressions/ExprYawPitch.java | 17 +-- src/main/java/ch/njol/util/Math2.java | 9 ++ 3 files changed, 81 insertions(+), 69 deletions(-) diff --git a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java index 6ea493dd8c4..0693e393ecd 100644 --- a/src/main/java/ch/njol/skript/classes/data/JavaClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/JavaClasses.java @@ -16,6 +16,7 @@ import ch.njol.util.StringUtils; import ch.njol.yggdrasil.Fields; import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Quaternionf; import org.joml.Vector3d; @@ -312,63 +313,8 @@ public boolean mustSyncDeserialization() { .examples("") .since("2.2-dev23") .defaultExpression(new EventValueExpression<>(Vector3d.class)) - .parser(new Parser() { - @Override - @Nullable - public Vector3d parse(final String s, final ParseContext context) { - return null; - } - - @Override - public boolean canParse(final ParseContext context) { - return false; - } - - @Override - public String toString(final Vector3d vec, final int flags) { - return "x: " + Skript.toString(vec.x()) + ", y: " + Skript.toString(vec.y()) + ", z: " + Skript.toString(vec.z()); - } - - @Override - public String toVariableNameString(final Vector3d vec) { - return "vector:" + vec.x() + "," + vec.y() + "," + vec.z(); - } - - @Override - public String getDebugMessage(final Vector3d vec) { - return "(" + vec.x() + "," + vec.y() + "," + vec.z() + ")"; - } - }) - .serializer(new Serializer<>() { - @Override - public Fields serialize(Vector3d o) { - Fields f = new Fields(); - f.putPrimitive("x", o.x()); - f.putPrimitive("y", o.y()); - f.putPrimitive("z", o.z()); - return f; - } - - @Override - public void deserialize(Vector3d o, Fields f) { - assert false; - } - - @Override - public Vector3d deserialize(final Fields f) throws StreamCorruptedException { - return new Vector3d(f.getPrimitive("x", double.class), f.getPrimitive("y", double.class), f.getPrimitive("z", double.class)); - } - - @Override - public boolean mustSyncDeserialization() { - return false; - } - - @Override - protected boolean canBeInstantiated() { - return false; - } - }) + .parser(new Vector3dParser()) + .serializer(new Vector3dSerializer()) .cloner(Vector3d::new)); // joml type - for display entities @@ -941,4 +887,68 @@ protected boolean canBeInstantiated() { } + private static class Vector3dParser extends Parser { + + @Override + public @Nullable Vector3d parse(String s, ParseContext context) { + return null; + } + + @Override + public boolean canParse(ParseContext context) { + return false; + } + + @Override + public @NotNull String toString(@NotNull Vector3d vec, int flags) { + return "x: " + Skript.toString(vec.x()) + ", y: " + Skript.toString(vec.y()) + ", z: " + Skript.toString(vec.z()); + } + + @Override + public @NotNull String toVariableNameString(@NotNull Vector3d vec) { + return "vector:" + vec.x() + "," + vec.y() + "," + vec.z(); + } + + @Override + public @NotNull String getDebugMessage(@NotNull Vector3d vec) { + return "(" + vec.x() + "," + vec.y() + "," + vec.z() + ")"; + } + + } + + private static class Vector3dSerializer extends Serializer { + @Override + public Fields serialize(Vector3d vector3d) { + Fields f = new Fields(); + f.putPrimitive("x", vector3d.x()); + f.putPrimitive("y", vector3d.y()); + f.putPrimitive("z", vector3d.z()); + return f; + } + + @Override + public void deserialize(Vector3d o, Fields f) { + assert false; + } + + @Override + public Vector3d deserialize(Fields fields) throws StreamCorruptedException { + return new Vector3d( + fields.getPrimitive("x", double.class), + fields.getPrimitive("y", double.class), + fields.getPrimitive("z", double.class)); + } + + @Override + public boolean mustSyncDeserialization() { + return false; + } + + @Override + protected boolean canBeInstantiated() { + return false; + } + + } + } diff --git a/src/main/java/ch/njol/skript/expressions/ExprYawPitch.java b/src/main/java/ch/njol/skript/expressions/ExprYawPitch.java index 28e472e9964..3041bb4a268 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprYawPitch.java +++ b/src/main/java/ch/njol/skript/expressions/ExprYawPitch.java @@ -217,33 +217,25 @@ public static Vector3d fromYawAndPitch(float yaw, float pitch) { return new Vector3d(x,y,z); } - // TODO Mark as private next version after VectorMath deletion - @ApiStatus.Internal - public static float getYaw(Vector3d vector) { + private static float getYaw(Vector3d vector) { if (((Double) vector.x()).equals((double) 0) && ((Double) vector.z()).equals((double) 0)){ return 0; } return (float) (Math.atan2(vector.z(), vector.x()) * RAD_TO_DEG); } - // TODO Mark as private next version after VectorMath deletion - @ApiStatus.Internal - public static float getPitch(Vector3d vector) { + private static float getPitch(Vector3d vector) { double xy = Math.sqrt(vector.x() * vector.x() + vector.z() * vector.z()); return (float) (Math.atan(vector.y() / xy) * RAD_TO_DEG); } - // TODO Mark as private next version after VectorMath deletion - @ApiStatus.Internal - public static float skriptYaw(float yaw) { + private static float skriptYaw(float yaw) { return yaw < 90 ? yaw + 270 : yaw - 90; } - // TODO Mark as private next version after VectorMath deletion - @ApiStatus.Internal - public static float skriptPitch(float pitch) { + private static float skriptPitch(float pitch) { return -pitch; } @@ -256,4 +248,5 @@ public static float fromSkriptYaw(float yaw) { public static float fromSkriptPitch(float pitch) { return -pitch; } + } diff --git a/src/main/java/ch/njol/util/Math2.java b/src/main/java/ch/njol/util/Math2.java index 3994162530e..4ec9b6fcc47 100644 --- a/src/main/java/ch/njol/util/Math2.java +++ b/src/main/java/ch/njol/util/Math2.java @@ -150,6 +150,11 @@ public static long addClamped(long x, long y) { return result; } + /** + * @param x the first value + * @param y the second value + * @return the product of x and y, or {@link Long#MAX_VALUE}, {@link Long#MIN_VALUE} in case of an overflow/underflow. + */ public static long multiplyClamped(long x, long y) { long result = x * y; long ax = Math.abs(x); @@ -161,6 +166,10 @@ public static long multiplyClamped(long x, long y) { return result; } + /** + * @param vector the vector to check + * @return whether the x, y, and z components of the vector are all within {@link Skript#EPSILON} of 0. + */ public static boolean vectorIsZero(Vector3d vector) { return Math.abs(vector.x) < Skript.EPSILON && Math.abs(vector.y) < Skript.EPSILON &&