diff --git a/paper-api/src/main/java/org/bukkit/block/Block.java b/paper-api/src/main/java/org/bukkit/block/Block.java index bd20c4a88a..da0964b1b6 100644 --- a/paper-api/src/main/java/org/bukkit/block/Block.java +++ b/paper-api/src/main/java/org/bukkit/block/Block.java @@ -15,6 +15,7 @@ import org.bukkit.metadata.Metadatable; import org.bukkit.util.BoundingBox; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; +import org.bukkit.util.VoxelShape; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -501,4 +502,13 @@ public interface Block extends Metadatable { */ @NotNull BoundingBox getBoundingBox(); + + /** + * Gets the collision shape of this block. + * + * @return a {@link VoxelShape} representing the collision shape of this + * block. + */ + @NotNull + VoxelShape getCollisionShape(); } diff --git a/paper-api/src/main/java/org/bukkit/util/VoxelShape.java b/paper-api/src/main/java/org/bukkit/util/VoxelShape.java new file mode 100644 index 0000000000..8d8888cd67 --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/util/VoxelShape.java @@ -0,0 +1,30 @@ +package org.bukkit.util; + +import java.util.Collection; +import org.jetbrains.annotations.NotNull; + +/** + * A shape made out of voxels. + * + * For example, used to represent the detailed collision shape of blocks. + */ +public interface VoxelShape { + + /** + * Converts this shape into a collection of {@link BoundingBox} equivalent + * to the shape: a bounding box intersects with this block shape if it + * intersects with any of the shape's bounding boxes. + * + * @return shape converted to bounding boxes + */ + @NotNull + public Collection getBoundingBoxes(); + + /** + * Checks if the given bounding box intersects this block shape. + * + * @param other bounding box to test + * @return true if other overlaps this, false otherwise + */ + public boolean overlaps(@NotNull BoundingBox other); +}