From 5d926aa6236b7cee7b347dd0cf3614aa676dda24 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sun, 13 Jun 2021 18:32:17 +0200 Subject: [PATCH] collisions: remove current block if stuck in block --- .../bixilon/minosoft/data/physics/CollisionDetector.kt | 9 ++++++++- .../bixilon/minosoft/gui/rendering/chunk/VoxelShape.kt | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/bixilon/minosoft/data/physics/CollisionDetector.kt b/src/main/java/de/bixilon/minosoft/data/physics/CollisionDetector.kt index 28894074a..5cf5a42cb 100644 --- a/src/main/java/de/bixilon/minosoft/data/physics/CollisionDetector.kt +++ b/src/main/java/de/bixilon/minosoft/data/physics/CollisionDetector.kt @@ -20,6 +20,7 @@ import de.bixilon.minosoft.gui.rendering.chunk.VoxelShape import de.bixilon.minosoft.gui.rendering.chunk.models.AABB import de.bixilon.minosoft.gui.rendering.util.VecUtil.EMPTY import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition +import de.bixilon.minosoft.gui.rendering.util.VecUtil.floor import de.bixilon.minosoft.gui.rendering.util.VecUtil.inChunkPosition import de.bixilon.minosoft.protocol.network.connection.PlayConnection import glm_.vec3.Vec3 @@ -31,7 +32,13 @@ class CollisionDetector(val connection: PlayConnection) { private fun getCollisionsToCheck(deltaPosition: Vec3d, aabb: AABB, ignoreUnloadedChunks: Boolean = true): VoxelShape { // also look at blocks further down to also cover blocks with a higher than normal hitbox (for example fences) - val blockPositions = (aabb extend deltaPosition extend Directions.DOWN grow COLLISION_BOX_MARGIN).blockPositions + val blockPositions = (aabb extend deltaPosition extend Directions.DOWN grow COLLISION_BOX_MARGIN).blockPositions.toMutableList() + + // check if already in block + if (!connection.world.isSpaceEmpty(aabb)) { + blockPositions.remove(aabb.min.floor) + } + val result = VoxelShape() for (blockPosition in blockPositions) { val chunk = connection.world[blockPosition.chunkPosition] diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/VoxelShape.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/VoxelShape.kt index 99020f874..621985eb3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/VoxelShape.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/VoxelShape.kt @@ -73,6 +73,12 @@ class VoxelShape(private val aabbs: MutableList = mutableListOf()) : Itera } } + fun remove(voxelShape: VoxelShape) { + for (newAABB in voxelShape.aabbs) { + aabbs.remove(newAABB) + } + } + fun computeOffset(other: AABB, offset: Double, axis: Axes): Double { var result = offset for (aabb in aabbs) {