Yatopia/patches/server/0062-Use-faster-block-collision-check-for-entity-suffocat.patch
Ivan Pekov ef03360a82
Updated Upstream and Sidestream(s) (Tuinity)
Upstream/An Sidestream has released updates that appears to apply and compile correctly
This update has NOT been tested by YatopiaMC and as with ANY update, please do your own testing.

Tuinity Changes:
8d982c4 Updated Upstream (Paper)
2c7bad9 Merge branch 'master' of https://github.com/Spottedleaf/Tuinity into ver/1.16.3
88a2c88 Revert usage of region manager
08581cf More validation
2020-09-30 16:32:49 +03:00

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 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
}
}