diff --git a/src/main/java/net/minestom/server/collision/CollisionUtils.java b/src/main/java/net/minestom/server/collision/CollisionUtils.java index a639d83b9..c565846c2 100644 --- a/src/main/java/net/minestom/server/collision/CollisionUtils.java +++ b/src/main/java/net/minestom/server/collision/CollisionUtils.java @@ -7,6 +7,7 @@ import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.WorldBorder; import net.minestom.server.instance.block.Block; +import net.minestom.server.instance.block.BlockGetter; import net.minestom.server.utils.chunk.ChunkUtils; import org.jetbrains.annotations.NotNull; @@ -121,10 +122,10 @@ public class CollisionUtils { // Collision at chunk border return true; } - final Block block = chunk.getBlock(newCorner); + final Block block = chunk.getBlock(newCorner, BlockGetter.Condition.TYPE); // TODO: block collision boxes // TODO: for the moment, always consider a full block - if (block.isSolid()) { + if (block != null && block.isSolid()) { corners.set(cornerIndex, new Vec( Math.abs(axis.x()) > 10e-16 ? newCorner.blockX() - axis.x() * sign : originalCorner.x(), Math.abs(axis.y()) > 10e-16 ? newCorner.blockY() - axis.y() * sign : originalCorner.y(), diff --git a/src/main/java/net/minestom/server/instance/DynamicChunk.java b/src/main/java/net/minestom/server/instance/DynamicChunk.java index b6f701ae0..9d972f87b 100644 --- a/src/main/java/net/minestom/server/instance/DynamicChunk.java +++ b/src/main/java/net/minestom/server/instance/DynamicChunk.java @@ -101,10 +101,12 @@ public class DynamicChunk extends Chunk { @Override public @Nullable Block getBlock(int x, int y, int z, @NotNull Condition condition) { // Verify if the block object is present - final Block entry = !entries.isEmpty() ? - entries.get(ChunkUtils.getBlockIndex(x, y, z)) : null; - if (entry != null || condition == Condition.CACHED) { - return entry; + if (condition != Condition.TYPE) { + final Block entry = !entries.isEmpty() ? + entries.get(ChunkUtils.getBlockIndex(x, y, z)) : null; + if (entry != null || condition == Condition.CACHED) { + return entry; + } } // Retrieve the block from state id final Section section = getOptionalSection(y); diff --git a/src/main/java/net/minestom/server/instance/block/BlockGetter.java b/src/main/java/net/minestom/server/instance/block/BlockGetter.java index 766d02a42..f8b5071d7 100644 --- a/src/main/java/net/minestom/server/instance/block/BlockGetter.java +++ b/src/main/java/net/minestom/server/instance/block/BlockGetter.java @@ -1,6 +1,7 @@ package net.minestom.server.instance.block; import net.minestom.server.coordinate.Point; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -21,6 +22,11 @@ public interface BlockGetter { return Objects.requireNonNull(getBlock(point, Condition.NONE)); } + /** + * Represents a hint to retrieve blocks more efficiently. + * Implementing interfaces do not have to honor this. + */ + @ApiStatus.Experimental enum Condition { /** * Returns a block no matter what. @@ -28,10 +34,17 @@ public interface BlockGetter { */ NONE, /** - * Returns a block only if it has a handler or nbt. + * Hints that the method should return only if the block is cached. *

- * Should be more performant than {@link #NONE}. + * Useful if you are only interested in a block handler or nbt. */ - CACHED + CACHED, + /** + * Hints that we only care about the block type. + *

+ * Useful if you need to retrieve registry information about the block. + * Be aware that the returned block may not return the proper handler/nbt. + */ + TYPE } }