From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Mykyta Komarn Date: Tue, 29 Sep 2020 17:27:30 -0700 Subject: [PATCH] Use faster block collision check for entity suffocation check Improves the speed of checks by ~3,000ns per entity on average. diff --git a/src/main/java/me/jellysquid/mods/lithium/common/entity/movement/ChunkAwareBlockCollisionSweeper.java b/src/main/java/me/jellysquid/mods/lithium/common/entity/movement/ChunkAwareBlockCollisionSweeper.java index 7ed343cfb3130446c85dab2ca04d60f91e2c94fb..194d2f177b05c594c7a27b6191860a3f89394f06 100644 --- a/src/main/java/me/jellysquid/mods/lithium/common/entity/movement/ChunkAwareBlockCollisionSweeper.java +++ b/src/main/java/me/jellysquid/mods/lithium/common/entity/movement/ChunkAwareBlockCollisionSweeper.java @@ -16,6 +16,7 @@ import net.minecraft.server.VoxelShape; import net.minecraft.server.VoxelShapeCollision; import net.minecraft.server.VoxelShapes; +import java.util.function.BiPredicate; // Yatopia import static me.jellysquid.mods.lithium.common.entity.LithiumEntityCollisions.EPSILON; /** @@ -59,6 +60,21 @@ public class ChunkAwareBlockCollisionSweeper { private ChunkSection cachedChunkSection; private boolean needEntityCollisionCheck; + // Yatopia start + private boolean checkSuffocation; + private final BiPredicate suffocationPredicate = new BiPredicate() { + @Override + public boolean test(IBlockData iBlockData, BlockPosition blockPosition) { + return iBlockData.o(view, blockPosition); + } + }; + + public ChunkAwareBlockCollisionSweeper(ICollisionAccess view, Entity entity, AxisAlignedBB box, boolean checkSuffocation) { + this(view, entity, box); + this.checkSuffocation = checkSuffocation; + } + // Yatopia end + public ChunkAwareBlockCollisionSweeper(ICollisionAccess view, Entity entity, AxisAlignedBB box) { this.box = box; this.shape = VoxelShapes.of(box); @@ -206,6 +222,11 @@ public class ChunkAwareBlockCollisionSweeper { if (canInteractWithBlock(state, edgesHit)) { this.pos.setValues(x, y, z); + // Yatopia start + if (checkSuffocation && !suffocationPredicate.test(state, this.pos)) { + continue; + } + // Yatopia end VoxelShape collisionShape = state.getCollisionShape(this.view, this.pos, this.context); if (collisionShape != VoxelShapes.empty()) { diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index ffac4d061cbfb3428317d8f23c9de2efcac460a8..2ae651710832e3b3bc4db16e5355f5012407a5b5 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -2171,9 +2171,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke float f1 = this.size.width * 0.8F; AxisAlignedBB axisalignedbb = AxisAlignedBB.g((double) f1, 0.10000000149011612D, (double) f1).d(this.locX(), this.getHeadY(), this.locZ()); - return this.world.b(this, axisalignedbb, (iblockdata, blockposition) -> { - return iblockdata.o(this.world, blockposition); - }).findAny().isPresent(); + return new me.jellysquid.mods.lithium.common.entity.movement.ChunkAwareBlockCollisionSweeper(this.world, this, axisalignedbb, true).getNextCollidedShape() != null; // Yatopia - fast suffocation check } }