Customizable chunk loader for InstanceContainers

This commit is contained in:
jglrxavpok 2020-06-30 18:07:47 +02:00
parent 4ffde8feed
commit 1ddef81372
5 changed files with 50 additions and 21 deletions

@ -1 +1 @@
Subproject commit 1e52503a6dbabd326bd0fee5e2aba5cd07b2a4f8
Subproject commit fc2078a404b7b6041a1d60f15b6b2b482890bbfb

View File

@ -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<Chunk> callback);
void saveChunk(Chunk chunk, Runnable callback);
}

View File

@ -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;

View File

@ -54,6 +54,7 @@ public class InstanceContainer extends Instance {
private ReadWriteLock changingBlockLock = new ReentrantReadWriteLock();
private Map<BlockPosition, Block> 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<Chunk> 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;

View File

@ -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<Chunk> callback) {
byte[] bytes = storageFolder.get(getChunkKey(chunkX, chunkZ));
@Override
public void loadOrCreateChunk(Instance instance, int chunkX, int chunkZ, Consumer<Chunk> 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;
}
}