From 0a0cdb8d54f0cb6991a1f7fa36126325e97a657a Mon Sep 17 00:00:00 2001 From: MrHua269 Date: Mon, 29 Jul 2024 20:16:25 +0800 Subject: [PATCH] Added some optimizations --- ...EntityCollisionContext-a-live-repres.patch | 99 ++++++++++ ...ish-Improve-fluid-direction-caching.patch} | 0 ...028-Pufferfish-Optimize-suffocation.patch} | 0 ...e-aging-cache-for-biome-temperatures.patch | 178 ++++++++++++++++++ ...return-optimization-for-target-find.patch} | 0 ...erfish-Reduce-chunk-loading-lookups.patch} | 0 ...per-6045-block-goal-shouldn-t-load-.patch} | 0 ...e-entity-fluid-lookups-if-no-fluids.patch} | 0 ...heck-for-spooky-season-once-an-hour.patch} | 0 ...ferfish-Skip-cloning-loot-parameters.patch | 23 +++ ...patch => 0036-Pufferfish-Entity-TTL.patch} | 0 ...ish-Reduce-projectile-chunk-loading.patch} | 0 ...ferfish-Dynamic-Activation-of-Brain.patch} | 0 ...le-goal-selector-during-inactive-ti.patch} | 0 ...ufferfish-Reduce-entity-allocations.patch} | 0 ...ve-container-checking-with-a-bitset.patch} | 0 ...er-ShapelessRecipes-comparison-for-V.patch | 65 +++++++ ...le-Variable-entity-wake-up-duration.patch} | 0 ...hunks-to-activate-climbing-entities.patch} | 0 ...=> 0045-Gale-Optimize-sun-burn-tick.patch} | 0 ...k-frozen-ticks-before-landing-block.patch} | 0 ...47-Gale-Use-platform-math-functions.patch} | 0 ...kip-entity-move-if-movement-is-zero.patch} | 0 ...ld-generation-chunk-and-block-acces.patch} | 0 ...0050-Gale-Optimize-noise-generation.patch} | 0 ...051-Gale-Faster-chunk-serialization.patch} | 0 ...a-and-Optional-allocation-in-Entity.patch} | 0 ...ttle-tracker-map-with-optimized-col.patch} | 0 ...parkly-Paper-Optimize-canSee-checks.patch} | 0 ...p-MapItem-update-if-the-map-does-not.patch | 46 +++++ ...p-distanceToSqr-call-in-ServerEntity.patch | 26 +++ ...7-Purpur-use-alternative-keep-alive.patch} | 0 ...I-and-display-of-chunkhot-in-tpsbar.patch} | 2 +- ...0059-Leaf-Skip-event-if-no-listeners.patch | 31 +++ ...-start-tick-and-finished-tick-event.patch} | 0 ...x-MC-2025.patch => 0061-Fix-MC-2025.patch} | 0 36 files changed, 469 insertions(+), 1 deletion(-) create mode 100644 patches/server/0026-Pufferfish-Make-EntityCollisionContext-a-live-repres.patch rename patches/server/{0026-Pufferfish-Improve-fluid-direction-caching.patch => 0027-Pufferfish-Improve-fluid-direction-caching.patch} (100%) rename patches/server/{0027-Pufferfish-Optimize-suffocation.patch => 0028-Pufferfish-Optimize-suffocation.patch} (100%) create mode 100644 patches/server/0029-Pufferfish-Use-aging-cache-for-biome-temperatures.patch rename patches/server/{0028-Pufferfish-Early-return-optimization-for-target-find.patch => 0030-Pufferfish-Early-return-optimization-for-target-find.patch} (100%) rename patches/server/{0029-Pufferfish-Reduce-chunk-loading-lookups.patch => 0031-Pufferfish-Reduce-chunk-loading-lookups.patch} (100%) rename patches/server/{0030-Pufferfish-Fix-Paper-6045-block-goal-shouldn-t-load-.patch => 0032-Pufferfish-Fix-Paper-6045-block-goal-shouldn-t-load-.patch} (100%) rename patches/server/{0031-Pufferfish-Reduce-entity-fluid-lookups-if-no-fluids.patch => 0033-Pufferfish-Reduce-entity-fluid-lookups-if-no-fluids.patch} (100%) rename patches/server/{0032-Pufferfish-Only-check-for-spooky-season-once-an-hour.patch => 0034-Pufferfish-Only-check-for-spooky-season-once-an-hour.patch} (100%) create mode 100644 patches/server/0035-Pufferfish-Skip-cloning-loot-parameters.patch rename patches/server/{0033-Pufferfish-Entity-TTL.patch => 0036-Pufferfish-Entity-TTL.patch} (100%) rename patches/server/{0034-Pufferfish-Reduce-projectile-chunk-loading.patch => 0037-Pufferfish-Reduce-projectile-chunk-loading.patch} (100%) rename patches/server/{0035-Pufferfish-Dynamic-Activation-of-Brain.patch => 0038-Pufferfish-Dynamic-Activation-of-Brain.patch} (100%) rename patches/server/{0036-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch => 0039-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch} (100%) rename patches/server/{0037-Pufferfish-Reduce-entity-allocations.patch => 0040-Pufferfish-Reduce-entity-allocations.patch} (100%) rename patches/server/{0038-Pufferfish-Improve-container-checking-with-a-bitset.patch => 0041-Pufferfish-Improve-container-checking-with-a-bitset.patch} (100%) create mode 100644 patches/server/0042-Pufferfish-Simpler-ShapelessRecipes-comparison-for-V.patch rename patches/server/{0039-Gale-Variable-entity-wake-up-duration.patch => 0043-Gale-Variable-entity-wake-up-duration.patch} (100%) rename patches/server/{0040-Gale-Don-t-load-chunks-to-activate-climbing-entities.patch => 0044-Gale-Don-t-load-chunks-to-activate-climbing-entities.patch} (100%) rename patches/server/{0041-Gale-Optimize-sun-burn-tick.patch => 0045-Gale-Optimize-sun-burn-tick.patch} (100%) rename patches/server/{0042-Gale-Check-frozen-ticks-before-landing-block.patch => 0046-Gale-Check-frozen-ticks-before-landing-block.patch} (100%) rename patches/server/{0043-Gale-Use-platform-math-functions.patch => 0047-Gale-Use-platform-math-functions.patch} (100%) rename patches/server/{0044-Gale-Skip-entity-move-if-movement-is-zero.patch => 0048-Gale-Skip-entity-move-if-movement-is-zero.patch} (100%) rename patches/server/{0045-Gale-Optimize-world-generation-chunk-and-block-acces.patch => 0049-Gale-Optimize-world-generation-chunk-and-block-acces.patch} (100%) rename patches/server/{0046-Gale-Optimize-noise-generation.patch => 0050-Gale-Optimize-noise-generation.patch} (100%) rename patches/server/{0047-Gale-Faster-chunk-serialization.patch => 0051-Gale-Faster-chunk-serialization.patch} (100%) rename patches/server/{0048-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch => 0052-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch} (100%) rename patches/server/{0049-Gale-Replace-throttle-tracker-map-with-optimized-col.patch => 0053-Gale-Replace-throttle-tracker-map-with-optimized-col.patch} (100%) rename patches/server/{0050-Sparkly-Paper-Optimize-canSee-checks.patch => 0054-Sparkly-Paper-Optimize-canSee-checks.patch} (100%) create mode 100644 patches/server/0055-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch create mode 100644 patches/server/0056-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch rename patches/server/{0051-Purpur-use-alternative-keep-alive.patch => 0057-Purpur-use-alternative-keep-alive.patch} (100%) rename patches/server/{0052-KioCG-Chunk-API-and-display-of-chunkhot-in-tpsbar.patch => 0058-KioCG-Chunk-API-and-display-of-chunkhot-in-tpsbar.patch} (99%) create mode 100644 patches/server/0059-Leaf-Skip-event-if-no-listeners.patch rename patches/server/{0053-Threaded-region-start-tick-and-finished-tick-event.patch => 0060-Threaded-region-start-tick-and-finished-tick-event.patch} (100%) rename patches/server/{0054-Fix-MC-2025.patch => 0061-Fix-MC-2025.patch} (100%) diff --git a/patches/server/0026-Pufferfish-Make-EntityCollisionContext-a-live-repres.patch b/patches/server/0026-Pufferfish-Make-EntityCollisionContext-a-live-repres.patch new file mode 100644 index 0000000..442fbc2 --- /dev/null +++ b/patches/server/0026-Pufferfish-Make-EntityCollisionContext-a-live-repres.patch @@ -0,0 +1,99 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Mon, 29 Jul 2024 19:53:42 +0800 +Subject: [PATCH] Pufferfish Make EntityCollisionContext a live representation + + +diff --git a/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java b/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java +index 88a4a72bb390947dc17e5da09a99b2d1b3ac4621..284c76ddb9724b44bb2e93f590685c728e843e6d 100644 +--- a/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java ++++ b/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java +@@ -17,50 +17,69 @@ public class EntityCollisionContext implements CollisionContext { + return defaultValue; + } + }; +- private final boolean descending; +- private final double entityBottom; +- private final ItemStack heldItem; +- private final Predicate canStandOnFluid; ++ // Pufferfish start - remove these and pray no plugin uses them ++ // private final boolean descending; ++ // private final double entityBottom; ++ // private final ItemStack heldItem; ++ // private final Predicate canStandOnFluid; ++ // Pufferfish end + @Nullable + private final Entity entity; + + protected EntityCollisionContext(boolean descending, double minY, ItemStack heldItem, Predicate walkOnFluidPredicate, @Nullable Entity entity) { +- this.descending = descending; +- this.entityBottom = minY; +- this.heldItem = heldItem; +- this.canStandOnFluid = walkOnFluidPredicate; ++ // Pufferfish start - remove these ++ // this.descending = descending; ++ // this.entityBottom = minY; ++ // this.heldItem = heldItem; ++ // this.canStandOnFluid = walkOnFluidPredicate; ++ // Pufferfish end + this.entity = entity; + } + + @Deprecated + protected EntityCollisionContext(Entity entity) { +- this( +- entity.isDescending(), +- entity.getY(), +- entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, +- entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : fluidState -> false, +- entity +- ); ++ // Pufferfish start - remove this ++ // this( ++ // entity.isDescending(), ++ // entity.getY(), ++ // entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, ++ // entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : fluidState -> false, ++ // entity ++ // ); ++ // Pufferfish end ++ this.entity = entity; + } + + @Override + public boolean isHoldingItem(Item item) { +- return this.heldItem.is(item); ++ // Pufferfish start ++ Entity entity = this.entity; ++ if (entity instanceof LivingEntity livingEntity) { ++ return livingEntity.getMainHandItem().is(item); ++ } ++ return ItemStack.EMPTY.is(item); ++ // Pufferfish end + } + + @Override + public boolean canStandOnFluid(FluidState stateAbove, FluidState state) { +- return this.canStandOnFluid.test(state) && !stateAbove.getType().isSame(state.getType()); ++ // Pufferfish start ++ Entity entity = this.entity; ++ if (entity instanceof LivingEntity livingEntity) { ++ return livingEntity.canStandOnFluid(state) && !stateAbove.getType().isSame(state.getType()); ++ } ++ return false; ++ // Pufferfish end + } + + @Override + public boolean isDescending() { +- return this.descending; ++ return this.entity != null && this.entity.isDescending(); // Pufferfish + } + + @Override + public boolean isAbove(VoxelShape shape, BlockPos pos, boolean defaultValue) { +- return this.entityBottom > (double)pos.getY() + shape.max(Direction.Axis.Y) - 1.0E-5F; ++ return (this.entity == null ? -Double.MAX_VALUE : entity.getY()) > (double)pos.getY() + shape.max(Direction.Axis.Y) - 1.0E-5F; // Pufferfish + } + + @Nullable diff --git a/patches/server/0026-Pufferfish-Improve-fluid-direction-caching.patch b/patches/server/0027-Pufferfish-Improve-fluid-direction-caching.patch similarity index 100% rename from patches/server/0026-Pufferfish-Improve-fluid-direction-caching.patch rename to patches/server/0027-Pufferfish-Improve-fluid-direction-caching.patch diff --git a/patches/server/0027-Pufferfish-Optimize-suffocation.patch b/patches/server/0028-Pufferfish-Optimize-suffocation.patch similarity index 100% rename from patches/server/0027-Pufferfish-Optimize-suffocation.patch rename to patches/server/0028-Pufferfish-Optimize-suffocation.patch diff --git a/patches/server/0029-Pufferfish-Use-aging-cache-for-biome-temperatures.patch b/patches/server/0029-Pufferfish-Use-aging-cache-for-biome-temperatures.patch new file mode 100644 index 0000000..f054c0d --- /dev/null +++ b/patches/server/0029-Pufferfish-Use-aging-cache-for-biome-temperatures.patch @@ -0,0 +1,178 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Mon, 29 Jul 2024 19:53:42 +0800 +Subject: [PATCH] Pufferfish Use aging cache for biome temperatures + + +diff --git a/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java b/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java +new file mode 100644 +index 0000000000000000000000000000000000000000..a7f297ebb569f7c1f205e967ca485be70013a714 +--- /dev/null ++++ b/src/main/java/gg/airplane/structs/Long2FloatAgingCache.java +@@ -0,0 +1,119 @@ ++package gg.airplane.structs; ++ ++import it.unimi.dsi.fastutil.HashCommon; ++ ++/** ++ * A replacement for the cache used in Biome. ++ */ ++public class Long2FloatAgingCache { ++ ++ private static class AgingEntry { ++ private long data; ++ private float value; ++ private int uses = 0; ++ private int age = 0; ++ ++ private AgingEntry(long data, float value) { ++ this.data = data; ++ this.value = value; ++ } ++ ++ public void replace(long data, float flag) { ++ this.data = data; ++ this.value = flag; ++ } ++ ++ public int getValue() { ++ return this.uses - (this.age >> 1); // age isn't as important as uses ++ } ++ ++ public void incrementUses() { ++ this.uses = this.uses + 1 & Integer.MAX_VALUE; ++ } ++ ++ public void incrementAge() { ++ this.age = this.age + 1 & Integer.MAX_VALUE; ++ } ++ } ++ ++ private final AgingEntry[] entries; ++ private final int mask; ++ private final int maxDistance; // the most amount of entries to check for a value ++ ++ public Long2FloatAgingCache(int size) { ++ int arraySize = HashCommon.nextPowerOfTwo(size); ++ this.entries = new AgingEntry[arraySize]; ++ this.mask = arraySize - 1; ++ this.maxDistance = Math.min(arraySize, 4); ++ } ++ ++ public float getValue(long data) { ++ AgingEntry curr; ++ int pos; ++ ++ if ((curr = this.entries[pos = HashCommon.mix(HashCommon.long2int(data)) & this.mask]) == null) { ++ return Float.NaN; ++ } else if (data == curr.data) { ++ curr.incrementUses(); ++ return curr.value; ++ } ++ ++ int checked = 1; // start at 1 because we already checked the first spot above ++ ++ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { ++ if (data == curr.data) { ++ curr.incrementUses(); ++ return curr.value; ++ } else if (++checked >= this.maxDistance) { ++ break; ++ } ++ } ++ ++ return Float.NaN; ++ } ++ ++ public void putValue(long data, float value) { ++ AgingEntry curr; ++ int pos; ++ ++ if ((curr = this.entries[pos = HashCommon.mix(HashCommon.long2int(data)) & this.mask]) == null) { ++ this.entries[pos] = new AgingEntry(data, value); // add ++ return; ++ } else if (data == curr.data) { ++ curr.incrementUses(); ++ return; ++ } ++ ++ int checked = 1; // start at 1 because we already checked the first spot above ++ ++ while ((curr = this.entries[pos = (pos + 1) & this.mask]) != null) { ++ if (data == curr.data) { ++ curr.incrementUses(); ++ return; ++ } else if (++checked >= this.maxDistance) { ++ this.forceAdd(data, value); ++ return; ++ } ++ } ++ ++ this.entries[pos] = new AgingEntry(data, value); // add ++ } ++ ++ private void forceAdd(long data, float value) { ++ int expectedPos = HashCommon.mix(HashCommon.long2int(data)) & this.mask; ++ AgingEntry entryToRemove = this.entries[expectedPos]; ++ ++ for (int i = expectedPos + 1; i < expectedPos + this.maxDistance; i++) { ++ int pos = i & this.mask; ++ AgingEntry entry = this.entries[pos]; ++ if (entry.getValue() < entryToRemove.getValue()) { ++ entryToRemove = entry; ++ } ++ ++ entry.incrementAge(); // use this as a mechanism to age the other entries ++ } ++ ++ // remove the least used/oldest entry ++ entryToRemove.replace(data, value); ++ } ++} +diff --git a/src/main/java/net/minecraft/world/level/biome/Biome.java b/src/main/java/net/minecraft/world/level/biome/Biome.java +index 15f82c9a1ce1fef2e951d1b3c7a65e64b82061ea..f9fbfb63f19decb3b15284306d7edda072e609af 100644 +--- a/src/main/java/net/minecraft/world/level/biome/Biome.java ++++ b/src/main/java/net/minecraft/world/level/biome/Biome.java +@@ -63,13 +63,18 @@ public final class Biome { + private final BiomeGenerationSettings generationSettings; + private final MobSpawnSettings mobSettings; + private final BiomeSpecialEffects specialEffects; +- private final ThreadLocal temperatureCache = ThreadLocal.withInitial(() -> Util.make(() -> { ++ // Pufferfish start - use our cache ++ private final ThreadLocal temperatureCache = ThreadLocal.withInitial(() -> Util.make(() -> { ++ /* + Long2FloatLinkedOpenHashMap long2FloatLinkedOpenHashMap = new Long2FloatLinkedOpenHashMap(1024, 0.25F) { + protected void rehash(int i) { + } + }; + long2FloatLinkedOpenHashMap.defaultReturnValue(Float.NaN); + return long2FloatLinkedOpenHashMap; ++ */ ++ return new gg.airplane.structs.Long2FloatAgingCache(TEMPERATURE_CACHE_SIZE); ++ // Pufferfish end + })); + + Biome(Biome.ClimateSettings weather, BiomeSpecialEffects effects, BiomeGenerationSettings generationSettings, MobSpawnSettings spawnSettings) { +@@ -112,17 +117,15 @@ public final class Biome { + @Deprecated + public float getTemperature(BlockPos blockPos) { + long l = blockPos.asLong(); +- Long2FloatLinkedOpenHashMap long2FloatLinkedOpenHashMap = this.temperatureCache.get(); +- float f = long2FloatLinkedOpenHashMap.get(l); ++ // Pufferfish start ++ gg.airplane.structs.Long2FloatAgingCache cache = this.temperatureCache.get(); ++ float f = cache.getValue(l); + if (!Float.isNaN(f)) { + return f; + } else { + float g = this.getHeightAdjustedTemperature(blockPos); +- if (long2FloatLinkedOpenHashMap.size() == 1024) { +- long2FloatLinkedOpenHashMap.removeFirstFloat(); +- } +- +- long2FloatLinkedOpenHashMap.put(l, g); ++ cache.putValue(l, g); ++ // Pufferfish end + return g; + } + } diff --git a/patches/server/0028-Pufferfish-Early-return-optimization-for-target-find.patch b/patches/server/0030-Pufferfish-Early-return-optimization-for-target-find.patch similarity index 100% rename from patches/server/0028-Pufferfish-Early-return-optimization-for-target-find.patch rename to patches/server/0030-Pufferfish-Early-return-optimization-for-target-find.patch diff --git a/patches/server/0029-Pufferfish-Reduce-chunk-loading-lookups.patch b/patches/server/0031-Pufferfish-Reduce-chunk-loading-lookups.patch similarity index 100% rename from patches/server/0029-Pufferfish-Reduce-chunk-loading-lookups.patch rename to patches/server/0031-Pufferfish-Reduce-chunk-loading-lookups.patch diff --git a/patches/server/0030-Pufferfish-Fix-Paper-6045-block-goal-shouldn-t-load-.patch b/patches/server/0032-Pufferfish-Fix-Paper-6045-block-goal-shouldn-t-load-.patch similarity index 100% rename from patches/server/0030-Pufferfish-Fix-Paper-6045-block-goal-shouldn-t-load-.patch rename to patches/server/0032-Pufferfish-Fix-Paper-6045-block-goal-shouldn-t-load-.patch diff --git a/patches/server/0031-Pufferfish-Reduce-entity-fluid-lookups-if-no-fluids.patch b/patches/server/0033-Pufferfish-Reduce-entity-fluid-lookups-if-no-fluids.patch similarity index 100% rename from patches/server/0031-Pufferfish-Reduce-entity-fluid-lookups-if-no-fluids.patch rename to patches/server/0033-Pufferfish-Reduce-entity-fluid-lookups-if-no-fluids.patch diff --git a/patches/server/0032-Pufferfish-Only-check-for-spooky-season-once-an-hour.patch b/patches/server/0034-Pufferfish-Only-check-for-spooky-season-once-an-hour.patch similarity index 100% rename from patches/server/0032-Pufferfish-Only-check-for-spooky-season-once-an-hour.patch rename to patches/server/0034-Pufferfish-Only-check-for-spooky-season-once-an-hour.patch diff --git a/patches/server/0035-Pufferfish-Skip-cloning-loot-parameters.patch b/patches/server/0035-Pufferfish-Skip-cloning-loot-parameters.patch new file mode 100644 index 0000000..62fbe5e --- /dev/null +++ b/patches/server/0035-Pufferfish-Skip-cloning-loot-parameters.patch @@ -0,0 +1,23 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Mon, 29 Jul 2024 20:12:08 +0800 +Subject: [PATCH] Pufferfish Skip cloning loot parameters + + +diff --git a/src/main/java/net/minecraft/world/level/storage/loot/LootParams.java b/src/main/java/net/minecraft/world/level/storage/loot/LootParams.java +index 37a0002bbe6539648db5219bb373e0404ae48dc0..ca0571d232e102c4b177a1ea44b96f5f0f440211 100644 +--- a/src/main/java/net/minecraft/world/level/storage/loot/LootParams.java ++++ b/src/main/java/net/minecraft/world/level/storage/loot/LootParams.java +@@ -21,8 +21,10 @@ public class LootParams { + + public LootParams(ServerLevel world, Map, Object> parameters, Map dynamicDrops, float luck) { + this.level = world; +- this.params = parameters; +- this.dynamicDrops = dynamicDrops; ++ // Pufferfish start - use unmodifiable maps instead of immutable ones to skip the copy ++ this.params = java.util.Collections.unmodifiableMap(parameters); ++ this.dynamicDrops = java.util.Collections.unmodifiableMap(dynamicDrops); ++ // Pufferfish end + this.luck = luck; + } + diff --git a/patches/server/0033-Pufferfish-Entity-TTL.patch b/patches/server/0036-Pufferfish-Entity-TTL.patch similarity index 100% rename from patches/server/0033-Pufferfish-Entity-TTL.patch rename to patches/server/0036-Pufferfish-Entity-TTL.patch diff --git a/patches/server/0034-Pufferfish-Reduce-projectile-chunk-loading.patch b/patches/server/0037-Pufferfish-Reduce-projectile-chunk-loading.patch similarity index 100% rename from patches/server/0034-Pufferfish-Reduce-projectile-chunk-loading.patch rename to patches/server/0037-Pufferfish-Reduce-projectile-chunk-loading.patch diff --git a/patches/server/0035-Pufferfish-Dynamic-Activation-of-Brain.patch b/patches/server/0038-Pufferfish-Dynamic-Activation-of-Brain.patch similarity index 100% rename from patches/server/0035-Pufferfish-Dynamic-Activation-of-Brain.patch rename to patches/server/0038-Pufferfish-Dynamic-Activation-of-Brain.patch diff --git a/patches/server/0036-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch b/patches/server/0039-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch similarity index 100% rename from patches/server/0036-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch rename to patches/server/0039-Pufferfish-Throttle-goal-selector-during-inactive-ti.patch diff --git a/patches/server/0037-Pufferfish-Reduce-entity-allocations.patch b/patches/server/0040-Pufferfish-Reduce-entity-allocations.patch similarity index 100% rename from patches/server/0037-Pufferfish-Reduce-entity-allocations.patch rename to patches/server/0040-Pufferfish-Reduce-entity-allocations.patch diff --git a/patches/server/0038-Pufferfish-Improve-container-checking-with-a-bitset.patch b/patches/server/0041-Pufferfish-Improve-container-checking-with-a-bitset.patch similarity index 100% rename from patches/server/0038-Pufferfish-Improve-container-checking-with-a-bitset.patch rename to patches/server/0041-Pufferfish-Improve-container-checking-with-a-bitset.patch diff --git a/patches/server/0042-Pufferfish-Simpler-ShapelessRecipes-comparison-for-V.patch b/patches/server/0042-Pufferfish-Simpler-ShapelessRecipes-comparison-for-V.patch new file mode 100644 index 0000000..075092d --- /dev/null +++ b/patches/server/0042-Pufferfish-Simpler-ShapelessRecipes-comparison-for-V.patch @@ -0,0 +1,65 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Mon, 29 Jul 2024 19:53:42 +0800 +Subject: [PATCH] Pufferfish Simpler ShapelessRecipes comparison for Vanilla + + +diff --git a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java +index 3554109bcc4651ca93b6275c914e57e007e2204e..60c7a9520335de8e2638572100affcfdd776c5a3 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java ++++ b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java +@@ -27,8 +27,13 @@ public class ShapelessRecipe extends io.papermc.paper.inventory.recipe.RecipeBoo + final CraftingBookCategory category; + final ItemStack result; + final NonNullList ingredients; ++ private final boolean isBukkit; // Pufferfish + ++ // Pufferfish start + public ShapelessRecipe(String group, CraftingBookCategory category, ItemStack result, NonNullList ingredients) { ++ this(group, category, result, ingredients, false); ++ } ++ public ShapelessRecipe(String group, CraftingBookCategory category, ItemStack result, NonNullList ingredients, boolean isBukkit) { this.isBukkit = isBukkit; // Pufferfish end + this.group = group; + this.category = category; + this.result = result; +@@ -78,6 +83,28 @@ public class ShapelessRecipe extends io.papermc.paper.inventory.recipe.RecipeBoo + } + + public boolean matches(CraftingContainer inventory, Level world) { ++ // Pufferfish start ++ if (!this.isBukkit) { ++ java.util.List ingredients = com.google.common.collect.Lists.newArrayList(this.ingredients.toArray(new Ingredient[0])); ++ ++ inventory: for (int index = 0; index < inventory.getContainerSize(); index++) { ++ ItemStack itemStack = inventory.getItem(index); ++ ++ if (!itemStack.isEmpty()) { ++ for (int i = 0; i < ingredients.size(); i++) { ++ if (ingredients.get(i).test(itemStack)) { ++ ingredients.remove(i); ++ continue inventory; ++ } ++ } ++ return false; ++ } ++ } ++ ++ return ingredients.isEmpty(); ++ } ++ // Pufferfish end ++ + StackedContents autorecipestackmanager = new StackedContents(); + autorecipestackmanager.initialize(this); // Paper - better exact choice recipes + int i = 0; +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java +index 96d772eb02f79f8c478f5e6f065e387aa7665b18..c5ce412f321b8b4f31cc042893659e213b081f29 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java +@@ -45,6 +45,6 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe + data.set(i, this.toNMS(ingred.get(i), true)); + } + +- MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.ShapelessRecipe(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), CraftItemStack.asNMSCopy(this.getResult()), data))); ++ MinecraftServer.getServer().getRecipeManager().addRecipe(new RecipeHolder<>(CraftNamespacedKey.toMinecraft(this.getKey()), new net.minecraft.world.item.crafting.ShapelessRecipe(this.getGroup(), CraftRecipe.getCategory(this.getCategory()), CraftItemStack.asNMSCopy(this.getResult()), data, true))); // Pufferfish + } + } diff --git a/patches/server/0039-Gale-Variable-entity-wake-up-duration.patch b/patches/server/0043-Gale-Variable-entity-wake-up-duration.patch similarity index 100% rename from patches/server/0039-Gale-Variable-entity-wake-up-duration.patch rename to patches/server/0043-Gale-Variable-entity-wake-up-duration.patch diff --git a/patches/server/0040-Gale-Don-t-load-chunks-to-activate-climbing-entities.patch b/patches/server/0044-Gale-Don-t-load-chunks-to-activate-climbing-entities.patch similarity index 100% rename from patches/server/0040-Gale-Don-t-load-chunks-to-activate-climbing-entities.patch rename to patches/server/0044-Gale-Don-t-load-chunks-to-activate-climbing-entities.patch diff --git a/patches/server/0041-Gale-Optimize-sun-burn-tick.patch b/patches/server/0045-Gale-Optimize-sun-burn-tick.patch similarity index 100% rename from patches/server/0041-Gale-Optimize-sun-burn-tick.patch rename to patches/server/0045-Gale-Optimize-sun-burn-tick.patch diff --git a/patches/server/0042-Gale-Check-frozen-ticks-before-landing-block.patch b/patches/server/0046-Gale-Check-frozen-ticks-before-landing-block.patch similarity index 100% rename from patches/server/0042-Gale-Check-frozen-ticks-before-landing-block.patch rename to patches/server/0046-Gale-Check-frozen-ticks-before-landing-block.patch diff --git a/patches/server/0043-Gale-Use-platform-math-functions.patch b/patches/server/0047-Gale-Use-platform-math-functions.patch similarity index 100% rename from patches/server/0043-Gale-Use-platform-math-functions.patch rename to patches/server/0047-Gale-Use-platform-math-functions.patch diff --git a/patches/server/0044-Gale-Skip-entity-move-if-movement-is-zero.patch b/patches/server/0048-Gale-Skip-entity-move-if-movement-is-zero.patch similarity index 100% rename from patches/server/0044-Gale-Skip-entity-move-if-movement-is-zero.patch rename to patches/server/0048-Gale-Skip-entity-move-if-movement-is-zero.patch diff --git a/patches/server/0045-Gale-Optimize-world-generation-chunk-and-block-acces.patch b/patches/server/0049-Gale-Optimize-world-generation-chunk-and-block-acces.patch similarity index 100% rename from patches/server/0045-Gale-Optimize-world-generation-chunk-and-block-acces.patch rename to patches/server/0049-Gale-Optimize-world-generation-chunk-and-block-acces.patch diff --git a/patches/server/0046-Gale-Optimize-noise-generation.patch b/patches/server/0050-Gale-Optimize-noise-generation.patch similarity index 100% rename from patches/server/0046-Gale-Optimize-noise-generation.patch rename to patches/server/0050-Gale-Optimize-noise-generation.patch diff --git a/patches/server/0047-Gale-Faster-chunk-serialization.patch b/patches/server/0051-Gale-Faster-chunk-serialization.patch similarity index 100% rename from patches/server/0047-Gale-Faster-chunk-serialization.patch rename to patches/server/0051-Gale-Faster-chunk-serialization.patch diff --git a/patches/server/0048-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch b/patches/server/0052-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch similarity index 100% rename from patches/server/0048-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch rename to patches/server/0052-Gale-Reduce-lambda-and-Optional-allocation-in-Entity.patch diff --git a/patches/server/0049-Gale-Replace-throttle-tracker-map-with-optimized-col.patch b/patches/server/0053-Gale-Replace-throttle-tracker-map-with-optimized-col.patch similarity index 100% rename from patches/server/0049-Gale-Replace-throttle-tracker-map-with-optimized-col.patch rename to patches/server/0053-Gale-Replace-throttle-tracker-map-with-optimized-col.patch diff --git a/patches/server/0050-Sparkly-Paper-Optimize-canSee-checks.patch b/patches/server/0054-Sparkly-Paper-Optimize-canSee-checks.patch similarity index 100% rename from patches/server/0050-Sparkly-Paper-Optimize-canSee-checks.patch rename to patches/server/0054-Sparkly-Paper-Optimize-canSee-checks.patch diff --git a/patches/server/0055-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch b/patches/server/0055-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch new file mode 100644 index 0000000..21fe8e2 --- /dev/null +++ b/patches/server/0055-SparklyPaper-Skip-MapItem-update-if-the-map-does-not.patch @@ -0,0 +1,46 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Mon, 29 Jul 2024 20:06:27 +0800 +Subject: [PATCH] SparklyPaper Skip "MapItem#update()" if the map does not have + the CraftMapRenderer present + + +diff --git a/src/main/java/me/earthme/luminol/config/modules/optimizations/MapItemUpdateSkipConfig.java b/src/main/java/me/earthme/luminol/config/modules/optimizations/MapItemUpdateSkipConfig.java +new file mode 100644 +index 0000000000000000000000000000000000000000..6235ff18455a21695bdc2d65367558d3936a45c5 +--- /dev/null ++++ b/src/main/java/me/earthme/luminol/config/modules/optimizations/MapItemUpdateSkipConfig.java +@@ -0,0 +1,20 @@ ++package me.earthme.luminol.config.modules.optimizations; ++ ++import me.earthme.luminol.config.ConfigInfo; ++import me.earthme.luminol.config.EnumConfigCategory; ++import me.earthme.luminol.config.IConfigModule; ++ ++public class MapItemUpdateSkipConfig implements IConfigModule { ++ @ConfigInfo(baseName = "enabled") ++ public static boolean enabled = true; ++ ++ @Override ++ public EnumConfigCategory getCategory() { ++ return EnumConfigCategory.OPTIMIZATIONS; ++ } ++ ++ @Override ++ public String getBaseName() { ++ return "skip_map_item_updates_if_no_bukkit_render"; ++ } ++} +diff --git a/src/main/java/net/minecraft/world/item/MapItem.java b/src/main/java/net/minecraft/world/item/MapItem.java +index 957396b145b1d1adf265f8b9aaeba052758f007a..6d0f67882885373b4772b9f747e68e490dd8797e 100644 +--- a/src/main/java/net/minecraft/world/item/MapItem.java ++++ b/src/main/java/net/minecraft/world/item/MapItem.java +@@ -281,7 +281,7 @@ public class MapItem extends ComplexItem { + mapItemSavedData.tickCarriedBy(player, stack); + } + +- if (!mapItemSavedData.locked && (selected || entity instanceof Player && ((Player)entity).getOffhandItem() == stack)) { ++ if (!mapItemSavedData.locked && (!me.earthme.luminol.config.modules.optimizations.MapItemUpdateSkipConfig.enabled || mapItemSavedData.mapView.getRenderers().stream().anyMatch(mapRenderer -> mapRenderer.getClass() == org.bukkit.craftbukkit.map.CraftMapRenderer.class)) && (selected || entity instanceof Player && ((Player)entity).getOffhandItem() == stack)) { // SparklyPaper - don't update maps if they don't have the CraftMapRenderer in the render list + this.update(world, entity, mapItemSavedData); + } + } // Folia - region threading diff --git a/patches/server/0056-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch b/patches/server/0056-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch new file mode 100644 index 0000000..94bf0c5 --- /dev/null +++ b/patches/server/0056-SparklyPaper-Skip-distanceToSqr-call-in-ServerEntity.patch @@ -0,0 +1,26 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Mon, 29 Jul 2024 20:12:08 +0800 +Subject: [PATCH] SparklyPaper Skip "distanceToSqr" call in + "ServerEntity#sendChanges" if the delta movement hasn't changed + + +diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java +index a2279262c93408c11f5d2290b48fd794975e8cfe..17cf318b89b8ecc12331714defa23c6dcf0305b4 100644 +--- a/src/main/java/net/minecraft/server/level/ServerEntity.java ++++ b/src/main/java/net/minecraft/server/level/ServerEntity.java +@@ -215,12 +215,14 @@ public class ServerEntity { + + if ((this.trackDelta || this.entity.hasImpulse || this.entity instanceof LivingEntity && ((LivingEntity) this.entity).isFallFlying()) && this.tickCount > 0) { + Vec3 vec3d1 = this.entity.getDeltaMovement(); ++ if (vec3d1 != this.ap) { // SparklyPaper start - skip distanceToSqr call in ServerEntity#sendChanges if the delta movement hasn't changed + double d0 = vec3d1.distanceToSqr(this.ap); + + if (d0 > 1.0E-7D || d0 > 0.0D && vec3d1.lengthSqr() == 0.0D) { + this.ap = vec3d1; + this.broadcast.accept(new ClientboundSetEntityMotionPacket(this.entity.getId(), this.ap)); + } ++ } // SparklyPaper end + } + + if (packet1 != null) { diff --git a/patches/server/0051-Purpur-use-alternative-keep-alive.patch b/patches/server/0057-Purpur-use-alternative-keep-alive.patch similarity index 100% rename from patches/server/0051-Purpur-use-alternative-keep-alive.patch rename to patches/server/0057-Purpur-use-alternative-keep-alive.patch diff --git a/patches/server/0052-KioCG-Chunk-API-and-display-of-chunkhot-in-tpsbar.patch b/patches/server/0058-KioCG-Chunk-API-and-display-of-chunkhot-in-tpsbar.patch similarity index 99% rename from patches/server/0052-KioCG-Chunk-API-and-display-of-chunkhot-in-tpsbar.patch rename to patches/server/0058-KioCG-Chunk-API-and-display-of-chunkhot-in-tpsbar.patch index 91cf04f..f23032f 100644 --- a/patches/server/0052-KioCG-Chunk-API-and-display-of-chunkhot-in-tpsbar.patch +++ b/patches/server/0058-KioCG-Chunk-API-and-display-of-chunkhot-in-tpsbar.patch @@ -400,7 +400,7 @@ index b0f2e614c90137c526de865bd64469f09b95c964..3d8b55afaced6fbac3bc957ffdc33682 + // KioCG end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index 1d62c164cf891a183ff3b5cfb8f88fd9508f4e12..c2976e61f6d8840c8811e10d6097051bd50654df 100644 +index 829b63c8a7574d6aefe95b7d190dccc4c6ecf1ba..d9018cc8a1e69efd23d6a0d35a24b75dd0220d20 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java @@ -402,4 +402,11 @@ public abstract class Projectile extends Entity implements TraceableEntity { diff --git a/patches/server/0059-Leaf-Skip-event-if-no-listeners.patch b/patches/server/0059-Leaf-Skip-event-if-no-listeners.patch new file mode 100644 index 0000000..8551227 --- /dev/null +++ b/patches/server/0059-Leaf-Skip-event-if-no-listeners.patch @@ -0,0 +1,31 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: MrHua269 +Date: Mon, 29 Jul 2024 20:05:34 +0800 +Subject: [PATCH] Leaf Skip event if no listeners + + +diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java +index 7ce9ebba8ce304d1f3f21d4f15ee5f3560d7700b..9180f23529a31b6b0a5b38bb7cda3e32d487f691 100644 +--- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java ++++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java +@@ -36,15 +36,17 @@ class PaperEventManager { + + // SimplePluginManager + public void callEvent(@NotNull Event event) { ++ // Leaf start - Skip event if no listeners ++ RegisteredListener[] listeners = event.getHandlers().getRegisteredListeners(); ++ if (listeners.length == 0) return; ++ // Leaf end - Skip event if no listeners ++ + if (event.isAsynchronous() && this.server.isPrimaryThread()) { + throw new IllegalStateException(event.getEventName() + " may only be triggered asynchronously."); + } else if (!event.isAsynchronous() && !this.server.isPrimaryThread() && !this.server.isStopping()) { + throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously."); + } + +- HandlerList handlers = event.getHandlers(); +- RegisteredListener[] listeners = handlers.getRegisteredListeners(); +- + for (RegisteredListener registration : listeners) { + if (!registration.getPlugin().isEnabled()) { + continue; diff --git a/patches/server/0053-Threaded-region-start-tick-and-finished-tick-event.patch b/patches/server/0060-Threaded-region-start-tick-and-finished-tick-event.patch similarity index 100% rename from patches/server/0053-Threaded-region-start-tick-and-finished-tick-event.patch rename to patches/server/0060-Threaded-region-start-tick-and-finished-tick-event.patch diff --git a/patches/server/0054-Fix-MC-2025.patch b/patches/server/0061-Fix-MC-2025.patch similarity index 100% rename from patches/server/0054-Fix-MC-2025.patch rename to patches/server/0061-Fix-MC-2025.patch