diff --git a/paper-api/src/main/java/org/bukkit/util/Vector.java b/paper-api/src/main/java/org/bukkit/util/Vector.java index 58d4ddbeec..143579bb30 100644 --- a/paper-api/src/main/java/org/bukkit/util/Vector.java +++ b/paper-api/src/main/java/org/bukkit/util/Vector.java @@ -1,6 +1,7 @@ package org.bukkit.util; import com.google.common.base.Preconditions; +import com.google.common.primitives.Doubles; import java.util.LinkedHashMap; import java.util.Map; import java.util.Random; @@ -202,7 +203,7 @@ public class Vector implements Cloneable, ConfigurationSerializable { * @return angle in radians */ public float angle(@NotNull Vector other) { - double dot = dot(other) / (length() * other.length()); + double dot = Doubles.constrainToRange(dot(other) / (length() * other.length()), -1.0, 1.0); return (float) Math.acos(dot); } diff --git a/paper-api/src/test/java/org/bukkit/util/VectorTest.java b/paper-api/src/test/java/org/bukkit/util/VectorTest.java index 05ddb8762d..9b846deba8 100644 --- a/paper-api/src/test/java/org/bukkit/util/VectorTest.java +++ b/paper-api/src/test/java/org/bukkit/util/VectorTest.java @@ -114,4 +114,12 @@ public class VectorTest { assertEquals(a, v.angle(axis), Vector.getEpsilon()); } } + + @Test + public void testSmallAngle() { + Vector a = new Vector(-0.13154885489775203, 0.0, 0.12210868381700482); + Vector b = new Vector(-0.7329152226448059, -0.0, 0.6803199648857117); + + assertTrue(Double.isFinite(a.angle(b))); + } }