From 9ec258c526fac9d8b14d985f6c2cc5df3f96817b Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 7 May 2025 20:03:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=B8=80=E8=88=AC=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LegacySlimeFormatStorageAdaptor.java | 5 +++- .../slimeworld/SlimeFormatStorageAdaptor.java | 5 +++- bukkit/loader/src/main/resources/config.yml | 4 ++-- ...ionFileStorage.java => CachedStorage.java} | 24 +++++++++++++------ .../chunk/storage/DefaultStorageAdaptor.java | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) rename core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/{CachedDefaultRegionFileStorage.java => CachedStorage.java} (67%) diff --git a/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeFormatStorageAdaptor.java b/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeFormatStorageAdaptor.java index 872e50bf8..982f91c5e 100644 --- a/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeFormatStorageAdaptor.java +++ b/bukkit/compatibility/legacy/src/main/java/net/momirealms/craftengine/bukkit/compatibility/legacy/slimeworld/LegacySlimeFormatStorageAdaptor.java @@ -2,8 +2,10 @@ package net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld; import com.infernalsuite.aswm.api.events.LoadSlimeWorldEvent; import com.infernalsuite.aswm.api.world.SlimeWorld; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldManager; +import net.momirealms.craftengine.core.world.chunk.storage.CachedStorage; import net.momirealms.craftengine.core.world.chunk.storage.DefaultStorageAdaptor; import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage; import org.bukkit.Bukkit; @@ -22,7 +24,8 @@ public class LegacySlimeFormatStorageAdaptor extends DefaultStorageAdaptor imple @EventHandler public void onWorldLoad(LoadSlimeWorldEvent event) { org.bukkit.World world = Bukkit.getWorld(event.getSlimeWorld().getName()); - this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), new LegacySlimeWorldDataStorage(event.getSlimeWorld()))); + this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), + Config.enableChunkCache() ? new CachedStorage<>(new LegacySlimeWorldDataStorage(event.getSlimeWorld())) : new LegacySlimeWorldDataStorage(event.getSlimeWorld()))); } public LegacySlimeFormatStorageAdaptor(WorldManager worldManager, int version) { diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeFormatStorageAdaptor.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeFormatStorageAdaptor.java index b01a6e1c1..2c02934a8 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeFormatStorageAdaptor.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/slimeworld/SlimeFormatStorageAdaptor.java @@ -3,9 +3,11 @@ package net.momirealms.craftengine.bukkit.compatibility.slimeworld; import com.infernalsuite.asp.api.AdvancedSlimePaperAPI; import com.infernalsuite.asp.api.events.LoadSlimeWorldEvent; import com.infernalsuite.asp.api.world.SlimeWorld; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.ReflectionUtils; import net.momirealms.craftengine.core.world.World; import net.momirealms.craftengine.core.world.WorldManager; +import net.momirealms.craftengine.core.world.chunk.storage.CachedStorage; import net.momirealms.craftengine.core.world.chunk.storage.DefaultStorageAdaptor; import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage; import org.bukkit.Bukkit; @@ -24,7 +26,8 @@ public class SlimeFormatStorageAdaptor extends DefaultStorageAdaptor implements @EventHandler public void onWorldLoad(LoadSlimeWorldEvent event) { org.bukkit.World world = Bukkit.getWorld(event.getSlimeWorld().getName()); - this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), new SlimeWorldDataStorage(event.getSlimeWorld(), this))); + this.worldManager.loadWorld(this.worldManager.createWorld(this.worldManager.wrap(world), + Config.enableChunkCache() ? new CachedStorage<>(new SlimeWorldDataStorage(event.getSlimeWorld(), this)) : new SlimeWorldDataStorage(event.getSlimeWorld(), this))); } public SlimeFormatStorageAdaptor(WorldManager worldManager) { diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 1c9c98fa2..297be7fe4 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -357,11 +357,11 @@ chunk-system: # Settings for injection injection: # Requires a restart to apply - # SECTION: Inject the LevelChunkSection (Faster, but may conflict with some plugins) + # SECTION: Inject the LevelChunkSection (Faster & Experimental) since 0.0.53 # PALETTE: Inject the PalettedContainer target: PALETTE # Enables faster injection method - # Note: May not work with certain server forks that alter chunk saving behavior + # Note: May not work with certain server forks that alter chunk class structure (In most cases it won't conflict) use-fast-method: false # Auto-convert custom blocks -> vanilla blocks when unloading chunks # diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedStorage.java similarity index 67% rename from core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java rename to core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedStorage.java index 782bbd90b..9cc9d5d5e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedDefaultRegionFileStorage.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CachedStorage.java @@ -10,14 +10,14 @@ import net.momirealms.craftengine.core.world.chunk.CEChunk; import org.jetbrains.annotations.NotNull; import java.io.IOException; -import java.nio.file.Path; import java.util.concurrent.TimeUnit; -public class CachedDefaultRegionFileStorage extends DefaultRegionFileStorage { +public class CachedStorage implements WorldDataStorage { + private final T storage; private final Cache chunkCache; - public CachedDefaultRegionFileStorage(Path directory) { - super(directory); + public CachedStorage(T storage) { + this.storage = storage; this.chunkCache = Caffeine.newBuilder() .executor(CraftEngine.instance().scheduler().async()) .scheduler(Scheduler.systemScheduler()) @@ -31,13 +31,23 @@ public class CachedDefaultRegionFileStorage extends DefaultRegionFileStorage { if (chunk != null) { return chunk; } - chunk = super.readChunkAt(world, pos); + chunk = this.storage.readChunkAt(world, pos); this.chunkCache.put(pos, chunk); return chunk; } @Override - public synchronized void close() throws IOException { - super.close(); + public void writeChunkAt(@NotNull ChunkPos pos, @NotNull CEChunk chunk) throws IOException { + this.storage.writeChunkAt(pos, chunk); + } + + @Override + public void close() throws IOException { + this.storage.close(); + } + + @Override + public void flush() throws IOException { + this.storage.flush(); } } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java index 281add860..6b669241f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultStorageAdaptor.java @@ -10,7 +10,7 @@ public class DefaultStorageAdaptor implements StorageAdaptor { @Override public @NotNull WorldDataStorage adapt(@NotNull World world) { if (Config.enableChunkCache()) { - return new CachedDefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY)); + return new CachedStorage<>(new DefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY))); } else { return new DefaultRegionFileStorage(world.directory().resolve(CEWorld.REGION_DIRECTORY)); }