From 9498b28fda1ab2dc459e791b713f3b32ce00c708 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sun, 21 Jul 2024 18:09:28 +0200 Subject: [PATCH] Range rework (#2284) * Range rework * Range.Int --- .../arguments/minecraft/ArgumentEntity.java | 6 +- .../minecraft/ArgumentFloatRange.java | 8 +- .../arguments/minecraft/ArgumentIntRange.java | 8 +- .../arguments/minecraft/ArgumentRange.java | 2 +- .../java/net/minestom/server/utils/Range.java | 68 ++++++++++++++ .../server/utils/entity/EntityFinder.java | 18 ++-- .../minestom/server/utils/math/ByteRange.java | 20 ---- .../server/utils/math/DoubleRange.java | 20 ---- .../server/utils/math/FloatRange.java | 19 ---- .../minestom/server/utils/math/IntRange.java | 20 ---- .../minestom/server/utils/math/LongRange.java | 20 ---- .../net/minestom/server/utils/math/Range.java | 93 ------------------- .../server/utils/math/ShortRange.java | 18 ---- .../server/command/ArgumentTypeTest.java | 31 +++---- 14 files changed, 104 insertions(+), 247 deletions(-) create mode 100644 src/main/java/net/minestom/server/utils/Range.java delete mode 100644 src/main/java/net/minestom/server/utils/math/ByteRange.java delete mode 100644 src/main/java/net/minestom/server/utils/math/DoubleRange.java delete mode 100644 src/main/java/net/minestom/server/utils/math/FloatRange.java delete mode 100644 src/main/java/net/minestom/server/utils/math/IntRange.java delete mode 100644 src/main/java/net/minestom/server/utils/math/LongRange.java delete mode 100644 src/main/java/net/minestom/server/utils/math/Range.java delete mode 100644 src/main/java/net/minestom/server/utils/math/ShortRange.java diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentEntity.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentEntity.java index 81156259f..33f3d0214 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentEntity.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentEntity.java @@ -5,10 +5,10 @@ import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.GameMode; +import net.minestom.server.utils.Range; import net.minestom.server.utils.StringUtils; import net.minestom.server.utils.binary.BinaryWriter; import net.minestom.server.utils.entity.EntityFinder; -import net.minestom.server.utils.math.IntRange; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -252,7 +252,7 @@ public class ArgumentEntity extends Argument { break; case "level": try { - final IntRange level = Argument.parse(sender, new ArgumentIntRange(value)); + final Range.Int level = Argument.parse(sender, new ArgumentIntRange(value)); entityFinder.setLevel(level); } catch (ArgumentSyntaxException e) { throw new ArgumentSyntaxException("Invalid level number", input, INVALID_ARGUMENT_VALUE); @@ -260,7 +260,7 @@ public class ArgumentEntity extends Argument { break; case "distance": try { - final IntRange distance = Argument.parse(sender, new ArgumentIntRange(value)); + final Range.Int distance = Argument.parse(sender, new ArgumentIntRange(value)); entityFinder.setDistance(distance); } catch (ArgumentSyntaxException e) { throw new ArgumentSyntaxException("Invalid level number", input, INVALID_ARGUMENT_VALUE); diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentFloatRange.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentFloatRange.java index 7f6ce258a..944492636 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentFloatRange.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentFloatRange.java @@ -1,16 +1,16 @@ package net.minestom.server.command.builder.arguments.minecraft; -import net.minestom.server.utils.math.FloatRange; +import net.minestom.server.utils.Range; /** - * Represents an argument which will give you an {@link FloatRange}. + * Represents an argument which will give you an {@link Range.Float}. *

* Example: ..3, 3.., 5..10, 15 */ -public class ArgumentFloatRange extends ArgumentRange { +public class ArgumentFloatRange extends ArgumentRange { public ArgumentFloatRange(String id) { - super(id, -Float.MAX_VALUE, Float.MAX_VALUE, Float::parseFloat, FloatRange::new); + super(id, -Float.MAX_VALUE, Float.MAX_VALUE, Float::parseFloat, Range.Float::new); } @Override diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentIntRange.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentIntRange.java index 1ea44245e..c531926e2 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentIntRange.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentIntRange.java @@ -1,16 +1,16 @@ package net.minestom.server.command.builder.arguments.minecraft; -import net.minestom.server.utils.math.IntRange; +import net.minestom.server.utils.Range; /** - * Represents an argument which will give you an {@link IntRange}. + * Represents an argument which will give you an {@link Range.Int}. *

* Example: ..3, 3.., 5..10, 15 */ -public class ArgumentIntRange extends ArgumentRange { +public class ArgumentIntRange extends ArgumentRange { public ArgumentIntRange(String id) { - super(id, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer::parseInt, IntRange::new); + super(id, Integer.MIN_VALUE, Integer.MAX_VALUE, Integer::parseInt, Range.Int::new); } @Override diff --git a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentRange.java b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentRange.java index 5f53f6e81..7ca9fe4a4 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentRange.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/minecraft/ArgumentRange.java @@ -3,7 +3,7 @@ package net.minestom.server.command.builder.arguments.minecraft; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.arguments.Argument; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; -import net.minestom.server.utils.math.Range; +import net.minestom.server.utils.Range; import org.jetbrains.annotations.NotNull; import java.util.function.BiFunction; diff --git a/src/main/java/net/minestom/server/utils/Range.java b/src/main/java/net/minestom/server/utils/Range.java new file mode 100644 index 000000000..8c66eb2bc --- /dev/null +++ b/src/main/java/net/minestom/server/utils/Range.java @@ -0,0 +1,68 @@ +package net.minestom.server.utils; + +/** + * Represents the base for any data type that is numeric. + * + * @param The type numeric of the range object. + */ +public sealed interface Range { + record Byte(byte min, byte max) implements Range { + public Byte(byte value) { + this(value, value); + } + + public boolean inRange(byte value) { + return value >= min && value <= max; + } + } + + record Short(short min, short max) implements Range { + public Short(short value) { + this(value, value); + } + + public boolean inRange(short value) { + return value >= min && value <= max; + } + } + + record Int(int min, int max) implements Range { + public Int(int value) { + this(value, value); + } + + public boolean inRange(int value) { + return value >= min && value <= max; + } + } + + record Long(long min, long max) implements Range { + public Long(long value) { + this(value, value); + } + + public boolean inRange(long value) { + return value >= min && value <= max; + } + } + + record Float(float min, float max) implements Range { + public Float(float value) { + this(value, value); + } + + public boolean inRange(float value) { + return value >= min && value <= max; + } + } + + record Double(double min, double max) implements Range { + public Double(double value) { + this(value, value); + } + + public boolean inRange(double value) { + return value >= min && value <= max; + } + } +} diff --git a/src/main/java/net/minestom/server/utils/entity/EntityFinder.java b/src/main/java/net/minestom/server/utils/entity/EntityFinder.java index f319f8d88..82c1ea210 100644 --- a/src/main/java/net/minestom/server/utils/entity/EntityFinder.java +++ b/src/main/java/net/minestom/server/utils/entity/EntityFinder.java @@ -13,7 +13,7 @@ import net.minestom.server.entity.Player; import net.minestom.server.instance.Instance; import net.minestom.server.network.ConnectionManager; import net.minestom.server.utils.MathUtils; -import net.minestom.server.utils.math.IntRange; +import net.minestom.server.utils.Range; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -37,7 +37,7 @@ public class EntityFinder { // Position private Point startPosition; private Float dx, dy, dz; - private IntRange distance; + private Range.Int distance; // By traits private Integer limit; @@ -50,7 +50,7 @@ public class EntityFinder { // Players specific private final ToggleableMap gameModes = new ToggleableMap<>(); - private IntRange level; + private Range.Int level; public EntityFinder setTargetSelector(@NotNull TargetSelector targetSelector) { this.targetSelector = targetSelector; @@ -67,7 +67,7 @@ public class EntityFinder { return this; } - public EntityFinder setDistance(@NotNull IntRange distance) { + public EntityFinder setDistance(@NotNull Range.Int distance) { this.distance = distance; return this; } @@ -77,7 +77,7 @@ public class EntityFinder { return this; } - public EntityFinder setLevel(@NotNull IntRange level) { + public EntityFinder setLevel(@NotNull Range.Int level) { this.level = level; return this; } @@ -148,8 +148,8 @@ public class EntityFinder { // Distance argument if (distance != null) { - final int minDistance = distance.getMinimum(); - final int maxDistance = distance.getMaximum(); + final int minDistance = distance.min(); + final int maxDistance = distance.max(); result = result.stream() .filter(entity -> MathUtils.isBetween(entity.getPosition().distanceSquared(pos), minDistance * minDistance, maxDistance * maxDistance)) .toList(); @@ -195,8 +195,8 @@ public class EntityFinder { // Level if (level != null) { - final int minLevel = level.getMinimum(); - final int maxLevel = level.getMaximum(); + final int minLevel = level.min(); + final int maxLevel = level.max(); result = result.stream() .filter(Player.class::isInstance) .filter(entity -> MathUtils.isBetween(((Player) entity).getLevel(), minLevel, maxLevel)) diff --git a/src/main/java/net/minestom/server/utils/math/ByteRange.java b/src/main/java/net/minestom/server/utils/math/ByteRange.java deleted file mode 100644 index 8509d4037..000000000 --- a/src/main/java/net/minestom/server/utils/math/ByteRange.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.minestom.server.utils.math; - -public class ByteRange extends Range { - - public ByteRange(Byte minimum, Byte maximum) { - super(minimum, maximum); - } - - public ByteRange(Byte value) { - super(value); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isInRange(Byte value) { - return value >= this.getMinimum() && value <= this.getMaximum(); - } -} diff --git a/src/main/java/net/minestom/server/utils/math/DoubleRange.java b/src/main/java/net/minestom/server/utils/math/DoubleRange.java deleted file mode 100644 index e117737ce..000000000 --- a/src/main/java/net/minestom/server/utils/math/DoubleRange.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.minestom.server.utils.math; - -public class DoubleRange extends Range { - - public DoubleRange(Double minimum, Double maximum) { - super(minimum, maximum); - } - - public DoubleRange(Double value) { - super(value); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isInRange(Double value) { - return value >= this.getMinimum() && value <= this.getMaximum(); - } -} diff --git a/src/main/java/net/minestom/server/utils/math/FloatRange.java b/src/main/java/net/minestom/server/utils/math/FloatRange.java deleted file mode 100644 index 47a1fa972..000000000 --- a/src/main/java/net/minestom/server/utils/math/FloatRange.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.minestom.server.utils.math; - -public class FloatRange extends Range { - - public FloatRange(Float minimum, Float maximum) { - super(minimum, maximum); - } - - public FloatRange(Float value) { - super(value); - } - - /** {@inheritDoc} */ - @Override - public boolean isInRange(Float value) { - return value >= this.getMinimum() && value <= this.getMaximum(); - - } -} diff --git a/src/main/java/net/minestom/server/utils/math/IntRange.java b/src/main/java/net/minestom/server/utils/math/IntRange.java deleted file mode 100644 index b06414b7d..000000000 --- a/src/main/java/net/minestom/server/utils/math/IntRange.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.minestom.server.utils.math; - -public class IntRange extends Range { - - public IntRange(Integer minimum, Integer maximum) { - super(minimum, maximum); - } - - public IntRange(Integer value) { - super(value); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isInRange(Integer value) { - return value >= this.getMinimum() && value <= this.getMaximum(); - } -} diff --git a/src/main/java/net/minestom/server/utils/math/LongRange.java b/src/main/java/net/minestom/server/utils/math/LongRange.java deleted file mode 100644 index 459a24011..000000000 --- a/src/main/java/net/minestom/server/utils/math/LongRange.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.minestom.server.utils.math; - -public class LongRange extends Range { - - public LongRange(Long minimum, Long maximum) { - super(minimum, maximum); - } - - public LongRange(Long value) { - super(value); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean isInRange(Long value) { - return value >= this.getMinimum() && value <= this.getMaximum(); - } -} diff --git a/src/main/java/net/minestom/server/utils/math/Range.java b/src/main/java/net/minestom/server/utils/math/Range.java deleted file mode 100644 index 3c27a998d..000000000 --- a/src/main/java/net/minestom/server/utils/math/Range.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minestom.server.utils.math; - -import java.util.Objects; - -/** - * Represents the base for any data type that is numeric. - * - * @param The type numeric of the range object. - */ -public abstract class Range { - - private T minimum; - private T maximum; - - /** - * Constructs a new {@link Range} with a {@code minimum} and a {@code maximum} value. - * - * @param minimum The minimum of the range. - * @param maximum The maximum of the range. - */ - public Range(T minimum, T maximum) { - this.minimum = minimum; - this.maximum = maximum; - } - - /** - * Constructs a new {@link Range} with the {@code value}. - * - * @param value The value of the range. - */ - public Range(T value) { - this(value, value); - } - - /** - * Retrieves the minimum value of the range. - * - * @return The range's minimum value. - */ - public T getMinimum() { - return this.minimum; - } - - /** - * Changes the minimum value of the range. - * - * @param minimum The new minimum value. - */ - public void setMinimum(T minimum) { - this.minimum = minimum; - } - - /** - * Retrieves the maximum value of the range. - * - * @return The range's maximum value. - */ - public T getMaximum() { - return this.maximum; - } - - /** - * Changes the maximum value of the range. - * - * @param maximum The new maximum value. - */ - public void setMaximum(T maximum) { - this.maximum = maximum; - } - - /** - * Whether the given {@code value} is in range of the minimum and the maximum. - * - * @param value The value to be checked. - * @return {@code true} if the value in the range of {@code minimum} and {@code maximum}, - * otherwise {@code false}. - */ - public abstract boolean isInRange(T value); - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Range range = (Range) o; - return Objects.equals(minimum, range.minimum) && Objects.equals(maximum, range.maximum); - } - - @Override - public int hashCode() { - return Objects.hash(minimum, maximum); - } - -} diff --git a/src/main/java/net/minestom/server/utils/math/ShortRange.java b/src/main/java/net/minestom/server/utils/math/ShortRange.java deleted file mode 100644 index 725212894..000000000 --- a/src/main/java/net/minestom/server/utils/math/ShortRange.java +++ /dev/null @@ -1,18 +0,0 @@ -package net.minestom.server.utils.math; - -public class ShortRange extends Range { - - public ShortRange(Short minimum, Short maximum) { - super(minimum, maximum); - } - - public ShortRange(Short value) { - super(value); - } - - /** {@inheritDoc} */ - @Override - public boolean isInRange(Short value) { - return value >= this.getMinimum() && value <= this.getMaximum(); - } -} diff --git a/src/test/java/net/minestom/server/command/ArgumentTypeTest.java b/src/test/java/net/minestom/server/command/ArgumentTypeTest.java index 7bbdfa6b3..a41e60259 100644 --- a/src/test/java/net/minestom/server/command/ArgumentTypeTest.java +++ b/src/test/java/net/minestom/server/command/ArgumentTypeTest.java @@ -23,9 +23,8 @@ import net.minestom.server.item.Material; import net.minestom.server.item.component.CustomData; import net.minestom.server.particle.Particle; import net.minestom.server.tag.Tag; +import net.minestom.server.utils.Range; import net.minestom.server.utils.location.RelativeVec; -import net.minestom.server.utils.math.FloatRange; -import net.minestom.server.utils.math.IntRange; import net.minestom.server.utils.time.TimeUnit; import org.junit.jupiter.api.Test; @@ -129,14 +128,14 @@ public class ArgumentTypeTest { @Test public void testArgumentFloatRange() { var arg = ArgumentType.FloatRange("float_range"); - assertArg(arg, new FloatRange(0f, 50f), "0..50"); - assertArg(arg, new FloatRange(0f, 0f), "0..0"); - assertArg(arg, new FloatRange(-50f, 0f), "-50..0"); - assertArg(arg, new FloatRange(-Float.MAX_VALUE, 50f), "..50"); - assertArg(arg, new FloatRange(0f, Float.MAX_VALUE), "0.."); - assertArg(arg, new FloatRange(-Float.MAX_VALUE, Float.MAX_VALUE), "-3.4028235E38..3.4028235E38"); - assertArg(arg, new FloatRange(0.5f, 24f), "0.5..24"); - assertArg(arg, new FloatRange(12f, 45.6f), "12..45.6"); + assertArg(arg, new Range.Float(0f, 50f), "0..50"); + assertArg(arg, new Range.Float(0f, 0f), "0..0"); + assertArg(arg, new Range.Float(-50f, 0f), "-50..0"); + assertArg(arg, new Range.Float(-Float.MAX_VALUE, 50f), "..50"); + assertArg(arg, new Range.Float(0f, Float.MAX_VALUE), "0.."); + assertArg(arg, new Range.Float(-Float.MAX_VALUE, Float.MAX_VALUE), "-3.4028235E38..3.4028235E38"); + assertArg(arg, new Range.Float(0.5f, 24f), "0.5..24"); + assertArg(arg, new Range.Float(12f, 45.6f), "12..45.6"); assertInvalidArg(arg, ".."); assertInvalidArg(arg, "0..50.."); } @@ -145,12 +144,12 @@ public class ArgumentTypeTest { public void testArgumentIntRange() { var arg = ArgumentType.IntRange("int_range"); - assertArg(arg, new IntRange(0, 50), "0..50"); - assertArg(arg, new IntRange(0, 0), "0..0"); - assertArg(arg, new IntRange(-50, 0), "-50..0"); - assertArg(arg, new IntRange(Integer.MIN_VALUE, 50), "..50"); - assertArg(arg, new IntRange(0, Integer.MAX_VALUE), "0.."); - assertArg(arg, new IntRange(Integer.MIN_VALUE, Integer.MAX_VALUE), "-2147483648..2147483647"); + assertArg(arg, new Range.Int(0, 50), "0..50"); + assertArg(arg, new Range.Int(0, 0), "0..0"); + assertArg(arg, new Range.Int(-50, 0), "-50..0"); + assertArg(arg, new Range.Int(Integer.MIN_VALUE, 50), "..50"); + assertArg(arg, new Range.Int(0, Integer.MAX_VALUE), "0.."); + assertArg(arg, new Range.Int(Integer.MIN_VALUE, Integer.MAX_VALUE), "-2147483648..2147483647"); assertInvalidArg(arg, ".."); assertInvalidArg(arg, "-2147483649..2147483647");