diff --git a/divinemc-api/build.gradle.kts.patch b/divinemc-api/build.gradle.kts.patch index 0ae12de..4432cf6 100644 --- a/divinemc-api/build.gradle.kts.patch +++ b/divinemc-api/build.gradle.kts.patch @@ -124,7 +124,7 @@ @@ -199,7 +_,7 @@ "https://jd.advntr.dev/text-logger-slf4j/$adventureVersion/", "https://javadoc.io/doc/org.slf4j/slf4j-api/$slf4jVersion/", - // "https://logging.apache.org/log4j/2.x/javadoc/log4j-api/", // TODO: Broken + "https://logging.apache.org/log4j/2.x/javadoc/log4j-api/", - "https://javadoc.io/doc/org.apache.maven.resolver/maven-resolver-api/1.7.3", + "https://javadoc.io/doc/org.apache.maven.resolver/maven-resolver-api/1.9.22", // DivineMC - Bump dependencies ) diff --git a/divinemc-server/build.gradle.kts.patch b/divinemc-server/build.gradle.kts.patch index 7d6392a..5409ee3 100644 --- a/divinemc-server/build.gradle.kts.patch +++ b/divinemc-server/build.gradle.kts.patch @@ -1,6 +1,6 @@ --- a/purpur-server/build.gradle.kts +++ b/purpur-server/build.gradle.kts -@@ -14,6 +_,7 @@ +@@ -16,6 +_,7 @@ } val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/" @@ -8,7 +8,7 @@ dependencies { mache("io.papermc:mache:1.21.6+build.1") -@@ -27,6 +_,7 @@ +@@ -29,6 +_,7 @@ // Purpur start - Rebrand val purpur = forks.register("purpur") { @@ -16,7 +16,7 @@ upstream.patchDir("paperServer") { upstreamPath = "paper-server" excludes = setOf("src/minecraft", "patches", "build.gradle.kts") -@@ -34,9 +_,27 @@ +@@ -36,9 +_,27 @@ outputDir = rootDirectory.dir("paper-server") } } @@ -43,9 +43,9 @@ + // DivineMC end - Rebrand + spigot { - enabled = false - buildDataRef = "702e1a0a5072b2c4082371d5228cb30525687efc" -@@ -60,6 +_,7 @@ + enabled = true + buildDataRef = "281ac0de7a76d808753ede97d11b034bc801b63d" +@@ -62,6 +_,7 @@ libraryRepositories.addAll( "https://repo.maven.apache.org/maven2/", paperMavenPublicUrl, @@ -53,7 +53,7 @@ ) } -@@ -123,10 +_,18 @@ +@@ -125,10 +_,18 @@ main { java { srcDir("../paper-server/src/main/java") } resources { srcDir("../paper-server/src/main/resources") } @@ -72,7 +72,7 @@ } } val log4jPlugins = sourceSets.create("log4jPlugins") { -@@ -154,10 +_,23 @@ +@@ -156,10 +_,23 @@ } dependencies { @@ -99,7 +99,7 @@ implementation("net.minecrell:terminalconsoleappender:1.3.0") implementation("net.kyori:adventure-text-serializer-ansi:4.21.0") // Keep in sync with adventureVersion from Paper-API build file runtimeConfiguration(sourceSets.main.map { it.runtimeClasspath }) -@@ -168,16 +_,16 @@ +@@ -170,16 +_,16 @@ all its classes to check if they are plugins. Scanning takes about 1-2 seconds so adding this speeds up the server start. */ @@ -120,7 +120,7 @@ implementation("org.ow2.asm:asm-commons:9.8") implementation("org.spongepowered:configurate-yaml:4.2.0-20250225.064233-199") implementation("org.spongepowered:configurate-core:4.2.0-20250225.064233-204") // Pinned dependency of above pinned yaml snapshot. -@@ -189,24 +_,31 @@ +@@ -191,24 +_,31 @@ // Deps that were previously in the API but have now been moved here for backwards compat, eventually to be removed runtimeOnly("commons-lang:commons-lang:2.6") runtimeOnly("org.xerial:sqlite-jdbc:3.49.1.0") @@ -160,7 +160,7 @@ implementation("net.neoforged:srgutils:1.0.9") // Mappings handling implementation("net.neoforged:AutoRenamingTool:2.0.3") // Remap plugins -@@ -222,30 +_,42 @@ +@@ -224,30 +_,42 @@ implementation("me.lucko:spark-paper:1.10.133-20250413.112336-1") } diff --git a/divinemc-server/minecraft-patches/features/0001-Rebrand.patch b/divinemc-server/minecraft-patches/features/0001-Rebrand.patch index 7bd38da..2920eff 100644 --- a/divinemc-server/minecraft-patches/features/0001-Rebrand.patch +++ b/divinemc-server/minecraft-patches/features/0001-Rebrand.patch @@ -18,10 +18,10 @@ index 394443d00e661715439be1e56dddc129947699a4..480ad57a6b7b74e6b83e9c6ceb69ea1f public CrashReport(String title, Throwable exception) { io.papermc.paper.util.StacktraceDeobfuscator.INSTANCE.deobfuscateThrowable(exception); // Paper diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index fb4301ccd4fb3643e19c477293946f536b0f7741..e26a053c598c33fd32b305235284ef6600a59752 100644 +index ac0ed2e7261a0d698fafd5b314108ff38a169073..8f32168ff0371a9168bbf9b08b2154200f8131a0 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1182,6 +1182,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop parseResults, String command, String label, boolean throwCommandError) { +@@ -357,7 +354,6 @@ public class Commands { + org.spigotmc.AsyncCatcher.catchOp("Cannot perform command async"); // Paper end CommandSourceStack commandSourceStack = parseResults.getContext().getSource(); - Profiler.get().push(() -> "/" + command); - ContextChain contextChain = this.finishParsing(parseResults, command, commandSourceStack, label); // CraftBukkit // Paper - Add UnknownCommandEvent + ContextChain contextChain = finishParsing(parseResults, command, commandSourceStack); try { -@@ -428,8 +424,6 @@ public class Commands { +@@ -393,8 +389,6 @@ public class Commands { commandSourceStack.sendFailure(Component.literal(Util.describeError(var12))); LOGGER.error("'/{}' threw an exception", command, var12); } @@ -49,7 +49,7 @@ index 75d167649749d0aa48eca87bcf478a4476bb4a6b..2b4345d16e8e5e903afb723dc41f5496 } } -@@ -486,7 +480,7 @@ public class Commands { +@@ -451,7 +445,7 @@ public class Commands { int max = Math.max(1, server.getGameRules().getInt(GameRules.RULE_MAX_COMMAND_CHAIN_LENGTH)); int _int = server.getGameRules().getInt(GameRules.RULE_MAX_COMMAND_FORK_COUNT); @@ -213,7 +213,7 @@ index 18071dcc69cc28471dddb7de94e803ec1e5fc2e4..aa25f5ebaf7d1b22825b962b02dcae02 } } diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index e26a053c598c33fd32b305235284ef6600a59752..ba5cb47347da6a0bc69b8f6924baac52f60375b8 100644 +index 8f32168ff0371a9168bbf9b08b2154200f8131a0..0912b009598876d6c16f7adcd80762074ea66f5a 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -114,19 +114,8 @@ import net.minecraft.util.TimeUtil; @@ -250,7 +250,7 @@ index e26a053c598c33fd32b305235284ef6600a59752..ba5cb47347da6a0bc69b8f6924baac52 private ServerConnectionListener connection; public final ChunkProgressListenerFactory progressListenerFactory; @Nullable -@@ -999,9 +981,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0 && this.tickCount % autosavePeriod == 0; try { this.isSaving = true; -@@ -1598,10 +1562,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop serverPlayer1.connection.suspendFlushing()); this.server.getScheduler().mainThreadHeartbeat(); // CraftBukkit // Paper start - Folia scheduler API -@@ -1716,9 +1672,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Purpur - Ridables @@ -429,7 +429,7 @@ index e26a053c598c33fd32b305235284ef6600a59752..ba5cb47347da6a0bc69b8f6924baac52 try { serverLevel.tick(hasTimeLeft); } catch (Throwable var7) { -@@ -1773,34 +1722,24 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop list = this.calculateExplodedPositions(); this.hurtEntities(); if (this.interactsWithBlocks()) { diff --git a/divinemc-server/minecraft-patches/features/0007-Multithreaded-Tracker.patch b/divinemc-server/minecraft-patches/features/0007-Multithreaded-Tracker.patch index ad17590..a24e956 100644 --- a/divinemc-server/minecraft-patches/features/0007-Multithreaded-Tracker.patch +++ b/divinemc-server/minecraft-patches/features/0007-Multithreaded-Tracker.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Multithreaded Tracker diff --git a/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java b/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java -index f3bac0906d8a1c5dea7b0dee13c5cd6fdbbcae49..c2c52fa8cd05a1b3487976cced210352a9026980 100644 +index bdc1200ef5317fdaf58973bf580b0a672aee800f..dc2b3ccf7810731c0e2c90e5a476c1c8203a1fb7 100644 --- a/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java +++ b/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java -@@ -340,7 +340,11 @@ public final class RegionizedPlayerChunkLoader { +@@ -344,7 +344,11 @@ public final class RegionizedPlayerChunkLoader { private boolean canGenerateChunks = true; private final ArrayDeque> delayedTicketOps = new ArrayDeque<>(); diff --git a/divinemc-server/minecraft-patches/features/0010-Chunk-System-Optimizations.patch b/divinemc-server/minecraft-patches/features/0010-Chunk-System-Optimizations.patch index e32f28f..1890541 100644 --- a/divinemc-server/minecraft-patches/features/0010-Chunk-System-Optimizations.patch +++ b/divinemc-server/minecraft-patches/features/0010-Chunk-System-Optimizations.patch @@ -104,10 +104,10 @@ index b2bcfb3557a0326fd7ec1059f95d6da4568dfd80..6bb36686ae7ca9f4bf763baa89408614 } diff --git a/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java b/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java -index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a51108f2c 100644 +index dc2b3ccf7810731c0e2c90e5a476c1c8203a1fb7..5cb896334f9916b030ee523119946d3b40585fc3 100644 --- a/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java +++ b/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java -@@ -187,13 +187,13 @@ public final class RegionizedPlayerChunkLoader { +@@ -191,13 +191,13 @@ public final class RegionizedPlayerChunkLoader { } if (((ChunkSystemServerPlayer)player).moonrise$getChunkLoader() != null) { @@ -123,7 +123,7 @@ index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a } public void updatePlayer(final ServerPlayer player) { -@@ -304,7 +304,7 @@ public final class RegionizedPlayerChunkLoader { +@@ -308,7 +308,7 @@ public final class RegionizedPlayerChunkLoader { long currTime = System.nanoTime(); for (final ServerPlayer player : new java.util.ArrayList<>(this.world.players())) { final PlayerChunkLoaderData loader = ((ChunkSystemServerPlayer)player).moonrise$getChunkLoader(); @@ -132,7 +132,7 @@ index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a // not our problem anymore continue; } -@@ -323,6 +323,7 @@ public final class RegionizedPlayerChunkLoader { +@@ -327,6 +327,7 @@ public final class RegionizedPlayerChunkLoader { private final ServerPlayer player; private final ServerLevel world; @@ -140,7 +140,7 @@ index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a private int lastChunkX = Integer.MIN_VALUE; private int lastChunkZ = Integer.MIN_VALUE; -@@ -382,10 +383,19 @@ public final class RegionizedPlayerChunkLoader { +@@ -386,10 +387,19 @@ public final class RegionizedPlayerChunkLoader { final int centerX = PlayerChunkLoaderData.this.lastChunkX; final int centerZ = PlayerChunkLoaderData.this.lastChunkZ; @@ -164,7 +164,7 @@ index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a }; private final LongHeapPriorityQueue sendQueue = new LongHeapPriorityQueue(CLOSEST_MANHATTAN_DIST); private final LongHeapPriorityQueue tickingQueue = new LongHeapPriorityQueue(CLOSEST_MANHATTAN_DIST); -@@ -853,6 +863,7 @@ public final class RegionizedPlayerChunkLoader { +@@ -857,6 +867,7 @@ public final class RegionizedPlayerChunkLoader { } void add() { @@ -172,7 +172,7 @@ index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a TickThread.ensureTickThread(this.player, "Cannot add player asynchronously"); if (this.removed) { throw new IllegalStateException("Adding removed player chunk loader"); -@@ -892,6 +903,7 @@ public final class RegionizedPlayerChunkLoader { +@@ -896,6 +907,7 @@ public final class RegionizedPlayerChunkLoader { // now we can update this.update(); @@ -180,7 +180,7 @@ index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a } private boolean isLoadedChunkGeneratable(final int chunkX, final int chunkZ) { -@@ -1060,6 +1072,7 @@ public final class RegionizedPlayerChunkLoader { +@@ -1064,6 +1076,7 @@ public final class RegionizedPlayerChunkLoader { } void remove() { @@ -188,7 +188,7 @@ index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a TickThread.ensureTickThread(this.player, "Cannot add player asynchronously"); if (this.removed) { throw new IllegalStateException("Removing removed player chunk loader"); -@@ -1087,7 +1100,7 @@ public final class RegionizedPlayerChunkLoader { +@@ -1091,7 +1104,7 @@ public final class RegionizedPlayerChunkLoader { } public LongOpenHashSet getSentChunksRaw() { @@ -198,10 +198,10 @@ index c2c52fa8cd05a1b3487976cced210352a9026980..25f1ab0d7a2701a9fe9d6af7169b056a } } diff --git a/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java b/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java -index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988aed8774fc 100644 +index 6ce4a98e4d3b633e3c87944c23b6b3f0ff58f159..dce2b0ae83e70ccaf2ac97441f80b25876ee9058 100644 --- a/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java +++ b/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/ChunkHolderManager.java -@@ -72,36 +72,49 @@ public final class ChunkHolderManager { +@@ -73,37 +73,50 @@ public final class ChunkHolderManager { private static final long NO_TIMEOUT_MARKER = Long.MIN_VALUE; public final ReentrantAreaLock ticketLockArea; @@ -220,6 +220,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a private long currentTick; - private final ArrayDeque pendingFullLoadUpdate = new ArrayDeque<>(); +- private final MultiThreadedQueue offThreadPendingFullLoadUpdate = new MultiThreadedQueue<>(); - private final ObjectRBTreeSet autoSaveQueue = new ObjectRBTreeSet<>((final NewChunkHolder c1, final NewChunkHolder c2) -> { - if (c1 == c2) { - return 0; @@ -227,6 +228,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a + // DivineMC start - Chunk System optimization + public static class LevelHolderData { + private final java.util.concurrent.ConcurrentLinkedDeque pendingFullLoadUpdate = new java.util.concurrent.ConcurrentLinkedDeque<>(); ++ private final MultiThreadedQueue offThreadPendingFullLoadUpdate = new MultiThreadedQueue<>(); + private final ObjectRBTreeSet autoSaveQueue = new ObjectRBTreeSet<>((final NewChunkHolder c1, final NewChunkHolder c2) -> { + if (c1 == c2) { + return 0; @@ -270,7 +272,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a private final ConcurrentLong2ReferenceChainedHashTable ticketCounters = new ConcurrentLong2ReferenceChainedHashTable<>(); -@@ -224,26 +237,29 @@ public final class ChunkHolderManager { +@@ -226,26 +239,29 @@ public final class ChunkHolderManager { this.taskScheduler.setShutdown(true); } @@ -307,7 +309,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a holder.lastAutoSave = currentTick; if (holder.save(false) != null) { -@@ -257,10 +273,11 @@ public final class ChunkHolderManager { +@@ -259,10 +275,11 @@ public final class ChunkHolderManager { for (final NewChunkHolder holder : reschedule) { if (holder.getChunkStatus().isOrAfter(FullChunkStatus.FULL)) { @@ -320,7 +322,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a public void saveAllChunks(final boolean flush, final boolean shutdown, final boolean logProgress) { final List holders = this.getChunkHolders(); -@@ -319,13 +336,9 @@ public final class ChunkHolderManager { +@@ -321,13 +338,9 @@ public final class ChunkHolderManager { } if (logProgress) { final long currTime = System.nanoTime(); @@ -336,7 +338,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a } } } -@@ -459,8 +472,8 @@ public final class ChunkHolderManager { +@@ -461,8 +474,8 @@ public final class ChunkHolderManager { final Long2ObjectOpenHashMap> ret = new Long2ObjectOpenHashMap<>(); final Long2ObjectOpenHashMap sections = new Long2ObjectOpenHashMap<>(); final int sectionShift = this.taskScheduler.getChunkSystemLockShift(); @@ -347,7 +349,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a sections.computeIfAbsent( CoordinateUtils.getChunkKey( CoordinateUtils.getChunkX(coord) >> sectionShift, -@@ -557,7 +570,7 @@ public final class ChunkHolderManager { +@@ -559,7 +572,7 @@ public final class ChunkHolderManager { chunkZ >> sectionShift ); @@ -356,7 +358,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a return new Long2IntOpenHashMap(); }).addTo(chunkKey, 1); } -@@ -601,8 +614,8 @@ public final class ChunkHolderManager { +@@ -603,8 +616,8 @@ public final class ChunkHolderManager { final ReentrantAreaLock.Node ticketLock = lock ? this.ticketLockArea.lock(chunkX, chunkZ) : null; try { @@ -367,7 +369,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a }); final int levelBefore = getTicketLevelAt(ticketsAtChunk); -@@ -782,8 +795,8 @@ public final class ChunkHolderManager { +@@ -784,8 +797,8 @@ public final class ChunkHolderManager { final Long2ObjectOpenHashMap sections = new Long2ObjectOpenHashMap<>(); final int sectionShift = this.taskScheduler.getChunkSystemLockShift(); @@ -378,9 +380,9 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a sections.computeIfAbsent( CoordinateUtils.getChunkKey( CoordinateUtils.getChunkX(coord) >> sectionShift, -@@ -831,8 +844,8 @@ public final class ChunkHolderManager { - return removeDelay <= 0L; - }; +@@ -836,8 +849,8 @@ public final class ChunkHolderManager { + final List scheduledTasks = new ArrayList<>(); + final List changedFullStatus = new ArrayList<>(); - for (final PrimitiveIterator.OfLong iterator = this.sectionToChunkToExpireCount.keyIterator(); iterator.hasNext();) { - final long sectionKey = iterator.nextLong(); @@ -389,18 +391,23 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a if (!this.sectionToChunkToExpireCount.containsKey(sectionKey)) { // removed concurrently -@@ -1118,7 +1131,7 @@ public final class ChunkHolderManager { - } +@@ -1145,18 +1158,29 @@ public final class ChunkHolderManager { if (!TickThread.isTickThread()) { - this.taskScheduler.scheduleChunkTask(() -> { -- final ArrayDeque pendingFullLoadUpdate = ChunkHolderManager.this.pendingFullLoadUpdate; -+ final java.util.Deque pendingFullLoadUpdate = ChunkHolderManager.this.getData().pendingFullLoadUpdate; // DivineMC - Chunk System optimization - for (int i = 0, len = changedFullStatus.size(); i < len; ++i) { - pendingFullLoadUpdate.add(changedFullStatus.get(i)); - } -@@ -1126,16 +1139,16 @@ public final class ChunkHolderManager { - ChunkHolderManager.this.processPendingFullUpdate(); - }, Priority.HIGHEST); + // These will be handled on the next ServerChunkCache$MainThreadExecutor#pollTask, as it runs the distance manager update + // which will invoke processTicketUpdates +- this.offThreadPendingFullLoadUpdate.addAll(changedFullStatus); ++ this.getData().offThreadPendingFullLoadUpdate.addAll(changedFullStatus); // DivineMC - Chunk System optimization ++ ++ // DivineMC start - Chunk System optimization ++ this.taskScheduler.scheduleChunkTask(() -> { ++ final java.util.Deque pendingFullLoadUpdate = ChunkHolderManager.this.getData().pendingFullLoadUpdate; ++ for (int i = 0, len = changedFullStatus.size(); i < len; ++i) { ++ pendingFullLoadUpdate.add(changedFullStatus.get(i)); ++ } ++ ++ ChunkHolderManager.this.processPendingFullUpdate(); ++ }, Priority.HIGHEST); ++ // DivineMC end - Chunk System optimization } else { - final ArrayDeque pendingFullLoadUpdate = this.pendingFullLoadUpdate; + final java.util.Deque pendingFullLoadUpdate = this.getData().pendingFullLoadUpdate; // DivineMC - Chunk System optimization @@ -418,7 +425,7 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a PlatformHooks.get().onChunkHolderDelete(this.world, holder.vanillaChunkHolder); this.chunkHolders.remove(CoordinateUtils.getChunkKey(holder.chunkX, holder.chunkZ)); } -@@ -1293,6 +1306,27 @@ public final class ChunkHolderManager { +@@ -1314,6 +1338,27 @@ public final class ChunkHolderManager { } } @@ -446,16 +453,27 @@ index f473999938840562b1007a789600342e5796a123..60705955e231d47c60f5a0a5e869988a public enum TicketOperationType { ADD, REMOVE, ADD_IF_REMOVED, ADD_AND_REMOVE } -@@ -1466,7 +1500,7 @@ public final class ChunkHolderManager { +@@ -1473,8 +1518,8 @@ public final class ChunkHolderManager { // only call on tick thread + private void processOffThreadFullUpdates() { +- final ArrayDeque pendingFullLoadUpdate = this.pendingFullLoadUpdate; +- final MultiThreadedQueue offThreadPendingFullLoadUpdate = this.offThreadPendingFullLoadUpdate; ++ final java.util.concurrent.ConcurrentLinkedDeque pendingFullLoadUpdate = this.getData().pendingFullLoadUpdate; // DivineMC - Chunk System optimization ++ final MultiThreadedQueue offThreadPendingFullLoadUpdate = this.getData().offThreadPendingFullLoadUpdate; // DivineMC - Chunk System optimization + + NewChunkHolder toUpdate; + while ((toUpdate = offThreadPendingFullLoadUpdate.poll()) != null) { +@@ -1486,7 +1531,7 @@ public final class ChunkHolderManager { private boolean processPendingFullUpdate() { + this.processOffThreadFullUpdates(); + - final ArrayDeque pendingFullLoadUpdate = this.pendingFullLoadUpdate; + final java.util.Deque pendingFullLoadUpdate = this.getData().pendingFullLoadUpdate; // DivineMC - Chunk System optimization boolean ret = false; -@@ -1502,8 +1536,7 @@ public final class ChunkHolderManager { +@@ -1522,8 +1567,7 @@ public final class ChunkHolderManager { final JsonArray allTicketsJson = new JsonArray(); ret.add("tickets", allTicketsJson); @@ -888,14 +906,13 @@ index 51f4dd4f583dfbd16cb00f1cb4418d1044cecb1c..2f83deafbb5b50e5ce191b5351ec5ed9 } diff --git a/io/papermc/paper/FeatureHooks.java b/io/papermc/paper/FeatureHooks.java -index a42a773503ca0e0dc36dd44440b3eda670a6811b..f51db348545db7073558efda7f95a9738313198b 100644 +index b2b67a3b1b4620dc97a32df953d4ad47bbe5e481..aa68cb8d489f976a5a2ea9b32de690a89589fc81 100644 --- a/io/papermc/paper/FeatureHooks.java +++ b/io/papermc/paper/FeatureHooks.java -@@ -32,11 +32,6 @@ import org.bukkit.Chunk; - import org.bukkit.World; +@@ -37,10 +37,6 @@ public final class FeatureHooks { + ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.setUnloadDelay(ticks); // Paper - rewrite chunk system + } - public final class FeatureHooks { -- - public static void initChunkTaskScheduler(final boolean useParallelGen) { - ca.spottedleaf.moonrise.patches.chunk_system.scheduling.ChunkTaskScheduler.init(useParallelGen); // Paper - Chunk system - } diff --git a/divinemc-server/minecraft-patches/features/0012-Lag-compensation.patch b/divinemc-server/minecraft-patches/features/0012-Lag-compensation.patch index 94ceaed..0b1baee 100644 --- a/divinemc-server/minecraft-patches/features/0012-Lag-compensation.patch +++ b/divinemc-server/minecraft-patches/features/0012-Lag-compensation.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Lag compensation diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index ba5cb47347da6a0bc69b8f6924baac52f60375b8..05541061f1ac4f13e3de55f4ab90df4e273aa4b0 100644 +index 0912b009598876d6c16f7adcd80762074ea66f5a..70b33e54d8384709b166ca57cd114632e357f24f 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -288,6 +288,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function threadFunction) { ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system -@@ -1533,6 +1534,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { private boolean value; diff --git a/net/minecraft/world/level/block/state/BlockBehaviour.java b/net/minecraft/world/level/block/state/BlockBehaviour.java -index 8db95b74f88f8096de93115ae8d3fb2e6184ad3b..e044830439fe9821ab3f62695d318a6321b8a266 100644 +index 36e754dedc9e7b97dc5565864f5664d062ff612a..346d1825a9ed03c61f6915edc2b8d96dd0ead3e4 100644 --- a/net/minecraft/world/level/block/state/BlockBehaviour.java +++ b/net/minecraft/world/level/block/state/BlockBehaviour.java @@ -347,13 +347,21 @@ public abstract class BlockBehaviour implements FeatureElement { diff --git a/divinemc-server/minecraft-patches/features/0013-Skip-EntityScheduler-s-executeTick-checks-if-there-i.patch b/divinemc-server/minecraft-patches/features/0013-Skip-EntityScheduler-s-executeTick-checks-if-there-i.patch index 12fb765..9aec326 100644 --- a/divinemc-server/minecraft-patches/features/0013-Skip-EntityScheduler-s-executeTick-checks-if-there-i.patch +++ b/divinemc-server/minecraft-patches/features/0013-Skip-EntityScheduler-s-executeTick-checks-if-there-i.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Skip EntityScheduler's executeTick checks if there isn't any diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 05541061f1ac4f13e3de55f4ab90df4e273aa4b0..f16a50b9b07e0f754f573710875859605318ba69 100644 +index 70b33e54d8384709b166ca57cd114632e357f24f..89f9c2c3661f1ef951d865bd8c81564ea558c1e2 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -289,6 +289,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop S spin(Function threadFunction) { ca.spottedleaf.dataconverter.minecraft.datatypes.MCTypeRegistry.init(); // Paper - rewrite data converter system -@@ -1661,17 +1662,18 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop calculateExplodedPositions() { @@ -20,7 +20,7 @@ index a772f2bd7be00172ad41353c6ad42d9239b9ec88..27c7a113b81160eb88021bf259005e3c // Paper start - collision optimisations final ObjectArrayList ret = new ObjectArrayList<>(); -@@ -470,6 +475,157 @@ public class ServerExplosion implements Explosion { +@@ -473,6 +478,157 @@ public class ServerExplosion implements Explosion { // Paper end - collision optimisations } @@ -178,7 +178,7 @@ index a772f2bd7be00172ad41353c6ad42d9239b9ec88..27c7a113b81160eb88021bf259005e3c private void hurtEntities() { float f = this.radius * 2.0F; int floor = Mth.floor(this.center.x - f - 1.0); -@@ -559,6 +715,11 @@ public class ServerExplosion implements Explosion { +@@ -562,6 +718,11 @@ public class ServerExplosion implements Explosion { } private void interactWithBlocks(List blocks) { diff --git a/divinemc-server/minecraft-patches/features/0024-Virtual-Threads.patch b/divinemc-server/minecraft-patches/features/0024-Virtual-Threads.patch index 0190c47..e09b981 100644 --- a/divinemc-server/minecraft-patches/features/0024-Virtual-Threads.patch +++ b/divinemc-server/minecraft-patches/features/0024-Virtual-Threads.patch @@ -23,10 +23,10 @@ index 0a69469c79aaa2466cda04f6acefed18e421d555..66f7f2aa071c2811400b4fed12ccf51c private final AtomicInteger count = new AtomicInteger(); diff --git a/net/minecraft/commands/Commands.java b/net/minecraft/commands/Commands.java -index 2b4345d16e8e5e903afb723dc41f549613998f7c..6e75bbc18762914c85866a0f46c6927aaf58afa1 100644 +index 7226d6066050523c021c89a79af1edbcc184af9c..7fa9214b865ee22f539467efb4130cc330ee9d7b 100644 --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java -@@ -508,7 +508,7 @@ public class Commands { +@@ -473,7 +473,7 @@ public class Commands { } // Fixed pool, but with discard policy @@ -36,10 +36,10 @@ index 2b4345d16e8e5e903afb723dc41f549613998f7c..6e75bbc18762914c85866a0f46c6927a new java.util.concurrent.LinkedBlockingQueue<>(), new com.google.common.util.concurrent.ThreadFactoryBuilder() diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index f16a50b9b07e0f754f573710875859605318ba69..f484d4b72e1919762dec1a219f0e51e1eacea37f 100644 +index 89f9c2c3661f1ef951d865bd8c81564ea558c1e2..45af325d0f457068f79e1b53414db1bf4c8d094b 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -2641,8 +2641,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { - final java.util.Deque pendingFullLoadUpdate = ChunkHolderManager.this.getData().pendingFullLoadUpdate; // DivineMC - Chunk System optimization - for (int i = 0, len = changedFullStatus.size(); i < len; ++i) { -@@ -1155,7 +1155,13 @@ public final class ChunkHolderManager { + // These will be handled on the next ServerChunkCache$MainThreadExecutor#pollTask, as it runs the distance manager update + // which will invoke processTicketUpdates + this.getData().offThreadPendingFullLoadUpdate.addAll(changedFullStatus); // DivineMC - Chunk System optimization +@@ -1187,7 +1187,13 @@ public final class ChunkHolderManager { // note: never call while inside the chunk system, this will absolutely break everything public void processUnloads() { @@ -32,15 +32,15 @@ index 60705955e231d47c60f5a0a5e869988aed8774fc..c0322d4f9eadb26b8d5c6a3b426218eb if (BLOCK_TICKET_UPDATES.get() == Boolean.TRUE) { throw new IllegalStateException("Cannot unload chunks recursively"); -@@ -1458,7 +1464,7 @@ public final class ChunkHolderManager { - - List changedFullStatus = null; - +@@ -1474,7 +1480,7 @@ public final class ChunkHolderManager { + if (BLOCK_TICKET_UPDATES.get() == Boolean.TRUE) { + throw new IllegalStateException("Cannot update ticket level while unloading chunks or updating entity manager"); + } - final boolean isTickThread = TickThread.isTickThread(); + final boolean isTickThread = org.bxteam.divinemc.config.DivineConfig.AsyncCategory.enableParallelWorldTicking && TickThread.isTickThreadFor(world) || TickThread.isTickThread(); // DivineMC - Parallel world ticking - boolean ret = false; - final boolean canProcessFullUpdates = processFullUpdates & isTickThread; + if (!PlatformHooks.get().allowAsyncTicketUpdates() && isTickThread) { + TickThread.ensureTickThread("Cannot asynchronously process ticket updates"); diff --git a/net/minecraft/core/dispenser/DispenseItemBehavior.java b/net/minecraft/core/dispenser/DispenseItemBehavior.java index ac27ff24f018d8798921c5152e679ceed1e88d8d..ec7d1353b19e55b00c558df8981323efb9b88bdf 100644 --- a/net/minecraft/core/dispenser/DispenseItemBehavior.java @@ -59,7 +59,7 @@ index ac27ff24f018d8798921c5152e679ceed1e88d8d..ec7d1353b19e55b00c558df8981323ef List states = new java.util.ArrayList<>(level.capturedBlockStates.values()); level.capturedBlockStates.clear(); diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 9e83d0ec1a0976f365fa6cb3f1b7db167641b336..6f08d761ee52d65a57fd01cf7bffa461dc1b898b 100644 +index 1079eebf665d4752c4796edf8b851f13e6972dc8..3e013d116f78f8f3d0338fae7bd5b4b1b57be9dc 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java @@ -291,6 +291,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop serverPlayer1.connection.suspendFlushing()); this.server.getScheduler().mainThreadHeartbeat(); // CraftBukkit -@@ -1707,28 +1732,43 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop, ServerLevel> oldLevels = this.levels; Map, ServerLevel> newLevels = Maps.newLinkedHashMap(oldLevels); newLevels.remove(level.dimension()); @@ -210,7 +210,7 @@ index 9e83d0ec1a0976f365fa6cb3f1b7db167641b336..6f08d761ee52d65a57fd01cf7bffa461 } // CraftBukkit end diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 19a3ba355694e7c26c233b216807cb23c82548be..245ffc68aac80d99849290bfefe5cb613eef5d81 100644 +index 7ac82a49e3c64d1a41a2870c5cf9900812329a57..5f1712d3a42ca9e061b7cf96eeba006111e64bd9 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java @@ -224,6 +224,13 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @@ -404,7 +404,7 @@ index 8bf5f7a98e4e8542d56c49a7e2c4926ec86f712d..e1ca822d41311e3be44c52badb907619 serverPlayer.connection = player.connection; serverPlayer.restoreFrom(player, keepInventory); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index e96eeae793d127b76a2fe6853cba49ce192b91f9..3aa2069ff070d9edb596e3c08cd34c617edd955c 100644 +index ef7c2443fbdaedd08c2489609768374a3ecd8661..0484d3ace8e80f0a82fa2f0397026fd867768818 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -3432,14 +3432,34 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -669,7 +669,7 @@ index 2258736e6f9f52efe5bd353b8949a7a0b9a4fdb8..440fbe301782e81cec679a27a876dd3c } else { Entity entity = owner.teleport( diff --git a/net/minecraft/world/inventory/AbstractContainerMenu.java b/net/minecraft/world/inventory/AbstractContainerMenu.java -index bfee8f3f47bc457543022fabbbee2130a6abe81a..55d0b8a88d202fb86c4da84e0d40b63df2461c2a 100644 +index 1f601781643945920c7522b9c6100d0a37ad535d..bd31350c5b9b727cfd9150a399d207839a51e4dd 100644 --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java @@ -96,8 +96,14 @@ public abstract class AbstractContainerMenu { diff --git a/divinemc-server/minecraft-patches/features/0046-MSPT-Tracking-for-each-world.patch b/divinemc-server/minecraft-patches/features/0046-MSPT-Tracking-for-each-world.patch index 5d0c442..b325981 100644 --- a/divinemc-server/minecraft-patches/features/0046-MSPT-Tracking-for-each-world.patch +++ b/divinemc-server/minecraft-patches/features/0046-MSPT-Tracking-for-each-world.patch @@ -5,10 +5,10 @@ Subject: [PATCH] MSPT Tracking for each world diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 6f08d761ee52d65a57fd01cf7bffa461dc1b898b..d96f1b3312734b4daa86fd7ac133f3f5475375b4 100644 +index 3e013d116f78f8f3d0338fae7bd5b4b1b57be9dc..693a3c2d0a908b4ce9825818b4af191d1ec98e92 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1674,7 +1674,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0, 5 * 20); // Paper - Add ticket on player join to avoid chunk load-unload-load cycle public static final int GENERATED_TICKET_LEVEL = ChunkHolderManager.FULL_LOADED_TICKET_LEVEL; public static final int LOADED_TICKET_LEVEL = ChunkTaskScheduler.getTicketLevel(ChunkStatus.EMPTY); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index a534b3e6835b9e998ae25210812ddf55685473ea..ce68dd77963e2bcb6119c682a700f540109d4877 100644 +index e1ca822d41311e3be44c52badb907619ca681cf9..bd6cff4916fdf379ee887259d18ee274ff2f8bc6 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -316,6 +316,13 @@ public abstract class PlayerList { diff --git a/divinemc-server/minecraft-patches/features/0054-Implement-NoChatReports.patch b/divinemc-server/minecraft-patches/features/0054-Implement-NoChatReports.patch index 7ef822a..815063e 100644 --- a/divinemc-server/minecraft-patches/features/0054-Implement-NoChatReports.patch +++ b/divinemc-server/minecraft-patches/features/0054-Implement-NoChatReports.patch @@ -206,10 +206,10 @@ index a491be4250de3199c3e1aa9e5482b568692bd2f5..c88826db76c28c536e6c36c5592d69c1 private static final String PREFIX = "data:image/png;base64,"; public static final Codec CODEC = Codec.STRING.comapFlatMap(string -> { diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java -index 245ffc68aac80d99849290bfefe5cb613eef5d81..7f8348518cf34ec9323d504f8c0a7d0de02daab2 100644 +index 5f1712d3a42ca9e061b7cf96eeba006111e64bd9..13d85eb366a070bfd6723088412f51af07892362 100644 --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -638,6 +638,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface +@@ -636,6 +636,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface @Override public boolean enforceSecureProfile() { diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch index 0c1a35f..fdc4137 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -988,6 +_,13 @@ +@@ -989,6 +_,13 @@ if (this.hasStopped) return; this.hasStopped = true; } diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/BaseCommandBlock.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/BaseCommandBlock.java.patch index 85b73c7..fdec8a3 100644 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/BaseCommandBlock.java.patch +++ b/divinemc-server/minecraft-patches/sources/net/minecraft/world/level/BaseCommandBlock.java.patch @@ -9,7 +9,7 @@ private static final Component DEFAULT_NAME = Component.literal("@"); private static final int NO_LAST_EXECUTION = -1; private long lastExecution = -1L; -@@ -150,7 +_,7 @@ +@@ -156,7 +_,7 @@ public void sendSystemMessage(Component component) { if (this.trackOutput) { org.spigotmc.AsyncCatcher.catchOp("sendSystemMessage to a command block"); // Paper - Don't broadcast messages to command blocks diff --git a/divinemc-server/paper-patches/features/0002-Configuration.patch b/divinemc-server/paper-patches/features/0002-Configuration.patch index 3caf486..f067d73 100644 --- a/divinemc-server/paper-patches/features/0002-Configuration.patch +++ b/divinemc-server/paper-patches/features/0002-Configuration.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configuration diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 7c79e58f86d113e5e67947e235475beef76e20ab..b26d3a2856ed7bd0a2dcb72f74ee0e157be85ac7 100644 +index d9d158ef36225345eec871fd6e6fb19db08d4c21..ade084fb8f6f9290104677d6fc10a72816715746 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1088,6 +1088,13 @@ public final class CraftServer implements Server { +@@ -1060,6 +1060,13 @@ public final class CraftServer implements Server { org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot this.console.paperConfigurations.reloadConfigs(this.console); org.purpurmc.purpur.PurpurConfig.init((File) console.options.valueOf("purpur-settings")); // Purpur - Purpur config files @@ -22,7 +22,7 @@ index 7c79e58f86d113e5e67947e235475beef76e20ab..b26d3a2856ed7bd0a2dcb72f74ee0e15 for (ServerLevel world : this.console.getAllLevels()) { // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) -@@ -1104,6 +1111,13 @@ public final class CraftServer implements Server { +@@ -1076,6 +1083,13 @@ public final class CraftServer implements Server { } world.spigotConfig.init(); // Spigot world.purpurConfig.init(); // Purpur - Purpur config files diff --git a/divinemc-server/paper-patches/features/0004-Implement-Secure-Seed.patch b/divinemc-server/paper-patches/features/0004-Implement-Secure-Seed.patch index a30f2c0..2f4c555 100644 --- a/divinemc-server/paper-patches/features/0004-Implement-Secure-Seed.patch +++ b/divinemc-server/paper-patches/features/0004-Implement-Secure-Seed.patch @@ -25,10 +25,10 @@ index 400e632208d133a3f49fc7f14bceb48a1026769b..a1c7ba0fdb505d09407cca94e890dedd @Override diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index b26d3a2856ed7bd0a2dcb72f74ee0e157be85ac7..ec77f0c59bd79dc680bf3f4f4e1257c8cf6125cb 100644 +index ade084fb8f6f9290104677d6fc10a72816715746..1515e84a266451f133835562a96b18432ef58fdc 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -1385,7 +1385,11 @@ public final class CraftServer implements Server { +@@ -1357,7 +1357,11 @@ public final class CraftServer implements Server { registryAccess = levelDataAndDimensions.dimensions().dimensionsRegistryAccess(); } else { LevelSettings levelSettings; diff --git a/divinemc-server/paper-patches/features/0013-Paper-PR-Throttle-failed-spawn-attempts.patch b/divinemc-server/paper-patches/features/0013-Paper-PR-Throttle-failed-spawn-attempts.patch index 3d489d3..a413512 100644 --- a/divinemc-server/paper-patches/features/0013-Paper-PR-Throttle-failed-spawn-attempts.patch +++ b/divinemc-server/paper-patches/features/0013-Paper-PR-Throttle-failed-spawn-attempts.patch @@ -22,10 +22,10 @@ Example config in paper-world-defaults.yml: ``` diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -index 65f6839fe75340a4b58894ad50c6eda7b59128c0..f7610c709bd6f9e30ec7b1295d58dfbe98fc8661 100644 +index 8e65586182bd586c95b8c4873fab6d6ff5975243..ed687b0ab589fd2ddb8bf77f42ba42cf8b1c2ea7 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -@@ -182,6 +182,17 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -183,6 +183,17 @@ public class WorldConfiguration extends ConfigurationPart { @MergeMap public Reference2IntMap ticksPerSpawn = Util.make(new Reference2IntOpenHashMap<>(NaturalSpawner.SPAWNING_CATEGORIES.length), map -> Arrays.stream(NaturalSpawner.SPAWNING_CATEGORIES).forEach(mobCategory -> map.put(mobCategory, -1))); diff --git a/divinemc-server/paper-patches/features/0015-Optimize-default-values-for-configs.patch b/divinemc-server/paper-patches/features/0015-Optimize-default-values-for-configs.patch index f3c4e00..18e28bf 100644 --- a/divinemc-server/paper-patches/features/0015-Optimize-default-values-for-configs.patch +++ b/divinemc-server/paper-patches/features/0015-Optimize-default-values-for-configs.patch @@ -20,10 +20,10 @@ index 83419bbcbf79d8eed1302d66356a62fa61a33473..caa4cf0af0696b90d61f32f5445a6e6c public IntOr.Default compressionLevel = IntOr.Default.USE_DEFAULT; @Comment("Defines the leniency distance added on the server to the interaction range of a player when validating interact packets.") diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -index 6c298304f842612d0e063b578f274eed04b32960..18c501a2fe2213e3282bf83f5e07fe3772eef05f 100644 +index ed687b0ab589fd2ddb8bf77f42ba42cf8b1c2ea7..b01509c5d579c57e3be019f8fb850a8d4790bd92 100644 --- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java +++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java -@@ -147,8 +147,10 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -148,8 +148,10 @@ public class WorldConfiguration extends ConfigurationPart { public ArmorStands armorStands; public class ArmorStands extends ConfigurationPart { @@ -36,7 +36,7 @@ index 6c298304f842612d0e063b578f274eed04b32960..18c501a2fe2213e3282bf83f5e07fe37 } public Markers markers; -@@ -274,8 +276,38 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -275,8 +277,38 @@ public class WorldConfiguration extends ConfigurationPart { public AltItemDespawnRate altItemDespawnRate; public class AltItemDespawnRate extends ConfigurationPart { @@ -77,7 +77,7 @@ index 6c298304f842612d0e063b578f274eed04b32960..18c501a2fe2213e3282bf83f5e07fe37 } } -@@ -418,7 +450,7 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -419,7 +451,7 @@ public class WorldConfiguration extends ConfigurationPart { public class Environment extends ConfigurationPart { public boolean disableThunder = false; public boolean disableIceAndSnow = false; @@ -86,7 +86,7 @@ index 6c298304f842612d0e063b578f274eed04b32960..18c501a2fe2213e3282bf83f5e07fe37 public boolean disableExplosionKnockback = false; public boolean generateFlatBedrock = false; public FrostedIce frostedIce; -@@ -471,7 +503,7 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -472,7 +504,7 @@ public class WorldConfiguration extends ConfigurationPart { public Fixes fixes; public class Fixes extends ConfigurationPart { @@ -95,7 +95,7 @@ index 6c298304f842612d0e063b578f274eed04b32960..18c501a2fe2213e3282bf83f5e07fe37 public boolean disableUnloadedChunkEnderpearlExploit = false; public boolean preventTntFromMovingInWater = false; public boolean splitOverstackedLoot = true; -@@ -499,9 +531,9 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -500,9 +532,9 @@ public class WorldConfiguration extends ConfigurationPart { public class Collisions extends ConfigurationPart { public boolean onlyPlayersCollide = false; public boolean allowVehicleCollisions = true; @@ -107,7 +107,7 @@ index 6c298304f842612d0e063b578f274eed04b32960..18c501a2fe2213e3282bf83f5e07fe37 public boolean allowPlayerCrammingDamage = false; } -@@ -511,16 +543,33 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -512,16 +544,33 @@ public class WorldConfiguration extends ConfigurationPart { public AutosavePeriod autoSaveInterval = AutosavePeriod.def(); public int maxAutoSaveChunksPerTick = 24; public int fixedChunkInhabitedTime = -1; @@ -147,8 +147,8 @@ index 6c298304f842612d0e063b578f274eed04b32960..18c501a2fe2213e3282bf83f5e07fe37 + // DivineMC end - Optimize default values for configs }); public boolean flushRegionsOnSave = false; - } -@@ -535,9 +584,9 @@ public class WorldConfiguration extends ConfigurationPart { + +@@ -541,9 +590,9 @@ public class WorldConfiguration extends ConfigurationPart { public TickRates tickRates; public class TickRates extends ConfigurationPart { @@ -160,7 +160,7 @@ index 6c298304f842612d0e063b578f274eed04b32960..18c501a2fe2213e3282bf83f5e07fe37 public int wetFarmland = 1; public int dryFarmland = 1; public Table, String, Integer> sensor = Util.make(HashBasedTable.create(), table -> table.put(EntityType.VILLAGER, "secondarypoisensor", 40)); -@@ -572,7 +621,7 @@ public class WorldConfiguration extends ConfigurationPart { +@@ -578,7 +627,7 @@ public class WorldConfiguration extends ConfigurationPart { public class Misc extends ConfigurationPart { public boolean updatePathfindingOnBlockUpdate = true; public boolean showSignClickCommandFailureMsgsToPlayer = false; diff --git a/divinemc-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch b/divinemc-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch index 2c09037..b52c47f 100644 --- a/divinemc-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch +++ b/divinemc-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/CraftServer.java.patch @@ -1,6 +1,6 @@ --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -@@ -976,7 +_,7 @@ +@@ -974,7 +_,7 @@ @Override public List getWorlds() { diff --git a/divinemc-server/purpur-patches/features/0001-Optimize-default-values-for-configs.patch b/divinemc-server/purpur-patches/features/0001-Optimize-default-values-for-configs.patch index 3f65414..98e9811 100644 --- a/divinemc-server/purpur-patches/features/0001-Optimize-default-values-for-configs.patch +++ b/divinemc-server/purpur-patches/features/0001-Optimize-default-values-for-configs.patch @@ -18,10 +18,10 @@ index e5bf7ea47143cf3f8d4c0f1840698068bb70cbf8..72fcad4a0b5857551221741b9c73fa75 useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive); } diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 611847bd7576bb77fdfb734ddb2e3412f3831041..508e5001eb691bd2d8231f8e6365eeacd14371ce 100644 +index a03e166b490952534e8050654c1afa975795f731..3346e45393776c9ed120c2be70e24a9289f74fd3 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -3169,8 +3169,8 @@ public class PurpurWorldConfig { +@@ -3164,8 +3164,8 @@ public class PurpurWorldConfig { public boolean villagerDisplayTradeItem = true; public int villagerSpawnIronGolemRadius = 0; public int villagerSpawnIronGolemLimit = 0; diff --git a/divinemc-server/purpur-patches/features/0002-Add-missing-purpur-config-options.patch b/divinemc-server/purpur-patches/features/0002-Add-missing-purpur-config-options.patch index f8629d8..cdc9479 100644 --- a/divinemc-server/purpur-patches/features/0002-Add-missing-purpur-config-options.patch +++ b/divinemc-server/purpur-patches/features/0002-Add-missing-purpur-config-options.patch @@ -25,10 +25,10 @@ index 72fcad4a0b5857551221741b9c73fa75596e6981..374af5eb6b55c731535be4e8c242ffc3 org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 508e5001eb691bd2d8231f8e6365eeacd14371ce..1e5f301d61da14c93b1cce4ceb3a3b2954435a80 100644 +index 3346e45393776c9ed120c2be70e24a9289f74fd3..225d3fab20ef461c87b260b2674229806649bc56 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1189,12 +1189,20 @@ public class PurpurWorldConfig { +@@ -1184,12 +1184,20 @@ public class PurpurWorldConfig { public boolean allayControllable = true; public double allayMaxHealth = 20.0D; public double allayScale = 1.0D; @@ -49,7 +49,7 @@ index 508e5001eb691bd2d8231f8e6365eeacd14371ce..1e5f301d61da14c93b1cce4ceb3a3b29 } public boolean armadilloRidable = false; -@@ -1349,6 +1357,10 @@ public class PurpurWorldConfig { +@@ -1344,6 +1352,10 @@ public class PurpurWorldConfig { public double camelMovementSpeedMin = 0.09D; public double camelMovementSpeedMax = 0.09D; public int camelBreedingTicks = 6000; @@ -60,7 +60,7 @@ index 508e5001eb691bd2d8231f8e6365eeacd14371ce..1e5f301d61da14c93b1cce4ceb3a3b29 private void camelSettings() { camelRidableInWater = getBoolean("mobs.camel.ridable-in-water", camelRidableInWater); camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin); -@@ -1358,6 +1370,10 @@ public class PurpurWorldConfig { +@@ -1353,6 +1365,10 @@ public class PurpurWorldConfig { camelMovementSpeedMin = getDouble("mobs.camel.attributes.movement_speed.min", camelMovementSpeedMin); camelMovementSpeedMax = getDouble("mobs.camel.attributes.movement_speed.max", camelMovementSpeedMax); camelBreedingTicks = getInt("mobs.camel.breeding-delay-ticks", camelBreedingTicks); @@ -71,7 +71,7 @@ index 508e5001eb691bd2d8231f8e6365eeacd14371ce..1e5f301d61da14c93b1cce4ceb3a3b29 } public boolean catRidable = false; -@@ -1839,12 +1855,22 @@ public class PurpurWorldConfig { +@@ -1834,12 +1850,22 @@ public class PurpurWorldConfig { public boolean frogControllable = true; public float frogRidableJumpHeight = 0.65F; public int frogBreedingTicks = 6000; @@ -94,7 +94,7 @@ index 508e5001eb691bd2d8231f8e6365eeacd14371ce..1e5f301d61da14c93b1cce4ceb3a3b29 } public boolean ghastRidable = false; -@@ -2930,6 +2956,10 @@ public class PurpurWorldConfig { +@@ -2925,6 +2951,10 @@ public class PurpurWorldConfig { public double snifferMaxHealth = 14.0D; public double snifferScale = 1.0D; public int snifferBreedingTicks = 6000; @@ -105,7 +105,7 @@ index 508e5001eb691bd2d8231f8e6365eeacd14371ce..1e5f301d61da14c93b1cce4ceb3a3b29 private void snifferSettings() { snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); -@@ -2937,6 +2967,10 @@ public class PurpurWorldConfig { +@@ -2932,6 +2962,10 @@ public class PurpurWorldConfig { snifferMaxHealth = getDouble("mobs.sniffer.attributes.max_health", snifferMaxHealth); snifferScale = Mth.clamp(getDouble("mobs.sniffer.attributes.scale", snifferScale), 0.0625D, 16.0D); snifferBreedingTicks = getInt("mobs.sniffer.breeding-delay-ticks", snifferBreedingTicks); @@ -116,7 +116,7 @@ index 508e5001eb691bd2d8231f8e6365eeacd14371ce..1e5f301d61da14c93b1cce4ceb3a3b29 } public boolean squidRidable = false; -@@ -3038,10 +3072,20 @@ public class PurpurWorldConfig { +@@ -3033,10 +3067,20 @@ public class PurpurWorldConfig { public boolean tadpoleRidable = false; public boolean tadpoleRidableInWater = true; public boolean tadpoleControllable = true; @@ -137,7 +137,7 @@ index 508e5001eb691bd2d8231f8e6365eeacd14371ce..1e5f301d61da14c93b1cce4ceb3a3b29 } public boolean traderLlamaRidable = false; -@@ -3275,10 +3319,20 @@ public class PurpurWorldConfig { +@@ -3270,10 +3314,20 @@ public class PurpurWorldConfig { public boolean wardenRidable = false; public boolean wardenRidableInWater = true; public boolean wardenControllable = true; diff --git a/divinemc-server/purpur-patches/features/0004-Configurable-movement-speed-for-entities.patch b/divinemc-server/purpur-patches/features/0004-Configurable-movement-speed-for-entities.patch index c3aa467..0e5ead5 100644 --- a/divinemc-server/purpur-patches/features/0004-Configurable-movement-speed-for-entities.patch +++ b/divinemc-server/purpur-patches/features/0004-Configurable-movement-speed-for-entities.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable movement speed for entities diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880a652f93b 100644 +index 225d3fab20ef461c87b260b2674229806649bc56..16baa76725af475ee1c27843ebfbd6312a238fce 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1641,6 +1641,7 @@ public class PurpurWorldConfig { +@@ -1636,6 +1636,7 @@ public class PurpurWorldConfig { public boolean drownedTakeDamageFromWater = false; public boolean drownedBreakDoors = false; public boolean drownedAlwaysDropExp = false; @@ -16,7 +16,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 private void drownedSettings() { drownedRidable = getBoolean("mobs.drowned.ridable", drownedRidable); drownedRidableInWater = getBoolean("mobs.drowned.ridable-in-water", drownedRidableInWater); -@@ -1659,6 +1660,7 @@ public class PurpurWorldConfig { +@@ -1654,6 +1655,7 @@ public class PurpurWorldConfig { drownedTakeDamageFromWater = getBoolean("mobs.drowned.takes-damage-from-water", drownedTakeDamageFromWater); drownedBreakDoors = getBoolean("mobs.drowned.can-break-doors", drownedBreakDoors); drownedAlwaysDropExp = getBoolean("mobs.drowned.always-drop-exp", drownedAlwaysDropExp); @@ -24,7 +24,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 } public boolean elderGuardianRidable = false; -@@ -2086,6 +2088,7 @@ public class PurpurWorldConfig { +@@ -2081,6 +2083,7 @@ public class PurpurWorldConfig { public boolean huskJockeyTryExistingChickens = true; public boolean huskTakeDamageFromWater = false; public boolean huskAlwaysDropExp = false; @@ -32,7 +32,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 private void huskSettings() { huskRidable = getBoolean("mobs.husk.ridable", huskRidable); huskRidableInWater = getBoolean("mobs.husk.ridable-in-water", huskRidableInWater); -@@ -2103,6 +2106,7 @@ public class PurpurWorldConfig { +@@ -2098,6 +2101,7 @@ public class PurpurWorldConfig { huskJockeyTryExistingChickens = getBoolean("mobs.husk.jockey.try-existing-chickens", huskJockeyTryExistingChickens); huskTakeDamageFromWater = getBoolean("mobs.husk.takes-damage-from-water", huskTakeDamageFromWater); huskAlwaysDropExp = getBoolean("mobs.husk.always-drop-exp", huskAlwaysDropExp); @@ -40,7 +40,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 } public boolean illusionerRidable = false; -@@ -3494,6 +3498,7 @@ public class PurpurWorldConfig { +@@ -3489,6 +3493,7 @@ public class PurpurWorldConfig { public boolean zombieTakeDamageFromWater = false; public boolean zombieAlwaysDropExp = false; public double zombieHeadVisibilityPercent = 0.5D; @@ -48,7 +48,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 private void zombieSettings() { zombieRidable = getBoolean("mobs.zombie.ridable", zombieRidable); zombieRidableInWater = getBoolean("mobs.zombie.ridable-in-water", zombieRidableInWater); -@@ -3519,6 +3524,7 @@ public class PurpurWorldConfig { +@@ -3514,6 +3519,7 @@ public class PurpurWorldConfig { zombieTakeDamageFromWater = getBoolean("mobs.zombie.takes-damage-from-water", zombieTakeDamageFromWater); zombieAlwaysDropExp = getBoolean("mobs.zombie.always-drop-exp", zombieAlwaysDropExp); zombieHeadVisibilityPercent = getDouble("mobs.zombie.head-visibility-percent", zombieHeadVisibilityPercent); @@ -56,7 +56,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 } public boolean zombieHorseRidable = false; -@@ -3568,6 +3574,7 @@ public class PurpurWorldConfig { +@@ -3563,6 +3569,7 @@ public class PurpurWorldConfig { public int zombieVillagerCuringTimeMax = 6000; public boolean zombieVillagerCureEnabled = true; public boolean zombieVillagerAlwaysDropExp = false; @@ -64,7 +64,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 private void zombieVillagerSettings() { zombieVillagerRidable = getBoolean("mobs.zombie_villager.ridable", zombieVillagerRidable); zombieVillagerRidableInWater = getBoolean("mobs.zombie_villager.ridable-in-water", zombieVillagerRidableInWater); -@@ -3588,6 +3595,7 @@ public class PurpurWorldConfig { +@@ -3583,6 +3590,7 @@ public class PurpurWorldConfig { zombieVillagerCuringTimeMax = getInt("mobs.zombie_villager.curing_time.max", zombieVillagerCuringTimeMax); zombieVillagerCureEnabled = getBoolean("mobs.zombie_villager.cure.enabled", zombieVillagerCureEnabled); zombieVillagerAlwaysDropExp = getBoolean("mobs.zombie_villager.always-drop-exp", zombieVillagerAlwaysDropExp); @@ -72,7 +72,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 } public boolean zombifiedPiglinRidable = false; -@@ -3602,6 +3610,7 @@ public class PurpurWorldConfig { +@@ -3597,6 +3605,7 @@ public class PurpurWorldConfig { public boolean zombifiedPiglinCountAsPlayerKillWhenAngry = false; public boolean zombifiedPiglinTakeDamageFromWater = false; public boolean zombifiedPiglinAlwaysDropExp = false; @@ -80,7 +80,7 @@ index 1e5f301d61da14c93b1cce4ceb3a3b2954435a80..e22d42be00677804c5548e9d9d6dd880 private void zombifiedPiglinSettings() { zombifiedPiglinRidable = getBoolean("mobs.zombified_piglin.ridable", zombifiedPiglinRidable); zombifiedPiglinRidableInWater = getBoolean("mobs.zombified_piglin.ridable-in-water", zombifiedPiglinRidableInWater); -@@ -3623,6 +3632,7 @@ public class PurpurWorldConfig { +@@ -3618,6 +3627,7 @@ public class PurpurWorldConfig { zombifiedPiglinCountAsPlayerKillWhenAngry = getBoolean("mobs.zombified_piglin.count-as-player-kill-when-angry", zombifiedPiglinCountAsPlayerKillWhenAngry); zombifiedPiglinTakeDamageFromWater = getBoolean("mobs.zombified_piglin.takes-damage-from-water", zombifiedPiglinTakeDamageFromWater); zombifiedPiglinAlwaysDropExp = getBoolean("mobs.zombified_piglin.always-drop-exp", zombifiedPiglinAlwaysDropExp); diff --git a/gradle.properties b/gradle.properties index 4b66a85..7f1e207 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group = org.bxteam.divinemc version=1.21.6-R0.1-SNAPSHOT mcVersion=1.21.6 -purpurRef=162bd2883b33f39b55bed76247be38d133ee2396 +purpurRef=3893bba083d4d2e2cc7e475e9239258e714f02be experimental=true org.gradle.configuration-cache=true