mirror of
https://github.com/YatopiaMC/Yatopia.git
synced 2024-11-05 18:33:22 +01:00
9047fcc9d4
* Use faster block collision check for entity suffocation check Improves the speed of checks by ~3,000ns per entity on average. * Add alternative constructor for suffocation check This fixes entities falling through non-full blocks, such as slabs or hoppers. * add patches.md Co-authored-by: Mykyta Komarn <nkomarn@hotmail.com>
69 lines
3.6 KiB
Diff
69 lines
3.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Mykyta Komarn <nkomarn@hotmail.com>
|
|
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<IBlockData, BlockPosition> suffocationPredicate = new BiPredicate<IBlockData, BlockPosition>() {
|
|
+ @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 9dfc5649b552a8cb16092fe6b20aa1c181b59d5e..d4c5d805cc9c8fb92b373536a3f07da50c19524a 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
|
|
}
|
|
}
|
|
|