diff --git a/README.md b/README.md index 691a9cc9..6ce66705 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ If these excellent projects hadn't appeared, Leaf wouldn't have become great. - [SparklyPaper](https://github.com/SparklyPower/SparklyPaper) - [Polpot](https://github.com/HaHaWTH/Polpot) - [Matter](https://github.com/plasmoapp/matter) +- [Luminol](https://github.com/LuminolMC/Luminol) ## 🔥 Special Thanks Jianke Cloud Host diff --git a/patches/server/0044-Reduce-canSee-work.patch b/patches/server/0044-Reduce-canSee-work.patch index 367c8fcf..0f99a249 100644 --- a/patches/server/0044-Reduce-canSee-work.patch +++ b/patches/server/0044-Reduce-canSee-work.patch @@ -3,8 +3,8 @@ From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Mon, 11 Sep 2023 15:47:19 -0400 Subject: [PATCH] Reduce canSee work -Co-authored by: Martijn Muijsers -Co-authored by: MachineBreaker +Co-authored by: Martijn Muijsers +Co-authored by: MachineBreaker diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java index 820f5dc02f89a54fab00942a3eaa72f006b3bd89..14668a88d741de97817cdd7845dc9582610f590d 100644 diff --git a/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch b/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch index 1a86bbcb..1f40d49e 100644 --- a/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch +++ b/patches/server/0054-LinearPurpur-Add-Linear-region-format.patch @@ -17,7 +17,7 @@ This format saves about 50% of disk space. Documentation: https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools diff --git a/build.gradle.kts b/build.gradle.kts -index f90321a70982e2a011f330968483ff1d12164e1b..5c14f2a186509e9f4a7a525320cc7492be939b7c 100644 +index 5cd5ed2053bf8538c7733b8cfb784827f879c4c8..90d705a319323c82a9e19cf70c46c80354a7f3f2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,6 +32,8 @@ dependencies { @@ -118,7 +118,7 @@ index 8dffb330b474b830d2f816ecf8be2e8d2e4556cd..bed46642b59d38e58e6aa663a47cbfc9 long expectedChunks = (long)regionFiles.length * (32L * 32L); // Gale start - instantly continue on world upgrade finish diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 2544c8022ed0fdebc407fc85350041d77247d168..78b787edacb65496eb7d84b452dc637deaa094e4 100644 +index ad24801339c4b5a4b4035aa85d5c45b3b309e985..8adca25614bb2ff999a2372e80e93402accd761f 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -866,7 +866,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 1) { ++ // Dreeam TODO - This should become comment after switching to Leaf world config ++ log(Level.SEVERE, "WARNING: DO NOT USE TOO HIGH COMPRESSION LEVEL (Recommended is 1 which is default value if you are using linear). BECAUSE THAT WOULD MAKE YOUR CHUNK DATA IN DANGER!"); + } + linearCrashOnBrokenSymlink = getBoolean("region-format.linear.crash-on-broken-symlink", linearCrashOnBrokenSymlink); + } @@ -788,10 +791,10 @@ index 0000000000000000000000000000000000000000..c88ff6fda185a8489cbefa51a7b09ccb +} diff --git a/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java b/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java new file mode 100644 -index 0000000000000000000000000000000000000000..041f97f32beabc52400f57d056de3d4d313d3e74 +index 0000000000000000000000000000000000000000..e381b2e3de96c34c2f5ed4ade7ecedd8a2218c15 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/region/LinearRegionFile.java -@@ -0,0 +1,317 @@ +@@ -0,0 +1,325 @@ +package org.purpurmc.purpur.region; + +import com.github.luben.zstd.ZstdInputStream; @@ -920,7 +923,7 @@ index 0000000000000000000000000000000000000000..041f97f32beabc52400f57d056de3d4d + } + + public void flush() throws IOException { -+ if (isMarkedToSave()) flushWrapper(); // sync ++ if (getAndResetSaveMarker()) flushWrapper(); // sync + } + + private void markToSave() { @@ -928,10 +931,18 @@ index 0000000000000000000000000000000000000000..041f97f32beabc52400f57d056de3d4d + markedToSave.set(true); + } + -+ public boolean isMarkedToSave() { ++ public boolean getAndResetSaveMarker() { + return markedToSave.getAndSet(false); + } + ++ public boolean isMarkedToSave() { ++ return this.markedToSave.get(); ++ } ++ ++ public void resetSaveMarker() { ++ this.markedToSave.set(false); ++ } ++ + public void flushWrapper() { + try { + save(); @@ -1111,16 +1122,21 @@ index 0000000000000000000000000000000000000000..041f97f32beabc52400f57d056de3d4d +} diff --git a/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java new file mode 100644 -index 0000000000000000000000000000000000000000..0d3d9193e8d8f72141dc155840c5eed1a744761c +index 0000000000000000000000000000000000000000..249a1f5f8b1f4f5184935aece4efce9e1e18ef18 --- /dev/null +++ b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java -@@ -0,0 +1,50 @@ +@@ -0,0 +1,65 @@ +package org.purpurmc.purpur.region; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; + -+import java.util.Queue; -+import java.util.concurrent.*; ++import java.util.Set; ++import java.util.concurrent.CompletableFuture; ++import java.util.concurrent.ConcurrentHashMap; ++import java.util.concurrent.Executor; ++import java.util.concurrent.ExecutorService; ++import java.util.concurrent.Executors; ++import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; @@ -1129,40 +1145,50 @@ index 0000000000000000000000000000000000000000..0d3d9193e8d8f72141dc155840c5eed1 + +public class LinearRegionFileFlusher { + private final Logger LOGGER = LogManager.getLogger(getClass().getName()); -+ private final Queue savingQueue = new LinkedBlockingQueue<>(); -+ private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( -+ new ThreadFactoryBuilder() -+ .setNameFormat("linear-flush-scheduler") -+ .build() -+ ); ++ private final Set pendingSaving = ConcurrentHashMap.newKeySet(); + private final ExecutorService executor = Executors.newFixedThreadPool( + PurpurConfig.linearFlushThreads, + new ThreadFactoryBuilder() + .setNameFormat("linear-flusher-%d") + .build() + ); ++ private final Executor delayedFlusher = CompletableFuture.delayedExecutor( ++ PurpurConfig.linearFlushThreads, ++ TimeUnit.SECONDS, ++ executor ++ ); + + public LinearRegionFileFlusher() { + Bukkit.getLogger().info("Using " + PurpurConfig.linearFlushThreads + " threads for linear region flushing."); -+ scheduler.scheduleAtFixedRate(this::pollAndFlush, 0L, PurpurConfig.linearFlushFrequency, TimeUnit.SECONDS); + } + + public void scheduleSave(LinearRegionFile regionFile) { -+ if (savingQueue.contains(regionFile)) return; -+ savingQueue.add(regionFile); -+ } -+ -+ private void pollAndFlush() { -+ while (!savingQueue.isEmpty()) { -+ LinearRegionFile regionFile = savingQueue.poll(); -+ if (!regionFile.closed && regionFile.isMarkedToSave()) -+ executor.execute(regionFile::flushWrapper); ++ if (this.pendingSaving.contains(regionFile) || !regionFile.isMarkedToSave()) { ++ return; + } ++ ++ this.pendingSaving.add(regionFile); ++ this.delayedFlusher.execute(() -> { ++ try { ++ if (!regionFile.closed && regionFile.isMarkedToSave()) { ++ regionFile.flushWrapper(); ++ } ++ } finally { ++ regionFile.resetSaveMarker(); ++ this.pendingSaving.remove(regionFile); ++ } ++ }); + } + + public void shutdown() { -+ executor.shutdown(); -+ scheduler.shutdown(); ++ this.executor.shutdown(); ++ for (;;) { ++ try { ++ if (this.executor.awaitTermination(5_00, TimeUnit.MILLISECONDS)) break; ++ } catch (InterruptedException e) { ++ e.printStackTrace(); ++ } ++ } + } +} diff --git a/src/main/java/org/purpurmc/purpur/region/RegionFileFormat.java b/src/main/java/org/purpurmc/purpur/region/RegionFileFormat.java diff --git a/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch b/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch index fcbeb870..f86c73c3 100644 --- a/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch +++ b/patches/server/0056-Plazma-Add-missing-purpur-configuration-options.patch @@ -209,10 +209,10 @@ index 63b5a0993207c55357ac507c974dea77206e80f4..e45c11bf2c42e6d57f803349d8ca6936 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 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf21ac5c6d 100644 +index 1ac5a18e2b56770fe1b9b27b56e4a88fe27a27fe..a4d60637dabcb57e0a559779455603752df03753 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -1190,7 +1190,15 @@ public class PurpurWorldConfig { +@@ -1193,7 +1193,15 @@ public class PurpurWorldConfig { public boolean allayRidableInWater = true; public boolean allayControllable = true; public List allayRespectNBT = new ArrayList<>(); @@ -228,7 +228,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf allayRidable = getBoolean("mobs.allay.ridable", allayRidable); allayRidableInWater = getBoolean("mobs.allay.ridable-in-water", allayRidableInWater); allayControllable = getBoolean("mobs.allay.controllable", allayControllable); -@@ -1309,7 +1317,15 @@ public class PurpurWorldConfig { +@@ -1312,7 +1320,15 @@ public class PurpurWorldConfig { public double camelMovementSpeedMin = 0.09D; public double camelMovementSpeedMax = 0.09D; public int camelBreedingTicks = 6000; @@ -244,7 +244,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf camelRidableInWater = getBoolean("mobs.camel.ridable-in-water", camelRidableInWater); camelMaxHealthMin = getDouble("mobs.camel.attributes.max_health.min", camelMaxHealthMin); camelMaxHealthMax = getDouble("mobs.camel.attributes.max_health.max", camelMaxHealthMax); -@@ -1739,7 +1755,15 @@ public class PurpurWorldConfig { +@@ -1742,7 +1758,15 @@ public class PurpurWorldConfig { public boolean frogControllable = true; public float frogRidableJumpHeight = 0.65F; public int frogBreedingTicks = 6000; @@ -260,7 +260,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf frogRidable = getBoolean("mobs.frog.ridable", frogRidable); frogRidableInWater = getBoolean("mobs.frog.ridable-in-water", frogRidableInWater); frogControllable = getBoolean("mobs.frog.controllable", frogControllable); -@@ -2685,7 +2709,13 @@ public class PurpurWorldConfig { +@@ -2688,7 +2712,13 @@ public class PurpurWorldConfig { public boolean snifferControllable = true; public double snifferMaxHealth = 14.0D; public int snifferBreedingTicks = 6000; @@ -274,7 +274,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf snifferRidable = getBoolean("mobs.sniffer.ridable", snifferRidable); snifferRidableInWater = getBoolean("mobs.sniffer.ridable-in-water", snifferRidableInWater); snifferControllable = getBoolean("mobs.sniffer.controllable", snifferControllable); -@@ -2784,7 +2814,15 @@ public class PurpurWorldConfig { +@@ -2787,7 +2817,15 @@ public class PurpurWorldConfig { public boolean tadpoleRidable = false; public boolean tadpoleRidableInWater = true; public boolean tadpoleControllable = true; @@ -290,7 +290,7 @@ index 21c15670c0c9b988472ac8e875a1c0332060fac3..60b8b2c797f842a1ba5053a9e9e5d1bf tadpoleRidable = getBoolean("mobs.tadpole.ridable", tadpoleRidable); tadpoleRidableInWater = getBoolean("mobs.tadpole.ridable-in-water", tadpoleRidableInWater); tadpoleControllable = getBoolean("mobs.tadpole.controllable", tadpoleControllable); -@@ -2996,7 +3034,15 @@ public class PurpurWorldConfig { +@@ -2999,7 +3037,15 @@ public class PurpurWorldConfig { public boolean wardenRidable = false; public boolean wardenRidableInWater = true; public boolean wardenControllable = true; diff --git a/patches/server/0077-Use-a-shadow-fork-that-supports-Java-21.patch b/patches/server/0076-Use-a-shadow-fork-that-supports-Java-21.patch similarity index 85% rename from patches/server/0077-Use-a-shadow-fork-that-supports-Java-21.patch rename to patches/server/0076-Use-a-shadow-fork-that-supports-Java-21.patch index c4ca113a..061fd1b4 100644 --- a/patches/server/0077-Use-a-shadow-fork-that-supports-Java-21.patch +++ b/patches/server/0076-Use-a-shadow-fork-that-supports-Java-21.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Use a shadow fork that supports Java 21 diff --git a/build.gradle.kts b/build.gradle.kts -index 5c14f2a186509e9f4a7a525320cc7492be939b7c..6eaa616acb8c6f21c6554b0bead67ac7cf613933 100644 +index 90d705a319323c82a9e19cf70c46c80354a7f3f2..6a96a847c3b0a7af0e187cc2251c3ad275da4c11 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import io.papermc.paperweight.util.* diff --git a/patches/server/0076-Virtual-Thread-for-linear-flusher.patch b/patches/server/0076-Virtual-Thread-for-linear-flusher.patch deleted file mode 100644 index 337a60cc..00000000 --- a/patches/server/0076-Virtual-Thread-for-linear-flusher.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Radiation_pi -Date: Mon, 25 Mar 2024 23:00:19 +0800 -Subject: [PATCH] Virtual Thread for linear flusher - - -diff --git a/src/main/java/org/dreeam/leaf/config/modules/opt/VT4LinearFlusher.java b/src/main/java/org/dreeam/leaf/config/modules/opt/VT4LinearFlusher.java -new file mode 100644 -index 0000000000000000000000000000000000000000..d4576c9930d12548d4302207f61a0eb8b1fa7b7a ---- /dev/null -+++ b/src/main/java/org/dreeam/leaf/config/modules/opt/VT4LinearFlusher.java -@@ -0,0 +1,29 @@ -+package org.dreeam.leaf.config.modules.opt; -+ -+import com.electronwill.nightconfig.core.file.CommentedFileConfig; -+import org.dreeam.leaf.config.ConfigInfo; -+import org.dreeam.leaf.config.EnumConfigCategory; -+import org.dreeam.leaf.config.IConfigModule; -+ -+public class VT4LinearFlusher implements IConfigModule { -+ -+ @Override -+ public EnumConfigCategory getCategory() { -+ return EnumConfigCategory.PERFORMANCE; -+ } -+ -+ @Override -+ public String getBaseName() { -+ return "use_virtual_thread_for_linear_flusher"; -+ } -+ -+ @ConfigInfo(baseName = "enabled") -+ public static boolean enabled = false; -+ -+ @Override -+ public void onLoaded(CommentedFileConfig config) { -+ config.setComment("performance.use_virtual_thread_for_linear_flusher", """ -+ Use the new Virtual Thread introduced in JDK 21 for Linear Region Flusher. -+ """); -+ } -+} -diff --git a/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java -index 0d3d9193e8d8f72141dc155840c5eed1a744761c..dc4cf8dc6ab60b6d691e0d74d141f00d7eaf233d 100644 ---- a/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java -+++ b/src/main/java/org/purpurmc/purpur/region/LinearRegionFileFlusher.java -@@ -4,9 +4,12 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; - - import java.util.Queue; - import java.util.concurrent.*; -+import java.lang.reflect.InvocationTargetException; -+import java.lang.reflect.Method; - - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; -+import org.galemc.gale.virtualthread.VirtualThreadService; - import org.purpurmc.purpur.PurpurConfig; - import org.bukkit.Bukkit; - -@@ -18,12 +21,30 @@ public class LinearRegionFileFlusher { - .setNameFormat("linear-flush-scheduler") - .build() - ); -- private final ExecutorService executor = Executors.newFixedThreadPool( -- PurpurConfig.linearFlushThreads, -- new ThreadFactoryBuilder() -- .setNameFormat("linear-flusher-%d") -- .build() -- ); -+ -+ // Leaf start - Use Virtual Thread for linear region flusher -+ private ExecutorService executor; -+ -+ { -+ try { -+ if (VirtualThreadService.getJavaMajorVersion() >= VirtualThreadService.minimumJavaMajorVersionWithoutFeaturePreview && org.dreeam.leaf.config.modules.opt.VT4LinearFlusher.enabled) { -+ Method newThreadPerTaskExecutor = Executors.class.getMethod("newThreadPerTaskExecutor", ThreadFactory.class); -+ -+ executor = (ExecutorService) newThreadPerTaskExecutor.invoke(null, VirtualThreadService.get().createFactory()); -+ } else { -+ throw new UnsupportedOperationException(); -+ } -+ } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | -+ UnsupportedOperationException e) { -+ LOGGER.error("Failed to create Virtual Thread executor! Fallback to default executor."); -+ executor = Executors.newFixedThreadPool( -+ PurpurConfig.linearFlushThreads, -+ new ThreadFactoryBuilder() -+ .setNameFormat("linear-flusher-%d") -+ .build()); -+ } -+ } -+ // Leaf end - - public LinearRegionFileFlusher() { - Bukkit.getLogger().info("Using " + PurpurConfig.linearFlushThreads + " threads for linear region flushing."); diff --git a/patches/server/0078-Chat-Image-protocol.patch b/patches/server/0077-Chat-Image-protocol.patch similarity index 100% rename from patches/server/0078-Chat-Image-protocol.patch rename to patches/server/0077-Chat-Image-protocol.patch diff --git a/patches/server/0079-Asteor-Bar-protocol.patch b/patches/server/0078-Asteor-Bar-protocol.patch similarity index 100% rename from patches/server/0079-Asteor-Bar-protocol.patch rename to patches/server/0078-Asteor-Bar-protocol.patch diff --git a/patches/server/0080-Mirai-Configurable-chat-message-signatures.patch b/patches/server/0079-Mirai-Configurable-chat-message-signatures.patch similarity index 100% rename from patches/server/0080-Mirai-Configurable-chat-message-signatures.patch rename to patches/server/0079-Mirai-Configurable-chat-message-signatures.patch diff --git a/patches/server/0081-Block-log4j-rce-exploit-in-chat.patch b/patches/server/0080-Block-log4j-rce-exploit-in-chat.patch similarity index 100% rename from patches/server/0081-Block-log4j-rce-exploit-in-chat.patch rename to patches/server/0080-Block-log4j-rce-exploit-in-chat.patch diff --git a/patches/server/0082-Cache-player-profileResult.patch b/patches/server/0081-Cache-player-profileResult.patch similarity index 98% rename from patches/server/0082-Cache-player-profileResult.patch rename to patches/server/0081-Cache-player-profileResult.patch index d451f749..33128e5b 100644 --- a/patches/server/0082-Cache-player-profileResult.patch +++ b/patches/server/0081-Cache-player-profileResult.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Cache player profileResult diff --git a/build.gradle.kts b/build.gradle.kts -index 6eaa616acb8c6f21c6554b0bead67ac7cf613933..370c43af11cd862a31a980549ad822cab2277c05 100644 +index 6a96a847c3b0a7af0e187cc2251c3ad275da4c11..517b7551bfaf546109fd8d4d246c083e9e62f85b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,6 +31,10 @@ dependencies { diff --git a/patches/server/0083-Prevent-change-non-editable-sign-warning-spam-in-con.patch b/patches/server/0082-Prevent-change-non-editable-sign-warning-spam-in-con.patch similarity index 100% rename from patches/server/0083-Prevent-change-non-editable-sign-warning-spam-in-con.patch rename to patches/server/0082-Prevent-change-non-editable-sign-warning-spam-in-con.patch diff --git a/patches/server/0084-Matter-Secure-Seed.patch b/patches/server/0083-Matter-Secure-Seed.patch similarity index 100% rename from patches/server/0084-Matter-Secure-Seed.patch rename to patches/server/0083-Matter-Secure-Seed.patch diff --git a/patches/server/0085-Matter-Seed-Command.patch b/patches/server/0084-Matter-Seed-Command.patch similarity index 100% rename from patches/server/0085-Matter-Seed-Command.patch rename to patches/server/0084-Matter-Seed-Command.patch