diff --git a/src/main/java/net/minestom/server/collision/BoundingBox.java b/src/main/java/net/minestom/server/collision/BoundingBox.java index 821338d3c..e426da90b 100644 --- a/src/main/java/net/minestom/server/collision/BoundingBox.java +++ b/src/main/java/net/minestom/server/collision/BoundingBox.java @@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull; public class BoundingBox { private final Entity entity; - private final float x, y, z; + private final double x, y, z; /** * Creates a {@link BoundingBox} linked to an {@link Entity} and with a specific size. @@ -22,7 +22,7 @@ public class BoundingBox { * @param y the height size * @param z the depth size */ - public BoundingBox(@NotNull Entity entity, float x, float y, float z) { + public BoundingBox(@NotNull Entity entity, double x, double y, double z) { this.entity = entity; this.x = x; this.y = y; @@ -59,30 +59,30 @@ public class BoundingBox { */ public boolean intersect(@NotNull BlockPosition blockPosition) { - final float offsetX = 1; - final float x = blockPosition.getX(); - final float maxX = x + offsetX; + final double offsetX = 1; + final double x = blockPosition.getX(); + final double maxX = x + offsetX; final boolean checkX = getMinX() < maxX && getMaxX() > x; if (!checkX) return false; - final float y = blockPosition.getY(); - final float maxY = y + 0.99999f; + final double y = blockPosition.getY(); + final double maxY = y + 0.99999; final boolean checkY = getMinY() < maxY && getMaxY() > y; if (!checkY) return false; - final float offsetZ = 1; - final float z = blockPosition.getZ(); - final float maxZ = z + offsetZ; + final double offsetZ = 1; + final double z = blockPosition.getZ(); + final double maxZ = z + offsetZ; // Z check return getMinZ() < maxZ && getMaxZ() > z; } - public boolean intersect(float x, float y, float z) { + public boolean intersect(double x, double y, double z) { return (x >= getMinX() && x <= getMaxX()) && (y >= getMinY() && y <= getMaxY()) && (z >= getMinZ() && z <= getMaxZ()); @@ -101,7 +101,7 @@ public class BoundingBox { * @return a new {@link BoundingBox} expanded */ @NotNull - public BoundingBox expand(float x, float y, float z) { + public BoundingBox expand(double x, double y, double z) { return new BoundingBox(entity, this.x + x, this.y + y, this.z + z); } @@ -114,7 +114,7 @@ public class BoundingBox { * @return a new bounding box contracted */ @NotNull - public BoundingBox contract(float x, float y, float z) { + public BoundingBox contract(double x, double y, double z) { return new BoundingBox(entity, this.x - x, this.y - y, this.z - z); } @@ -123,7 +123,7 @@ public class BoundingBox { * * @return the width */ - public float getWidth() { + public double getWidth() { return x; } @@ -132,7 +132,7 @@ public class BoundingBox { * * @return the height */ - public float getHeight() { + public double getHeight() { return y; } @@ -141,7 +141,7 @@ public class BoundingBox { * * @return the depth */ - public float getDepth() { + public double getDepth() { return z; } @@ -150,7 +150,7 @@ public class BoundingBox { * * @return the min X */ - public float getMinX() { + public double getMinX() { return entity.getPosition().getX() - (x / 2); } @@ -159,7 +159,7 @@ public class BoundingBox { * * @return the max X */ - public float getMaxX() { + public double getMaxX() { return entity.getPosition().getX() + (x / 2); } @@ -168,7 +168,7 @@ public class BoundingBox { * * @return the min Y */ - public float getMinY() { + public double getMinY() { return entity.getPosition().getY(); } @@ -177,7 +177,7 @@ public class BoundingBox { * * @return the max Y */ - public float getMaxY() { + public double getMaxY() { return entity.getPosition().getY() + y; } @@ -186,7 +186,7 @@ public class BoundingBox { * * @return the min Z */ - public float getMinZ() { + public double getMinZ() { return entity.getPosition().getZ() - (z / 2); } @@ -195,7 +195,7 @@ public class BoundingBox { * * @return the max Z */ - public float getMaxZ() { + public double getMaxZ() { return entity.getPosition().getZ() + (z / 2); } diff --git a/src/main/java/net/minestom/server/collision/CollisionUtils.java b/src/main/java/net/minestom/server/collision/CollisionUtils.java index 5d9305ab6..dbdf738c2 100644 --- a/src/main/java/net/minestom/server/collision/CollisionUtils.java +++ b/src/main/java/net/minestom/server/collision/CollisionUtils.java @@ -80,7 +80,7 @@ public class CollisionUtils { * @param corners the corners to check against * @return true if a collision has been found */ - private static boolean stepAxis(Instance instance, Vector startPosition, Vector axis, float stepAmount, Vector positionOut, Vector... corners) { + private static boolean stepAxis(Instance instance, Vector startPosition, Vector axis, double stepAmount, Vector positionOut, Vector... corners) { positionOut.copy(startPosition); if (corners.length == 0) return false; // avoid degeneracy in following computations @@ -93,9 +93,9 @@ public class CollisionUtils { cornerPositions[i] = new BlockPosition(corners[i]); } - float sign = Math.signum(stepAmount); + final double sign = Math.signum(stepAmount); final int blockLength = (int) stepAmount; - final float remainingLength = stepAmount - blockLength; + final double remainingLength = stepAmount - blockLength; // used to determine if 'remainingLength' should be used boolean collisionFound = false; for (int i = 0; i < Math.abs(blockLength); i++) { @@ -133,12 +133,13 @@ public class CollisionUtils { * * @param instance instance to get blocks from * @param axis the axis to move along + * @param amount * @param cornersCopy the corners of the bounding box to consider (mutable) * @param cornerPositions the corners, converted to BlockPosition (mutable) * @return false if this method encountered a collision */ - private static boolean stepOnce(Instance instance, Vector axis, float amount, Vector[] cornersCopy, BlockPosition[] cornerPositions) { - final float sign = Math.signum(amount); + private static boolean stepOnce(Instance instance, Vector axis, double amount, Vector[] cornersCopy, BlockPosition[] cornerPositions) { + final double sign = Math.signum(amount); for (int cornerIndex = 0; cornerIndex < cornersCopy.length; cornerIndex++) { Vector corner = cornersCopy[cornerIndex]; BlockPosition blockPos = cornerPositions[cornerIndex]; diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 0935d202f..354b6eff8 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -80,8 +80,8 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P protected Instance instance; protected final Position position; - protected float lastX, lastY, lastZ; - protected float cacheX, cacheY, cacheZ; // Used to synchronize with #getPosition + protected double lastX, lastY, lastZ; + protected double cacheX, cacheY, cacheZ; // Used to synchronize with #getPosition protected float lastYaw, lastPitch; protected float cacheYaw, cachePitch; protected boolean onGround; @@ -422,7 +422,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P cacheZ != position.getZ(); final boolean viewChange = cacheYaw != position.getYaw() || cachePitch != position.getPitch(); - final float distance = positionChange ? position.getDistance(cacheX, cacheY, cacheZ) : 0; + final double distance = positionChange ? position.getDistance(cacheX, cacheY, cacheZ) : 0; if (distance >= 8 || (positionChange && PlayerUtils.isNettyClient(this))) { // Teleport has the priority over everything else @@ -477,9 +477,9 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P if (applyVelocity) { final float tps = MinecraftServer.TICK_PER_SECOND; - final float newX = position.getX() + velocity.getX() / tps; - final float newY = position.getY() + velocity.getY() / tps; - final float newZ = position.getZ() + velocity.getZ() / tps; + final double newX = position.getX() + velocity.getX() / tps; + final double newY = position.getY() + velocity.getY() / tps; + final double newZ = position.getZ() + velocity.getZ() / tps; Position newPosition = new Position(newX, newY, newZ); Vector newVelocityOut = new Vector(); @@ -711,12 +711,11 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * Changes the internal entity bounding box. *

* WARNING: this does not change the entity hit-box which is client-side. - * - * @param x the bounding box X size + * @param x the bounding box X size * @param y the bounding box Y size * @param z the bounding box Z size */ - public void setBoundingBox(float x, float y, float z) { + public void setBoundingBox(double x, double y, double z) { this.boundingBox = new BoundingBox(this, x, y, z); } @@ -866,7 +865,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param entity the entity to get the distance from * @return the distance between this and {@code entity} */ - public float getDistance(@NotNull Entity entity) { + public double getDistance(@NotNull Entity entity) { return getPosition().getDistance(entity.getPosition()); } @@ -1102,7 +1101,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * @param y new position Y * @param z new position Z */ - public void refreshPosition(float x, float y, float z) { + public void refreshPosition(double x, double y, double z) { position.setX(x); position.setY(y); position.setZ(z); @@ -1147,7 +1146,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P /** * @param position the new position - * @see #refreshPosition(float, float, float) + * @see #refreshPosition(double, double, double) */ public void refreshPosition(@NotNull Position position) { refreshPosition(position.getX(), position.getY(), position.getZ()); @@ -1237,8 +1236,8 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P * * @return the entity eye height */ - public float getEyeHeight() { - return boundingBox.getHeight() * 0.85f; + public double getEyeHeight() { + return boundingBox.getHeight() * 0.85; } /** diff --git a/src/main/java/net/minestom/server/entity/ExperienceOrb.java b/src/main/java/net/minestom/server/entity/ExperienceOrb.java index a794a133f..71b99dad7 100644 --- a/src/main/java/net/minestom/server/entity/ExperienceOrb.java +++ b/src/main/java/net/minestom/server/entity/ExperienceOrb.java @@ -3,12 +3,13 @@ package net.minestom.server.entity; import net.minestom.server.instance.Instance; import net.minestom.server.network.packet.server.play.SpawnExperienceOrbPacket; import net.minestom.server.network.player.PlayerConnection; -import net.minestom.server.utils.BlockPosition; import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Comparator; + public class ExperienceOrb extends Entity { private short experienceCount; @@ -132,7 +133,7 @@ public class ExperienceOrb extends Entity { Player closest = entity.getInstance() .getPlayers() .stream() - .min((a, b) -> Float.compare(a.getDistance(entity), b.getDistance(entity))) + .min(Comparator.comparingDouble(a -> a.getDistance(entity))) .orElse(null); if (closest == null) return null; if (closest.getDistance(entity) > maxDistance) return null; diff --git a/src/main/java/net/minestom/server/entity/LivingEntity.java b/src/main/java/net/minestom/server/entity/LivingEntity.java index 82d8e4bf6..da4776f9b 100644 --- a/src/main/java/net/minestom/server/entity/LivingEntity.java +++ b/src/main/java/net/minestom/server/entity/LivingEntity.java @@ -27,7 +27,6 @@ import net.minestom.server.utils.block.BlockIterator; import net.minestom.server.utils.time.CooldownUtils; import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.utils.time.UpdateOption; -import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -451,7 +450,7 @@ public abstract class LivingEntity extends Entity implements EquipmentHandler { } @Override - public void setBoundingBox(float x, float y, float z) { + public void setBoundingBox(double x, double y, double z) { super.setBoundingBox(x, y, z); this.expandedBoundingBox = getBoundingBox().expand(1, 0.5f, 1); } diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 5c72b05b7..65c6e6848 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -169,7 +169,8 @@ public class Player extends LivingEntity implements CommandSender { // Position synchronization with viewers private long lastPlayerSynchronizationTime; - private float lastPlayerSyncX, lastPlayerSyncY, lastPlayerSyncZ, lastPlayerSyncYaw, lastPlayerSyncPitch; + private double lastPlayerSyncX, lastPlayerSyncY, lastPlayerSyncZ; + private float lastPlayerSyncYaw, lastPlayerSyncPitch; // Experience orb pickup protected UpdateOption experiencePickupCooldown = new UpdateOption(10, TimeUnit.TICK); @@ -1615,7 +1616,7 @@ public class Player extends LivingEntity implements CommandSender { // Manage already viewable entities this.viewableEntities.forEach(entity -> { - final float distance = entity.getDistance(this); + final double distance = entity.getDistance(this); if (distance > maximalDistance) { // Entity shouldn't be viewable anymore if (isAutoViewable()) { diff --git a/src/main/java/net/minestom/server/entity/ai/goal/FollowTargetGoal.java b/src/main/java/net/minestom/server/entity/ai/goal/FollowTargetGoal.java index 223f711ae..6b39e3ff9 100644 --- a/src/main/java/net/minestom/server/entity/ai/goal/FollowTargetGoal.java +++ b/src/main/java/net/minestom/server/entity/ai/goal/FollowTargetGoal.java @@ -83,7 +83,7 @@ public class FollowTargetGoal extends GoalSelector { entityCreature.setPathTo(null); } - private float getDistance(@NotNull Position a, @NotNull Position b) { + private double getDistance(@NotNull Position a, @NotNull Position b) { return MathUtils.square(a.getX() - b.getX()) + MathUtils.square(a.getZ() - b.getZ()); } diff --git a/src/main/java/net/minestom/server/entity/ai/target/ClosestEntityTarget.java b/src/main/java/net/minestom/server/entity/ai/target/ClosestEntityTarget.java index 74a18a286..0c101bc47 100644 --- a/src/main/java/net/minestom/server/entity/ai/target/ClosestEntityTarget.java +++ b/src/main/java/net/minestom/server/entity/ai/target/ClosestEntityTarget.java @@ -39,7 +39,7 @@ public class ClosestEntityTarget extends TargetSelector { final List chunks = getNeighbours(instance, currentChunk.getChunkX(), currentChunk.getChunkZ()); Entity entity = null; - float distance = Float.MAX_VALUE; + double distance = Double.MAX_VALUE; for (Chunk chunk : chunks) { final Set entities = instance.getChunkEntities(chunk); @@ -76,7 +76,7 @@ public class ClosestEntityTarget extends TargetSelector { } // Check distance - final float d = entityCreature.getDistance(ent); + final double d = entityCreature.getDistance(ent); if ((entity == null || d < distance) && d < range) { entity = ent; distance = d; diff --git a/src/main/java/net/minestom/server/entity/pathfinding/NavigableEntity.java b/src/main/java/net/minestom/server/entity/pathfinding/NavigableEntity.java index 0b8f62d16..04e982207 100644 --- a/src/main/java/net/minestom/server/entity/pathfinding/NavigableEntity.java +++ b/src/main/java/net/minestom/server/entity/pathfinding/NavigableEntity.java @@ -12,7 +12,6 @@ import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; import net.minestom.server.utils.chunk.ChunkUtils; import net.minestom.server.utils.position.PositionUtils; -import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -29,32 +28,32 @@ public interface NavigableEntity { * @param direction the targeted position * @param speed define how far the entity will move */ - default void moveTowards(@NotNull Position direction, float speed) { + default void moveTowards(@NotNull Position direction, double speed) { final Position position = getNavigableEntity().getPosition(); - final float currentX = position.getX(); - final float currentY = position.getY(); - final float currentZ = position.getZ(); + final double currentX = position.getX(); + final double currentY = position.getY(); + final double currentZ = position.getZ(); - final float targetX = direction.getX(); - final float targetY = direction.getY(); - final float targetZ = direction.getZ(); + final double targetX = direction.getX(); + final double targetY = direction.getY(); + final double targetZ = direction.getZ(); - final float dx = targetX - currentX; - final float dy = targetY - currentY; - final float dz = targetZ - currentZ; + final double dx = targetX - currentX; + final double dy = targetY - currentY; + final double dz = targetZ - currentZ; // the purpose of these few lines is to slow down entities when they reach their destination - final float distSquared = dx * dx + dy * dy + dz * dz; + final double distSquared = dx * dx + dy * dy + dz * dz; if (speed > distSquared) { speed = distSquared; } - final float radians = (float) Math.atan2(dz, dx); - final float speedX = (float) (Math.cos(radians) * speed); - final float speedY = dy * speed; - final float speedZ = (float) (Math.sin(radians) * speed); + final double radians = Math.atan2(dz, dx); + final double speedX = Math.cos(radians) * speed; + final double speedY = dy * speed; + final double speedZ = Math.sin(radians) * speed; // Update 'position' view PositionUtils.lookAlong(position, dx, direction.getY(), dz); diff --git a/src/main/java/net/minestom/server/entity/pathfinding/PFPathingEntity.java b/src/main/java/net/minestom/server/entity/pathfinding/PFPathingEntity.java index f76b981ee..8b575c8fd 100644 --- a/src/main/java/net/minestom/server/entity/pathfinding/PFPathingEntity.java +++ b/src/main/java/net/minestom/server/entity/pathfinding/PFPathingEntity.java @@ -189,13 +189,10 @@ public class PFPathingEntity implements IPathingEntity { @Override public void moveTo(Vec3d position, Passibility passibility, Gravitation gravitation) { - final float x = (float) position.x; - final float y = (float) position.y; - final float z = (float) position.z; - this.targetPosition = new Position(x, y, z); + this.targetPosition = new Position(position.x, position.y, position.z); - final float entityY = entity.getPosition().getY(); - if (entityY < y) { + final double entityY = entity.getPosition().getY(); + if (entityY < targetPosition.getY()) { navigableEntity.jump(1); } } @@ -208,12 +205,12 @@ public class PFPathingEntity implements IPathingEntity { @Override public float width() { - return entity.getBoundingBox().getWidth(); + return (float) entity.getBoundingBox().getWidth(); } @Override public float height() { - return entity.getBoundingBox().getHeight(); + return (float) entity.getBoundingBox().getHeight(); } private float getAttributeValue(@NotNull Attribute attribute) { diff --git a/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java b/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java index 5c7c11e98..aab74a043 100644 --- a/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java +++ b/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java @@ -311,15 +311,15 @@ public class EntityArmorStand extends ObjectEntity implements EquipmentHandler { } private float getRotationX(Vector vector) { - return vector != null ? vector.getX() : 0; + return vector != null ? (float) vector.getX() : 0; } private float getRotationY(Vector vector) { - return vector != null ? vector.getY() : 0; + return vector != null ? (float) vector.getY() : 0; } private float getRotationZ(Vector vector) { - return vector != null ? vector.getZ() : 0; + return vector != null ? (float) vector.getZ() : 0; } // Equipments diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityZombie.java b/src/main/java/net/minestom/server/entity/type/monster/EntityZombie.java index e69cbc98e..05775596e 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityZombie.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityZombie.java @@ -62,7 +62,7 @@ public class EntityZombie extends EntityCreature implements Monster { } @Override - public float getEyeHeight() { - return isBaby() ? 0.93f : 1.74f; + public double getEyeHeight() { + return isBaby() ? 0.93 : 1.74; } } diff --git a/src/main/java/net/minestom/server/entity/type/monster/EntityZombifiedPiglin.java b/src/main/java/net/minestom/server/entity/type/monster/EntityZombifiedPiglin.java index ca08f4623..e08731b0a 100644 --- a/src/main/java/net/minestom/server/entity/type/monster/EntityZombifiedPiglin.java +++ b/src/main/java/net/minestom/server/entity/type/monster/EntityZombifiedPiglin.java @@ -72,7 +72,7 @@ public class EntityZombifiedPiglin extends EntityCreature implements Monster { } @Override - public float getEyeHeight() { - return isBaby() ? 0.93f : 1.74f; + public double getEyeHeight() { + return isBaby() ? 0.93 : 1.74; } } diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index dcfc9afcc..52c60061d 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -631,7 +631,7 @@ public abstract class Instance implements BlockModifier, EventHandler, DataConta * @param z the Z position * @return the block state id at the position */ - public short getBlockStateId(float x, float y, float z) { + public short getBlockStateId(double x, double y, double z) { return getBlockStateId(Math.round(x), Math.round(y), Math.round(z)); } @@ -759,7 +759,7 @@ public abstract class Instance implements BlockModifier, EventHandler, DataConta * @return the chunk at the given position, null if not loaded */ @Nullable - public Chunk getChunkAt(float x, float z) { + public Chunk getChunkAt(double x, double z) { final int chunkX = ChunkUtils.getChunkCoordinate((int) Math.floor(x)); final int chunkZ = ChunkUtils.getChunkCoordinate((int) Math.floor(z)); return getChunk(chunkX, chunkZ); diff --git a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java index 852d0f042..f67b59d52 100644 --- a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java @@ -20,9 +20,9 @@ public class PlayerPositionListener { public static void playerLookListener(ClientPlayerRotationPacket packet, Player player) { final Position playerPosition = player.getPosition(); - final float x = playerPosition.getX(); - final float y = playerPosition.getY(); - final float z = playerPosition.getZ(); + final double x = playerPosition.getX(); + final double y = playerPosition.getY(); + final double z = playerPosition.getZ(); final float yaw = packet.yaw; final float pitch = packet.pitch; final boolean onGround = packet.onGround; @@ -31,26 +31,24 @@ public class PlayerPositionListener { public static void playerPositionListener(ClientPlayerPositionPacket packet, Player player) { final Position playerPosition = player.getPosition(); - final float x = (float) packet.x; - final float y = (float) packet.y; - final float z = (float) packet.z; final float yaw = playerPosition.getYaw(); final float pitch = playerPosition.getPitch(); final boolean onGround = packet.onGround; - processMovement(player, x, y, z, yaw, pitch, onGround); + processMovement(player, + packet.x, packet.y, packet.z, + yaw, pitch, onGround); } public static void playerPositionAndLookListener(ClientPlayerPositionAndRotationPacket packet, Player player) { - final float x = (float) packet.x; - final float y = (float) packet.y; - final float z = (float) packet.z; final float yaw = packet.yaw; final float pitch = packet.pitch; final boolean onGround = packet.onGround; - processMovement(player, x, y, z, yaw, pitch, onGround); + processMovement(player, + packet.x, packet.y, packet.z, + yaw, pitch, onGround); } - private static void processMovement(@NotNull Player player, float x, float y, float z, + private static void processMovement(@NotNull Player player, double x, double y, double z, float yaw, float pitch, boolean onGround) { final Instance instance = player.getInstance(); @@ -60,7 +58,7 @@ public class PlayerPositionListener { } // Prevent the player from moving during a teleport - final float distance = player.getPosition().getDistance(x, y, z); + final double distance = player.getPosition().getDistance(x, y, z); final int chunkRange = player.getChunkRange() * Chunk.CHUNK_SECTION_SIZE; if (distance >= chunkRange) { return; diff --git a/src/main/java/net/minestom/server/utils/BlockPosition.java b/src/main/java/net/minestom/server/utils/BlockPosition.java index e04770e0c..1fb3c527d 100644 --- a/src/main/java/net/minestom/server/utils/BlockPosition.java +++ b/src/main/java/net/minestom/server/utils/BlockPosition.java @@ -38,7 +38,7 @@ public class BlockPosition implements PublicCloneable { * @param y the block Y * @param z the block Z */ - public BlockPosition(float x, float y, float z) { + public BlockPosition(double x, double y, double z) { final int castedY = (int) y; this.x = (int) Math.floor(x); @@ -50,7 +50,7 @@ public class BlockPosition implements PublicCloneable { * Creates a new {@link BlockPosition} from a {@link Vector}. * * @param position the position vector - * @see #BlockPosition(float, float, float) + * @see #BlockPosition(double, double, double) */ public BlockPosition(@NotNull Vector position) { this(position.getX(), position.getY(), position.getZ()); diff --git a/src/main/java/net/minestom/server/utils/MathUtils.java b/src/main/java/net/minestom/server/utils/MathUtils.java index 8fd237802..54aac1217 100644 --- a/src/main/java/net/minestom/server/utils/MathUtils.java +++ b/src/main/java/net/minestom/server/utils/MathUtils.java @@ -14,6 +14,10 @@ public final class MathUtils { return num * num; } + public static double square(double num) { + return num * num; + } + public static double round(double value, int places) { if (places < 0) throw new IllegalArgumentException(); @@ -55,10 +59,22 @@ public final class MathUtils { return number >= min && number <= max; } + public static boolean isBetween(double number, double min, double max) { + return number >= min && number <= max; + } + public static boolean isBetween(float number, float min, float max) { return number >= min && number <= max; } + public static boolean isBetweenUnordered(double number, double compare1, double compare2) { + if (compare1 > compare2) { + return isBetween(number, compare2, compare1); + } else { + return isBetween(number, compare1, compare2); + } + } + public static boolean isBetweenUnordered(float number, float compare1, float compare2) { if (compare1 > compare2) { return isBetween(number, compare2, compare1); diff --git a/src/main/java/net/minestom/server/utils/Position.java b/src/main/java/net/minestom/server/utils/Position.java index 6d3666bb1..bea0d25d0 100644 --- a/src/main/java/net/minestom/server/utils/Position.java +++ b/src/main/java/net/minestom/server/utils/Position.java @@ -13,10 +13,10 @@ import java.util.Objects; */ public class Position implements PublicCloneable { - private float x, y, z; + private double x, y, z; private float yaw, pitch; - public Position(float x, float y, float z, float yaw, float pitch) { + public Position(double x, double y, double z, float yaw, float pitch) { this.x = x; this.y = y; this.z = z; @@ -24,7 +24,7 @@ public class Position implements PublicCloneable { this.pitch = pitch; } - public Position(float x, float y, float z) { + public Position(double x, double y, double z) { this(x, y, z, 0, 0); } @@ -40,7 +40,8 @@ public class Position implements PublicCloneable { * @param z the Z offset * @return the same object position */ - public Position add(float x, float y, float z) { + @NotNull + public Position add(double x, double y, double z) { this.x += x; this.y += y; this.z += z; @@ -53,7 +54,8 @@ public class Position implements PublicCloneable { * @param position the position to add to this * @return the same object position */ - public Position add(Position position) { + @NotNull + public Position add(@NotNull Position position) { this.x += position.x; this.y += position.y; this.z += position.z; @@ -68,15 +70,16 @@ public class Position implements PublicCloneable { * @param z the Z offset * @return the same object position */ - public Position subtract(float x, float y, float z) { + @NotNull + public Position subtract(double x, double y, double z) { this.x -= x; this.y -= y; this.z -= z; return this; } - public float getDistance(float x, float y, float z) { - return (float) Math.sqrt(MathUtils.square(x - getX()) + + public double getDistance(double x, double y, double z) { + return Math.sqrt(MathUtils.square(x - getX()) + MathUtils.square(y - getY()) + MathUtils.square(z - getZ())); } @@ -89,7 +92,7 @@ public class Position implements PublicCloneable { * @param position the second position * @return the distance between {@code this} and {@code position} */ - public float getDistance(@NotNull Position position) { + public double getDistance(@NotNull Position position) { return getDistance(position.getX(), position.getY(), position.getZ()); } @@ -99,7 +102,7 @@ public class Position implements PublicCloneable { * @param position the second position * @return the squared distance between {@code this} and {@code position} */ - public float getDistanceSquared(@NotNull Position position) { + public double getDistanceSquared(@NotNull Position position) { return MathUtils.square(getX() - position.getX()) + MathUtils.square(getY() - position.getY()) + MathUtils.square(getZ() - position.getZ()); @@ -123,8 +126,8 @@ public class Position implements PublicCloneable { final double xz = Math.cos(Math.toRadians(rotY)); - vector.setX((float) (-xz * Math.sin(Math.toRadians(rotX)))); - vector.setZ((float) (xz * Math.cos(Math.toRadians(rotX)))); + vector.setX((-xz * Math.sin(Math.toRadians(rotX)))); + vector.setZ((xz * Math.cos(Math.toRadians(rotX)))); return vector; } @@ -144,8 +147,8 @@ public class Position implements PublicCloneable { * z = Adj */ final double _2PI = 2 * Math.PI; - final float x = vector.getX(); - final float z = vector.getZ(); + final double x = vector.getX(); + final double z = vector.getZ(); if (x == 0 && z == 0) { pitch = vector.getY() > 0 ? -90 : 90; @@ -155,9 +158,9 @@ public class Position implements PublicCloneable { final double theta = Math.atan2(-x, z); yaw = (float) Math.toDegrees((theta + _2PI) % _2PI); - final float x2 = MathUtils.square(x); - final float z2 = MathUtils.square(z); - final float xz = (float) Math.sqrt(x2 + z2); + final double x2 = MathUtils.square(x); + final double z2 = MathUtils.square(z); + final double xz = Math.sqrt(x2 + z2); pitch = (float) Math.toDegrees(Math.atan(-vector.getY() / xz)); return this; @@ -228,11 +231,11 @@ public class Position implements PublicCloneable { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Position position = (Position) o; - return Float.compare(position.x, x) == 0 && - Float.compare(position.y, y) == 0 && - Float.compare(position.z, z) == 0 && - Float.compare(position.yaw, yaw) == 0 && - Float.compare(position.pitch, pitch) == 0; + return Double.compare(position.x, x) == 0 && + Double.compare(position.y, y) == 0 && + Double.compare(position.z, z) == 0 && + Double.compare(position.yaw, yaw) == 0 && + Double.compare(position.pitch, pitch) == 0; } /** @@ -242,9 +245,9 @@ public class Position implements PublicCloneable { * @return true if the two positions are similar */ public boolean isSimilar(@NotNull Position position) { - return Float.compare(position.x, x) == 0 && - Float.compare(position.y, y) == 0 && - Float.compare(position.z, z) == 0; + return Double.compare(position.x, x) == 0 && + Double.compare(position.y, y) == 0 && + Double.compare(position.z, z) == 0; } /** @@ -284,7 +287,7 @@ public class Position implements PublicCloneable { * * @return the position X */ - public float getX() { + public double getX() { return x; } @@ -293,7 +296,7 @@ public class Position implements PublicCloneable { * * @param x the new position X */ - public void setX(float x) { + public void setX(double x) { this.x = x; } @@ -302,7 +305,7 @@ public class Position implements PublicCloneable { * * @return the position Y */ - public float getY() { + public double getY() { return y; } @@ -311,7 +314,7 @@ public class Position implements PublicCloneable { * * @param y the new position Y */ - public void setY(float y) { + public void setY(double y) { this.y = y; } @@ -320,7 +323,7 @@ public class Position implements PublicCloneable { * * @return the position Z */ - public float getZ() { + public double getZ() { return z; } @@ -329,7 +332,7 @@ public class Position implements PublicCloneable { * * @param z the new position Z */ - public void setZ(float z) { + public void setZ(double z) { this.z = z; } @@ -374,6 +377,7 @@ public class Position implements PublicCloneable { * * @return the converted {@link BlockPosition} */ + @NotNull public BlockPosition toBlockPosition() { return new BlockPosition(x, y, z); } @@ -383,6 +387,7 @@ public class Position implements PublicCloneable { * * @return the converted {@link Vector} */ + @NotNull public Vector toVector() { return new Vector(x, y, z); } diff --git a/src/main/java/net/minestom/server/utils/Vector.java b/src/main/java/net/minestom/server/utils/Vector.java index dc7b87f6d..693e27f4f 100644 --- a/src/main/java/net/minestom/server/utils/Vector.java +++ b/src/main/java/net/minestom/server/utils/Vector.java @@ -8,7 +8,7 @@ public class Vector implements PublicCloneable { private static final double epsilon = 0.000001; - protected float x, y, z; + protected double x, y, z; public Vector() { this.x = 0; @@ -16,7 +16,7 @@ public class Vector implements PublicCloneable { this.z = 0; } - public Vector(float x, float y, float z) { + public Vector(double x, double y, double z) { this.x = x; this.y = y; this.z = z; @@ -31,7 +31,7 @@ public class Vector implements PublicCloneable { } @NotNull - public Vector add(float x, float y, float z) { + public Vector add(double x, double y, double z) { this.x += x; this.y += y; this.z += z; @@ -53,7 +53,7 @@ public class Vector implements PublicCloneable { } @NotNull - public Vector subtract(float x, float y, float z) { + public Vector subtract(double x, double y, double z) { this.x -= x; this.y -= y; this.z -= z; @@ -278,27 +278,27 @@ public class Vector implements PublicCloneable { } } - public float getX() { + public double getX() { return x; } - public void setX(float x) { + public void setX(double x) { this.x = x; } - public float getY() { + public double getY() { return y; } - public void setY(float y) { + public void setY(double y) { this.y = y; } - public float getZ() { + public double getZ() { return z; } - public void setZ(float z) { + public void setZ(double z) { this.z = z; } diff --git a/src/main/java/net/minestom/server/utils/block/BlockIterator.java b/src/main/java/net/minestom/server/utils/block/BlockIterator.java index c70fcd7ad..53e622532 100644 --- a/src/main/java/net/minestom/server/utils/block/BlockIterator.java +++ b/src/main/java/net/minestom/server/utils/block/BlockIterator.java @@ -1,8 +1,5 @@ package net.minestom.server.utils.block; -import java.util.Iterator; -import java.util.NoSuchElementException; - import net.minestom.server.entity.LivingEntity; import net.minestom.server.instance.block.BlockFace; import net.minestom.server.utils.BlockPosition; @@ -10,6 +7,9 @@ import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; import org.jetbrains.annotations.NotNull; +import java.util.Iterator; +import java.util.NoSuchElementException; + /** * This class performs ray tracing and iterates along blocks on a line */ @@ -41,16 +41,15 @@ public class BlockIterator implements Iterator { *

* This considers all blocks as 1x1x1 in size. * - * @param start A Vector giving the initial position for the trace - * @param direction A Vector pointing in the direction for the trace - * @param yOffset The trace begins vertically offset from the start vector - * by this value + * @param start A Vector giving the initial position for the trace + * @param direction A Vector pointing in the direction for the trace + * @param yOffset The trace begins vertically offset from the start vector + * by this value * @param maxDistance This is the maximum distance in blocks for the - * trace. Setting this value above 140 may lead to problems with - * unloaded chunks. A value of 0 indicates no limit - * + * trace. Setting this value above 140 may lead to problems with + * unloaded chunks. A value of 0 indicates no limit */ - public BlockIterator(@NotNull Vector start, @NotNull Vector direction, float yOffset, int maxDistance) { + public BlockIterator(@NotNull Vector start, @NotNull Vector direction, double yOffset, int maxDistance) { this.maxDistance = maxDistance; Vector startClone = start.clone(); @@ -112,15 +111,15 @@ public class BlockIterator implements Iterator { // trace line backwards to find intercept with plane perpendicular to the main axis double d = mainPosition / mainDirection; // how far to hit face behind - double secondd = secondPosition - secondDirection * d; - double thirdd = thirdPosition - thirdDirection * d; + double second = secondPosition - secondDirection * d; + double third = thirdPosition - thirdDirection * d; // Guarantee that the ray will pass though the start block. // It is possible that it would miss due to rounding // This should only move the ray by 1 grid position - secondError = floor(secondd * gridSize); + secondError = floor(second * gridSize); secondStep = round(secondDirection / mainDirection * gridSize); - thirdError = floor(thirdd * gridSize); + thirdError = floor(third * gridSize); thirdStep = round(thirdDirection / mainDirection * gridSize); if (secondError + secondStep <= 0) { @@ -222,14 +221,14 @@ public class BlockIterator implements Iterator { *

* This considers all blocks as 1x1x1 in size. * - * @param pos The position for the start of the ray trace - * @param yOffset The trace begins vertically offset from the start vector - * by this value + * @param pos The position for the start of the ray trace + * @param yOffset The trace begins vertically offset from the start vector + * by this value * @param maxDistance This is the maximum distance in blocks for the - * trace. Setting this value above 140 may lead to problems with - * unloaded chunks. A value of 0 indicates no limit + * trace. Setting this value above 140 may lead to problems with + * unloaded chunks. A value of 0 indicates no limit */ - public BlockIterator(@NotNull Position pos, float yOffset, int maxDistance) { + public BlockIterator(@NotNull Position pos, double yOffset, int maxDistance) { this(pos.toVector(), pos.getDirection(), yOffset, maxDistance); } @@ -238,12 +237,12 @@ public class BlockIterator implements Iterator { *

* This considers all blocks as 1x1x1 in size. * - * @param pos The position for the start of the ray trace + * @param pos The position for the start of the ray trace * @param yOffset The trace begins vertically offset from the start vector - * by this value + * by this value */ - public BlockIterator(@NotNull Position pos, float yOffset) { + public BlockIterator(@NotNull Position pos, double yOffset) { this(pos.toVector(), pos.getDirection(), yOffset, 0); } @@ -264,10 +263,10 @@ public class BlockIterator implements Iterator { *

* This considers all blocks as 1x1x1 in size. * - * @param entity Information from the entity is used to set up the trace + * @param entity Information from the entity is used to set up the trace * @param maxDistance This is the maximum distance in blocks for the - * trace. Setting this value above 140 may lead to problems with - * unloaded chunks. A value of 0 indicates no limit + * trace. Setting this value above 140 may lead to problems with + * unloaded chunks. A value of 0 indicates no limit */ public BlockIterator(@NotNull LivingEntity entity, int maxDistance) { diff --git a/src/main/java/net/minestom/server/utils/chunk/ChunkUtils.java b/src/main/java/net/minestom/server/utils/chunk/ChunkUtils.java index 59b68c669..954c1c176 100644 --- a/src/main/java/net/minestom/server/utils/chunk/ChunkUtils.java +++ b/src/main/java/net/minestom/server/utils/chunk/ChunkUtils.java @@ -76,7 +76,7 @@ public final class ChunkUtils { * @param z instance Z coordinate * @return true if the chunk is loaded, false otherwise */ - public static boolean isLoaded(@NotNull Instance instance, float x, float z) { + public static boolean isLoaded(@NotNull Instance instance, double x, double z) { final int chunkX = getChunkCoordinate((int) x); final int chunkZ = getChunkCoordinate((int) z); 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 2d8e34b44..dba4088b9 100644 --- a/src/main/java/net/minestom/server/utils/entity/EntityFinder.java +++ b/src/main/java/net/minestom/server/utils/entity/EntityFinder.java @@ -270,12 +270,12 @@ public class EntityFinder { if (targetSelector == TargetSelector.NEAREST_PLAYER) { Entity entity = null; - float closestDistance = Float.MAX_VALUE; + double closestDistance = Double.MAX_VALUE; Collection instancePlayers = instance != null ? instance.getPlayers() : MinecraftServer.getConnectionManager().getOnlinePlayers(); for (Player player : instancePlayers) { - final float distance = player.getPosition().getDistance(startPosition); + final double distance = player.getPosition().getDistance(startPosition); if (distance < closestDistance) { entity = player; closestDistance = distance; diff --git a/src/main/java/net/minestom/server/utils/location/RelativeVec.java b/src/main/java/net/minestom/server/utils/location/RelativeVec.java index 69a04316d..ea0c76d22 100644 --- a/src/main/java/net/minestom/server/utils/location/RelativeVec.java +++ b/src/main/java/net/minestom/server/utils/location/RelativeVec.java @@ -23,9 +23,9 @@ public class RelativeVec extends RelativeLocation { } final Position entityPosition = entity.getPosition(); - final float x = location.getX() + (relativeX ? entityPosition.getX() : 0); - final float y = location.getY() + (relativeY ? entityPosition.getY() : 0); - final float z = location.getZ() + (relativeZ ? entityPosition.getZ() : 0); + final double x = location.getX() + (relativeX ? entityPosition.getX() : 0); + final double y = location.getY() + (relativeY ? entityPosition.getY() : 0); + final double z = location.getZ() + (relativeZ ? entityPosition.getZ() : 0); return new Vector(x, y, z); } diff --git a/src/main/java/net/minestom/server/utils/position/PositionUtils.java b/src/main/java/net/minestom/server/utils/position/PositionUtils.java index 8a421348c..95d11da08 100644 --- a/src/main/java/net/minestom/server/utils/position/PositionUtils.java +++ b/src/main/java/net/minestom/server/utils/position/PositionUtils.java @@ -5,8 +5,8 @@ import org.jetbrains.annotations.NotNull; public final class PositionUtils { - public static void lookAlong(@NotNull Position position, float dx, float dy, float dz) { - final float horizontalAngle = (float) Math.atan2(dz, dx); + public static void lookAlong(@NotNull Position position, double dx, double dy, double dz) { + final double horizontalAngle = Math.atan2(dz, dx); final float yaw = (float) (horizontalAngle * (180.0 / Math.PI)) - 90; final float pitch = (float) Math.atan2(dy, Math.max(Math.abs(dx), Math.abs(dz)));