From 50a7d7ca81771b7900e224aa68ee7763b660d477 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 13 Apr 2022 12:07:43 +0200 Subject: [PATCH] ShapeImpl should not depend on the block material Signed-off-by: TheMode --- .../server/collision/CollisionUtils.java | 18 ++++++------- .../minestom/server/collision/ShapeImpl.java | 27 ++++++++++++------- .../minestom/server/registry/Registry.java | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/minestom/server/collision/CollisionUtils.java b/src/main/java/net/minestom/server/collision/CollisionUtils.java index df8e73411..5b567d20f 100644 --- a/src/main/java/net/minestom/server/collision/CollisionUtils.java +++ b/src/main/java/net/minestom/server/collision/CollisionUtils.java @@ -8,14 +8,12 @@ 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.item.Material; +import net.minestom.server.registry.Registry; import net.minestom.server.utils.chunk.ChunkCache; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Supplier; - @ApiStatus.Internal @ApiStatus.Experimental public final class CollisionUtils { @@ -48,9 +46,9 @@ public final class CollisionUtils { * @return the result of physics simulation */ public static PhysicsResult handlePhysics(@NotNull Instance instance, @Nullable Chunk chunk, - @NotNull BoundingBox boundingBox, - @NotNull Pos position, @NotNull Vec velocity, - @Nullable PhysicsResult lastPhysicsResult) { + @NotNull BoundingBox boundingBox, + @NotNull Pos position, @NotNull Vec velocity, + @Nullable PhysicsResult lastPhysicsResult) { final Block.Getter getter = new ChunkCache(instance, chunk != null ? chunk : instance.getChunkAt(position), Block.STONE); return BlockCollision.handlePhysics(boundingBox, velocity, position, @@ -69,8 +67,8 @@ public final class CollisionUtils { * @return true is shape is reachable by the given line of sight; false otherwise. */ public static boolean isLineOfSightReachingShape(@NotNull Instance instance, @Nullable Chunk chunk, - @NotNull Point start, @NotNull Point end, - @NotNull Shape shape) { + @NotNull Point start, @NotNull Point end, + @NotNull Shape shape) { final PhysicsResult result = handlePhysics(instance, chunk, BoundingBox.ZERO, Pos.fromPoint(start), Vec.fromPoint(end.sub(start)), @@ -114,7 +112,7 @@ public final class CollisionUtils { }; } - public static Shape parseBlockShape(String str, Supplier block) { - return ShapeImpl.parseBlockFromRegistry(str, block); + public static Shape parseBlockShape(String str, Registry.BlockEntry blockEntry) { + return ShapeImpl.parseBlockFromRegistry(str, blockEntry); } } diff --git a/src/main/java/net/minestom/server/collision/ShapeImpl.java b/src/main/java/net/minestom/server/collision/ShapeImpl.java index 070da0b1b..fc4bee640 100644 --- a/src/main/java/net/minestom/server/collision/ShapeImpl.java +++ b/src/main/java/net/minestom/server/collision/ShapeImpl.java @@ -4,10 +4,10 @@ import it.unimi.dsi.fastutil.doubles.DoubleArrayList; import it.unimi.dsi.fastutil.doubles.DoubleList; import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Vec; -import net.minestom.server.item.Material; +import net.minestom.server.instance.block.Block; +import net.minestom.server.registry.Registry; import org.jetbrains.annotations.NotNull; -import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,11 +15,13 @@ final class ShapeImpl implements Shape { private static final Pattern PATTERN = Pattern.compile("\\d.\\d{1,3}", Pattern.MULTILINE); private final BoundingBox[] blockSections; private final Point relativeStart, relativeEnd; - private final Supplier block; - private ShapeImpl(BoundingBox[] boundingBoxes, Supplier block) { + private final Registry.BlockEntry blockEntry; + private Block block; + + private ShapeImpl(BoundingBox[] boundingBoxes, Registry.BlockEntry blockEntry) { this.blockSections = boundingBoxes; - this.block = block; + this.blockEntry = blockEntry; // Find bounds { double minX = 1, minY = 1, minZ = 1; @@ -39,7 +41,7 @@ final class ShapeImpl implements Shape { } } - static ShapeImpl parseBlockFromRegistry(String str, Supplier block) { + static ShapeImpl parseBlockFromRegistry(String str, Registry.BlockEntry blockEntry) { final Matcher matcher = PATTERN.matcher(str); DoubleList vals = new DoubleArrayList(); while (matcher.find()) { @@ -64,7 +66,7 @@ final class ShapeImpl implements Shape { assert bb.minZ() == minZ; boundingBoxes[i] = bb; } - return new ShapeImpl(boundingBoxes, block); + return new ShapeImpl(boundingBoxes, blockEntry); } @Override @@ -86,7 +88,8 @@ final class ShapeImpl implements Shape { } @Override - public boolean intersectBoxSwept(@NotNull Point rayStart, @NotNull Point rayDirection, @NotNull Point shapePos, @NotNull BoundingBox moving, @NotNull SweepResult finalResult) { + public boolean intersectBoxSwept(@NotNull Point rayStart, @NotNull Point rayDirection, + @NotNull Point shapePos, @NotNull BoundingBox moving, @NotNull SweepResult finalResult) { boolean hitBlock = false; for (BoundingBox blockSection : blockSections) { // Fast check to see if a collision happens @@ -97,10 +100,16 @@ final class ShapeImpl implements Shape { if (RayUtils.SweptAABB(moving, rayStart, rayDirection, blockSection, shapePos, finalResult)) { finalResult.collidedShapePosition = shapePos; finalResult.collidedShape = this; - finalResult.blockType = block.get().block(); + finalResult.blockType = block(); } hitBlock = true; } return hitBlock; } + + private Block block() { + Block block = this.block; + if (block == null) this.block = block = Block.fromStateId((short) blockEntry.stateId()); + return block; + } } diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index a07d9161d..a9ad4b530 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -200,7 +200,7 @@ public final class Registry { } { final String string = main.getString("collisionShape"); - this.shape = CollisionUtils.parseBlockShape(string, this.materialSupplier); + this.shape = CollisionUtils.parseBlockShape(string, this); } }