Improve collision

This commit is contained in:
TheMode 2021-07-09 20:43:12 +02:00
parent 4f20580482
commit d8b92d23ba
3 changed files with 17 additions and 16 deletions

View File

@ -136,9 +136,8 @@ public class CollisionUtils {
* @param newPosition the future target position * @param newPosition the future target position
* @return the position with the world border collision applied (can be {@code newPosition} if not changed) * @return the position with the world border collision applied (can be {@code newPosition} if not changed)
*/ */
@NotNull public static @NotNull Pos applyWorldBorder(@NotNull Instance instance,
public static Point applyWorldBorder(@NotNull Instance instance, @NotNull Pos currentPosition, @NotNull Pos newPosition) {
@NotNull Point currentPosition, @NotNull Point newPosition) {
final WorldBorder worldBorder = instance.getWorldBorder(); final WorldBorder worldBorder = instance.getWorldBorder();
final WorldBorder.CollisionAxis collisionAxis = worldBorder.getCollisionAxis(newPosition); final WorldBorder.CollisionAxis collisionAxis = worldBorder.getCollisionAxis(newPosition);
switch (collisionAxis) { switch (collisionAxis) {
@ -147,13 +146,13 @@ public class CollisionUtils {
return newPosition; return newPosition;
case BOTH: case BOTH:
// Apply Y velocity/gravity // Apply Y velocity/gravity
return new Vec(currentPosition.x(), newPosition.y(), currentPosition.z()); return new Pos(currentPosition.x(), newPosition.y(), currentPosition.z());
case X: case X:
// Apply Y/Z velocity/gravity // Apply Y/Z velocity/gravity
return new Vec(currentPosition.x(), newPosition.y(), newPosition.z()); return new Pos(currentPosition.x(), newPosition.y(), newPosition.z());
case Z: case Z:
// Apply X/Y velocity/gravity // Apply X/Y velocity/gravity
return new Vec(newPosition.x(), newPosition.y(), currentPosition.z()); return new Pos(newPosition.x(), newPosition.y(), currentPosition.z());
} }
throw new IllegalStateException("Something weird happened..."); throw new IllegalStateException("Something weird happened...");
} }

View File

@ -507,7 +507,7 @@ public class Entity implements Viewable, Tickable, EventHandler<EntityEvent>, Da
); );
if (this.hasPhysics) { if (this.hasPhysics) {
final CollisionUtils.PhysicsResult physicsResult = CollisionUtils.handlePhysics(this, deltaPos); final var physicsResult = CollisionUtils.handlePhysics(this, deltaPos);
this.onGround = physicsResult.isOnGround(); this.onGround = physicsResult.isOnGround();
newPosition = physicsResult.newPosition(); newPosition = physicsResult.newPosition();
newVelocity = physicsResult.newVelocity(); newVelocity = physicsResult.newVelocity();
@ -521,7 +521,7 @@ public class Entity implements Viewable, Tickable, EventHandler<EntityEvent>, Da
} }
// World border collision // World border collision
final Point finalVelocityPosition = CollisionUtils.applyWorldBorder(instance, position, newPosition); final var finalVelocityPosition = CollisionUtils.applyWorldBorder(instance, position, newPosition);
final Chunk finalChunk = ChunkUtils.retrieve(instance, currentChunk, finalVelocityPosition); final Chunk finalChunk = ChunkUtils.retrieve(instance, currentChunk, finalVelocityPosition);
if (!ChunkUtils.isLoaded(finalChunk)) { if (!ChunkUtils.isLoaded(finalChunk)) {
// Entity shouldn't be updated when moving in an unloaded chunk // Entity shouldn't be updated when moving in an unloaded chunk
@ -530,7 +530,7 @@ public class Entity implements Viewable, Tickable, EventHandler<EntityEvent>, Da
// Apply the position if changed // Apply the position if changed
if (!finalVelocityPosition.samePoint(position)) { if (!finalVelocityPosition.samePoint(position)) {
refreshPosition((Pos) finalVelocityPosition, true); refreshPosition(finalVelocityPosition, true);
} }
// Update velocity // Update velocity

View File

@ -1,11 +1,11 @@
package net.minestom.server.instance; package net.minestom.server.instance;
import net.minestom.server.coordinate.Point;
import net.minestom.server.entity.Entity; import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Player; import net.minestom.server.entity.Player;
import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.play.*; import net.minestom.server.network.packet.server.play.*;
import net.minestom.server.utils.PacketUtils; import net.minestom.server.utils.PacketUtils;
import net.minestom.server.coordinate.Point;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
@ -166,12 +166,14 @@ public class WorldBorder {
final double radius = getDiameter() / 2d; final double radius = getDiameter() / 2d;
final boolean checkX = point.x() <= getCenterX() + radius && point.x() >= getCenterX() - radius; final boolean checkX = point.x() <= getCenterX() + radius && point.x() >= getCenterX() - radius;
final boolean checkZ = point.z() <= getCenterZ() + radius && point.z() >= getCenterZ() - radius; final boolean checkZ = point.z() <= getCenterZ() + radius && point.z() >= getCenterZ() - radius;
if (!checkX && !checkZ) { if (!checkX || !checkZ) {
return CollisionAxis.BOTH; if (!checkX && !checkZ) {
} else if (!checkX) { return CollisionAxis.BOTH;
return CollisionAxis.X; } else if (!checkX) {
} else if (!checkZ) { return CollisionAxis.X;
return CollisionAxis.Z; } else {
return CollisionAxis.Z;
}
} }
return CollisionAxis.NONE; return CollisionAxis.NONE;
} }