Minestom/src/main/java/net/minestom/server/collision/CollisionUtils.java

76 lines
3.2 KiB
Java
Raw Normal View History

2020-04-24 03:25:58 +02:00
package net.minestom.server.collision;
2020-04-22 19:09:57 +02:00
2021-07-13 02:32:44 +02:00
import net.minestom.server.coordinate.Pos;
import net.minestom.server.coordinate.Vec;
import net.minestom.server.entity.Entity;
2020-04-24 03:25:58 +02:00
import net.minestom.server.instance.Instance;
2020-12-04 19:19:30 +01:00
import net.minestom.server.instance.WorldBorder;
2020-04-24 03:25:58 +02:00
import net.minestom.server.instance.block.Block;
2022-03-09 19:08:42 +01:00
import net.minestom.server.item.Material;
import net.minestom.server.utils.chunk.ChunkCache;
2022-03-09 19:08:42 +01:00
import org.jetbrains.annotations.ApiStatus;
2020-12-04 19:19:30 +01:00
import org.jetbrains.annotations.NotNull;
2022-03-09 19:08:42 +01:00
import org.jetbrains.annotations.Nullable;
2020-04-22 19:09:57 +02:00
2022-03-09 19:08:42 +01:00
import java.util.function.Supplier;
2021-08-13 10:12:28 +02:00
2022-03-09 19:08:42 +01:00
@ApiStatus.Internal
@ApiStatus.Experimental
public final class CollisionUtils {
/**
* Moves an entity with physics applied (ie checking against blocks)
2022-03-09 19:08:42 +01:00
* <p>
* Works by getting all the full blocks that an entity could interact with.
* All bounding boxes inside the full blocks are checked for collisions with the entity.
*
2021-07-13 02:32:44 +02:00
* @param entity the entity to move
2021-07-06 22:26:11 +02:00
* @return the result of physics simulation
*/
2022-03-09 19:08:42 +01:00
public static PhysicsResult handlePhysics(@NotNull Entity entity, @NotNull Vec entityVelocity,
@Nullable PhysicsResult lastPhysicsResult) {
final BoundingBox boundingBox = entity.getBoundingBox();
final Pos currentPosition = entity.getPosition();
final Block.Getter getter = new ChunkCache(entity.getInstance(), entity.getChunk(), Block.STONE);
return BlockCollision.handlePhysics(boundingBox,
entityVelocity, currentPosition,
getter, lastPhysicsResult);
}
2022-03-09 19:08:42 +01:00
public static PhysicsResult handlePhysics(@NotNull Entity entity, @NotNull Vec entityVelocity) {
return handlePhysics(entity, entityVelocity, null);
2020-04-22 19:09:57 +02:00
}
2020-12-04 19:19:30 +01:00
/**
* Applies world border collision.
*
* @param instance the instance where the world border is
* @param currentPosition the current position
* @param newPosition the future target position
* @return the position with the world border collision applied (can be {@code newPosition} if not changed)
*/
2021-07-09 20:43:12 +02:00
public static @NotNull Pos applyWorldBorder(@NotNull Instance instance,
2021-07-13 02:32:44 +02:00
@NotNull Pos currentPosition, @NotNull Pos newPosition) {
2020-12-04 19:19:30 +01:00
final WorldBorder worldBorder = instance.getWorldBorder();
final WorldBorder.CollisionAxis collisionAxis = worldBorder.getCollisionAxis(newPosition);
2021-10-22 01:55:55 +02:00
return switch (collisionAxis) {
case NONE ->
2022-03-09 19:08:42 +01:00
// Apply velocity + gravity
2021-10-22 01:55:55 +02:00
newPosition;
case BOTH ->
2022-03-09 19:08:42 +01:00
// Apply Y velocity/gravity
2021-10-22 01:55:55 +02:00
new Pos(currentPosition.x(), newPosition.y(), currentPosition.z());
case X ->
2022-03-09 19:08:42 +01:00
// Apply Y/Z velocity/gravity
2021-10-22 01:55:55 +02:00
new Pos(currentPosition.x(), newPosition.y(), newPosition.z());
case Z ->
2022-03-09 19:08:42 +01:00
// Apply X/Y velocity/gravity
2021-10-22 01:55:55 +02:00
new Pos(newPosition.x(), newPosition.y(), currentPosition.z());
};
2020-12-04 19:19:30 +01:00
}
2022-03-09 19:08:42 +01:00
public static Shape parseBlockShape(String str, Supplier<Material> block) {
return ShapeImpl.parseBlockFromRegistry(str, block);
2021-07-06 22:26:11 +02:00
}
2020-04-22 19:09:57 +02:00
}