9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00
Files
Leaf/leaf-server/minecraft-patches/features/0292-cache-collision-list.patch
Creeam 3994984604 Improved fix of MC-298464 (#524)
* Improved fix of MC-298464

* Remove configurable & cleanup

* [ci skip] Fix patch order
2025-10-13 00:29:05 -04:00

88 lines
6.0 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: hayanesuru <hayanesuru@outlook.jp>
Date: Mon, 11 Aug 2025 02:19:59 +0900
Subject: [PATCH] cache collision list
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
index aa919f4aeb79e00afd455cc73de2825c63a6afc7..6ee710e78b6c169ea4bb0c92787bb2631e4f68cf 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -1095,6 +1095,8 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(paperConfig()); // Leaf - optimize despawn
public final org.dreeam.leaf.world.NatureSpawnChunkMap natureSpawnChunkMap = new org.dreeam.leaf.world.NatureSpawnChunkMap(); // Leaf - optimize mob spawning
public final org.dreeam.leaf.world.RandomTickSystem randomTickSystem = new org.dreeam.leaf.world.RandomTickSystem(); // Leaf - optimize random tick
+ public final org.dreeam.leaf.world.EntityCollisionCache entityCollisionCache = new org.dreeam.leaf.world.EntityCollisionCache(); // Leaf - cache collision list
+
public void tickChunk(LevelChunk chunk, int randomTickSpeed) {
final net.minecraft.world.level.levelgen.BitRandomSource simpleRandom = this.simpleRandom; // Paper - optimise random ticking // Leaf - Faster random generator - upcasting
ChunkPos pos = chunk.getPos();
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
index e4aac8b9b178c2780e9ba0e1232927fdd63f0f22..2e1804ea6ee00585edfbd0d531cfde013f766b4c 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -1552,8 +1552,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
final AABB currentBox = this.getBoundingBox();
- final List<VoxelShape> potentialCollisionsVoxel = new ArrayList<>();
- final List<AABB> potentialCollisionsBB = new ArrayList<>();
+ // final List<VoxelShape> potentialCollisionsVoxel = new ArrayList<>(); // Leaf - cache collision list
+ // final List<AABB> potentialCollisionsBB = new ArrayList<>(); // Leaf - cache collision list
final AABB initialCollisionBox;
if (xZero & zZero) {
@@ -1565,17 +1565,17 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
initialCollisionBox = currentBox.expandTowards(movement);
}
- final List<AABB> entityAABBs = new ArrayList<>();
+ org.dreeam.leaf.world.EntityCollisionCache entityCollisionCache = ((ServerLevel) this.level).entityCollisionCache; // Leaf - cache collision list
ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getEntityHardCollisions(
- this.level, (Entity)(Object)this, initialCollisionBox, entityAABBs, 0, null
+ this.level, (Entity)(Object)this, initialCollisionBox, entityCollisionCache.entityAABBs(), 0, null // Leaf - cache collision list
);
ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getCollisionsForBlocksOrWorldBorder(
- this.level, (Entity)(Object)this, initialCollisionBox, potentialCollisionsVoxel, potentialCollisionsBB,
+ this.level, (Entity)(Object)this, initialCollisionBox, entityCollisionCache.potentialCollisionsVoxel(), entityCollisionCache.potentialCollisionsBB(), // Leaf - cache collision list
ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.COLLISION_FLAG_CHECK_BORDER, null
);
- potentialCollisionsBB.addAll(entityAABBs);
- final Vec3 collided = ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.performCollisions(movement, currentBox, potentialCollisionsVoxel, potentialCollisionsBB);
+ entityCollisionCache.potentialCollisionsBB().addAll(entityCollisionCache.entityAABBs()); // Leaf - cache collision list
+ final Vec3 collided = ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.performCollisions(movement, currentBox, entityCollisionCache.potentialCollisionsVoxel(), entityCollisionCache.potentialCollisionsBB()); // Leaf - cache collision list
final boolean collidedX = collided.x != movement.x;
final boolean collidedY = collided.y != movement.y;
@@ -1586,6 +1586,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
final double stepHeight;
if ((!collidedDownwards && !this.onGround) || (!collidedX && !collidedZ) || (stepHeight = (double)this.maxUpStep()) <= 0.0) {
+ entityCollisionCache.clear(); // Leaf - cache collision list
return collided;
}
@@ -1596,7 +1597,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
}
final List<VoxelShape> stepVoxels = new ArrayList<>();
- final List<AABB> stepAABBs = entityAABBs;
+ final List<AABB> stepAABBs = entityCollisionCache.entityAABBs(); // Leaf // Leaf - cache collision list
ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.getCollisionsForBlocksOrWorldBorder(
this.level, (Entity)(Object)this, stepRetrievalBox, stepVoxels, stepAABBs,
@@ -1606,10 +1607,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
for (final float step : calculateStepHeights(collidedYBox, stepVoxels, stepAABBs, (float)stepHeight, (float)collided.y)) {
final Vec3 stepResult = ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.performCollisions(new Vec3(movement.x, (double)step, movement.z), collidedYBox, stepVoxels, stepAABBs);
if (stepResult.horizontalDistanceSqr() > collided.horizontalDistanceSqr()) {
+ entityCollisionCache.clear(); // Leaf - cache collision list
return stepResult.add(0.0, collidedYBox.minY - currentBox.minY, 0.0);
}
}
+ entityCollisionCache.clear(); // Leaf - cache collision list
return collided;
// Paper end - optimise collisions
}