Skip to content

Commit

Permalink
Adds checks to not normalize zero vectors (#6642)
Browse files Browse the repository at this point in the history
* Adds checks to not normalize zero vectors

* Make custom isZero method to support pre 1.19.3 versions

* Check isZero before lengthSquared

* Add a regression test

* Fix assert statements

---------

Co-authored-by: Moderocky <[email protected]>
  • Loading branch information
Phill310 and Moderocky authored May 31, 2024
1 parent 4983d9c commit ece9312
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package ch.njol.skript.expressions;

import ch.njol.util.VectorMath;
import org.bukkit.event.Event;
import org.bukkit.util.Vector;
import org.eclipse.jdt.annotation.Nullable;
Expand Down Expand Up @@ -70,7 +71,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) {
//$FALL-THROUGH$
case ADD:
for (Vector vector : vectors) {
if (deltaLength < 0 && vector.lengthSquared() < deltaLength * deltaLength) {
if (VectorMath.isZero(vector) || (deltaLength < 0 && vector.lengthSquared() < deltaLength * deltaLength)) {
vector.zero();
} else {
double newLength = deltaLength + vector.length();
Expand All @@ -82,7 +83,7 @@ public void change(Event event, @Nullable Object[] delta, ChangeMode mode) {
break;
case SET:
for (Vector vector : vectors) {
if (deltaLength < 0) {
if (deltaLength < 0 || VectorMath.isZero(vector)) {
vector.zero();
} else {
if (!vector.isNormalized())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/
package ch.njol.skript.expressions;

import ch.njol.util.VectorMath;
import org.bukkit.event.Event;
import org.bukkit.util.Vector;
import org.eclipse.jdt.annotation.Nullable;
Expand Down Expand Up @@ -63,7 +64,7 @@ protected Vector[] get(Event event) {
if (vector == null)
return null;
vector = vector.clone();
if (!vector.isNormalized())
if (!VectorMath.isZero(vector) && !vector.isNormalized())
vector.normalize();
return CollectionUtils.array(vector);
}
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/ch/njol/util/VectorMath.java
Original file line number Diff line number Diff line change
Expand Up @@ -198,4 +198,13 @@ public static void copyVector(Vector vector1, Vector vector2) {
vector1.setX(vector2.getX()).setY(vector2.getY()).setZ(vector2.getZ());
}

/**
* Check whether or not each component of this vector is equal to 0.
* <br>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);
}

}
9 changes: 9 additions & 0 deletions src/test/skript/tests/regressions/6194-vectors + push.sk
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
test "normalize zero vector":
set {_vector} to vector(0,0,0)
add 1 to vector length of {_vector}
assert {_vector} is vector(0,0,0) with "add to zero vector's length failed"

set vector length of {_vector} to 1
assert {_vector} is vector(0,0,0) with "set zero vector's length failed"

assert normalize {_vector} is vector(0,0,0) with "normalize zero vector failed"

0 comments on commit ece9312

Please sign in to comment.