9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2026-01-04 15:41:40 +00:00
Files
Leaf/leaf-server/minecraft-patches/features/0199-optimize-mob-despawn.patch
Dreeam 9a4efaa230 Drop patch that causes performance regression
Originally vanilla logic is to use stream, and Mojang switched it to Guava's Collections2
since 1.21.4. It is much faster than using stream or manually adding to a new ArrayList.
Manually adding to a new ArrayList requires allocating a new object array. However, the Collections2
lazy handles filter condition on iteration, so much better.
2025-08-04 19:25:56 +08:00

147 lines
6.8 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: hayanesuru <hayanesuru@outlook.jp>
Date: Fri, 4 Jul 2025 03:22:38 +0900
Subject: [PATCH] optimize mob despawn
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
index 7fb763e89e43698bfb2b9fcf6296705384e8624a..91752678f887559132921cff61697478e5f44e3d 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -797,13 +797,19 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
}
io.papermc.paper.entity.activation.ActivationRange.activateEntities(this); // Paper - EAR
+
+ if (org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled && tickRateManager.runsNormally()) { despawnMap.tick(this, this.entityTickList); } // Leaf - optimize despawn
this.entityTickList
.forEach(
entity -> {
entity.activatedPriorityReset = false; // Pufferfish - DAB
if (!entity.isRemoved()) {
if (!tickRateManager.isEntityFrozen(entity)) {
- entity.checkDespawn();
+ // Leaf start - optimize despawn
+ if (!org.dreeam.leaf.config.modules.opt.OptimizeDespawn.enabled) {
+ entity.checkDespawn();
+ }
+ // Leaf end - optimize despawn
if (true) { // Paper - rewrite chunk system
Entity vehicle = entity.getVehicle();
if (vehicle != null) {
@@ -945,6 +951,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
private int currentIceAndSnowTick = 0; protected void resetIceAndSnowTick() { this.currentIceAndSnowTick = this.simpleRandom.nextInt(16); } // Gale - Airplane - optimize random calls in chunk ticking
+ public final org.dreeam.leaf.world.DespawnMap despawnMap = new org.dreeam.leaf.world.DespawnMap(paperConfig()); // Leaf - optimize despawn
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 1d75ea57923f891a07b0c29e065ad46cdfac9b91..b87a1a2452cd236b4bdf7a7f12cae03f58833ccd 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -5132,6 +5132,11 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
public void checkDespawn() {
}
+ // Leaf start - optimize despawn
+ public void leafCheckDespawn() {
+ }
+ // Leaf end - optimize despawn
+
public Vec3[] getQuadLeashHolderOffsets() {
return Leashable.createQuadLeashOffsets(this, 0.0, 0.5, 0.5, 0.0);
}
diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java
index b22960f06f92ef4d9d12ab5b3891363534567a29..bb31b5c952152d8c6b9d3868893bb82deda5aa4d 100644
--- a/net/minecraft/world/entity/Mob.java
+++ b/net/minecraft/world/entity/Mob.java
@@ -764,6 +764,22 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab
}
}
+ // Leaf start - optimize despawn
+ @Override
+ public void leafCheckDespawn() {
+ if (isRemoved()) {
+ return;
+ }
+ if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) {
+ this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
+ } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) {
+ ((ServerLevel) level()).despawnMap.checkDespawn(this);
+ } else {
+ this.noActionTime = 0;
+ }
+ }
+ // Leaf end - optimize despawn
+
@Override
protected final void serverAiStep() {
this.noActionTime++;
diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
index de09a91b89661118e460842453e33f383ea08a94..e9fc2bf959949a8589a9ab87e00c85ffbe598a83 100644
--- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
+++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
@@ -956,6 +956,12 @@ public class EnderDragon extends Mob implements Enemy {
public void checkDespawn() {
}
+ // Leaf start - optimize despawn
+ @Override
+ public void leafCheckDespawn() {
+ }
+ // Leaf end - optimize despawn
+
public EnderDragonPart[] getSubEntities() {
return this.subEntities;
}
diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java
index e3c34d5f00ce64b3c08b10cfcb3dd14ebe8c1977..d8336fc8852b9939f341aedd17403913c7dadcf9 100644
--- a/net/minecraft/world/entity/boss/wither/WitherBoss.java
+++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java
@@ -695,6 +695,21 @@ public class WitherBoss extends Monster implements RangedAttackMob {
}
}
+
+ // Leaf start - optimize despawn
+ @Override
+ public void leafCheckDespawn() {
+ if (isRemoved()) {
+ return;
+ }
+ if (this.level().getDifficulty() == Difficulty.PEACEFUL && this.shouldDespawnInPeaceful()) {
+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
+ } else {
+ this.noActionTime = 0;
+ }
+ }
+ // Leaf end - optimize despawn
+
@Override
public boolean addEffect(MobEffectInstance effectInstance, @Nullable Entity entity) {
return false;
diff --git a/net/minecraft/world/entity/projectile/ShulkerBullet.java b/net/minecraft/world/entity/projectile/ShulkerBullet.java
index 00154ba80175bcb07b3378f19514fec1700c94e9..46d30c3273d31dbda06275ad098c6c2b9b2eed14 100644
--- a/net/minecraft/world/entity/projectile/ShulkerBullet.java
+++ b/net/minecraft/world/entity/projectile/ShulkerBullet.java
@@ -197,6 +197,16 @@ public class ShulkerBullet extends Projectile {
}
}
+
+ // Leaf start - optimize despawn
+ @Override
+ public void leafCheckDespawn() {
+ if (!isRemoved() && this.level().getDifficulty() == Difficulty.PEACEFUL) {
+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
+ }
+ }
+ // Leaf end - optimize despawn
+
@Override
protected double getDefaultGravity() {
return 0.04;