diff --git a/gradle.properties b/gradle.properties index ee4485b35..fbc61c693 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group = org.purpurmc.purpur version = 1.19.1-R0.1-SNAPSHOT -paperCommit = 532dc51d5f4deb036474e8d5921275f937e4c4ac +paperCommit = fd557b7d51bba4d5e830d6047005f7e4335f5ada org.gradle.caching = true org.gradle.parallel = true diff --git a/patches/api/0001-Pufferfish-API-Changes.patch b/patches/api/0001-Pufferfish-API-Changes.patch index 1794faadb..d8e63d57a 100644 --- a/patches/api/0001-Pufferfish-API-Changes.patch +++ b/patches/api/0001-Pufferfish-API-Changes.patch @@ -3,21 +3,6 @@ From: Kevin Raneri Date: Tue, 9 Nov 2021 14:01:56 -0500 Subject: [PATCH] Pufferfish API Changes -Pufferfish -Copyright (C) 2022 Pufferfish Studios LLC - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . diff --git a/build.gradle.kts b/build.gradle.kts index e950bce5047552bdd3f5664eb24ce290b0a06225..10716b2c866631badb99b1fb79b66c62b117b038 100644 @@ -426,7 +411,7 @@ index 8e6ad6ffb6918742d47b58d6cb1ad646d5e3df5f..331adbaf782c00d801a36c0c9551451a } diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java -index 1c9d0a81d581d0e6a8b2551a2cb9ed5e18bb2991..e42a2d631fd7eaa455132e0cf64c9be7707dadb9 100644 +index 9db611841b73fed8dc8a71f4d7fdef95af3cf89d..49a4611ed4891cce10fd6e01b4062740ad18ee6f 100644 --- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java +++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java @@ -623,7 +623,9 @@ public final class SimplePluginManager implements PluginManager { diff --git a/patches/api/0007-Ridables.patch b/patches/api/0007-Ridables.patch index 4dfd9264e..32ca39198 100644 --- a/patches/api/0007-Ridables.patch +++ b/patches/api/0007-Ridables.patch @@ -22,13 +22,13 @@ index 8fd399f791b45eb7fc62693ca954eea0c68e2881..22705359d5b3b1af522ff5575c07ca5e * @deprecated removed in 1.16 */ diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java -index 03b35d3ba8ba00c0fa0272450f19355244a014ea..79990a193443ed4c619a25ae1b4c18d46e8dcc83 100644 +index 4d4a0d15876cc48c9c0456b9f11a5dda37fd56ce..dd7df647f98fe72694fb7615e5cd1192724b7812 100644 --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java -@@ -897,4 +897,35 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent +@@ -919,4 +919,35 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent */ - boolean isInPowderedSnow(); - // Paper end + boolean wouldCollideUsing(@NotNull BoundingBox boundingBox); + // Paper End - Collision API + + // Purpur start + /** diff --git a/patches/api/0034-API-for-any-mob-to-burn-daylight.patch b/patches/api/0034-API-for-any-mob-to-burn-daylight.patch index a4600bfb6..490286be5 100644 --- a/patches/api/0034-API-for-any-mob-to-burn-daylight.patch +++ b/patches/api/0034-API-for-any-mob-to-burn-daylight.patch @@ -6,10 +6,10 @@ Subject: [PATCH] API for any mob to burn daylight Co-authored by: Encode42 diff --git a/src/main/java/org/bukkit/entity/Entity.java b/src/main/java/org/bukkit/entity/Entity.java -index 79990a193443ed4c619a25ae1b4c18d46e8dcc83..ffd3d7f4c0c86806bcf70bd90edf3041834d401c 100644 +index dd7df647f98fe72694fb7615e5cd1192724b7812..1f116f33e6dbce8d8d67d799beeedecf792cd728 100644 --- a/src/main/java/org/bukkit/entity/Entity.java +++ b/src/main/java/org/bukkit/entity/Entity.java -@@ -927,5 +927,12 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent +@@ -949,5 +949,12 @@ public interface Entity extends Metadatable, CommandSender, Nameable, Persistent * @return True if ridable in water */ boolean isRidableInWater(); diff --git a/patches/server/0001-Pufferfish-Server-Changes.patch b/patches/server/0001-Pufferfish-Server-Changes.patch index ad1ff46d4..8cca11499 100644 --- a/patches/server/0001-Pufferfish-Server-Changes.patch +++ b/patches/server/0001-Pufferfish-Server-Changes.patch @@ -3,21 +3,6 @@ From: Kevin Raneri Date: Wed, 3 Feb 2021 23:02:38 -0600 Subject: [PATCH] Pufferfish Server Changes -Pufferfish -Copyright (C) 2022 Pufferfish Studios LLC - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . diff --git a/build.gradle.kts b/build.gradle.kts index 2374cc9bab5039d0a0dc11d4b2ec573ab75778a7..74c91f79576e85618fefb79be8d313ba871701c7 100644 @@ -612,10 +597,10 @@ index 0000000000000000000000000000000000000000..020368da69b9a492155f6de6297f7473 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..09827eaa9f6adf49385a33aa60b3a6bf4005a982 +index 0000000000000000000000000000000000000000..38cb29c646ff496ffaa6553f98a565b71155c464 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java -@@ -0,0 +1,335 @@ +@@ -0,0 +1,337 @@ +package gg.pufferfish.pufferfish; + +import gg.pufferfish.pufferfish.simd.SIMDDetection; @@ -945,8 +930,10 @@ index 0000000000000000000000000000000000000000..09827eaa9f6adf49385a33aa60b3a6bf + + + public static boolean disableMethodProfiler; ++ public static boolean disableOutOfOrderChat; + private static void miscSettings() { -+ disableMethodProfiler = getBoolean("misc.disable-method-profiler", true); ++ disableMethodProfiler = getBoolean("misc.disable-method-profiler", true); ++ disableOutOfOrderChat = getBoolean("misc.disable-out-of-order-chat", false); + setComment("misc", "Settings for things that don't belong elsewhere"); + } + @@ -1811,10 +1798,10 @@ index 0000000000000000000000000000000000000000..db15d3fbe2b65fc8035573f5fdbea382 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/path/AsyncPath.java b/src/main/java/gg/pufferfish/pufferfish/path/AsyncPath.java new file mode 100644 -index 0000000000000000000000000000000000000000..401645f9f2cccaec4b37c6a91cf930a1fc520301 +index 0000000000000000000000000000000000000000..dcfe6fa538c54417b90a138b26c451f63b408ff6 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/path/AsyncPath.java -@@ -0,0 +1,280 @@ +@@ -0,0 +1,282 @@ +package gg.pufferfish.pufferfish.path; + +import net.minecraft.core.BlockPos; @@ -1825,9 +1812,9 @@ index 0000000000000000000000000000000000000000..401645f9f2cccaec4b37c6a91cf930a1 +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + ++import java.util.ArrayList; +import java.util.List; +import java.util.Set; -+import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +/** @@ -1841,9 +1828,9 @@ index 0000000000000000000000000000000000000000..401645f9f2cccaec4b37c6a91cf930a1 + private volatile boolean processed = false; + + /** -+ * a future representing the processing state of this path ++ * runnables waiting for path to be processed + */ -+ private final @NotNull CompletableFuture processingFuture; ++ private final @NotNull List postProcessing = new ArrayList<>(); + + /** + * a list of positions that this path could path towards @@ -1890,7 +1877,7 @@ index 0000000000000000000000000000000000000000..401645f9f2cccaec4b37c6a91cf930a1 + this.positions = positions; + this.pathSupplier = pathSupplier; + -+ this.processingFuture = AsyncPathProcessor.queue(this).thenApply((unused) -> this); ++ AsyncPathProcessor.queue(this); + } + + @Override @@ -1899,11 +1886,11 @@ index 0000000000000000000000000000000000000000..401645f9f2cccaec4b37c6a91cf930a1 + } + + /** -+ * returns the future representing the processing state of this path -+ * @return a future ++ * add a post-processing action + */ -+ public @NotNull CompletableFuture getProcessingFuture() { -+ return this.processingFuture; ++ public synchronized void postProcessing(@NotNull Runnable runnable) { ++ if (processed) runnable.run(); ++ else postProcessing.add(runnable); + } + + /** @@ -1936,6 +1923,8 @@ index 0000000000000000000000000000000000000000..401645f9f2cccaec4b37c6a91cf930a1 + this.canReach = bestPath.canReach(); + + this.processed = true; ++ ++ this.postProcessing.forEach(Runnable::run); + } + + /** @@ -2097,7 +2086,7 @@ index 0000000000000000000000000000000000000000..401645f9f2cccaec4b37c6a91cf930a1 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/path/AsyncPathProcessor.java b/src/main/java/gg/pufferfish/pufferfish/path/AsyncPathProcessor.java new file mode 100644 -index 0000000000000000000000000000000000000000..08e949d8493284667cd8f1adb710b4e9e9611e28 +index 0000000000000000000000000000000000000000..6c8035ef7effd0ccdc887b3792ba09ef6b2a74fa --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/path/AsyncPathProcessor.java @@ -0,0 +1,44 @@ @@ -2139,7 +2128,7 @@ index 0000000000000000000000000000000000000000..08e949d8493284667cd8f1adb710b4e9 + */ + public static void awaitProcessing(@Nullable Path path, Consumer<@Nullable Path> afterProcessing) { + if (path != null && !path.isProcessed() && path instanceof AsyncPath asyncPath) { -+ asyncPath.getProcessingFuture().thenAcceptAsync(afterProcessing, mainThreadExecutor); ++ asyncPath.postProcessing(() -> mainThreadExecutor.execute(() -> afterProcessing.accept(path))); + } else { + afterProcessing.accept(path); + } @@ -2147,10 +2136,10 @@ index 0000000000000000000000000000000000000000..08e949d8493284667cd8f1adb710b4e9 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/path/NodeEvaluatorCache.java b/src/main/java/gg/pufferfish/pufferfish/path/NodeEvaluatorCache.java new file mode 100644 -index 0000000000000000000000000000000000000000..9f81dc6e8d198f1be957c1a05c72eb5ba38832ce +index 0000000000000000000000000000000000000000..a18b967d7a7325885c94a1093cc5800012998f1a --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/path/NodeEvaluatorCache.java -@@ -0,0 +1,39 @@ +@@ -0,0 +1,43 @@ +package gg.pufferfish.pufferfish.path; + +import net.minecraft.world.level.pathfinder.NodeEvaluator; @@ -2189,6 +2178,10 @@ index 0000000000000000000000000000000000000000..9f81dc6e8d198f1be957c1a05c72eb5b + getDequeForGenerator(generator).offer(nodeEvaluator); + } + ++ public static void removeNodeEvaluator(@NotNull NodeEvaluator nodeEvaluator) { ++ nodeEvaluatorToGenerator.remove(nodeEvaluator); ++ } ++ +} diff --git a/src/main/java/gg/pufferfish/pufferfish/path/NodeEvaluatorGenerator.java b/src/main/java/gg/pufferfish/pufferfish/path/NodeEvaluatorGenerator.java new file mode 100644 @@ -2395,10 +2388,10 @@ index 0000000000000000000000000000000000000000..1b29210ad0bbb4ada150f23357f0c80d +} diff --git a/src/main/java/gg/pufferfish/pufferfish/tracker/MultithreadedTracker.java b/src/main/java/gg/pufferfish/pufferfish/tracker/MultithreadedTracker.java new file mode 100644 -index 0000000000000000000000000000000000000000..2dfe34a3fd0e460865393d9d8a1bdab71aa47b6b +index 0000000000000000000000000000000000000000..ac541ddf1594ae865de02fd40940e39285043b1f --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/tracker/MultithreadedTracker.java -@@ -0,0 +1,141 @@ +@@ -0,0 +1,127 @@ +package gg.pufferfish.pufferfish.tracker; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; @@ -2426,7 +2419,6 @@ index 0000000000000000000000000000000000000000..2dfe34a3fd0e460865393d9d8a1bdab7 + private final AtomicInteger taskIndex = new AtomicInteger(); + + private final ConcurrentLinkedQueue mainThreadTasks; -+ private final ConcurrentLinkedQueue postTrackingTasks = new ConcurrentLinkedQueue<>(); + private final AtomicInteger finishedTasks = new AtomicInteger(); + + public MultithreadedTracker(IteratorSafeOrderedReferenceSet entityTickingChunks, ConcurrentLinkedQueue mainThreadTasks) { @@ -2459,7 +2451,6 @@ index 0000000000000000000000000000000000000000..2dfe34a3fd0e460865393d9d8a1bdab7 + } + + this.runMainThreadTasks(); // finish any remaining tasks -+ this.runPostTrackingTasks(); // run all post-tracking tasks + } finally { + this.entityTickingChunks.finishRawIterator(); + } @@ -2476,17 +2467,6 @@ index 0000000000000000000000000000000000000000..2dfe34a3fd0e460865393d9d8a1bdab7 + } + } + -+ private void runPostTrackingTasks() { -+ try { -+ Runnable task; -+ while ((task = this.postTrackingTasks.poll()) != null) { -+ task.run(); -+ } -+ } catch (Throwable throwable) { -+ MinecraftServer.LOGGER.warn("Post-tracking tasks failed while ticking track queue", throwable); -+ } -+ } -+ + private void run() { + try { + while (handleTasks(10)); @@ -2532,8 +2512,7 @@ index 0000000000000000000000000000000000000000..2dfe34a3fd0e460865393d9d8a1bdab7 + if (entityTracker != null) { + entityTracker.updatePlayers(entityTracker.entity.getPlayersInTrackRange()); + -+ // run this on the main thread. This needs to be run after all updatePlayers methods are called. -+ this.postTrackingTasks.offer(entityTracker.serverEntity::sendChanges); ++ this.mainThreadTasks.offer(entityTracker.serverEntity::sendChanges); + } + } + } @@ -3080,7 +3059,7 @@ index 59acbf6249f8f5285504c0ddea448a3433d1d68d..378cc1f9e19eb9b18037ab8af92f6589 private void getFullChunk(long pos, Consumer chunkConsumer) { diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java -index 3b144c820531122eb37d41be06c182b5f5dc0724..871bce7f5acc1b9a058496f41d962ec2e724f620 100644 +index 3b144c820531122eb37d41be06c182b5f5dc0724..88152988425b7b02ec5ce229ba4c24b40e030329 100644 --- a/src/main/java/net/minecraft/server/level/ServerEntity.java +++ b/src/main/java/net/minecraft/server/level/ServerEntity.java @@ -165,6 +165,7 @@ public class ServerEntity { @@ -3120,6 +3099,36 @@ index 3b144c820531122eb37d41be06c182b5f5dc0724..871bce7f5acc1b9a058496f41d962ec2 this.entity.startSeenByPlayer(player); } +@@ -360,19 +366,26 @@ public class ServerEntity { + SynchedEntityData datawatcher = this.entity.getEntityData(); + + if (datawatcher.isDirty()) { +- this.broadcastAndSend(new ClientboundSetEntityDataPacket(this.entity.getId(), datawatcher, false)); ++ ((ServerLevel) this.entity.level).chunkSource.chunkMap.runOnTrackerMainThread(() -> // Pufferfish ++ this.broadcastAndSend(new ClientboundSetEntityDataPacket(this.entity.getId(), datawatcher, false)) ++ ); // Pufferfish + } + + if (this.entity instanceof LivingEntity) { + Set set = ((LivingEntity) this.entity).getAttributes().getDirtyAttributes(); + + if (!set.isEmpty()) { ++ // Pufferfish start ++ 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); // Pufferfish + } + // CraftBukkit end +- this.broadcastAndSend(new ClientboundUpdateAttributesPacket(this.entity.getId(), set)); ++ this.broadcastAndSend(new ClientboundUpdateAttributesPacket(this.entity.getId(), attributesCopy)); // Pufferfish ++ }); ++ // Pufferfish end + } + + set.clear(); diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java index 083349794d5ceb50322c5a645dd33fbfcc1c8155..f58873ef4362bfcc618ead099be94ba2dd4d86ed 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -3178,7 +3187,7 @@ index 083349794d5ceb50322c5a645dd33fbfcc1c8155..f58873ef4362bfcc618ead099be94ba2 this.getRandomBlockPosition(j, 0, k, 15, blockposition); int normalY = chunk.getHeight(Heightmap.Types.MOTION_BLOCKING, blockposition.getX() & 15, blockposition.getZ() & 15) + 1; diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index ff7df8026f85b7ad51458a0b720a8baf71cd9bd1..32ef30e130c7f6e252ebf5b866fb9e89d7c0d7db 100644 +index ff7df8026f85b7ad51458a0b720a8baf71cd9bd1..8da76daecef969f452960df5577c7bc408ac7acb 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -1215,6 +1215,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -3189,6 +3198,14 @@ index ff7df8026f85b7ad51458a0b720a8baf71cd9bd1..32ef30e130c7f6e252ebf5b866fb9e89 // Paper start if (!this.cserver.isPrimaryThread()) { List pageList = packet.getPages(); +@@ -2349,6 +2350,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + } + + private boolean updateChatOrder(Instant timestamp) { ++ if (gg.pufferfish.pufferfish.PufferfishConfig.disableOutOfOrderChat) return true; + Instant instant1; + + do { diff --git a/src/main/java/net/minecraft/world/CompoundContainer.java b/src/main/java/net/minecraft/world/CompoundContainer.java index 241fec02e6869c638d3a160819b32173a081467b..6a8f9e8f5bf108674c47018def28906e2d0a729c 100644 --- a/src/main/java/net/minecraft/world/CompoundContainer.java @@ -3741,84 +3758,136 @@ index 43243537b765a2d270be6de3f053fea77ff67d18..b56bb0ac37a6d51d645b6189af0ae7da } diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java b/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java -index 18364ce4c60172529b10bc9e3a813dcedc4b766f..698c46f786689d719ecca0780e220eab594bc45e 100644 +index 18364ce4c60172529b10bc9e3a813dcedc4b766f..72dfb58a7f4586387c2d32cf54fff137b2d26666 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java +++ b/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java -@@ -58,6 +58,7 @@ public class MoveToTargetSink extends Behavior { +@@ -21,6 +21,7 @@ public class MoveToTargetSink extends Behavior { + private int remainingCooldown; + @Nullable + private Path path; ++ private boolean finishedProcessing; // Pufferfish + @Nullable + private BlockPos lastTargetPos; + private float speedModifier; +@@ -42,9 +43,10 @@ public class MoveToTargetSink extends Behavior { + Brain brain = entity.getBrain(); + WalkTarget walkTarget = brain.getMemory(MemoryModuleType.WALK_TARGET).get(); + boolean bl = this.reachedTarget(entity, walkTarget); +- if (!bl && this.tryComputePath(entity, walkTarget, world.getGameTime())) { ++ if (!bl && (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding && this.tryComputePath(entity, walkTarget, world.getGameTime()))) { // Pufferfish + this.lastTargetPos = walkTarget.getTarget().currentBlockPosition(); + return true; ++ } else if (!bl) { return true; // Pufferfish + } else { + brain.eraseMemory(MemoryModuleType.WALK_TARGET); + if (bl) { +@@ -58,6 +60,7 @@ public class MoveToTargetSink extends Behavior { @Override protected boolean canStillUse(ServerLevel serverLevel, Mob mob, long l) { -+ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding && this.path != null && !this.path.isProcessed()) return true; // Pufferfish - wait for path to process ++ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding && !finishedProcessing) return true; // Pufferfish - wait for path to process if (this.path != null && this.lastTargetPos != null) { Optional optional = mob.getBrain().getMemory(MemoryModuleType.WALK_TARGET); PathNavigation pathNavigation = mob.getNavigation(); -@@ -87,6 +88,8 @@ public class MoveToTargetSink extends Behavior { +@@ -81,28 +84,96 @@ public class MoveToTargetSink extends Behavior { + + @Override + protected void start(ServerLevel serverLevel, Mob mob, long l) { ++ if (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding) { // Pufferfish + mob.getBrain().setMemory(MemoryModuleType.PATH, this.path); + mob.getNavigation().moveTo(this.path, (double)this.speedModifier); ++ // Pufferfish start ++ } else { ++ Brain brain = mob.getBrain(); ++ WalkTarget walkTarget = brain.getMemory(MemoryModuleType.WALK_TARGET).get(); ++ ++ this.finishedProcessing = false; ++ this.lastTargetPos = walkTarget.getTarget().currentBlockPosition(); ++ this.path = this.computePath(mob, walkTarget); ++ } ++ // Pufferfish end + } @Override protected void tick(ServerLevel world, Mob entity, long time) { + if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding && this.path != null && !this.path.isProcessed()) return; // Pufferfish - wait for processing + - Path path = entity.getNavigation().getPath(); - Brain brain = entity.getBrain(); - if (this.path != path) { -@@ -94,6 +97,12 @@ public class MoveToTargetSink extends Behavior { - brain.setMemory(MemoryModuleType.PATH, path); - } - -+ // Pufferfish start - periodically recall moveTo to ensure we're moving towards the correct path -+ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding && time % 8 == 0) { ++ // Pufferfish start ++ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding && !finishedProcessing) { ++ this.finishedProcessing = true; ++ Brain brain = entity.getBrain(); ++ boolean canReach = this.path != null && this.path.canReach(); ++ if (canReach) { ++ brain.eraseMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE); ++ } else if (brain.hasMemoryValue(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE)) { ++ brain.setMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, time); ++ } ++ ++ if (!canReach) { ++ Optional walkTarget = brain.getMemory(MemoryModuleType.WALK_TARGET); ++ ++ if (walkTarget.isPresent()) { ++ BlockPos blockPos = walkTarget.get().getTarget().currentBlockPosition(); ++ Vec3 vec3 = DefaultRandomPos.getPosTowards((PathfinderMob)entity, 10, 7, Vec3.atBottomCenterOf(blockPos), (double)((float)Math.PI / 2F)); ++ if (vec3 != null) { ++ // try recalculating the path using a random position ++ this.path = entity.getNavigation().createPath(vec3.x, vec3.y, vec3.z, 0); ++ this.finishedProcessing = false; ++ return; ++ } ++ } ++ ++ brain.eraseMemory(MemoryModuleType.WALK_TARGET); ++ this.path = null; ++ ++ return; ++ } ++ ++ entity.getBrain().setMemory(MemoryModuleType.PATH, this.path); + entity.getNavigation().moveTo(this.path, (double)this.speedModifier); + } + // Pufferfish end + - if (path != null && this.lastTargetPos != null) { - WalkTarget walkTarget = brain.getMemory(MemoryModuleType.WALK_TARGET).get(); - if (walkTarget.getTarget().currentBlockPosition().distSqr(this.lastTargetPos) > 4.0D && this.tryComputePath(entity, walkTarget, world.getGameTime())) { -@@ -112,6 +121,24 @@ public class MoveToTargetSink extends Behavior { - if (this.reachedTarget(entity, walkTarget)) { - brain.eraseMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE); - } else { -+ // Pufferfish start - move this out to postProcessPath -+ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding) { -+ gg.pufferfish.pufferfish.path.AsyncPathProcessor.awaitProcessing(this.path, (unusedPath) -> { -+ this.postProcessPath(entity, walkTarget, time); -+ }); -+ return true; -+ } else { -+ return postProcessPath(entity, walkTarget, time); -+ } -+ } -+ -+ return false; -+ } -+ -+ private boolean postProcessPath(Mob entity, WalkTarget walkTarget, long time) { -+ Brain brain = entity.getBrain(); -+ BlockPos blockPos = walkTarget.getTarget().currentBlockPosition(); -+ - boolean bl = this.path != null && this.path.canReach(); - if (bl) { - brain.eraseMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE); -@@ -128,10 +155,19 @@ public class MoveToTargetSink extends Behavior { - this.path = entity.getNavigation().createPath(vec3.x, vec3.y, vec3.z, 0); - return this.path != null; - } -+ -+ // We failed, so erase and move on -+ if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding) { -+ brain.eraseMemory(MemoryModuleType.WALK_TARGET); -+ if (bl) { -+ brain.eraseMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE); -+ } -+ this.path = null; + Path path = entity.getNavigation().getPath(); + Brain brain = entity.getBrain(); +- if (this.path != path) { ++ if (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding && this.path != path) { // Pufferfish + this.path = path; + brain.setMemory(MemoryModuleType.PATH, path); } - return false; +- if (path != null && this.lastTargetPos != null) { ++ if (path != null && this.lastTargetPos != null && (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding || brain.hasMemoryValue(MemoryModuleType.WALK_TARGET))) { // Pufferfish + WalkTarget walkTarget = brain.getMemory(MemoryModuleType.WALK_TARGET).get(); ++ if (!gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncPathfinding) { // Pufferfish + if (walkTarget.getTarget().currentBlockPosition().distSqr(this.lastTargetPos) > 4.0D && this.tryComputePath(entity, walkTarget, world.getGameTime())) { + this.lastTargetPos = walkTarget.getTarget().currentBlockPosition(); + this.start(world, entity, time); + } ++ // Pufferfish start ++ } else { ++ if (walkTarget.getTarget().currentBlockPosition().distSqr(this.lastTargetPos) > 4.0D) this.start(world, entity, time); ++ } ++ // Pufferfish end ++ ++ } ++ } + ++ // Pufferfish start ++ private Path computePath(Mob entity, WalkTarget walkTarget) { ++ BlockPos blockPos = walkTarget.getTarget().currentBlockPosition(); ++ this.speedModifier = walkTarget.getSpeedModifier(); ++ Brain brain = entity.getBrain(); ++ if (this.reachedTarget(entity, walkTarget)) { ++ brain.eraseMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE); + } ++ ++ return entity.getNavigation().createPath(blockPos, 0); } + // Pufferfish end - private boolean reachedTarget(Mob entity, WalkTarget walkTarget) { - return walkTarget.getTarget().currentBlockPosition().distManhattan(entity.blockPosition()) <= walkTarget.getCloseEnoughDist(); + private boolean tryComputePath(Mob entity, WalkTarget walkTarget, long time) { + BlockPos blockPos = walkTarget.getTarget().currentBlockPosition(); diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java b/src/main/java/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java index 9bd6d4f7b86daaaa9cfbad454dde06b797e3f667..2402a8c1067a74a21d9812561df5fb6284670571 100644 --- a/src/main/java/net/minecraft/world/entity/ai/behavior/SetClosestHomeAsWalkTarget.java @@ -5364,10 +5433,10 @@ index 2a335f277bd0e4b8ad0f60d8226eb8aaa80a871f..228b11a21735885055d2fb5e0568e21a return false; } else if (o.nodes.size() != this.nodes.size()) { diff --git a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java -index d23481453717f715124156b5d83f6448f720d049..e6593d081b9349d68d45b645455d28f6f00d7c00 100644 +index d23481453717f715124156b5d83f6448f720d049..0455c8a7da880da4f0b7ae9d57e83e281a55f0ae 100644 --- a/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java +++ b/src/main/java/net/minecraft/world/level/pathfinder/PathFinder.java -@@ -25,36 +25,73 @@ public class PathFinder { +@@ -25,36 +25,75 @@ public class PathFinder { private static final boolean DEBUG = false; private final BinaryHeap openSet = new BinaryHeap(); @@ -5397,6 +5466,7 @@ index d23481453717f715124156b5d83f6448f720d049..e6593d081b9349d68d45b645455d28f6 + nodeEvaluator.prepare(world, mob); + Node node = nodeEvaluator.getStart(); if (node == null) { ++ gg.pufferfish.pufferfish.path.NodeEvaluatorCache.removeNodeEvaluator(nodeEvaluator); return null; } else { // Paper start - remove streams - and optimize collection @@ -5413,6 +5483,7 @@ index d23481453717f715124156b5d83f6448f720d049..e6593d081b9349d68d45b645455d28f6 + // Pufferfish start + if (this.nodeEvaluatorGenerator == null) { + // run sync :( ++ gg.pufferfish.pufferfish.path.NodeEvaluatorCache.removeNodeEvaluator(nodeEvaluator); + return this.findPath(world.getProfiler(), node, map, followRange, distance, rangeMultiplier); + } + @@ -5450,7 +5521,7 @@ index d23481453717f715124156b5d83f6448f720d049..e6593d081b9349d68d45b645455d28f6 // Set set = positions.keySet(); startNode.g = 0.0F; startNode.h = this.getBestH(startNode, positions); // Paper - optimize collection -@@ -91,7 +128,7 @@ public class PathFinder { +@@ -91,7 +130,7 @@ public class PathFinder { } if (!(node.distanceTo(startNode) >= followRange)) { @@ -5459,7 +5530,7 @@ index d23481453717f715124156b5d83f6448f720d049..e6593d081b9349d68d45b645455d28f6 for(int l = 0; l < k; ++l) { Node node2 = this.neighbors[l]; -@@ -123,9 +160,14 @@ public class PathFinder { +@@ -123,9 +162,14 @@ public class PathFinder { if (best == null || comparator.compare(path, best) < 0) best = path; } diff --git a/patches/server/0005-Purpur-client-support.patch b/patches/server/0005-Purpur-client-support.patch index f398c6b0e..0577e7a7e 100644 --- a/patches/server/0005-Purpur-client-support.patch +++ b/patches/server/0005-Purpur-client-support.patch @@ -17,10 +17,10 @@ index 94944ba458178f9e5b772224da329bb5d85f4394..94d87f6bd2c27b0d6cc4547e8bc6e87b public double lastEntitySpawnRadiusSquared; // Paper - optimise isOutsideRange, this field is in blocks public final com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet cachedSingleHashSet; // Paper diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 32ef30e130c7f6e252ebf5b866fb9e89d7c0d7db..2c9ab0cd801b6c95c9263960a7234a5e30de9672 100644 +index 8da76daecef969f452960df5577c7bc408ac7acb..116389472b3b25aaa5657c7dcbbc59bf8324b25e 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3614,6 +3614,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3615,6 +3615,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private static final ResourceLocation CUSTOM_UNREGISTER = new ResourceLocation("unregister"); private static final ResourceLocation MINECRAFT_BRAND = new ResourceLocation("brand"); // Paper - Brand support @@ -28,7 +28,7 @@ index 32ef30e130c7f6e252ebf5b866fb9e89d7c0d7db..2c9ab0cd801b6c95c9263960a7234a5e @Override public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { -@@ -3638,6 +3639,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3639,6 +3640,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic ServerGamePacketListenerImpl.LOGGER.error("Couldn\'t unregister custom payload", ex); this.disconnect("Invalid payload UNREGISTER!", org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause } diff --git a/patches/server/0008-Ridables.patch b/patches/server/0008-Ridables.patch index 7d0bc2154..5e168b5c2 100644 --- a/patches/server/0008-Ridables.patch +++ b/patches/server/0008-Ridables.patch @@ -66,10 +66,10 @@ index db23ce6f9253697592d80e44c192e9a97d06b83b..8c18c203854628c0dd8d660b197127b0 public void doTick() { diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 2c9ab0cd801b6c95c9263960a7234a5e30de9672..cd723d7e216ff6de0daee9d21309006b9874f321 100644 +index 116389472b3b25aaa5657c7dcbbc59bf8324b25e..ed5ba255f7de765bf956381c6d1d99dfc3cc64d3 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2887,6 +2887,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2888,6 +2888,8 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); @@ -3237,7 +3237,7 @@ index d980b906d9206560741576fa4153c57212f307a0..790d4abbc8e0b288e20e72e63f8190e9 public boolean doHurtTarget(Entity target) { if (super.doHurtTarget(target)) { diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 8c328d72c42ccaa6891249cc700b70bb34c09545..a5250d7a85f11c58732d7e3d3ca3321efac42fc0 100644 +index e0f71dc12cfc28710cacfbc372026f556dcab165..17cc847fd6e5a128c9ae7427dc0aef51918bc30a 100644 --- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java +++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java @@ -60,21 +60,98 @@ public class Creeper extends Monster implements PowerableMob { @@ -5146,13 +5146,13 @@ index 4132c1113f5437a776e5e3c1cb306904775aed88..1a945a32c3d3705a318ebca72a365931 public void tick() { super.tick(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index b80cc0938b2b3928f4450f1314a9fbd7ea9c116b..b8cb317246b1f07c193abac9b5c84acdfe9ef958 100644 +index 6549ade8e19807c523e5a1dc68b66585aad438b1..11d51beb52c326a9fc040322a79d3916a8ddd0a2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -@@ -1340,4 +1340,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { - return getHandle().isInPowderSnow || getHandle().wasInPowderSnow; // depending on the location in the entity "tick" either could be needed. +@@ -1355,4 +1355,27 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { + return !this.getHandle().level.noCollision(this.getHandle(), aabb); } - // Paper end + // Paper End - Collision API + + // Purpur start + @Override diff --git a/patches/server/0023-Alternative-Keepalive-Handling.patch b/patches/server/0023-Alternative-Keepalive-Handling.patch index 3dec3b693..791a297b7 100644 --- a/patches/server/0023-Alternative-Keepalive-Handling.patch +++ b/patches/server/0023-Alternative-Keepalive-Handling.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Alternative Keepalive Handling diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a67301f606e7f2b05559aed2ac88288dd40dd539..977da4e13d0f67179522da6964231773de9451e8 100644 +index 7da5e02745decd39c9ef220b84eb2f633cf44494..fe3a1669bb224bea7559adbf453e744962dfd1d3 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -258,6 +258,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @@ -38,7 +38,7 @@ index a67301f606e7f2b05559aed2ac88288dd40dd539..977da4e13d0f67179522da6964231773 if (this.keepAlivePending) { if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected ServerGamePacketListenerImpl.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); // more info -@@ -3599,6 +3615,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3600,6 +3616,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic @Override public void handleKeepAlive(ServerboundKeepAlivePacket packet) { diff --git a/patches/server/0079-Entity-lifespan.patch b/patches/server/0079-Entity-lifespan.patch index a03f1c58b..c5762c299 100644 --- a/patches/server/0079-Entity-lifespan.patch +++ b/patches/server/0079-Entity-lifespan.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Entity lifespan diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index e529b3f40f5388f3f20bde4e61be70ed2b018372..309240669b3e7116a7e1e52ddcffd4365e438c9c 100644 +index 6995bdfea267d64286b8549521df2e3ef8e8c562..999a6c65f9693d03ab7010f55e0b9eb42dd25206 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2942,6 +2942,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2943,6 +2943,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic } if (entity.distanceToSqr(this.player.getEyePosition()) < ServerGamePacketListenerImpl.MAX_INTERACTION_DISTANCE) { diff --git a/patches/server/0239-Signs-allow-color-codes.patch b/patches/server/0239-Signs-allow-color-codes.patch index 8a630d044..dcf01355e 100644 --- a/patches/server/0239-Signs-allow-color-codes.patch +++ b/patches/server/0239-Signs-allow-color-codes.patch @@ -17,10 +17,10 @@ index d042f2866a513263cc1b82df1cabe7fee81a1603..ab3744184ed4e761e58ea93099a3d6e9 this.connection.send(new ClientboundBlockUpdatePacket(this.level, sign.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos())); diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 2505557a4e0db77dd1d18bc78ecada154d59da0f..de6255d8c629e6ffc3963521f1021d0c72c3d0b1 100644 +index a727e98b5b5575e895579cb02b5e6c719ad24445..36e9129d4a63201e8dca9e94c9aaa09679144500 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3623,11 +3623,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -3624,11 +3624,17 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic for (int i = 0; i < signText.size(); ++i) { FilteredText filteredtext = (FilteredText) signText.get(i); diff --git a/patches/server/0276-Add-log-suppression-for-sent-expired-chat.patch b/patches/server/0276-Add-log-suppression-for-sent-expired-chat.patch index 7c6228dd5..4f2f18080 100644 --- a/patches/server/0276-Add-log-suppression-for-sent-expired-chat.patch +++ b/patches/server/0276-Add-log-suppression-for-sent-expired-chat.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add log suppression for sent expired chat diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index de6255d8c629e6ffc3963521f1021d0c72c3d0b1..42ab824643fe252761b1c83262effd2ba2cc7af0 100644 +index 36e9129d4a63201e8dca9e94c9aaa09679144500..433c8c86202619a0af8b03bfd6182f6a57b7a8ed 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2660,7 +2660,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2661,7 +2661,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic this.disconnect(Component.translatable("multiplayer.disconnect.unsigned_chat"), org.bukkit.event.player.PlayerKickEvent.Cause.UNSIGNED_CHAT); // Paper - kick event cause return false; } else { diff --git a/patches/server/0280-Option-to-disable-kick-for-out-of-order-chat.patch b/patches/server/0280-Option-to-disable-kick-for-out-of-order-chat.patch index da545a141..0d67ca786 100644 --- a/patches/server/0280-Option-to-disable-kick-for-out-of-order-chat.patch +++ b/patches/server/0280-Option-to-disable-kick-for-out-of-order-chat.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Option to disable kick for out of order chat diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 42ab824643fe252761b1c83262effd2ba2cc7af0..85a0a342f6c007280e62f2b0f3c932e665debd6f 100644 +index 433c8c86202619a0af8b03bfd6182f6a57b7a8ed..fcc032154baba11894ab381943f496f225bed464 100644 --- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2437,7 +2437,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic +@@ -2438,7 +2438,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic do { instant1 = (Instant) this.lastChatTimeStamp.get(); if (timestamp.isBefore(instant1)) { diff --git a/patches/server/0289-Remove-Timings.patch b/patches/server/0289-Remove-Timings.patch index e77e2d89e..357571daf 100644 --- a/patches/server/0289-Remove-Timings.patch +++ b/patches/server/0289-Remove-Timings.patch @@ -82,7 +82,7 @@ index 8bc0cb9ad5bb4e76d962ff54305e2c08e279a17b..e8efbbeece7e866c6c4d7489677d2d9e PacketUtils.LOGGER.debug("Ignoring packet due to disconnection: {}", packet); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 327ecc7a92671fbdb8e22e19ca30bb0f76a35a8c..d6b0477509ce4fc37f9e3388a014970ec5e04693 100644 +index 7b999456cc1a0808bcb5490deb334e848ce5f361..96255e81c232f9cbc3268127d4232bb9c2c73292 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1426,15 +1426,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop> positions, float followRange, int distance, float rangeMultiplier) { // readd the profiler code for sync