diff --git a/src/main/java/net/minestom/server/collision/CollisionUtils.java b/src/main/java/net/minestom/server/collision/CollisionUtils.java index 4086de592..5d9305ab6 100644 --- a/src/main/java/net/minestom/server/collision/CollisionUtils.java +++ b/src/main/java/net/minestom/server/collision/CollisionUtils.java @@ -26,7 +26,10 @@ public class CollisionUtils { * @param velocityOut the Vector object in which the new velocity will be saved * @return whether this entity is on the ground */ - public static boolean handlePhysics(Entity entity, Vector deltaPosition, Position positionOut, Vector velocityOut) { + public static boolean handlePhysics(@NotNull Entity entity, + @NotNull Vector deltaPosition, + @NotNull Position positionOut, + @NotNull Vector velocityOut) { // TODO handle collisions with nearby entities (should it be done here?) final Instance instance = entity.getInstance(); final Position currentPosition = entity.getPosition(); @@ -75,7 +78,7 @@ public class CollisionUtils { * @param stepAmount how much to step in the direction (in blocks) * @param positionOut the vector in which to store the new position * @param corners the corners to check against - * @return true iif a collision has been found + * @return true if a collision has been found */ private static boolean stepAxis(Instance instance, Vector startPosition, Vector axis, float stepAmount, Vector positionOut, Vector... corners) { positionOut.copy(startPosition); diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 3fe3eb798..391880d36 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -453,6 +453,13 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P // Entity tick { + // Cache the number of "gravity tick" + if (!onGround) { + gravityTickCount++; + } else { + gravityTickCount = 0; + } + // Velocity boolean applyVelocity; // Non-player entities with either velocity or gravity enabled @@ -467,32 +474,19 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P final float newZ = position.getZ() + velocity.getZ() / tps; Position newPosition = new Position(newX, newY, newZ); - // Gravity - { - // Cache the number of "gravity tick" - if (!onGround) { - gravityTickCount++; - } else { - gravityTickCount = 0; - } - - // Compute the gravity change (drag per tick + acceleration) - final float gravityY = Math.min( - gravityDragPerTick + (gravityAcceleration * (float) gravityTickCount), - gravityTerminalVelocity); - - // Change velocity to apply gravity - if (!noGravity) { - velocity.setY(velocity.getY() - gravityY); - } - } - Vector newVelocityOut = new Vector(); + + // Gravity force + final float gravityY = !noGravity ? Math.min( + gravityDragPerTick + (gravityAcceleration * (float) gravityTickCount), + gravityTerminalVelocity) : 0f; + final Vector deltaPos = new Vector( getVelocity().getX() / tps, - getVelocity().getY() / tps, + (getVelocity().getY() - gravityY) / tps, getVelocity().getZ() / tps ); + this.onGround = CollisionUtils.handlePhysics(this, deltaPos, newPosition, newVelocityOut); // Stop here if the position is the same @@ -535,7 +529,7 @@ public abstract class Entity implements Viewable, EventHandler, DataContainer, P // Stop player velocity if (PlayerUtils.isNettyClient(this)) { - velocity.zero(); + this.velocity.zero(); } } else { drag = 0.98f; // air drag diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 3b0056231..62c8ea2a9 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -130,7 +130,6 @@ public class Player extends LivingEntity implements CommandSender { protected final Set viewableChunks = new CopyOnWriteArraySet<>(); private final AtomicInteger teleportId = new AtomicInteger(); - protected boolean onGround; private final Queue packets = Queues.newConcurrentLinkedQueue(); private final boolean levelFlat; private final PlayerSettings settings; diff --git a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java index 1170a0bb8..852d0f042 100644 --- a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java @@ -52,7 +52,6 @@ public class PlayerPositionListener { private static void processMovement(@NotNull Player player, float x, float y, float z, float yaw, float pitch, boolean onGround) { - final Instance instance = player.getInstance(); // Prevent moving before the player spawned, probably a modified client (or high latency?) diff --git a/src/main/java/net/minestom/server/utils/Vector.java b/src/main/java/net/minestom/server/utils/Vector.java index d37aa010d..e00f587e6 100644 --- a/src/main/java/net/minestom/server/utils/Vector.java +++ b/src/main/java/net/minestom/server/utils/Vector.java @@ -21,13 +21,15 @@ public class Vector implements PublicCloneable { this.z = z; } - public Vector add(Vector vec) { + @NotNull + public Vector add(@NotNull Vector vec) { x += vec.x; y += vec.y; z += vec.z; return this; } + @NotNull public Vector add(float x, float y, float z) { this.x += x; this.y += y; @@ -41,13 +43,15 @@ public class Vector implements PublicCloneable { * @param vec The other vector * @return the same vector */ - public Vector subtract(Vector vec) { + @NotNull + public Vector subtract(@NotNull Vector vec) { x -= vec.x; y -= vec.y; z -= vec.z; return this; } + @NotNull public Vector subtract(float x, float y, float z) { this.x -= x; this.y -= y; @@ -61,7 +65,8 @@ public class Vector implements PublicCloneable { * @param vec The other vector * @return the same vector */ - public Vector multiply(Vector vec) { + @NotNull + public Vector multiply(@NotNull Vector vec) { x *= vec.x; y *= vec.y; z *= vec.z; @@ -74,7 +79,8 @@ public class Vector implements PublicCloneable { * @param vec The other vector * @return the same vector */ - public Vector divide(Vector vec) { + @NotNull + public Vector divide(@NotNull Vector vec) { x /= vec.x; y /= vec.y; z /= vec.z; @@ -87,7 +93,8 @@ public class Vector implements PublicCloneable { * @param vec The other vector * @return the same vector */ - public Vector copy(Vector vec) { + @NotNull + public Vector copy(@NotNull Vector vec) { x = vec.x; y = vec.y; z = vec.z; @@ -128,7 +135,7 @@ public class Vector implements PublicCloneable { * @param o The other vector * @return the distance */ - public double distance(Vector o) { + public double distance(@NotNull Vector o) { return Math.sqrt(MathUtils.square(x - o.x) + MathUtils.square(y - o.y) + MathUtils.square(z - o.z)); } @@ -138,7 +145,7 @@ public class Vector implements PublicCloneable { * @param o The other vector * @return the squared distance */ - public double distanceSquared(Vector o) { + public double distanceSquared(@NotNull Vector o) { return MathUtils.square(x - o.x) + MathUtils.square(y - o.y) + MathUtils.square(z - o.z); } @@ -149,6 +156,7 @@ public class Vector implements PublicCloneable { * @param m The factor * @return the same vector */ + @NotNull public Vector multiply(int m) { x *= m; y *= m; @@ -163,6 +171,7 @@ public class Vector implements PublicCloneable { * @param m The factor * @return the same vector */ + @NotNull public Vector multiply(double m) { x *= m; y *= m; @@ -177,6 +186,7 @@ public class Vector implements PublicCloneable { * @param m The factor * @return the same vector */ + @NotNull public Vector multiply(float m) { x *= m; y *= m; @@ -204,6 +214,7 @@ public class Vector implements PublicCloneable { * * @return the same vector */ + @NotNull public Vector zero() { x = 0; y = 0; @@ -295,7 +306,17 @@ public class Vector implements PublicCloneable { * * @return this vector as a position */ + @NotNull public Position toPosition() { return new Position(x, y, z); } + + /** + * Get the threshold used for equals(). + * + * @return The epsilon. + */ + public static double getEpsilon() { + return epsilon; + } } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 6d3fda112..548e0e2ee 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -8,7 +8,6 @@ import net.minestom.server.chat.ColoredText; import net.minestom.server.entity.*; import net.minestom.server.entity.damage.DamageType; import net.minestom.server.entity.type.monster.EntityZombie; -import net.minestom.server.entity.type.other.EntityEndCrystal; import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.entity.EntityPotionAddEvent; @@ -192,12 +191,6 @@ public class PlayerInit { EntityZombie entityZombie = new EntityZombie(new Position(0, 41, 0)); entityZombie.setInstance(player.getInstance()); entityZombie.setPathTo(player.getPosition()); - - { - EntityEndCrystal entityEndCrystal = new EntityEndCrystal(player.getPosition()); - entityEndCrystal.setInstance(instanceContainer); - entityEndCrystal.setBeamTarget(player.getPosition().toBlockPosition().add(5, 5, 0)); - } }); globalEventHandler.addEventCallback(PlayerDisconnectEvent.class, event -> { @@ -223,7 +216,7 @@ public class PlayerInit { globalEventHandler.addEventCallback(PlayerSpawnEvent.class, event -> { final Player player = event.getPlayer(); - player.setGameMode(GameMode.SURVIVAL); + player.setGameMode(GameMode.CREATIVE); PlayerInventory inventory = player.getInventory(); ItemStack itemStack = new ItemStack(Material.STONE, (byte) 64);