diff --git a/prismarine-minecraft-data b/prismarine-minecraft-data index 1e52503a6..fc2078a40 160000 --- a/prismarine-minecraft-data +++ b/prismarine-minecraft-data @@ -1 +1 @@ -Subproject commit 1e52503a6dbabd326bd0fee5e2aba5cd07b2a4f8 +Subproject commit fc2078a404b7b6041a1d60f15b6b2b482890bbfb diff --git a/src/main/java/net/minestom/server/instance/IChunkLoader.java b/src/main/java/net/minestom/server/instance/IChunkLoader.java new file mode 100644 index 000000000..2ec558b10 --- /dev/null +++ b/src/main/java/net/minestom/server/instance/IChunkLoader.java @@ -0,0 +1,8 @@ +package net.minestom.server.instance; + +import java.util.function.Consumer; + +public interface IChunkLoader { + void loadOrCreateChunk(Instance instance, int chunkX, int chunkZ, Consumer callback); + void saveChunk(Chunk chunk, Runnable callback); +} diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index feac75179..c221347e0 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -35,7 +35,6 @@ import java.util.function.Consumer; public abstract class Instance implements BlockModifier, EventHandler, DataContainer { - protected static final ChunkLoader CHUNK_LOADER_IO = new ChunkLoader(); protected static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); private Dimension dimension; diff --git a/src/main/java/net/minestom/server/instance/InstanceContainer.java b/src/main/java/net/minestom/server/instance/InstanceContainer.java index 5edfc61ee..b4e2d9cae 100644 --- a/src/main/java/net/minestom/server/instance/InstanceContainer.java +++ b/src/main/java/net/minestom/server/instance/InstanceContainer.java @@ -54,6 +54,7 @@ public class InstanceContainer extends Instance { private ReadWriteLock changingBlockLock = new ReentrantReadWriteLock(); private Map currentlyChangingBlocks = new HashMap<>(); + private IChunkLoader chunkLoader; private boolean autoChunkLoad; @@ -61,9 +62,12 @@ public class InstanceContainer extends Instance { super(uniqueId, dimension); this.storageFolder = storageFolder; + chunkLoader = new MinestomBasicChunkLoader(storageFolder); - if (storageFolder == null) + if (storageFolder == null) { return; + } + // Retrieve instance data this.uniqueId = storageFolder.getOrDefault(UUID_KEY, UUID.class, uniqueId); @@ -360,7 +364,7 @@ public class InstanceContainer extends Instance { @Override public void saveChunkToStorageFolder(Chunk chunk, Runnable callback) { Check.notNull(getStorageFolder(), "You cannot save the chunk if no StorageFolder has been defined"); - CHUNK_LOADER_IO.saveChunk(chunk, getStorageFolder(), callback); + chunkLoader.saveChunk(chunk, callback); } @Override @@ -387,17 +391,11 @@ public class InstanceContainer extends Instance { @Override protected void retrieveChunk(int chunkX, int chunkZ, Consumer callback) { - if (storageFolder != null) { - // Load from file if possible - CHUNK_LOADER_IO.loadChunk(this, chunkX, chunkZ, getStorageFolder(), chunk -> { - cacheChunk(chunk); - if (callback != null) - callback.accept(chunk); - }); - } else { - // Folder isn't defined, create new chunk - createChunk(chunkX, chunkZ, callback); - } + chunkLoader.loadOrCreateChunk(this, chunkX, chunkZ, chunk -> { + cacheChunk(chunk); + if (callback != null) + callback.accept(chunk); + }); } @Override @@ -499,6 +497,14 @@ public class InstanceContainer extends Instance { this.storageFolder = storageFolder; } + public IChunkLoader getChunkLoader() { + return chunkLoader; + } + + public void setChunkLoader(IChunkLoader chunkLoader) { + this.chunkLoader = chunkLoader; + } + private void sendBlockChange(Chunk chunk, BlockPosition blockPosition, short blockId) { BlockChangePacket blockChangePacket = new BlockChangePacket(); blockChangePacket.blockPosition = blockPosition; diff --git a/src/main/java/net/minestom/server/instance/ChunkLoader.java b/src/main/java/net/minestom/server/instance/MinestomBasicChunkLoader.java similarity index 54% rename from src/main/java/net/minestom/server/instance/ChunkLoader.java rename to src/main/java/net/minestom/server/instance/MinestomBasicChunkLoader.java index 168e06343..18a7f4de9 100644 --- a/src/main/java/net/minestom/server/instance/ChunkLoader.java +++ b/src/main/java/net/minestom/server/instance/MinestomBasicChunkLoader.java @@ -2,17 +2,28 @@ package net.minestom.server.instance; import net.minestom.server.reader.ChunkReader; import net.minestom.server.storage.StorageFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.function.Consumer; -public class ChunkLoader { +public class MinestomBasicChunkLoader implements IChunkLoader { - private static String getChunkKey(int chunkX, int chunkZ) { - return chunkX + "." + chunkZ; + private final static Logger LOGGER = LoggerFactory.getLogger(MinestomBasicChunkLoader.class); + private StorageFolder storageFolder; + + public MinestomBasicChunkLoader(StorageFolder storageFolder) { + this.storageFolder = storageFolder; } - protected void saveChunk(Chunk chunk, StorageFolder storageFolder, Runnable callback) { + @Override + public void saveChunk(Chunk chunk, Runnable callback) { + if(storageFolder == null) { + callback.run(); + LOGGER.warn("No folder to save chunk!"); + return; + } int chunkX = chunk.getChunkX(); int chunkZ = chunk.getChunkZ(); @@ -27,8 +38,9 @@ public class ChunkLoader { } } - protected void loadChunk(Instance instance, int chunkX, int chunkZ, StorageFolder storageFolder, Consumer callback) { - byte[] bytes = storageFolder.get(getChunkKey(chunkX, chunkZ)); + @Override + public void loadOrCreateChunk(Instance instance, int chunkX, int chunkZ, Consumer callback) { + byte[] bytes = storageFolder == null ? null : storageFolder.get(getChunkKey(chunkX, chunkZ)); if (bytes == null) { // Not found, create a new chunk @@ -39,5 +51,9 @@ public class ChunkLoader { } } + private static String getChunkKey(int chunkX, int chunkZ) { + return chunkX + "." + chunkZ; + } + }