diff --git a/patches/server/0018-Optimize-mob-spawning.patch b/patches/server/0018-Optimize-mob-spawning.patch index cc771678..159f244d 100644 --- a/patches/server/0018-Optimize-mob-spawning.patch +++ b/patches/server/0018-Optimize-mob-spawning.patch @@ -5,141 +5,6 @@ Subject: [PATCH] Optimize mob spawning This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index fc27cf0cf98a8640e2a451d3f06ac1216eb9686c..217c3e1a55de3f750383707eef7af7484db2ef7f 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -315,6 +315,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { - AtomicReference atomicreference = new AtomicReference(); - Thread thread = new io.papermc.paper.util.TickThread(() -> { // Paper - rewrite chunk system -diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -index 90d284192f27a69f6694544c885c3e4d393081bb..094af18dda115019430a3cbacaf5508f9ffa7690 100644 ---- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java -@@ -342,6 +342,11 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface - DedicatedServer.LOGGER.info("JMX monitoring enabled"); - } - -+ // Leaves start - optimize mob spawning -+ if (top.leavesmc.leaves.LeavesConfig.asyncMobSpawning) { -+ mobSpawnExecutor.start(); -+ } -+ // Leaves end - optimize mob spawning - return true; - } - } -diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index fbe209a66c77c47935ad026dd3e45e682af91fd8..31f6791935b3f4cc1349716448d46da2bcea2f15 100644 ---- a/src/main/java/net/minecraft/server/level/ChunkMap.java -+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java -@@ -345,7 +345,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - this.dataRegionManager = new io.papermc.paper.chunk.SingleThreadChunkRegionManager(this.level, 2, (1.0 / 3.0), 1, 6, "Data", DataRegionData::new, DataRegionSectionData::new); - this.regionManagers.add(this.dataRegionManager); - // Paper end -- this.playerMobDistanceMap = this.level.paperConfig().entities.spawning.perPlayerMobSpawns ? new com.destroystokyo.paper.util.misc.PlayerAreaMap(this.pooledLinkedPlayerHashSets) : null; // Paper -+ this.playerMobDistanceMap = this.level.paperConfig().entities.spawning.perPlayerMobSpawns ? new top.leavesmc.leaves.util.AsyncPlayerAreaMap(this.pooledLinkedPlayerHashSets) : null; // Paper // Leaves - optimize mob spawning(actually not use) - // Paper start - use distance map to optimise entity tracker - this.playerEntityTrackerTrackMaps = new com.destroystokyo.paper.util.misc.PlayerAreaMap[TRACKING_RANGE_TYPES.length]; - this.entityTrackerTrackRanges = new int[TRACKING_RANGE_TYPES.length]; -diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..6a2adfe51b5ea6b3290349781f41ed7818f15fe5 100644 ---- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java -+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -77,6 +77,11 @@ public class ServerChunkCache extends ChunkSource { - - private final LevelChunk[] lastLoadedChunks = new LevelChunk[4 * 4]; - -+ // Leaves start - optimize countmobs -+ public boolean firstRunSpawnCounts = true; -+ public final java.util.concurrent.atomic.AtomicBoolean spawnCountsReady = new java.util.concurrent.atomic.AtomicBoolean(false); -+ // Leaves end - optimize countmobs -+ - private static int getChunkCacheKey(int x, int z) { - return x & 3 | ((z & 3) << 2); - } -@@ -710,20 +715,27 @@ public class ServerChunkCache extends ChunkSource { - this.level.timings.countNaturalMobs.startTiming(); // Paper - timings - int l = this.distanceManager.getNaturalSpawnChunkCount(); - // Paper start - per player mob spawning -- NaturalSpawner.SpawnState spawnercreature_d; // moved down -+ // NaturalSpawner.SpawnState spawnercreature_d; // moved down // Leaves - asynchronously - if ((this.spawnFriendlies || this.spawnEnemies) && this.chunkMap.playerMobDistanceMap != null) { // don't count mobs when animals and monsters are disabled -- // re-set mob counts -- for (ServerPlayer player : this.level.players) { -- Arrays.fill(player.mobCounts, 0); -+ // Leaves start - moved down when async processing -+ if (!top.leavesmc.leaves.LeavesConfig.asyncMobSpawning) { -+ // re-set mob counts -+ for (ServerPlayer player : this.level.players) { -+ Arrays.fill(player.mobCounts, 0); -+ } -+ lastSpawnState = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); - } -- spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, null, true); -+ // Leaves end - moved down when async processing - } else { -- spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false); -+ // Leaves start - this is only implemented for per-player mob spawning so this makes everything work if this setting is disabled (actually not use) -+ lastSpawnState = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false); -+ spawnCountsReady.set(true); -+ // Leaves end - this is only implemented for per-player mob spawning so this makes everything work if this setting is disabled (actually not use) - } - // Paper end - this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings - -- this.lastSpawnState = spawnercreature_d; -+ // this.lastSpawnState = spawnercreature_d; // Leaves - asynchronously - gameprofilerfiller.popPush("filteringLoadedChunks"); - // Paper - moved down - this.level.timings.chunkTicks.startTiming(); // Paper -@@ -761,8 +773,8 @@ public class ServerChunkCache extends ChunkSource { - - if ((true || this.level.isNaturalSpawningAllowed(chunkcoordintpair)) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, false)) { // Paper - optimise anyPlayerCloseEnoughForSpawning // Paper - the chunk is known ticking - chunk1.incrementInhabitedTime(j); -- if (flag2 && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, true)) { // Spigot // Paper - optimise anyPlayerCloseEnoughForSpawning & optimise chunk tick iteration -- NaturalSpawner.spawnForChunk(this.level, chunk1, spawnercreature_d, this.spawnFriendlies, this.spawnEnemies, flag1); -+ if (flag2 && (!top.leavesmc.leaves.LeavesConfig.asyncMobSpawning || spawnCountsReady.get()) && (this.spawnEnemies || this.spawnFriendlies) && this.level.getWorldBorder().isWithinBounds(chunkcoordintpair) && this.chunkMap.anyPlayerCloseEnoughForSpawning(holder, chunkcoordintpair, true)) { // Spigot // Paper - optimise anyPlayerCloseEnoughForSpawning & optimise chunk tick iteration // Leaves - optimize mob spawning -+ NaturalSpawner.spawnForChunk(this.level, chunk1, lastSpawnState, this.spawnFriendlies, this.spawnEnemies, flag1); // Leaves - optimize mob spawning - } - - if (true || this.level.shouldTickBlocksAt(chunkcoordintpair.toLong())) { // Paper - the chunk is known ticking -@@ -823,6 +835,30 @@ public class ServerChunkCache extends ChunkSource { - } - } - // Paper end - controlled flush for entity tracker packets -+ -+ // Leaves start - optimize mob spawning -+ if (top.leavesmc.leaves.LeavesConfig.asyncMobSpawning) { -+ for (ServerPlayer player : this.level.players) { -+ Arrays.fill(player.mobCounts, 0); -+ } -+ if (firstRunSpawnCounts) { -+ firstRunSpawnCounts = false; -+ spawnCountsReady.set(true); -+ } -+ if (chunkMap.playerMobDistanceMap != null && spawnCountsReady.getAndSet(false)) { -+ net.minecraft.server.MinecraftServer.getServer().mobSpawnExecutor.submit(() -> { -+ int mapped = distanceManager.getNaturalSpawnChunkCount(); -+ io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet.Iterator objectiterator = -+ level.entityTickList.entities.iterator(io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet.ITERATOR_FLAG_SEE_ADDITIONS); -+ top.leavesmc.leaves.util.IterableWrapper wrappedIterator = -+ new top.leavesmc.leaves.util.IterableWrapper(objectiterator); -+ lastSpawnState = NaturalSpawner.createState(mapped, wrappedIterator, this::getFullChunk, new LocalMobCapCalculator(this.chunkMap), true); // try add LocalMobCapCalculator -+ objectiterator.finishedIterating(); -+ spawnCountsReady.set(true); -+ }); -+ } -+ } -+ // Leaves end - optimize mob spawning - } - } - diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java index 15d266fc97eb73338f4f6fb2cfe25d6861e79810..70773c525bcf33d4d4764ce4a16dedddc423b02b 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -153,24 +18,11 @@ index 15d266fc97eb73338f4f6fb2cfe25d6861e79810..70773c525bcf33d4d4764ce4a16deddd // Paper end // CraftBukkit end Objects.requireNonNull(info); -diff --git a/src/main/java/net/minecraft/world/level/entity/EntityTickList.java b/src/main/java/net/minecraft/world/level/entity/EntityTickList.java -index 4cdfc433df67afcd455422e9baf56f167dd712ae..a6e0f5dab21d806e0c7744b2a337cded2739d870 100644 ---- a/src/main/java/net/minecraft/world/level/entity/EntityTickList.java -+++ b/src/main/java/net/minecraft/world/level/entity/EntityTickList.java -@@ -8,7 +8,7 @@ import javax.annotation.Nullable; - import net.minecraft.world.entity.Entity; - - public class EntityTickList { -- private final io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet entities = new io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet<>(true); // Paper - rewrite this, always keep this updated - why would we EVER tick an entity that's not ticking? -+ public final io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet entities = new io.papermc.paper.util.maplist.IteratorSafeOrderedReferenceSet<>(true); // Paper - rewrite this, always keep this updated - why would we EVER tick an entity that's not ticking? // Leaves - private -> public - - private void ensureActiveIsNotIterated() { - // Paper - replace with better logic, do not delay removals diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 937e84214223e978b3b6bc6107974c61e2d0f558..170f1f964e5cd3d1f1590106e31718dced04d0ef 100644 +index 937e84214223e978b3b6bc6107974c61e2d0f558..af84cbaf93392d90b4c74ef5a0eb7bd163b76ce5 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -226,7 +226,16 @@ public final class LeavesConfig { +@@ -226,7 +226,21 @@ public final class LeavesConfig { } noChatSign = getBoolean("settings.misc.no-chat-sign", noChatSign); } @@ -183,6 +35,11 @@ index 937e84214223e978b3b6bc6107974c61e2d0f558..170f1f964e5cd3d1f1590106e31718dc + asyncMobSpawning = getBoolean("settings.performance.async-mob-spawning", asyncMobSpawning); + asyncMobSpawningLock = true; + } ++ ++ if (asyncMobSpawning) { ++ asyncMobSpawning = false; ++ LeavesLogger.LOGGER.severe("Async MobSpawning is updating, it can't work"); ++ } + } + public static final class WorldConfig { diff --git a/patches/server/0019-Dont-send-useless-entity-packets.patch b/patches/server/0019-Dont-send-useless-entity-packets.patch index 17ef2d8e..564cedb8 100644 --- a/patches/server/0019-Dont-send-useless-entity-packets.patch +++ b/patches/server/0019-Dont-send-useless-entity-packets.patch @@ -52,10 +52,10 @@ index b7fd8e70413c38923d0719aff803449e392383ac..209685e67ebdb7f062bb58118242dcbf this.entity.stopSeenByPlayer(player); player.connection.send(new ClientboundRemoveEntitiesPacket(new int[]{this.entity.getId()})); diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 170f1f964e5cd3d1f1590106e31718dced04d0ef..76c382c839b904640cb92afa503d1aef1c29ffc6 100644 +index af84cbaf93392d90b4c74ef5a0eb7bd163b76ce5..d217994b16f2f749fe48fe0b895416e0ae02eee4 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -236,6 +236,11 @@ public final class LeavesConfig { +@@ -241,6 +241,11 @@ public final class LeavesConfig { } } diff --git a/patches/server/0020-Multithreaded-Tracker.patch b/patches/server/0020-Multithreaded-Tracker.patch index fe7fe691..c31207d3 100644 --- a/patches/server/0020-Multithreaded-Tracker.patch +++ b/patches/server/0020-Multithreaded-Tracker.patch @@ -5,171 +5,11 @@ Subject: [PATCH] Multithreaded Tracker This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) -diff --git a/src/main/java/io/papermc/paper/util/maplist/IteratorSafeOrderedReferenceSet.java b/src/main/java/io/papermc/paper/util/maplist/IteratorSafeOrderedReferenceSet.java -index 0fd814f1d65c111266a2b20f86561839a4cef755..28f853e93b149de9eb838f5aa3b6779d59a77e2b 100644 ---- a/src/main/java/io/papermc/paper/util/maplist/IteratorSafeOrderedReferenceSet.java -+++ b/src/main/java/io/papermc/paper/util/maplist/IteratorSafeOrderedReferenceSet.java -@@ -16,6 +16,7 @@ public final class IteratorSafeOrderedReferenceSet { - /* list impl */ - protected E[] listElements; - protected int listSize; -+ public int getListSize() { return this.listSize; } // Leaves - expose listSize - - protected final double maxFragFactor; - -diff --git a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -index f597d65d56964297eeeed6c7e77703764178fee0..a584f2d0829db0bb220b2934ae2934dab981fdd5 100644 ---- a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -+++ b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -@@ -35,7 +35,7 @@ public final class ChunkEntitySlices { - protected final EntityCollectionBySection allEntities; - protected final EntityCollectionBySection hardCollidingEntities; - protected final Reference2ObjectOpenHashMap, EntityCollectionBySection> entitiesByClass; -- protected final EntityList entities = new EntityList(); -+ public final EntityList entities = new EntityList(); // Leaves - protected -> public - - public ChunkHolder.FullChunkStatus status; - -diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 31f6791935b3f4cc1349716448d46da2bcea2f15..6cca26640b5c392d2d1bb3ecb6b2b235937f54bd 100644 ---- a/src/main/java/net/minecraft/server/level/ChunkMap.java -+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java -@@ -1251,8 +1251,38 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - entity.tracker = null; // Paper - We're no longer tracked - } - -+ // Leaves start - multithreaded tracker -+ private @Nullable top.leavesmc.leaves.tracker.MultithreadedTracker multithreadedTracker; -+ private final java.util.concurrent.ConcurrentLinkedQueue trackerMainThreadTasks = new java.util.concurrent.ConcurrentLinkedQueue<>(); -+ private boolean multithreadedTrackingInProgress; -+ -+ public void runOnTrackerMainThread(final Runnable runnable) { -+ if (multithreadedTrackingInProgress) { -+ this.trackerMainThreadTasks.add(runnable); -+ } else { -+ runnable.run(); -+ } -+ } -+ // Leaves end - multithreaded tracker -+ - // Paper start - optimised tracker - private final void processTrackQueue() { -+ // Leaves start - multithreaded tracker -+ if (top.leavesmc.leaves.LeavesConfig.asyncEntityTracker) { -+ if (this.multithreadedTracker == null) { -+ this.multithreadedTracker = new top.leavesmc.leaves.tracker.MultithreadedTracker(this.level.chunkSource.entityTickingChunks, this.trackerMainThreadTasks); -+ } -+ -+ try { -+ multithreadedTrackingInProgress = true; -+ this.multithreadedTracker.tick(); -+ } finally { -+ multithreadedTrackingInProgress = false; -+ } -+ return; -+ } -+ // Leaves end - multithreaded tracker -+ - this.level.timings.tracker1.startTiming(); - try { - for (TrackedEntity tracker : this.entityMap.values()) { -@@ -1509,11 +1539,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - - public class TrackedEntity { - -- public final ServerEntity serverEntity; -- final Entity entity; -+ public final ServerEntity serverEntity; // Leaves - package -> public -+ public final Entity entity; // Leaves - package -> public - private final int range; - SectionPos lastSectionPos; -- public final Set seenBy = new ReferenceOpenHashSet<>(); // Paper - optimise map impl -+ public final Set seenBy = it.unimi.dsi.fastutil.objects.ReferenceSets.synchronize(new ReferenceOpenHashSet<>()); // Paper - optimise map impl // Leaves - sync - - public TrackedEntity(Entity entity, int i, int j, boolean flag) { - this.serverEntity = new ServerEntity(ChunkMap.this.level, entity, j, flag, this::broadcast, this.seenBy); // CraftBukkit -@@ -1525,7 +1555,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - // Paper start - use distance map to optimise tracker - com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet lastTrackerCandidates; - -- final void updatePlayers(com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newTrackerCandidates) { -+ public final void updatePlayers(com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet newTrackerCandidates) { // Leaves - package -> public - com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet oldTrackerCandidates = this.lastTrackerCandidates; - this.lastTrackerCandidates = newTrackerCandidates; - -@@ -1597,7 +1627,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - } - - public void removePlayer(ServerPlayer player) { -- org.spigotmc.AsyncCatcher.catchOp("player tracker clear"); // Spigot -+ // org.spigotmc.AsyncCatcher.catchOp("player tracker clear"); // Spigot // Leaves - we can remove async too - if (this.seenBy.remove(player.connection)) { - this.serverEntity.removePairing(player); - } -@@ -1605,7 +1635,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - } - - public void updatePlayer(ServerPlayer player) { -- org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot -+ // org.spigotmc.AsyncCatcher.catchOp("player tracker update"); // Spigot // Leaves - we can update async - if (player != this.entity) { - // Paper start - remove allocation of Vec3D here - // Vec3 vec3d = player.position().subtract(this.entity.position()); -diff --git a/src/main/java/net/minecraft/server/level/ServerBossEvent.java b/src/main/java/net/minecraft/server/level/ServerBossEvent.java -index ca42c2642a729b90d22b968af7258f3aee72e14b..464678e973513b5c9e0cf0910cac1b3b98419720 100644 ---- a/src/main/java/net/minecraft/server/level/ServerBossEvent.java -+++ b/src/main/java/net/minecraft/server/level/ServerBossEvent.java -@@ -13,7 +13,7 @@ import net.minecraft.util.Mth; - import net.minecraft.world.BossEvent; - - public class ServerBossEvent extends BossEvent { -- private final Set players = Sets.newHashSet(); -+ private final Set players = Sets.newConcurrentHashSet(); // Leaves - players can be removed in async tracking - private final Set unmodifiablePlayers = Collections.unmodifiableSet(this.players); - public boolean visible = true; - -diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index 209685e67ebdb7f062bb58118242dcbf884a3876..555f5075f5b61f7c0527289471ead1c56789d200 100644 ---- a/src/main/java/net/minecraft/server/level/ServerEntity.java -+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java -@@ -302,7 +302,11 @@ public class ServerEntity { - - public void removePairing(ServerPlayer player) { - this.entity.stopSeenByPlayer(player); -- player.connection.send(new ClientboundRemoveEntitiesPacket(new int[]{this.entity.getId()})); -+ // Leaves start - ensure main thread -+ ((ServerLevel) this.entity.level).chunkSource.chunkMap.runOnTrackerMainThread(() -> -+ player.connection.send(new ClientboundRemoveEntitiesPacket(new int[]{this.entity.getId()})) -+ ); -+ // Leaves end - ensure main thread - } - - public void addPairing(ServerPlayer player) { -@@ -425,12 +429,17 @@ public class ServerEntity { - Set set = ((LivingEntity) this.entity).getAttributes().getDirtyAttributes(); - - if (!set.isEmpty()) { -+ // Leaves start - multithreaded tracker -+ List attributesCopy = Lists.newArrayList(set); -+ ((ServerLevel) this.entity.level).chunkSource.chunkMap.runOnTrackerMainThread(() -> { - // CraftBukkit start - Send scaled max health - if (this.entity instanceof ServerPlayer) { -- ((ServerPlayer) this.entity).getBukkitEntity().injectScaledMaxHealth(set, false); -+ ((ServerPlayer) this.entity).getBukkitEntity().injectScaledMaxHealth(attributesCopy, false); // Leaves - } - // CraftBukkit end -- this.broadcastAndSend(new ClientboundUpdateAttributesPacket(this.entity.getId(), set)); -+ this.broadcastAndSend(new ClientboundUpdateAttributesPacket(this.entity.getId(), attributesCopy)); // Leaves -+ }); -+ // Leaves end - multithreaded tracker - } - - set.clear(); diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 76c382c839b904640cb92afa503d1aef1c29ffc6..3c13acaae250ddc1480a7c846097cc187038cde4 100644 +index d217994b16f2f749fe48fe0b895416e0ae02eee4..46233c5845cffb67d89f360c4dfdcc80abdf00c8 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -241,6 +241,20 @@ public final class LeavesConfig { +@@ -246,6 +246,20 @@ public final class LeavesConfig { dontSendUselessEntityPackets = getBoolean("settings.performance.dont-send-useless-entity-packets", dontSendUselessEntityPackets); } diff --git a/patches/server/0021-Fix-Paper-6045-block-goal-shouldn-t-load-chunks.patch b/patches/server/0021-Fix-Paper-6045-block-goal-shouldn-t-load-chunks.patch index e83ac103..fe77ea05 100644 --- a/patches/server/0021-Fix-Paper-6045-block-goal-shouldn-t-load-chunks.patch +++ b/patches/server/0021-Fix-Paper-6045-block-goal-shouldn-t-load-chunks.patch @@ -18,10 +18,10 @@ index 26bf383caea68834c654b25653ced9017f1b1b22..71e3c7fc5c071e83dfeca6954771e559 this.blockPos = mutableBlockPos; setTargetPosition(mutableBlockPos.immutable()); // Paper diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 3c13acaae250ddc1480a7c846097cc187038cde4..78fdad3bd377da395be17efa1c20b30b427730cc 100644 +index 46233c5845cffb67d89f360c4dfdcc80abdf00c8..549cfa4766d8ad9c78b18d86cbdac22a558a727b 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -255,6 +255,11 @@ public final class LeavesConfig { +@@ -260,6 +260,11 @@ public final class LeavesConfig { } } diff --git a/patches/server/0022-Optimize-entity-coordinate-key.patch b/patches/server/0022-Optimize-entity-coordinate-key.patch index 858230e0..e3bbcc4b 100644 --- a/patches/server/0022-Optimize-entity-coordinate-key.patch +++ b/patches/server/0022-Optimize-entity-coordinate-key.patch @@ -25,7 +25,7 @@ index 6efb8b10f17c70b05128039376d254e6beda3841..abbb75af4ffad5b82d8b785b4a747b06 public static long getCoordinateKey(final ChunkPos pair) { diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 43873929f11e373186190b3ae831dc68bfa69616..2433315c13e2da90f4f208d180d487c984a087ea 100644 +index a5842db77bdba6061e0bdd8a7118d93e16d9f793..14dc0a75043274bf0ff31f4982ca7224e8db6c19 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -291,7 +291,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -38,10 +38,10 @@ index 43873929f11e373186190b3ae831dc68bfa69616..2433315c13e2da90f4f208d180d487c9 private Vec3 deltaMovement; private float yRot; diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 78fdad3bd377da395be17efa1c20b30b427730cc..e80ab1fcd4d7a1a8b607ea17c4f4da8c6eb419b6 100644 +index 549cfa4766d8ad9c78b18d86cbdac22a558a727b..b6bd8381f34bac1d88ea73da5284a65668093b56 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -260,6 +260,12 @@ public final class LeavesConfig { +@@ -265,6 +265,12 @@ public final class LeavesConfig { fixPaper6045 = getBoolean("settings.performance.fix.fix-paper-6045", fixPaper6045); } diff --git a/patches/server/0023-Optimize-suffocation.patch b/patches/server/0023-Optimize-suffocation.patch index 39d49f20..611bcf93 100644 --- a/patches/server/0023-Optimize-suffocation.patch +++ b/patches/server/0023-Optimize-suffocation.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Optimize suffocation This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index f02913ec025208dcdfe9d0f0e5b26a1d912f4797..5189762e0f9cae84b7bc60a22437cef4e95c7c36 100644 +index bf41a901ed274fd2f5e8c861301f395825b50167..f0579a29fb4fa51aa9db8f9467f63926ea80cd3c 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -397,7 +397,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -35,10 +35,10 @@ index f02913ec025208dcdfe9d0f0e5b26a1d912f4797..5189762e0f9cae84b7bc60a22437cef4 public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index e80ab1fcd4d7a1a8b607ea17c4f4da8c6eb419b6..00f49a8d6fa8fc460d276f31170d3379f06199bb 100644 +index b6bd8381f34bac1d88ea73da5284a65668093b56..c88049b0223d90bd6bdc2eab433e78e9411280d5 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -265,6 +265,10 @@ public final class LeavesConfig { +@@ -270,6 +270,10 @@ public final class LeavesConfig { optimizeEntityCoordinateKey = getBoolean("settings.performance.optimize-entity-coordinate-key", optimizeEntityCoordinateKey); } diff --git a/patches/server/0024-Strip-raytracing-for-EntityLiving-hasLineOfSight.patch b/patches/server/0024-Strip-raytracing-for-EntityLiving-hasLineOfSight.patch index dada54ef..a063f1f1 100644 --- a/patches/server/0024-Strip-raytracing-for-EntityLiving-hasLineOfSight.patch +++ b/patches/server/0024-Strip-raytracing-for-EntityLiving-hasLineOfSight.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Strip raytracing for EntityLiving#hasLineOfSight This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 5189762e0f9cae84b7bc60a22437cef4e95c7c36..029f456504f0229a564af937e30329ca08a1b5f9 100644 +index f0579a29fb4fa51aa9db8f9467f63926ea80cd3c..f240f2b337524a417f6ddb57cbf063f013aa80f7 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -3618,7 +3618,13 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -142,10 +142,10 @@ index 31f0034115a88a42b18e0b838eab8b801473bbef..8cadc9655b8876ede4ec4d2b09198445 return pos.isInsideBuildHeightAndWorldBoundsHorizontal(this); // Paper - use better/optimized check } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 00f49a8d6fa8fc460d276f31170d3379f06199bb..ce433db220fa43111ab72e27c932cacf2ed03178 100644 +index c88049b0223d90bd6bdc2eab433e78e9411280d5..88969f50419f7966d395d4fd3f42ce3cb9dd9581 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -270,6 +270,11 @@ public final class LeavesConfig { +@@ -275,6 +275,11 @@ public final class LeavesConfig { enableSuffocationOptimization = getBoolean("settings.performance.enable-suffocation-optimization", enableSuffocationOptimization); } diff --git a/patches/server/0025-Only-check-for-spooky-season-once-an-hour.patch b/patches/server/0025-Only-check-for-spooky-season-once-an-hour.patch index 677808ef..f1a9d0d0 100644 --- a/patches/server/0025-Only-check-for-spooky-season-once-an-hour.patch +++ b/patches/server/0025-Only-check-for-spooky-season-once-an-hour.patch @@ -45,10 +45,10 @@ index f5efdf59617d43de18a2267351fa784c0be3ae83..3af66e566c7e154eda362a564c630b5c @Override protected float getStandingEyeHeight(Pose pose, EntityDimensions dimensions) { diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index ce433db220fa43111ab72e27c932cacf2ed03178..240fe801ba2670f5986faa58b77c7902f0465fc6 100644 +index 88969f50419f7966d395d4fd3f42ce3cb9dd9581..b34de11a113b4b3943c0f3cea7036a80ac4e4bd9 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -275,6 +275,11 @@ public final class LeavesConfig { +@@ -280,6 +280,11 @@ public final class LeavesConfig { entityStripRaytracing = getBoolean("settings.performance.strip-raytracing-for-entity", entityStripRaytracing); } diff --git a/patches/server/0027-Optimize-random-calls-in-chunk-ticking.patch b/patches/server/0027-Optimize-random-calls-in-chunk-ticking.patch index 69afd80c..acca69c8 100644 --- a/patches/server/0027-Optimize-random-calls-in-chunk-ticking.patch +++ b/patches/server/0027-Optimize-random-calls-in-chunk-ticking.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Optimize random calls in chunk ticking This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 6a2adfe51b5ea6b3290349781f41ed7818f15fe5..928139e8d0f7b65e2376d3c89d7bea294e3ed3a2 100644 +index ca84eddbdb1e198b899750e5f6b3eafd25ce970f..188a0e1b8b9c30ad9e3f88301a91aa4809818d2d 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -708,6 +708,11 @@ public class ServerChunkCache extends ChunkSource { +@@ -703,6 +703,11 @@ public class ServerChunkCache extends ChunkSource { ProfilerFiller gameprofilerfiller = this.level.getProfiler(); gameprofilerfiller.push("pollingChunks"); @@ -94,10 +94,10 @@ index d190bad5d287766ed4165ed827d9901a9d878687..19012c60ea6f725248f7e4a18d78eb10 // CraftBukkit start diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 240fe801ba2670f5986faa58b77c7902f0465fc6..64215f03789db0555422c4b0aec32c8a4504cb4d 100644 +index b34de11a113b4b3943c0f3cea7036a80ac4e4bd9..4acebe3a5eeef435415ba8c44e7c04ba21751c69 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -280,6 +280,15 @@ public final class LeavesConfig { +@@ -285,6 +285,15 @@ public final class LeavesConfig { checkSpookySeasonOnceAnHour = getBoolean("settings.performance.check-spooky-season-once-an-hour", checkSpookySeasonOnceAnHour); } diff --git a/patches/server/0028-Skip-POI-finding-if-stuck-in-vehicle.patch b/patches/server/0028-Skip-POI-finding-if-stuck-in-vehicle.patch index c630e344..a58409b4 100644 --- a/patches/server/0028-Skip-POI-finding-if-stuck-in-vehicle.patch +++ b/patches/server/0028-Skip-POI-finding-if-stuck-in-vehicle.patch @@ -22,10 +22,10 @@ index d4c91e0a0c64fcb7f1145de3f30134cb1f1f8ee6..44fc394dbab7e05a3bd7cab493300a96 long2ObjectMap.long2ObjectEntrySet().removeIf((entry) -> { return !entry.getValue().isStillValid(time); diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 64215f03789db0555422c4b0aec32c8a4504cb4d..020659f8555e43dd71cea39747bd8f8fe8a6c5a4 100644 +index 4acebe3a5eeef435415ba8c44e7c04ba21751c69..93bc4c20785b235cb22099ed160ef1f32290fe85 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -289,6 +289,11 @@ public final class LeavesConfig { +@@ -294,6 +294,11 @@ public final class LeavesConfig { } } diff --git a/patches/server/0029-Early-return-optimization-for-target-finding.patch b/patches/server/0029-Early-return-optimization-for-target-finding.patch index cab4a0df..d67246b9 100644 --- a/patches/server/0029-Early-return-optimization-for-target-finding.patch +++ b/patches/server/0029-Early-return-optimization-for-target-finding.patch @@ -29,10 +29,10 @@ index a7575b5ef56af6f53448d391abb4956e130148ca..e2764cbc888be39943728ff810e1e44b return false; } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 020659f8555e43dd71cea39747bd8f8fe8a6c5a4..076074b70f95141011b3f71948b9d2581306db4e 100644 +index 93bc4c20785b235cb22099ed160ef1f32290fe85..cefea848344060836cddea81e16e7b5613c54fb7 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -293,6 +293,11 @@ public final class LeavesConfig { +@@ -298,6 +298,11 @@ public final class LeavesConfig { private static void skipPOIFindingInVehicle() { skipPOIFindingInVehicle = getBoolean("settings.performance.skip-poi-find-in-vehicle", skipPOIFindingInVehicle); } diff --git a/patches/server/0030-Use-thread-unsafe-random-for-mob-spawning.patch b/patches/server/0030-Use-thread-unsafe-random-for-mob-spawning.patch index a0ec02cb..4866fe69 100644 --- a/patches/server/0030-Use-thread-unsafe-random-for-mob-spawning.patch +++ b/patches/server/0030-Use-thread-unsafe-random-for-mob-spawning.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Use thread unsafe random for mob spawning This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index dca0d9611593a0f3b921b314b4b458cc95f08ebc..612d536f8a1b4e45d7431dc8bbd1c7aa631a3575 100644 +index 70773c525bcf33d4d4764ce4a16dedddc423b02b..7a3bd3e7aa208ade1d33f59ba684354d000dd011 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -419,12 +419,21 @@ public final class NaturalSpawner { @@ -38,10 +38,10 @@ index dca0d9611593a0f3b921b314b4b458cc95f08ebc..612d536f8a1b4e45d7431dc8bbd1c7aa public static boolean isValidEmptySpawnBlock(BlockGetter blockView, BlockPos pos, BlockState state, FluidState fluidState, EntityType entityType) { diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 076074b70f95141011b3f71948b9d2581306db4e..ba58171708fd3362fe76af608d657e94fd2b3c01 100644 +index cefea848344060836cddea81e16e7b5613c54fb7..c81a7a41ae4ff73608150ac92197525b46a19212 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -299,6 +299,11 @@ public final class LeavesConfig { +@@ -304,6 +304,11 @@ public final class LeavesConfig { entityTargetFindingOptimization = getBoolean("settings.performance.entity-target-find-optimization", entityTargetFindingOptimization); } diff --git a/patches/server/0031-Config-to-disable-method-profiler.patch b/patches/server/0031-Config-to-disable-method-profiler.patch index 73a97b6c..194b1aeb 100644 --- a/patches/server/0031-Config-to-disable-method-profiler.patch +++ b/patches/server/0031-Config-to-disable-method-profiler.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Config to disable method profiler This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 217c3e1a55de3f750383707eef7af7484db2ef7f..13fd9744adfa5459a24fedcc6359b11e125eff42 100644 +index fc27cf0cf98a8640e2a451d3f06ac1216eb9686c..161321c0064f55ba3623d24dfabf6a9bfd55e5ae 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -2277,6 +2277,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop parameter) { diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index e90760d8b4657265e70f73c62623702175dcf4ee..d373eebef63a6f3edd0cdee1d06e2a992678b362 100644 +index 93b70e8149d98b0d29729687d66d17bf898685be..bbc402ea7addd33b6d77b51c213bd8b29615caea 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -314,6 +314,11 @@ public final class LeavesConfig { +@@ -319,6 +319,11 @@ public final class LeavesConfig { throttleInactiveGoalSelectorTick = getBoolean("settings.performance.inactive-goal-selector-disable", throttleInactiveGoalSelectorTick); } diff --git a/patches/server/0034-Reduce-entity-allocations.patch b/patches/server/0034-Reduce-entity-allocations.patch index 91f88cd2..4a60b006 100644 --- a/patches/server/0034-Reduce-entity-allocations.patch +++ b/patches/server/0034-Reduce-entity-allocations.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Reduce entity allocations This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 9c44cae6f624c845f8abd84061e2dc4157748c83..c0e7ea96effd44b75ef3afdeab29bc21277af6bd 100644 +index 14dc0a75043274bf0ff31f4982ca7224e8db6c19..9f5b14295f85d32a8ebee44b3aab939cb7ea6230 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -416,6 +416,8 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -54,10 +54,10 @@ index dd1102d5291ef6f18e82400a6d8a0a376cc071e9..53c094c8a674b2842009727569e7e1f6 @Nullable diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index d373eebef63a6f3edd0cdee1d06e2a992678b362..80f8fdaf3b9b208580422645d3fe3016da4f2b0e 100644 +index bbc402ea7addd33b6d77b51c213bd8b29615caea..dedf8d67dcf389c98b67614fc75b69465c18d276 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -319,6 +319,11 @@ public final class LeavesConfig { +@@ -324,6 +324,11 @@ public final class LeavesConfig { skipCloneLootParameters = getBoolean("settings.performance.skip-clone-loot-parameters", skipCloneLootParameters); } diff --git a/patches/server/0035-Remove-lambda-from-ticking-guard.patch b/patches/server/0035-Remove-lambda-from-ticking-guard.patch index 60e7ca89..6e67448c 100644 --- a/patches/server/0035-Remove-lambda-from-ticking-guard.patch +++ b/patches/server/0035-Remove-lambda-from-ticking-guard.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Remove lambda from ticking guard This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 03a4e114a3383ce779a6fc48747834b33b480f66..09f6622d9e45e16d1147a43f579d2ec7092ad4d3 100644 +index b06a79cbf4ab0fe3ff6f2f9a2d4697e6bf237d60..b0a30f6426868b397ae73d20d57e0c3ddc03b470 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -728,7 +728,24 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -36,10 +36,10 @@ index 03a4e114a3383ce779a6fc48747834b33b480f66..09f6622d9e45e16d1147a43f579d2ec7 } } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 80f8fdaf3b9b208580422645d3fe3016da4f2b0e..345b9ef0af9f8f08af00693e562e5f39a8ad3362 100644 +index dedf8d67dcf389c98b67614fc75b69465c18d276..83a3d5b3324ad49c0a9e203037a793c03fb3bcfc 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -324,6 +324,11 @@ public final class LeavesConfig { +@@ -329,6 +329,11 @@ public final class LeavesConfig { reduceEntityAllocations = getBoolean("settings.performance.reduce-entity-allocations", reduceEntityAllocations); } diff --git a/patches/server/0036-Remove-iterators-from-inventory-contains.patch b/patches/server/0036-Remove-iterators-from-inventory-contains.patch index 53144826..5594a37a 100644 --- a/patches/server/0036-Remove-iterators-from-inventory-contains.patch +++ b/patches/server/0036-Remove-iterators-from-inventory-contains.patch @@ -55,10 +55,10 @@ index 27c028ab6b1edb6e413af3bbaa27bf30f2d85540..4a89ce4fbd8b19ce1cff5905d779d2e4 } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 345b9ef0af9f8f08af00693e562e5f39a8ad3362..a5fece21769900d5600df3284b7d3191121f10a5 100644 +index 83a3d5b3324ad49c0a9e203037a793c03fb3bcfc..d29d1dfcd3b5cf3c74e377acaf64186b03cf7b4a 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -329,6 +329,11 @@ public final class LeavesConfig { +@@ -334,6 +334,11 @@ public final class LeavesConfig { removeTickGuardLambda = getBoolean("settings.performance.remove.tick-guard-lambda", removeTickGuardLambda); } diff --git a/patches/server/0037-Remove-streams-from-getting-nearby-players.patch b/patches/server/0037-Remove-streams-from-getting-nearby-players.patch index 71751d1d..978d1e7c 100644 --- a/patches/server/0037-Remove-streams-from-getting-nearby-players.patch +++ b/patches/server/0037-Remove-streams-from-getting-nearby-players.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Remove streams from getting nearby players This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index c0e7ea96effd44b75ef3afdeab29bc21277af6bd..06709144f1cd70889e358e4e4a0b0c3a92ac0f7d 100644 +index 9f5b14295f85d32a8ebee44b3aab939cb7ea6230..cf1694ada40fab9e06f702bcf6bf3a6a07b2cee3 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -492,25 +492,50 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { @@ -68,10 +68,10 @@ index c0e7ea96effd44b75ef3afdeab29bc21277af6bd..06709144f1cd70889e358e4e4a0b0c3a return chunkMap.playerEntityTrackerTrackMaps[type.ordinal()].getObjectsInRange(MCUtil.getCoordinateKey(this)); } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index a5fece21769900d5600df3284b7d3191121f10a5..06852bda6703c077ce5b4d6bd0eaceb413e52888 100644 +index d29d1dfcd3b5cf3c74e377acaf64186b03cf7b4a..37b6a53b8b6f09af4f8e389eb6afdb80b6494554 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -334,6 +334,11 @@ public final class LeavesConfig { +@@ -339,6 +339,11 @@ public final class LeavesConfig { removeInventoryContainsIterators = getBoolean("settings.performance.remove.inventory-contains-iterators", removeInventoryContainsIterators); } diff --git a/patches/server/0038-Remove-streams-and-iterators-from-range-check.patch b/patches/server/0038-Remove-streams-and-iterators-from-range-check.patch index 70b47cf0..58c5de8f 100644 --- a/patches/server/0038-Remove-streams-and-iterators-from-range-check.patch +++ b/patches/server/0038-Remove-streams-and-iterators-from-range-check.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Remove streams and iterators from range check This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 6cca26640b5c392d2d1bb3ecb6b2b235937f54bd..698ca70f42a0db81f89d67d75f23c80d816a10b0 100644 +index fbe209a66c77c47935ad026dd3e45e682af91fd8..71d62db53b5b103c3640e1f77609445b4b3e047e 100644 --- a/src/main/java/net/minecraft/server/level/ChunkMap.java +++ b/src/main/java/net/minecraft/server/level/ChunkMap.java -@@ -1667,19 +1667,45 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -1637,19 +1637,45 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider return ChunkMap.this.level.getServer().getScaledTrackingDistance(initialDistance); } @@ -63,10 +63,10 @@ index 6cca26640b5c392d2d1bb3ecb6b2b235937f54bd..698ca70f42a0db81f89d67d75f23c80d return this.scaledRange(i); } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 06852bda6703c077ce5b4d6bd0eaceb413e52888..317ec81396bebd72ba1b3c0cfcb421a960e32268 100644 +index 37b6a53b8b6f09af4f8e389eb6afdb80b6494554..91087dc6d9429f0ccca1194bcf25f52bd264febb 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -339,6 +339,11 @@ public final class LeavesConfig { +@@ -344,6 +344,11 @@ public final class LeavesConfig { removeGetNearPlayerStreams = getBoolean("settings.performance.remove.get-nearby-players-streams", removeGetNearPlayerStreams); } diff --git a/patches/server/0039-Async-Pathfinding.patch b/patches/server/0039-Async-Pathfinding.patch index 52adf67b..0b1db5bc 100644 --- a/patches/server/0039-Async-Pathfinding.patch +++ b/patches/server/0039-Async-Pathfinding.patch @@ -7,10 +7,10 @@ This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) But Pufferfish patch was ported downstream from the Petal fork diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 317ec81396bebd72ba1b3c0cfcb421a960e32268..ab7613a1ccfc6117f8b4eed72bdaa6730b8238d3 100644 +index 91087dc6d9429f0ccca1194bcf25f52bd264febb..cf3de827f8a2f1a48546e17327e71d1fa5b7058a 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -344,6 +344,21 @@ public final class LeavesConfig { +@@ -349,6 +349,21 @@ public final class LeavesConfig { removeRangeCheckStreams = getBoolean("settings.performance.remove.range-check-streams-and-iterators", removeRangeCheckStreams); } diff --git a/patches/server/0040-Cache-climbing-check-for-activation.patch b/patches/server/0040-Cache-climbing-check-for-activation.patch index 0ea98652..ac262849 100644 --- a/patches/server/0040-Cache-climbing-check-for-activation.patch +++ b/patches/server/0040-Cache-climbing-check-for-activation.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Cache climbing check for activation This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java -index 0fea7b506a65d21161a538c68579982a98ca98c7..557a92bfaecf3f1bddd4c602a26a7d5373f9798d 100644 +index f240f2b337524a417f6ddb57cbf063f013aa80f7..523a46eb4a23b4a4aa9e5ea38771a5953c1bdccc 100644 --- a/src/main/java/net/minecraft/world/entity/LivingEntity.java +++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java @@ -1938,6 +1938,22 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -46,10 +46,10 @@ index 52780192d6417f8085566e4cdf3a895a83638520..eeb3522c39dde84e497d22758e90b42f return 1; // Paper } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index ab7613a1ccfc6117f8b4eed72bdaa6730b8238d3..136bd381e68318f5b2afd3616fb13e580aa0cc49 100644 +index cf3de827f8a2f1a48546e17327e71d1fa5b7058a..c0e405bae8dfadfef5295240f6cebd0670fbdaae 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -359,6 +359,11 @@ public final class LeavesConfig { +@@ -364,6 +364,11 @@ public final class LeavesConfig { } } diff --git a/patches/server/0041-Use-aging-cache-for-biome-temperatures.patch b/patches/server/0041-Use-aging-cache-for-biome-temperatures.patch index 1c864182..453c02e8 100644 --- a/patches/server/0041-Use-aging-cache-for-biome-temperatures.patch +++ b/patches/server/0041-Use-aging-cache-for-biome-temperatures.patch @@ -102,10 +102,10 @@ index 65012a12e1430956ef55ced56773e6354ac26444..fe43432da26a3570c993b5592b7b8020 public boolean shouldFreeze(LevelReader world, BlockPos blockPos) { diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 136bd381e68318f5b2afd3616fb13e580aa0cc49..224ff765c57b65cea7dd46806ed57e82da42a3f8 100644 +index c0e405bae8dfadfef5295240f6cebd0670fbdaae..58a00110efb035bd893f89ab24f353d0427a6888 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -364,6 +364,15 @@ public final class LeavesConfig { +@@ -369,6 +369,15 @@ public final class LeavesConfig { cacheClimbCheck = getBoolean("settings.performance.cache-climb-check", cacheClimbCheck); } diff --git a/patches/server/0042-Reduce-entity-fluid-lookups-if-no-fluids.patch b/patches/server/0042-Reduce-entity-fluid-lookups-if-no-fluids.patch index 6a8655b2..c72b254c 100644 --- a/patches/server/0042-Reduce-entity-fluid-lookups-if-no-fluids.patch +++ b/patches/server/0042-Reduce-entity-fluid-lookups-if-no-fluids.patch @@ -217,10 +217,10 @@ index 1b80a91fa36c59a31b57ef7ef4a68eacbb0f17f5..62f4e7a2dcd93a5b11fb9f847c70da1b }); diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 224ff765c57b65cea7dd46806ed57e82da42a3f8..ac919b7b128e23c12e00956974220872cc3a4848 100644 +index 58a00110efb035bd893f89ab24f353d0427a6888..81763862b3e12797038920ff55b96325927049e2 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -373,6 +373,11 @@ public final class LeavesConfig { +@@ -378,6 +378,11 @@ public final class LeavesConfig { } } diff --git a/patches/server/0043-Reduce-chunk-loading-lookups.patch b/patches/server/0043-Reduce-chunk-loading-lookups.patch index 197ae171..d0b643ea 100644 --- a/patches/server/0043-Reduce-chunk-loading-lookups.patch +++ b/patches/server/0043-Reduce-chunk-loading-lookups.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Reduce chunk loading & lookups This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index f4002ac7cba7d5e41b4f11b98212c625f6a92a65..6feeb3d30e45c5aba4e8204fe7e76f8f0357ad08 100644 +index 418d6301f067803e2471e59ac2d52a68cbff249b..5659e7e61bc3ab36817d17e95a758696d08007a5 100644 --- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java @@ -322,11 +322,28 @@ public class EnderMan extends Monster implements NeutralMob { @@ -42,10 +42,10 @@ index f4002ac7cba7d5e41b4f11b98212c625f6a92a65..6feeb3d30e45c5aba4e8204fe7e76f8f boolean flag1 = iblockdata.getFluidState().is(FluidTags.WATER); diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index ac919b7b128e23c12e00956974220872cc3a4848..a2b13e51c96dc929ab3f0ddb89560398bbab23f5 100644 +index 81763862b3e12797038920ff55b96325927049e2..54195078dcf4ad069bb21cd73c85509eafb85630 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -378,6 +378,11 @@ public final class LeavesConfig { +@@ -383,6 +383,11 @@ public final class LeavesConfig { reduceEntityFluidLookup = getBoolean("settings.performance.reduce-entity-fluid-lookup", reduceEntityFluidLookup); } diff --git a/patches/server/0044-Simpler-ShapelessRecipes-comparison-for-Vanilla.patch b/patches/server/0044-Simpler-ShapelessRecipes-comparison-for-Vanilla.patch index 39d81f6b..cae55bdf 100644 --- a/patches/server/0044-Simpler-ShapelessRecipes-comparison-for-Vanilla.patch +++ b/patches/server/0044-Simpler-ShapelessRecipes-comparison-for-Vanilla.patch @@ -73,10 +73,10 @@ index f7ea77dd82d978ad307f99c743efacfb34478b3d..96be7a7b030b2f82ac91f0c5c8e66f28 } } diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index a2b13e51c96dc929ab3f0ddb89560398bbab23f5..3207f4787b0bad1122825a9b491de03e768e16ad 100644 +index 54195078dcf4ad069bb21cd73c85509eafb85630..ef298d46639f042780154855aca01e69257ba708 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -383,6 +383,11 @@ public final class LeavesConfig { +@@ -388,6 +388,11 @@ public final class LeavesConfig { reduceChuckLoadAndLookup = getBoolean("settings.performance.reduce-chuck-load-and-lookup", reduceChuckLoadAndLookup); } diff --git a/patches/server/0045-PCA-sync-protocol.patch b/patches/server/0045-PCA-sync-protocol.patch index 3e4e596b..d654ec1c 100644 --- a/patches/server/0045-PCA-sync-protocol.patch +++ b/patches/server/0045-PCA-sync-protocol.patch @@ -369,10 +369,10 @@ index 1658adddd81880f0231c714e25ebb588ca7fd3c8..e4189f444da906d89d7c910c4f0e61e0 // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -index 3207f4787b0bad1122825a9b491de03e768e16ad..a72995e1315fe492f4c2299a5d67b077ed094509 100644 +index ef298d46639f042780154855aca01e69257ba708..77595ddd8569251f4481d3dddbd769710c69320a 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java -@@ -388,6 +388,21 @@ public final class LeavesConfig { +@@ -393,6 +393,21 @@ public final class LeavesConfig { simplerVanillaShapelessRecipes = getBoolean("settings.performance.simpler-vanilla-shapeless-recipes", simplerVanillaShapelessRecipes); } diff --git a/patches/server/0046-BBOR-Protocol.patch b/patches/server/0046-BBOR-Protocol.patch index b202ce3c..3c28f5ae 100644 --- a/patches/server/0046-BBOR-Protocol.patch +++ b/patches/server/0046-BBOR-Protocol.patch @@ -5,10 +5,10 @@ Subject: [PATCH] BBOR Protocol diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 13fd9744adfa5459a24fedcc6359b11e125eff42..a8c580c9e8ee099af1869c9aa42d3e6aaba720e4 100644 +index 161321c0064f55ba3623d24dfabf6a9bfd55e5ae..b02c2dbed413a06d01e41a3dbd1701d070c27d5b 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1595,6 +1595,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop