diff --git a/gradle.properties b/gradle.properties index a08e2296..1562f9b8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group = cn.dreeam.leaf mcVersion = 1.21 version = 1.21-R0.1-SNAPSHOT -galeCommit = 0cb487e2e577a1b56a4605a8d1abf84cba0da56a +galeCommit = d95dc9d8a01fabe3851dd697ca379526049605f6 org.gradle.caching = true org.gradle.parallel = true diff --git a/patches/server/0001-Rebrand.patch b/patches/server/0001-Rebrand.patch index 53055572..fd71a0e5 100644 --- a/patches/server/0001-Rebrand.patch +++ b/patches/server/0001-Rebrand.patch @@ -215,10 +215,10 @@ index 3d674eca7d20202d8f811c5c3e3946a12046028a..6fae3dedda0ce742e33040c7b85b5a59 } diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java -index 1647cf84bd8bb703967c6d4d8ac473291200c094..dfdbf7654db34487f7db2e568006642291b1c132 100644 +index 08fa6018bcab38d8c9ca05c84e229d69184ce01b..f9351c15c8c6e2f4cbd2af0a15bdd5e1a90cb262 100644 --- a/src/main/java/org/spigotmc/WatchdogThread.java +++ b/src/main/java/org/spigotmc/WatchdogThread.java -@@ -96,7 +96,7 @@ public class WatchdogThread extends io.papermc.paper.util.TickThread // Paper - +@@ -96,7 +96,7 @@ public class WatchdogThread extends ca.spottedleaf.moonrise.common.util.TickThre private WatchdogThread(long timeoutTime, boolean restart) { @@ -227,7 +227,7 @@ index 1647cf84bd8bb703967c6d4d8ac473291200c094..dfdbf7654db34487f7db2e5680066422 this.timeoutTime = timeoutTime; this.restart = restart; earlyWarningEvery = Math.min(io.papermc.paper.configuration.GlobalConfiguration.get().watchdog.earlyWarningEvery, timeoutTime); // Paper -@@ -160,15 +160,15 @@ public class WatchdogThread extends io.papermc.paper.util.TickThread // Paper - +@@ -160,15 +160,15 @@ public class WatchdogThread extends ca.spottedleaf.moonrise.common.util.TickThre We do not want people to report thread issues to Paper, but we do want people to report thread issues to Gale. */ @@ -246,7 +246,7 @@ index 1647cf84bd8bb703967c6d4d8ac473291200c094..dfdbf7654db34487f7db2e5680066422 // if ( net.minecraft.world.level.Level.lastPhysicsProblem != null ) { -@@ -195,13 +195,13 @@ public class WatchdogThread extends io.papermc.paper.util.TickThread // Paper - +@@ -195,13 +195,13 @@ public class WatchdogThread extends ca.spottedleaf.moonrise.common.util.TickThre We do not want people to report thread issues to Paper, but we do want people to report thread issues to Gale. */ @@ -262,7 +262,7 @@ index 1647cf84bd8bb703967c6d4d8ac473291200c094..dfdbf7654db34487f7db2e5680066422 ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler.dumpAllChunkLoadInfo(MinecraftServer.getServer(), isLongTimeout); // Paper - rewrite chunk system this.dumpTickingInfo(); // Paper - log detailed tick information WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log ); -@@ -222,7 +222,7 @@ public class WatchdogThread extends io.papermc.paper.util.TickThread // Paper - +@@ -222,7 +222,7 @@ public class WatchdogThread extends ca.spottedleaf.moonrise.common.util.TickThre We do not want people to report thread issues to Paper, but we do want people to report thread issues to Gale. */ diff --git a/patches/server/0004-Pufferfish-Utils.patch b/patches/server/0004-Pufferfish-Utils.patch index a25bf0da..1f0aacec 100644 --- a/patches/server/0004-Pufferfish-Utils.patch +++ b/patches/server/0004-Pufferfish-Utils.patch @@ -6,42 +6,6 @@ Subject: [PATCH] Pufferfish: Utils Original license: GPL v3 Original project: https://github.com/pufferfish-gg/Pufferfish -diff --git a/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java b/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java -index 41b9405d6759d865e0d14dd4f95163e9690e967d..091b1ae822e1c0517e59572e7a9bda11e998c0ee 100644 ---- a/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java -+++ b/src/main/java/com/destroystokyo/paper/util/misc/AreaMap.java -@@ -26,7 +26,7 @@ public abstract class AreaMap { - - // we use linked for better iteration. - // map of: coordinate to set of objects in coordinate -- protected final Long2ObjectOpenHashMap> areaMap = new Long2ObjectOpenHashMap<>(1024, 0.7f); -+ protected Long2ObjectOpenHashMap> areaMap = new Long2ObjectOpenHashMap<>(1024, 0.7f); // Pufferfish - not actually final - protected final PooledLinkedHashSets pooledHashSets; - - protected final ChangeCallback addCallback; -@@ -160,7 +160,8 @@ public abstract class AreaMap { - protected abstract PooledLinkedHashSets.PooledObjectLinkedOpenHashSet getEmptySetFor(final E object); - - // expensive op, only for debug -- protected void validate(final E object, final int viewDistance) { -+ protected void validate0(final E object, final int viewDistance) { // Pufferfish - rename this thing just in case it gets used I'd rather a compile time error. -+ if (true) throw new UnsupportedOperationException(); // Pufferfish - not going to put in the effort to fix this if it doesn't ever get used. - int entiesGot = 0; - int expectedEntries = (2 * viewDistance + 1); - expectedEntries *= expectedEntries; -diff --git a/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java b/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java -index 46954db7ecd35ac4018fdf476df7c8020d7ce6c8..1ad890a244bdf6df48a8db68cb43450e08c788a6 100644 ---- a/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java -+++ b/src/main/java/com/destroystokyo/paper/util/misc/PlayerAreaMap.java -@@ -5,7 +5,7 @@ import net.minecraft.server.level.ServerPlayer; - /** - * @author Spottedleaf - */ --public final class PlayerAreaMap extends AreaMap { -+public class PlayerAreaMap extends AreaMap { // Pufferfish - not actually final - - public PlayerAreaMap() { - super(); diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishLogger.java new file mode 100644 index 0000000000000000000000000000000000000000..53aab67aea0a28c004c6106aa775443c30457141 @@ -65,194 +29,3 @@ index 0000000000000000000000000000000000000000..53aab67aea0a28c004c6106aa775443c + setLevel(Level.ALL); + } +} -diff --git a/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java -new file mode 100644 -index 0000000000000000000000000000000000000000..a62d22dc4ae2cc82cf6763e8b0ce6d4611782a57 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java -@@ -0,0 +1,73 @@ -+package gg.pufferfish.pufferfish.util; -+ -+import com.google.common.collect.Queues; -+import gg.pufferfish.pufferfish.PufferfishLogger; -+ -+import java.util.Queue; -+import java.util.concurrent.locks.Condition; -+import java.util.concurrent.locks.Lock; -+import java.util.concurrent.locks.ReentrantLock; -+import java.util.logging.Level; -+ -+public class AsyncExecutor implements Runnable { -+ -+ private final Queue jobs = Queues.newArrayDeque(); -+ private final Lock mutex = new ReentrantLock(); -+ private final Condition cond = mutex.newCondition(); -+ private final Thread thread; -+ private volatile boolean killswitch = false; -+ -+ public AsyncExecutor(String threadName) { -+ this.thread = new Thread(this, threadName); -+ } -+ -+ public void start() { -+ thread.start(); -+ } -+ -+ public void kill() { -+ killswitch = true; -+ cond.signalAll(); -+ } -+ -+ public void submit(Runnable runnable) { -+ mutex.lock(); -+ try { -+ jobs.offer(runnable); -+ cond.signalAll(); -+ } finally { -+ mutex.unlock(); -+ } -+ } -+ -+ @Override -+ public void run() { -+ while (!killswitch) { -+ try { -+ Runnable runnable = takeRunnable(); -+ if (runnable != null) { -+ runnable.run(); -+ } -+ } catch (InterruptedException e) { -+ Thread.currentThread().interrupt(); -+ } catch (Exception e) { -+ PufferfishLogger.LOGGER.log(Level.SEVERE, e, () -> "Failed to execute async job for thread " + thread.getName()); -+ } -+ } -+ } -+ -+ private Runnable takeRunnable() throws InterruptedException { -+ mutex.lock(); -+ try { -+ while (jobs.isEmpty() && !killswitch) { -+ cond.await(); -+ } -+ -+ if (jobs.isEmpty()) return null; // We've set killswitch -+ -+ return jobs.remove(); -+ } finally { -+ mutex.unlock(); -+ } -+ } -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java b/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java -new file mode 100644 -index 0000000000000000000000000000000000000000..a9052e71b943b2bc4f07732fa1c3712518dcd3e7 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java -@@ -0,0 +1,32 @@ -+package gg.pufferfish.pufferfish.util; -+ -+import com.destroystokyo.paper.util.misc.PlayerAreaMap; -+import com.destroystokyo.paper.util.misc.PooledLinkedHashSets; -+ -+import java.util.concurrent.ConcurrentHashMap; -+ -+import net.minecraft.server.level.ServerPlayer; -+ -+public final class AsyncPlayerAreaMap extends PlayerAreaMap { -+ -+ public AsyncPlayerAreaMap() { -+ super(); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets) { -+ super(pooledHashSets); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, -+ final ChangeCallback removeCallback) { -+ this(pooledHashSets, addCallback, removeCallback, null); -+ } -+ -+ public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, -+ final ChangeCallback removeCallback, final ChangeSourceCallback changeSourceCallback) { -+ super(pooledHashSets, addCallback, removeCallback, changeSourceCallback); -+ this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); -+ } -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java b/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java -new file mode 100644 -index 0000000000000000000000000000000000000000..8b4a51ae41e99d41a1095333c2036efcc9a38973 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/util/IterableWrapper.java -@@ -0,0 +1,20 @@ -+package gg.pufferfish.pufferfish.util; -+ -+import java.util.Iterator; -+ -+import org.jetbrains.annotations.NotNull; -+ -+public class IterableWrapper implements Iterable { -+ -+ private final Iterator iterator; -+ -+ public IterableWrapper(Iterator iterator) { -+ this.iterator = iterator; -+ } -+ -+ @NotNull -+ @Override -+ public Iterator iterator() { -+ return iterator; -+ } -+} -diff --git a/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java b/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java -new file mode 100644 -index 0000000000000000000000000000000000000000..5578acce073cea8a60619e634b3862624c8a1ae8 ---- /dev/null -+++ b/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java -@@ -0,0 +1,42 @@ -+package gg.pufferfish.pufferfish.util; -+ -+import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -+ -+import java.util.Map; -+ -+import org.jetbrains.annotations.Nullable; -+ -+public class Long2ObjectOpenHashMapWrapper extends Long2ObjectOpenHashMap { -+ -+ private final Map backingMap; -+ -+ public Long2ObjectOpenHashMapWrapper(Map map) { -+ backingMap = map; -+ } -+ -+ @Override -+ public V put(Long key, V value) { -+ return backingMap.put(key, value); -+ } -+ -+ @Override -+ public V get(Object key) { -+ return backingMap.get(key); -+ } -+ -+ @Override -+ public V remove(Object key) { -+ return backingMap.remove(key); -+ } -+ -+ @Nullable -+ @Override -+ public V putIfAbsent(Long key, V value) { -+ return backingMap.putIfAbsent(key, value); -+ } -+ -+ @Override -+ public int size() { -+ return backingMap.size(); -+ } -+} diff --git a/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch b/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch index 35b78f8a..6282ec21 100644 --- a/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch +++ b/patches/server/0006-Pufferfish-Dynamic-Activation-of-Brain.patch @@ -32,10 +32,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 8bca5e1165e09e219386a787eb36fabcd948a0e6..3f787ea97480fa987cc1fc8d64268d46723fe1dd 100644 +index 7e94dcbf3adb8954800a6d577b39616638d673e8..4c95cb6a53004157faac55540225da3e4f8eb82b 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -725,6 +725,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -744,6 +744,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. org.spigotmc.ActivationRange.activateEntities(this); // Spigot this.timings.entityTick.startTiming(); // Spigot this.entityTickList.forEach((entity) -> { @@ -44,7 +44,7 @@ index 8bca5e1165e09e219386a787eb36fabcd948a0e6..3f787ea97480fa987cc1fc8d64268d46 if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed entity.discard(); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 092074acfc53d422b92efbe16e492c26f43db1f9..bdd61610c9f1c380a8e5e068a5ad85dea86c26b9 100644 +index ea0e44fa359f5fecbf1c3fc7fc5da62611e5565d..611cf8f85d479798858477dc5f657a567e32e04d 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -431,6 +431,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -118,7 +118,7 @@ index 758f62416ca9c02351348ac0d41deeb4624abc0e..69130969c9a434ec2361e573c9a1ec9f } } diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java -index 8ac1a3b86bf0eee6a27985d6b9dbc98b6fedbb15..95d20cd10ef0b3da32a6168c5d4a9bc4abc63e22 100644 +index 6fd5f65d8fb8830e000af6556c4009befa65b66f..6e01c7ba7720d6b08e4e98f59e0c086179e2ee0d 100644 --- a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java +++ b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java @@ -39,9 +39,13 @@ public class GoalSelector { diff --git a/patches/server/0009-Purpur-Server-Changes.patch b/patches/server/0009-Purpur-Server-Changes.patch index 0b500389..552582a1 100644 --- a/patches/server/0009-Purpur-Server-Changes.patch +++ b/patches/server/0009-Purpur-Server-Changes.patch @@ -149,10 +149,10 @@ index 0000000000000000000000000000000000000000..15a226e3854d731f7724025ea3459c8a + } +} diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -index 06455d65c4605ce092bf5300d432087f24186741..750fd2809f6d5d5896904cad0f65029b03bda849 100644 +index f7241c5292f1c012404eea11256813fbc2c2df1a..fad407d0cec0605e303e93a79752435f0b4646d7 100644 --- a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java +++ b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java -@@ -137,6 +137,10 @@ public class MobGoalHelper { +@@ -136,6 +136,10 @@ public class MobGoalHelper { static { // TODO these kinda should be checked on each release, in case obfuscation changes deobfuscationMap.put("abstract_skeleton_1", "abstract_skeleton_melee"); @@ -699,7 +699,7 @@ index d2ea951c7e5899d0e2edb52064e35c23965c4230..b929842514a97ca993ead608d355a4af Bootstrap.bootStrap(); Bootstrap.validate(); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 29c35af2dd3bbcc2527542d594316b9756c7c2a2..21d3c7cb818a5a61f5532b73f2b320665802ec0f 100644 +index 333beb88e048daaaf44e67984bb17d5201a9ab21..dd6e71ac7d02fc0ce8c904a59c3d8924e1c3ca09 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -289,6 +289,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - Add EntityMoveEvent net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers worldserver.updateLagCompensationTick(); // Paper - lag compensation @@ -1098,7 +1098,7 @@ index c80be65d190c85e7f0ea8233ebbbdbc1ea67f276..97e793c971614299504605aeb4f99cad public ServerEntity(ServerLevel worldserver, Entity entity, int i, boolean flag, Consumer> consumer, Set trackedPlayers) { this.trackedPlayers = trackedPlayers; diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0dc2bc6f6e 100644 +index 4c95cb6a53004157faac55540225da3e4f8eb82b..e3152dd90c5c58a8f40491fa3250f7e38c2eaa8b 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -220,6 +220,8 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. @@ -1118,7 +1118,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d public LevelChunk getChunkIfLoaded(int x, int z) { return this.chunkSource.getChunkAtIfLoadedImmediately(x, z); // Paper - Use getChunkIfLoadedImmediately -@@ -544,7 +547,24 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -563,7 +566,24 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. this.dragonParts = new Int2ObjectOpenHashMap(); this.tickTime = flag1; this.server = minecraftserver; @@ -1144,7 +1144,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d this.serverLevelData = iworlddataserver; ChunkGenerator chunkgenerator = worlddimension.generator(); // CraftBukkit start -@@ -615,6 +635,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -634,6 +654,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. this.chunkTaskScheduler = new ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler((ServerLevel)(Object)this, ca.spottedleaf.moonrise.common.util.MoonriseCommon.WORKER_POOL); // Paper end - rewrite chunk system this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit @@ -1152,7 +1152,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d } // Paper start -@@ -661,7 +682,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -680,7 +701,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); long j; @@ -1161,7 +1161,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d // CraftBukkit start j = this.levelData.getDayTime() + 24000L; TimeSkipEvent event = new TimeSkipEvent(this.getWorld(), TimeSkipEvent.SkipReason.NIGHT_SKIP, (j - j % 24000L) - this.getDayTime()); -@@ -783,6 +804,13 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -802,6 +823,13 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. this.serverLevelData.setGameTime(i); this.serverLevelData.getScheduledEvents().tick(this.server, i); if (this.levelData.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { @@ -1175,7 +1175,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d this.setDayTime(this.levelData.getDayTime() + 1L); } -@@ -791,8 +819,22 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -810,8 +838,22 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. public void setDayTime(long timeOfDay) { this.serverLevelData.setDayTime(timeOfDay); @@ -1198,7 +1198,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d public void tickCustomSpawners(boolean spawnMonsters, boolean spawnAnimals) { Iterator iterator = this.customSpawners.iterator(); -@@ -886,10 +928,18 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -905,10 +947,18 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. boolean flag1 = this.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && this.random.nextDouble() < (double) difficultydamagescaler.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01D) && !this.getBlockState(blockposition.below()).is(Blocks.LIGHTNING_ROD); // Paper - Configurable spawn chances for skeleton horses if (flag1) { @@ -1219,7 +1219,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d entityhorseskeleton.setAge(0); entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); this.addFreshEntity(entityhorseskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit -@@ -968,7 +1018,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -987,7 +1037,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. return holder.is(PoiTypes.LIGHTNING_ROD); }, (blockposition1) -> { return blockposition1.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, blockposition1.getX(), blockposition1.getZ()) - 1; @@ -1228,7 +1228,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d return optional.map((blockposition1) -> { return blockposition1.above(1); -@@ -1017,11 +1067,27 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1036,11 +1086,27 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. if (this.canSleepThroughNights()) { if (!this.getServer().isSingleplayer() || this.getServer().isPublished()) { int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); @@ -1257,7 +1257,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d ichatmutablecomponent = Component.translatable("sleep.players_sleeping", this.sleepStatus.amountSleeping(), this.sleepStatus.sleepersNeeded(i)); } -@@ -1161,6 +1227,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1180,6 +1246,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. @VisibleForTesting public void resetWeatherCycle() { // CraftBukkit start @@ -1265,7 +1265,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d this.serverLevelData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents // If we stop due to everyone sleeping we should reset the weather duration to some other random value. // Not that everyone ever manages to get the whole server to sleep at the same time.... -@@ -1168,6 +1235,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1187,6 +1254,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. this.serverLevelData.setRainTime(0); } // CraftBukkit end @@ -1273,7 +1273,7 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d this.serverLevelData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents // CraftBukkit start // If we stop due to everyone sleeping we should reset the weather duration to some other random value. -@@ -2606,7 +2674,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -2625,7 +2693,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. // Spigot Start if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message // Paper start - Fix merchant inventory not closing on entity removal @@ -1283,10 +1283,10 @@ index e6821a3a99eabfd6ea3d4f7fe98e25598c591f86..5c7fc68e5d1c33fd5151512582ba9a0d } // Paper end - Fix merchant inventory not closing on entity removal diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff866bf3f6 100644 +index a5ed3eef0f66a44a9ce1effff19dbde7c1caa4ab..c98389197ee11d4fb64625169f342f762287ee94 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -303,6 +303,10 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -302,6 +302,10 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple public com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent public @Nullable String clientBrandName = null; // Paper - Brand support public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event @@ -1297,7 +1297,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff // Paper start - rewrite chunk system private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; -@@ -602,6 +606,9 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -599,6 +603,9 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple }); } @@ -1307,7 +1307,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff } @Override -@@ -678,6 +685,9 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -675,6 +682,9 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple }); } @@ -1317,7 +1317,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff } // CraftBukkit start - World fallback code, either respawn location or global spawn -@@ -807,6 +817,15 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -804,6 +814,15 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple this.trackEnteredOrExitedLavaOnVehicle(); this.updatePlayerAttributes(); this.advancements.flushDirty(this); @@ -1333,7 +1333,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff } private void updatePlayerAttributes() { -@@ -1072,6 +1091,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -1069,6 +1088,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple })); PlayerTeam scoreboardteam = this.getTeam(); @@ -1341,7 +1341,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff if (scoreboardteam != null && scoreboardteam.getDeathMessageVisibility() != Team.Visibility.ALWAYS) { if (scoreboardteam.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) { this.server.getPlayerList().broadcastSystemToTeam(this, ichatbasecomponent); -@@ -1175,6 +1195,16 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -1172,6 +1192,16 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple if (this.isInvulnerableTo(source)) { return false; } else { @@ -1358,7 +1358,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff boolean flag = this.server.isDedicatedServer() && this.isPvpAllowed() && source.is(DamageTypeTags.IS_FALL); if (!flag && this.spawnInvulnerableTime > 0 && !source.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { -@@ -1402,6 +1432,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -1399,6 +1429,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple worldserver1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); // CraftBukkit end @@ -1366,7 +1366,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff this.setServerLevel(worldserver); this.connection.teleport(exit); // CraftBukkit - use internal teleport without event this.connection.resetPosition(); -@@ -1505,7 +1536,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -1502,7 +1533,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple return entitymonster.isPreventingPlayerRest(this); }); @@ -1375,7 +1375,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff return Either.left(net.minecraft.world.entity.player.Player.BedSleepingProblem.NOT_SAFE); } } -@@ -1545,7 +1576,19 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -1542,7 +1573,19 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple }); if (!this.serverLevel().canSleepThroughNights()) { @@ -1396,7 +1396,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff } ((ServerLevel) this.level()).updateSleepingPlayerList(); -@@ -1667,6 +1710,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -1664,6 +1707,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple @Override public void openTextEdit(SignBlockEntity sign, boolean front) { @@ -1404,7 +1404,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff this.connection.send(new ClientboundBlockUpdatePacket(this.level(), sign.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos(), front)); } -@@ -2003,6 +2047,26 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -2000,6 +2044,26 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -1431,7 +1431,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff @Override public void displayClientMessage(Component message, boolean overlay) { this.sendSystemMessage(message, overlay); -@@ -2343,8 +2407,68 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -2340,8 +2404,68 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); @@ -1500,7 +1500,7 @@ index 4a69885e173cebc8ab427e02145e1020282ea95d..5b645db318a73f352838d779e3be16ff public ServerStatsCounter getStats() { return this.stats; } -@@ -2948,4 +3072,50 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -2945,4 +3069,50 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple return (CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end @@ -2228,7 +2228,7 @@ index f43bf280999ff3860cc702def50cc62b131eb1bd..66d9e99a351f5fc6cf58be3bee4397d9 } diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 109106fb93dd2b05363a1d89d38a9ccf09ae5195..1ee16b9102aea1248f10a41b4bd4cddf5dc12928 100644 +index b22fe825a8556a9ec6cb645b67a4335a6cb7f54e..173f4f3b046bb2566e33b5dc93c3e6e459410a43 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -169,6 +169,7 @@ import org.bukkit.plugin.PluginManager; @@ -14495,7 +14495,7 @@ index d6e43a9b061a45c8e785ab93bafc8a9721fca7d0..8c79bbd7dde436915f1aeedef1b71379 // Paper start - collision optimisations diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 9da1b9e2afac5d6a82eeff66f685c032c19e0366..4a71075b673e2b9413d9797ddeeafc04d699ec5e 100644 +index 00b001e279ed1e79ad4171a5d2cedb2745ea946d..3cb6faa071c6a743a845bc358ea411a165c4024b 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -176,6 +176,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @@ -14580,7 +14580,7 @@ index 9da1b9e2afac5d6a82eeff66f685c032c19e0366..4a71075b673e2b9413d9797ddeeafc04 + // Purpur end } diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index 7e707fe1d800debf1eef8800fe98eb4e1dbd800b..d490429ddbb8cd82aeda5e03540075c9167b095e 100644 +index 2c992661d4864cf826464f840c9d13c09b26f86f..1da91797ddbaf2cee7124b3dbd0970acb1a23073 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -251,7 +251,7 @@ public final class NaturalSpawner { @@ -16975,7 +16975,7 @@ index 9d93130f23addb18b97d7f5ec013faef17a74529..29d2fb87a65778926aea2cfc7a5b486c + // Purpur end - OfflinePlayer API } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 25cccb9796004891df59c15970b3e1ba391d4073..d10c10907cefc06afff7e0f4c4cbbca352410c25 100644 +index b77455f84acc4b17087b2f973bf9c26cd62fb117..4878f26e9daf98858e45e14abb37b27b6f3f9c0a 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -414,6 +414,20 @@ public final class CraftServer implements Server { @@ -17115,7 +17115,7 @@ index 25cccb9796004891df59c15970b3e1ba391d4073..d10c10907cefc06afff7e0f4c4cbbca3 + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java -index f2aec38dc7a631e41983f2c21f93ee0b260058b0..ff62cfec3b15307b801e35666772be4b278e5252 100644 +index 1f354c6c09bc49e57a69db7cfa4f2a331dd02bdb..b251b057ec6e0bb90d140be8f4d24a6c20ae97bf 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -2338,6 +2338,48 @@ public class CraftWorld extends CraftRegionAccessor implements World { @@ -17545,7 +17545,7 @@ index 351f42842b780d053cd2e5bad9ae299449141b10..4860574e7fad7a9527dda599703c573c + // Purpur end } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index d01b45a48d412e3cb591acee101730704574448a..6a3b023b0f60dbb350943bdd7f0bfead9e8e3ce0 100644 +index 992437a6e838f653f32d33b5b3f702c484640a97..b9130d040acff1e5cb7a475be93b03cdbe229683 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -576,10 +576,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/0010-Fix-Pufferfish-and-Purpur-patches.patch b/patches/server/0010-Fix-Pufferfish-and-Purpur-patches.patch index 81d67241..6a8b8d78 100644 --- a/patches/server/0010-Fix-Pufferfish-and-Purpur-patches.patch +++ b/patches/server/0010-Fix-Pufferfish-and-Purpur-patches.patch @@ -27,7 +27,7 @@ index e94224ed280247ee69dfdff8dc960f2b8729be33..5b9725a9a81c0850dc2809c150529e5f for (Component component : formatProviders(spigotPlugins, sender)) { // Purpur diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 21d3c7cb818a5a61f5532b73f2b320665802ec0f..ab1ac64066f43a3c14f788760c12fc964a3cc60f 100644 +index dd6e71ac7d02fc0ce8c904a59c3d8924e1c3ca09..ddff5713a30d96e0b6876371f5936aa9b8ccf339 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -300,7 +300,7 @@ 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 + Thread thread = new ca.spottedleaf.moonrise.common.util.TickThread(() -> { // Paper - rewrite chunk system @@ -1030,6 +1032,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { entityplayer.connection.suspendFlushing(); }); @@ -984,7 +981,7 @@ index e955f760abd27abb22cfd3b3c9627207a522300c..30f63049b254dd87df7d6bbb2415eb53 // Paper start - Folia scheduler API ((io.papermc.paper.threadedregions.scheduler.FoliaGlobalRegionScheduler) Bukkit.getGlobalRegionScheduler()).tick(); getAllLevels().forEach(level -> { -@@ -1751,20 +1739,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop list = Lists.newArrayList(); List list1 = this.level.players(); ObjectIterator objectiterator = this.entityMap.values().iterator(); @@ -1117,7 +1114,7 @@ index 3af290825bbbc461354c6d76b61a0ebf8c8a3ee7..138bb26241ce67d1dd8447a7f1c737ba ChunkMap.TrackedEntity playerchunkmap_entitytracker; -@@ -1010,17 +1008,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider +@@ -977,17 +975,14 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider playerchunkmap_entitytracker.serverEntity.sendChanges(); } } @@ -1136,10 +1133,10 @@ index 3af290825bbbc461354c6d76b61a0ebf8c8a3ee7..138bb26241ce67d1dd8447a7f1c737ba } diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -index 015780e88997cc0518e5626b3094770a41669fd8..6324bb513d0d7a42f1a411cb6deb4814bf36975f 100644 +index 5f976c5aac125cfa802c4141b9ea07a204bb30f6..1f7906d2c5fbe6d732d773cbd0f36d28163f3a13 100644 --- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java +++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java -@@ -356,9 +356,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -355,9 +355,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon public void save(boolean flush) { // Paper - rewrite chunk system @@ -1149,7 +1146,7 @@ index 015780e88997cc0518e5626b3094770a41669fd8..6324bb513d0d7a42f1a411cb6deb4814 } @Override -@@ -389,24 +387,18 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -388,24 +386,18 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon @Override public void tick(BooleanSupplier shouldKeepTicking, boolean tickChunks) { @@ -1174,15 +1171,15 @@ index 015780e88997cc0518e5626b3094770a41669fd8..6324bb513d0d7a42f1a411cb6deb4814 this.clearCache(); } -@@ -419,7 +411,6 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon - if (!this.level.isDebug()) { - List list = Lists.newArrayListWithCapacity(this.chunkMap.size()); - Iterator iterator = this.chunkMap.getChunks().iterator(); +@@ -436,7 +428,6 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + } + // Paper end - chunk tick iteration optimisations + Iterator iterator = null; // Paper - chunk tick iteration optimisations - if (this.level.getServer().tickRateManager().runsNormally()) this.level.timings.chunkTicks.startTiming(); // Paper - while (iterator.hasNext()) { - ChunkHolder playerchunk = (ChunkHolder) iterator.next(); -@@ -437,7 +428,6 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + // Paper - chunk tick iteration optimisations + +@@ -447,7 +438,6 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon boolean flagAndHasNaturalSpawn = flag && this.anySpawnCategoryIsSpawnedThisTick(); if (flagAndHasNaturalSpawn) { // Gale end - MultiPaper - skip unnecessary mob spawning computations @@ -1190,7 +1187,7 @@ index 015780e88997cc0518e5626b3094770a41669fd8..6324bb513d0d7a42f1a411cb6deb4814 int k = this.distanceManager.getNaturalSpawnChunkCount(); // Paper start - Optional per player mob spawns int naturalSpawnChunkCount = k; -@@ -461,7 +451,6 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -471,7 +461,6 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon spawnercreature_d = NaturalSpawner.createState(naturalSpawnChunkCount, this.level.getAllEntities(), this::getFullChunk, !this.level.paperConfig().entities.spawning.perPlayerMobSpawns ? new LocalMobCapCalculator(this.chunkMap) : null, false); } // Paper end - Optional per player mob spawns @@ -1198,7 +1195,7 @@ index 015780e88997cc0518e5626b3094770a41669fd8..6324bb513d0d7a42f1a411cb6deb4814 this.lastSpawnState = spawnercreature_d; // Gale start - MultiPaper - skip unnecessary mob spawning computations -@@ -506,19 +495,14 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon +@@ -516,17 +505,13 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } } } @@ -1211,15 +1208,21 @@ index 015780e88997cc0518e5626b3094770a41669fd8..6324bb513d0d7a42f1a411cb6deb4814 } } - list.forEach((chunkproviderserver_a1) -> { -- this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing - chunkproviderserver_a1.holder.broadcastChanges(chunkproviderserver_a1.chunk); -- this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing - }); + // Paper start - chunk tick iteration optimisations +- this.level.timings.broadcastChunkUpdates.startTiming(); // Paper - timing + { + final it.unimi.dsi.fastutil.objects.ObjectArrayList chunks = (it.unimi.dsi.fastutil.objects.ObjectArrayList)list; + final ServerChunkCache.ChunkAndHolder[] raw = chunks.elements(); +@@ -540,7 +525,6 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon + holder.holder().broadcastChanges(holder.chunk()); + } + } +- this.level.timings.broadcastChunkUpdates.stopTiming(); // Paper - timing + // Paper end - chunk tick iteration optimisations } } diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b952667443932 100644 +index ac323393d7fe0b77bafb0728b7eb545930136e6e..b97f3ec10552941892b2b6edd53a873eaf72df86 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -1,7 +1,6 @@ @@ -1230,7 +1233,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 import com.google.common.collect.Lists; import com.mojang.datafixers.DataFixer; import com.mojang.datafixers.util.Pair; -@@ -707,27 +706,19 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -726,27 +725,19 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. this.tickTime(); } @@ -1258,7 +1261,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 } this.handlingTick = false; -@@ -738,13 +729,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -757,13 +748,11 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. } if (flag1 || this.emptyTime++ < 300) { @@ -1272,7 +1275,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 this.entityTickList.forEach((entity) -> { entity.activatedPriorityReset = false; // Pufferfish - DAB if (!entity.isRemoved()) { -@@ -781,8 +770,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -800,8 +789,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. } } }); @@ -1281,7 +1284,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 this.tickBlockEntities(); } -@@ -964,12 +951,9 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -983,12 +970,9 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. } } // Paper - Option to disable ice and snow @@ -1294,7 +1297,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 } @VisibleForTesting -@@ -1298,31 +1282,21 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1317,31 +1301,21 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. currentlyTickingEntity.lazySet(entity); } // Paper end - log detailed entity tick information @@ -1326,7 +1329,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 Iterator iterator = entity.getPassengers().iterator(); while (iterator.hasNext()) { -@@ -1330,7 +1304,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1349,7 +1323,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. this.tickPassenger(entity, entity1); } @@ -1334,7 +1337,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 // Paper start - log detailed entity tick information } finally { if (currentlyTickingEntity.get() == entity) { -@@ -1345,9 +1318,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1364,9 +1337,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. if (passenger instanceof Player || this.entityTickList.contains(passenger)) { // Paper - EAR 2 final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger); @@ -1344,7 +1347,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 passenger.setOldPosAndRot(); ++passenger.tickCount; -@@ -1369,8 +1339,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1388,8 +1358,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. this.tickPassenger(passenger, entity2); } @@ -1353,7 +1356,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 } } else { passenger.stopRiding(); -@@ -1390,7 +1358,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1409,7 +1377,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); } @@ -1361,7 +1364,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 if (doFull) { this.saveLevelData(true); } -@@ -1407,7 +1374,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1426,7 +1393,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData()); } // CraftBukkit end @@ -1369,7 +1372,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 } // Paper end - Incremental chunk and player saving -@@ -1421,7 +1387,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1440,7 +1406,6 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. if (!savingDisabled) { org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(this.getWorld())); // CraftBukkit @@ -1377,7 +1380,7 @@ index c4ad1054ab6334ea33533396ed33e10b214c8721..6b6a01ae372d88aee2853d96203b9526 if (progressListener != null) { progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel")); } -@@ -1431,10 +1396,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1450,10 +1415,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. progressListener.progressStage(Component.translatable("menu.savingChunks")); } @@ -1556,7 +1559,7 @@ index 85b4b24361e785acf75571ff98f924c00ae80748..ac67dd7a30616fe70f73426e332972b7 } diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 4a71075b673e2b9413d9797ddeeafc04d699ec5e..fd23063ef316d6f1930a565c601bdf5b72bcfda1 100644 +index 3cb6faa071c6a743a845bc358ea411a165c4024b..24ed26286c7e3e45279b6b27cd0a432b37fda4b2 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -177,7 +177,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl @@ -1602,7 +1605,7 @@ index 4a71075b673e2b9413d9797ddeeafc04d699ec5e..fd23063ef316d6f1930a565c601bdf5b } diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java -index d490429ddbb8cd82aeda5e03540075c9167b095e..d556089907bb695a9d87df1961ef0b0ae4382cad 100644 +index 1da91797ddbaf2cee7124b3dbd0970acb1a23073..e33b39d369386d677cc15247846790b498e37a82 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -127,7 +127,6 @@ public final class NaturalSpawner { @@ -1660,10 +1663,10 @@ index cd0e43f4c53a746dd6183a8406269f9b11ad3571..54657ac895fb2fa9c58910d5421f0082 private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry(); public CraftPersistentDataContainer persistentDataContainer; diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -index b07763aa7b3b92e24891b4ba346334ba8984ed67..db16be7db9d1df323f150dfd6f3d893b79d79838 100644 +index 36540053590c30a902b9986dcf2e74375157822d..fb0ffd302ec87516cd7f28b8b4c6a8e9b1577157 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java -@@ -644,7 +644,6 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -655,7 +655,6 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel)this.level).moonrise$getChunkTaskScheduler().chunkHolderManager.getChunkHolder(this.locX, this.locZ).getEntityChunk().callEntitiesLoadEvent(); // Paper - rewrite chunk system if (this.needsDecoration) { @@ -1671,7 +1674,7 @@ index b07763aa7b3b92e24891b4ba346334ba8984ed67..db16be7db9d1df323f150dfd6f3d893b this.needsDecoration = false; java.util.Random random = new java.util.Random(); random.setSeed(this.level.getSeed()); -@@ -664,7 +663,6 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -675,7 +674,6 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p } } server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(bukkitChunk)); @@ -1679,7 +1682,7 @@ index b07763aa7b3b92e24891b4ba346334ba8984ed67..db16be7db9d1df323f150dfd6f3d893b } } } -@@ -1001,7 +999,6 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -1012,7 +1010,6 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p if (LevelChunk.this.isTicking(blockposition)) { try { @@ -1687,7 +1690,7 @@ index b07763aa7b3b92e24891b4ba346334ba8984ed67..db16be7db9d1df323f150dfd6f3d893b BlockState iblockdata = LevelChunk.this.getBlockState(blockposition); if (this.blockEntity.getType().isValid(iblockdata)) { -@@ -1024,14 +1021,9 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p +@@ -1035,14 +1032,9 @@ public class LevelChunk extends ChunkAccess implements ca.spottedleaf.moonrise.p net.minecraft.world.level.chunk.LevelChunk.this.level.getCraftServer().getPluginManager().callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerInternalException(msg, throwable))); // Paper - ServerExceptionEvent LevelChunk.this.removeBlockEntity(this.getPos()); // Paper end - Prevent block entity and entity crashes @@ -1703,7 +1706,7 @@ index b07763aa7b3b92e24891b4ba346334ba8984ed67..db16be7db9d1df323f150dfd6f3d893b @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index d10c10907cefc06afff7e0f4c4cbbca352410c25..ec341e053e8eb539d4401161245039c90609138c 100644 +index 4878f26e9daf98858e45e14abb37b27b6f3f9c0a..6cd292c92486a807ab651f784171793d763e43d4 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -477,7 +477,6 @@ public final class CraftServer implements Server { @@ -1714,6 +1717,17 @@ index d10c10907cefc06afff7e0f4c4cbbca352410c25..ec341e053e8eb539d4401161245039c9 this.overrideSpawnLimits(); console.autosavePeriod = this.configuration.getInt("ticks-per.autosave"); this.warningState = WarningState.value(this.configuration.getString("settings.deprecated-verbose")); +@@ -1024,10 +1023,8 @@ public final class CraftServer implements Server { + commands.performCommand(results, commandLine, commandLine, true); + } catch (CommandException ex) { + this.pluginManager.callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerCommandException(ex, target, sender, args))); // Paper +- //target.timings.stopTiming(); // Spigot // Paper + throw ex; + } catch (Throwable ex) { +- //target.timings.stopTiming(); // Spigot // Paper + String msg = "Unhandled exception executing '" + commandLine + "' in " + target; + this.pluginManager.callEvent(new com.destroystokyo.paper.event.server.ServerExceptionEvent(new com.destroystokyo.paper.exception.ServerCommandException(ex, target, sender, args))); // Paper + throw new CommandException(msg, ex); diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java index 006adb2adb27c497ede69f87e78bc3e34499cbf8..4ee1c3461d21feab3a54e76a7c2ab80b6ea2ab38 100644 --- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java diff --git a/patches/server/0026-Slice-Smooth-Teleports.patch b/patches/server/0026-Slice-Smooth-Teleports.patch index 2232ba1c..0904a771 100644 --- a/patches/server/0026-Slice-Smooth-Teleports.patch +++ b/patches/server/0026-Slice-Smooth-Teleports.patch @@ -7,10 +7,10 @@ Original license: MIT Original project: https://github.com/Cryptite/Slice diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 5b645db318a73f352838d779e3be16ff866bf3f6..000ee5bf7ef715511e4232d757e8360037bfe8f4 100644 +index c98389197ee11d4fb64625169f342f762287ee94..55c3e652be4d45c2c36c3b2dcef931b63270718b 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -307,6 +307,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -306,6 +306,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple private boolean tpsBar = false; // Purpur private boolean compassBar = false; // Purpur private boolean ramBar = false; // Purpur @@ -36,7 +36,7 @@ index d34e31c6f7591bfdd34a6f2fe9376a515f20c3b7..442b5ccc446d0dfc69f2d2e88003a776 entityplayer1.connection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); entityplayer1.connection.send(new ClientboundSetExperiencePacket(entityplayer1.experienceProgress, entityplayer1.totalExperience, entityplayer1.experienceLevel)); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index ee1d4d83b856b9a7eba28a6f72256bb5dc33b67b..9325d2c676899fcedc360ea9183339c91af026dc 100644 +index 6b285e068cc789fd49a8c0f22ebd98378b6dd86b..39cb0c26e1d7e246a5867ea0915dc87c43777cfe 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1361,6 +1361,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { diff --git a/patches/server/0029-Leaves-Protocol-Core.patch b/patches/server/0029-Leaves-Protocol-Core.patch index a12c36f4..e517c798 100644 --- a/patches/server/0029-Leaves-Protocol-Core.patch +++ b/patches/server/0029-Leaves-Protocol-Core.patch @@ -51,10 +51,10 @@ index 1967c43ee3a12e63365cc40ee6565307e2fd73cf..6e376d0db5321d8e9b6e0b54617ffd17 assert isValidPath(path); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 30f63049b254dd87df7d6bbb2415eb53503e05a5..e43250317c9373709ab5b7ba26bb85c75021604e 100644 +index 3a4aed08dbf8055cf0861bf3961706eb0de6e85d..7bb592292222c58f28545434981bc5743ddf5a49 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1803,6 +1803,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); -@@ -1726,6 +1727,18 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { for (final Entity entity : level.moonrise$getEntityLookup().getAllCopy()) { // Paper - rewrite chunk system if (entity.isRemoved()) { -@@ -1737,6 +1750,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 ? split[0] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListPrefix, ""); String suffix = (split.length > 1 ? split[1] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListSuffix, ""); if (afk) { diff --git a/patches/server/0080-Fix-MC-119417.patch b/patches/server/0080-Fix-MC-119417.patch index 73b9224c..df877b08 100644 --- a/patches/server/0080-Fix-MC-119417.patch +++ b/patches/server/0080-Fix-MC-119417.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Fix-MC-119417 Related MC issue: https://bugs.mojang.com/browse/MC-119417 diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index f02c1d7c583c326401ae93d16dbdd2bc075670c8..40f316214111365df3e15e72da77bcd6155964d0 100644 +index ca5e8d86ca046a63462362330960501e82bb98ae..dc14cd61df226675d6c0d8e6d6ac387c0c07c80c 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java -@@ -2259,6 +2259,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple +@@ -2256,6 +2256,7 @@ public class ServerPlayer extends net.minecraft.world.entity.player.Player imple this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, (float) gameMode.getId())); if (gameMode == GameType.SPECTATOR) { this.removeEntitiesOnShoulder(); diff --git a/scripts/upstreamCommit.sh b/scripts/upstreamCommit.sh index 965d5624..d6b89fce 100644 --- a/scripts/upstreamCommit.sh +++ b/scripts/upstreamCommit.sh @@ -58,8 +58,7 @@ logsuffix="" # Paper updates if [ -n "$paperHash" ]; then - newHash=$(git diff gradle.properties | awk '/^+paperCommit =/{print $NF}') - paper=$(getCommits "PaperMC/Paper" "$paperHash" $(echo $newHash | grep . -q && echo $newHash || echo "HEAD")) + paper=$(getCommits "PaperMC/Paper" "$paperHash" "HEAD") # Updates found if [ -n "$paper" ]; then @@ -70,7 +69,8 @@ fi # Gale updates if [ -n "$galeHash" ]; then - gale=$(getCommits "Dreeam-qwq/Gale" "$galeHash" "HEAD") + newHash=$(git diff gradle.properties | awk '/^+galeCommit =/{print $NF}') + gale=$(getCommits "Dreeam-qwq/Gale" "$galeHash" $(echo $newHash | grep . -q && echo $newHash || echo "HEAD")) # Updates found if [ -n "$gale" ]; then