mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
* Unify comment format * More configurable * Remove one extra execute mid-tick task call in level tick when PWT is disabled This may cause extremely rare, weird, strange, magic, mysterious issues with plugins, or potentially more. One example is that it may cause boss mob duplication issue when `ONE MOB ONLY` was enabled in plugin SupremeBosses
88 lines
6.0 KiB
Diff
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 5abd7fabcd1b860d66ce5363373c236393d1a580..fb9623d89376fc42fd5892e9c395439f55fa5ac5 100644
|
|
--- a/net/minecraft/server/level/ServerLevel.java
|
|
+++ b/net/minecraft/server/level/ServerLevel.java
|
|
@@ -1105,6 +1105,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 30813f3d9aeece3d8a63300b8dc73ebaed8e75cd..f6d619709d4e5b0e6d1b943226579d7388835cdb 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
|
|
}
|