From 662cf20316441d0cc58bd44cadb7ab94edd0d4d8 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sat, 6 Apr 2024 23:09:19 -0400 Subject: [PATCH] Fix and update optimize minecart patch --- ...e-minecart-vehicle-collision-results.patch | 115 ----------------- .../0043-Optimize-Minecart-collisions.patch | 122 ++++++++++++++++++ patches/server/0044-Reduce-canSee-work.patch | 4 +- .../server/0045-Faster-Natural-Spawning.patch | 4 +- 4 files changed, 126 insertions(+), 119 deletions(-) delete mode 100644 patches/server/0043-Cache-minecart-vehicle-collision-results.patch create mode 100644 patches/server/0043-Optimize-Minecart-collisions.patch diff --git a/patches/server/0043-Cache-minecart-vehicle-collision-results.patch b/patches/server/0043-Cache-minecart-vehicle-collision-results.patch deleted file mode 100644 index dc6ab74fa..000000000 --- a/patches/server/0043-Cache-minecart-vehicle-collision-results.patch +++ /dev/null @@ -1,115 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: MrHua269 -Date: Wed, 23 Aug 2023 14:21:16 -0400 -Subject: [PATCH] Cache minecart vehicle collision results - -Co-authored-by: MrHua269 - -Cache minecart vehicle collision results to prevent lag causing by massive stacked minecart -The known issue: entity can't enter the minecart after enabling this! - -diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index eb5bd5cfd131042e366872bf599a315d83dc732b..024000e5b1c36e72a4b6cfff233d7a64cdb80758 100644 ---- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -+++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java -@@ -5,6 +5,8 @@ import com.google.common.collect.ImmutableMap; - import com.google.common.collect.Maps; - import com.google.common.collect.UnmodifiableIterator; - import com.mojang.datafixers.util.Pair; -+ -+import java.util.ArrayList; - import java.util.Iterator; - import java.util.List; - import java.util.Map; -@@ -294,6 +296,15 @@ public abstract class AbstractMinecart extends VehicleEntity { - return this.flipped ? this.getDirection().getOpposite().getClockWise() : this.getDirection().getClockWise(); - } - -+ // Leaf start - Cache minecart vehicle collision results -+ private List lastCollideCache = new ArrayList<>(); -+ private void checkAndUpdateCache(boolean ride) { -+ if (this.tickCount % 30 == 0) { -+ this.lastCollideCache = ride ? this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), EntitySelector.pushableBy(this)) : this.level().getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D)); -+ } -+ } -+ // Leaf end -+ - @Override - public void tick() { - // Purpur start -@@ -390,14 +401,13 @@ public abstract class AbstractMinecart extends VehicleEntity { - } - // CraftBukkit end - if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) { -- List list = this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), EntitySelector.pushableBy(this)); -+ // Leaf start - Cache minecart vehicle collision results -+ if (org.dreeam.leaf.config.modules.opt.CacheMinecartCollision.enabled) this.checkAndUpdateCache(true); -+ List list = org.dreeam.leaf.config.modules.opt.CacheMinecartCollision.enabled ? this.lastCollideCache : this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), EntitySelector.pushableBy(this));; // Leaf - Cache minecart vehicle collision results - - if (!list.isEmpty()) { -- Iterator iterator = list.iterator(); -- -- while (iterator.hasNext()) { -- Entity entity = (Entity) iterator.next(); - -+ for (Entity entity : list) { - if (!(entity instanceof Player) && !(entity instanceof IronGolem) && !(entity instanceof AbstractMinecart) && !this.isVehicle() && !entity.isPassenger()) { - // CraftBukkit start - VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity.getBukkitEntity()); -@@ -424,11 +434,10 @@ public abstract class AbstractMinecart extends VehicleEntity { - } - } - } else { -- Iterator iterator1 = this.level().getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D)).iterator(); -- -- while (iterator1.hasNext()) { -- Entity entity1 = (Entity) iterator1.next(); -+ if (org.dreeam.leaf.config.modules.opt.CacheMinecartCollision.enabled) this.checkAndUpdateCache(false); // Leaf - Cache minecart vehicle collision results -+ List list2 = org.dreeam.leaf.config.modules.opt.CacheMinecartCollision.enabled ? this.lastCollideCache : this.level().getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D));; // Leaf - Cache minecart vehicle collision results - -+ for (Entity entity1 : list2) { - if (!this.hasPassenger(entity1) && entity1.isPushable() && entity1 instanceof AbstractMinecart) { - // CraftBukkit start - VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity1.getBukkitEntity()); -@@ -442,6 +451,7 @@ public abstract class AbstractMinecart extends VehicleEntity { - } - } - } -+ // Leaf end - - this.updateInWaterStateAndDoFluidPushing(); - if (this.isInLava()) { -diff --git a/src/main/java/org/dreeam/leaf/config/modules/opt/CacheMinecartCollision.java b/src/main/java/org/dreeam/leaf/config/modules/opt/CacheMinecartCollision.java -new file mode 100644 -index 0000000000000000000000000000000000000000..edd7f1440751f535a209a6762c152532f2bb0427 ---- /dev/null -+++ b/src/main/java/org/dreeam/leaf/config/modules/opt/CacheMinecartCollision.java -@@ -0,0 +1,28 @@ -+package org.dreeam.leaf.config.modules.opt; -+ -+import com.electronwill.nightconfig.core.file.CommentedFileConfig; -+import org.dreeam.leaf.config.ConfigInfo; -+import org.dreeam.leaf.config.EnumConfigCategory; -+import org.dreeam.leaf.config.IConfigModule; -+ -+public class CacheMinecartCollision implements IConfigModule { -+ -+ -+ @Override -+ public EnumConfigCategory getCategory() { -+ return EnumConfigCategory.PERFORMANCE; -+ } -+ -+ @Override -+ public String getBaseName() { -+ return "cache_minecart_collision"; -+ } -+ -+ @ConfigInfo(baseName = "enabled") -+ public static boolean enabled = false; -+ -+ @Override -+ public void onLoaded(CommentedFileConfig config) { -+ config.setComment("performance.cache_minecart_collision", "Cache the minecart collision result to prevent massive stacked minecart lag the server."); -+ } -+} diff --git a/patches/server/0043-Optimize-Minecart-collisions.patch b/patches/server/0043-Optimize-Minecart-collisions.patch new file mode 100644 index 000000000..8f6eab10d --- /dev/null +++ b/patches/server/0043-Optimize-Minecart-collisions.patch @@ -0,0 +1,122 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> +Date: Sat, 6 Apr 2024 22:57:41 -0400 +Subject: [PATCH] Optimize Minecart collisions + +Skip tick collisions to to prevent lag causing by massive stacked Minecart +Useful for anarchy server. + +diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +index eb5bd5cfd131042e366872bf599a315d83dc732b..9bf74e76a2b2fef92bef37fbaee2171b7f7a357d 100644 +--- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java ++++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +@@ -5,7 +5,8 @@ import com.google.common.collect.ImmutableMap; + import com.google.common.collect.Maps; + import com.google.common.collect.UnmodifiableIterator; + import com.mojang.datafixers.util.Pair; +-import java.util.Iterator; ++ ++import java.util.ArrayList; + import java.util.List; + import java.util.Map; + import javax.annotation.Nullable; +@@ -389,15 +390,15 @@ public abstract class AbstractMinecart extends VehicleEntity { + this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); + } + // CraftBukkit end +- if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) { ++ // Leaf start - Optimize Minecart collision handling ++ // The logic below is used to get list of entities around Minecart ++ // and handle behaviors for their collisions with each other ++ if (!org.dreeam.leaf.config.modules.opt.OptimizeMinecart.enabled || this.tickCount % org.dreeam.leaf.config.modules.opt.OptimizeMinecart.skipTickCount == 0) { ++ if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && (org.dreeam.leaf.config.modules.opt.OptimizeMinecart.enabled || this.getDeltaMovement().horizontalDistanceSqr() > 0.01D)) { + List list = this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), EntitySelector.pushableBy(this)); + + if (!list.isEmpty()) { +- Iterator iterator = list.iterator(); +- +- while (iterator.hasNext()) { +- Entity entity = (Entity) iterator.next(); +- ++ for (Entity entity : list) { + if (!(entity instanceof Player) && !(entity instanceof IronGolem) && !(entity instanceof AbstractMinecart) && !this.isVehicle() && !entity.isPassenger()) { + // CraftBukkit start + VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity.getBukkitEntity()); +@@ -424,11 +425,7 @@ public abstract class AbstractMinecart extends VehicleEntity { + } + } + } else { +- Iterator iterator1 = this.level().getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D)).iterator(); +- +- while (iterator1.hasNext()) { +- Entity entity1 = (Entity) iterator1.next(); +- ++ for (Entity entity1 : this.level().getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D))) { + if (!this.hasPassenger(entity1) && entity1.isPushable() && entity1 instanceof AbstractMinecart) { + // CraftBukkit start + VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity1.getBukkitEntity()); +@@ -442,6 +439,8 @@ public abstract class AbstractMinecart extends VehicleEntity { + } + } + } ++ } ++ // Leaf end + + this.updateInWaterStateAndDoFluidPushing(); + if (this.isInLava()) { +diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java +index ff05efe0b78defe3d25905b6a2984bdb646fcff3..820f5dc02f89a54fab00942a3eaa72f006b3bd89 100644 +--- a/src/main/java/net/minecraft/world/level/Level.java ++++ b/src/main/java/net/minecraft/world/level/Level.java +@@ -1572,12 +1572,14 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + return this.getChunk(chunkX, chunkZ, ChunkStatus.FULL, false); + } + ++ // Leaf start - Optimize predicate call + @Override +- public List getEntities(@Nullable Entity except, AABB box, Predicate predicate) { ++ public List getEntities(@Nullable Entity except, AABB box, @Nullable Predicate predicate) { + List list = Lists.newArrayList(); +- ((ServerLevel)this).getEntityLookup().getEntities(except, box, list, predicate); // Paper - optimise this call +- return list; ++ ((ServerLevel) this).getEntityLookup().getEntities(except, box, list, null); // Paper - optimise this call ++ return predicate != null ? list.stream().filter(predicate).toList() : list; + } ++ // Leaf end + + @Override + public List getEntities(EntityTypeTest filter, AABB box, Predicate predicate) { +diff --git a/src/main/java/org/dreeam/leaf/config/modules/opt/OptimizeMinecart.java b/src/main/java/org/dreeam/leaf/config/modules/opt/OptimizeMinecart.java +new file mode 100644 +index 0000000000000000000000000000000000000000..a891454eb9b83d50ef3e8914efbb013f88a6b3fd +--- /dev/null ++++ b/src/main/java/org/dreeam/leaf/config/modules/opt/OptimizeMinecart.java +@@ -0,0 +1,28 @@ ++package org.dreeam.leaf.config.modules.opt; ++ ++import org.dreeam.leaf.config.ConfigInfo; ++import org.dreeam.leaf.config.EnumConfigCategory; ++import org.dreeam.leaf.config.IConfigModule; ++ ++public class OptimizeMinecart implements IConfigModule { ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.PERFORMANCE; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "optimize_minecart"; ++ } ++ ++ @ConfigInfo(baseName = "enabled", comments = """ ++ Enable this feature to handle large amount of stacked Minecart better. ++ By skipping tick collisions to reduce expense getting entities list ++ and bukkit event calls, useful for the anarchy server. ++ """) ++ public static boolean enabled = false; ++ ++ @ConfigInfo(baseName = "skip-tick-count") ++ public static int skipTickCount = 30; ++} diff --git a/patches/server/0044-Reduce-canSee-work.patch b/patches/server/0044-Reduce-canSee-work.patch index c9b949a1f..f1702041c 100644 --- a/patches/server/0044-Reduce-canSee-work.patch +++ b/patches/server/0044-Reduce-canSee-work.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Reduce canSee work Credit by: Martijn Muijsers , MachineBreaker diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 7ce1f694d84f395406b1e06217f549f5f3e6e294..5f1043e84ba315b420c0bf60dfd3c2248bd03cc3 100644 +index 820f5dc02f89a54fab00942a3eaa72f006b3bd89..14668a88d741de97817cdd7845dc9582610f590d 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -394,17 +394,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -392,17 +392,19 @@ public abstract class Level implements LevelAccessor, AutoCloseable { for (int i = 0, len = entities.size(); i < len; ++i) { Entity entity = entities.get(i); diff --git a/patches/server/0045-Faster-Natural-Spawning.patch b/patches/server/0045-Faster-Natural-Spawning.patch index c00bc4750..22f636950 100644 --- a/patches/server/0045-Faster-Natural-Spawning.patch +++ b/patches/server/0045-Faster-Natural-Spawning.patch @@ -22,10 +22,10 @@ index ff1ad1024419182f7f3de578442c1c033d4c9ebb..5e51a1c79811291a740ad4d5e79a7d67 @Deprecated static RandomSource createThreadSafe() { diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 5f1043e84ba315b420c0bf60dfd3c2248bd03cc3..309b5a053d1115c149d2a72fdb71747dea8fc936 100644 +index 14668a88d741de97817cdd7845dc9582610f590d..e3f64fdfddb47b6bcdd3bf1ed7d31d540a555c90 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -128,6 +128,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { +@@ -126,6 +126,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { protected float oThunderLevel; public float thunderLevel; public final RandomSource random = RandomSource.create();