mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-29 15:07:36 +02:00
Customizable chunk loader for InstanceContainers
This commit is contained in:
parent
4ffde8feed
commit
1ddef81372
@ -1 +1 @@
|
|||||||
Subproject commit 1e52503a6dbabd326bd0fee5e2aba5cd07b2a4f8
|
Subproject commit fc2078a404b7b6041a1d60f15b6b2b482890bbfb
|
@ -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);
|
||||||
|
}
|
@ -35,7 +35,6 @@ import java.util.function.Consumer;
|
|||||||
|
|
||||||
public abstract class Instance implements BlockModifier, EventHandler, DataContainer {
|
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();
|
protected static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager();
|
||||||
|
|
||||||
private Dimension dimension;
|
private Dimension dimension;
|
||||||
|
@ -54,6 +54,7 @@ public class InstanceContainer extends Instance {
|
|||||||
|
|
||||||
private ReadWriteLock changingBlockLock = new ReentrantReadWriteLock();
|
private ReadWriteLock changingBlockLock = new ReentrantReadWriteLock();
|
||||||
private Map<BlockPosition, Block> currentlyChangingBlocks = new HashMap<>();
|
private Map<BlockPosition, Block> currentlyChangingBlocks = new HashMap<>();
|
||||||
|
private IChunkLoader chunkLoader;
|
||||||
|
|
||||||
private boolean autoChunkLoad;
|
private boolean autoChunkLoad;
|
||||||
|
|
||||||
@ -61,9 +62,12 @@ public class InstanceContainer extends Instance {
|
|||||||
super(uniqueId, dimension);
|
super(uniqueId, dimension);
|
||||||
|
|
||||||
this.storageFolder = storageFolder;
|
this.storageFolder = storageFolder;
|
||||||
|
chunkLoader = new MinestomBasicChunkLoader(storageFolder);
|
||||||
|
|
||||||
if (storageFolder == null)
|
if (storageFolder == null) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Retrieve instance data
|
// Retrieve instance data
|
||||||
this.uniqueId = storageFolder.getOrDefault(UUID_KEY, UUID.class, uniqueId);
|
this.uniqueId = storageFolder.getOrDefault(UUID_KEY, UUID.class, uniqueId);
|
||||||
|
|
||||||
@ -360,7 +364,7 @@ public class InstanceContainer extends Instance {
|
|||||||
@Override
|
@Override
|
||||||
public void saveChunkToStorageFolder(Chunk chunk, Runnable callback) {
|
public void saveChunkToStorageFolder(Chunk chunk, Runnable callback) {
|
||||||
Check.notNull(getStorageFolder(), "You cannot save the chunk if no StorageFolder has been defined");
|
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
|
@Override
|
||||||
@ -387,17 +391,11 @@ public class InstanceContainer extends Instance {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void retrieveChunk(int chunkX, int chunkZ, Consumer<Chunk> callback) {
|
protected void retrieveChunk(int chunkX, int chunkZ, Consumer<Chunk> callback) {
|
||||||
if (storageFolder != null) {
|
chunkLoader.loadOrCreateChunk(this, chunkX, chunkZ, chunk -> {
|
||||||
// Load from file if possible
|
|
||||||
CHUNK_LOADER_IO.loadChunk(this, chunkX, chunkZ, getStorageFolder(), chunk -> {
|
|
||||||
cacheChunk(chunk);
|
cacheChunk(chunk);
|
||||||
if (callback != null)
|
if (callback != null)
|
||||||
callback.accept(chunk);
|
callback.accept(chunk);
|
||||||
});
|
});
|
||||||
} else {
|
|
||||||
// Folder isn't defined, create new chunk
|
|
||||||
createChunk(chunkX, chunkZ, callback);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -499,6 +497,14 @@ public class InstanceContainer extends Instance {
|
|||||||
this.storageFolder = storageFolder;
|
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) {
|
private void sendBlockChange(Chunk chunk, BlockPosition blockPosition, short blockId) {
|
||||||
BlockChangePacket blockChangePacket = new BlockChangePacket();
|
BlockChangePacket blockChangePacket = new BlockChangePacket();
|
||||||
blockChangePacket.blockPosition = blockPosition;
|
blockChangePacket.blockPosition = blockPosition;
|
||||||
|
@ -2,17 +2,28 @@ package net.minestom.server.instance;
|
|||||||
|
|
||||||
import net.minestom.server.reader.ChunkReader;
|
import net.minestom.server.reader.ChunkReader;
|
||||||
import net.minestom.server.storage.StorageFolder;
|
import net.minestom.server.storage.StorageFolder;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class ChunkLoader {
|
public class MinestomBasicChunkLoader implements IChunkLoader {
|
||||||
|
|
||||||
private static String getChunkKey(int chunkX, int chunkZ) {
|
private final static Logger LOGGER = LoggerFactory.getLogger(MinestomBasicChunkLoader.class);
|
||||||
return chunkX + "." + chunkZ;
|
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 chunkX = chunk.getChunkX();
|
||||||
int chunkZ = chunk.getChunkZ();
|
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) {
|
@Override
|
||||||
byte[] bytes = storageFolder.get(getChunkKey(chunkX, chunkZ));
|
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) {
|
if (bytes == null) {
|
||||||
// Not found, create a new chunk
|
// Not found, create a new chunk
|
||||||
@ -39,5 +51,9 @@ public class ChunkLoader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String getChunkKey(int chunkX, int chunkZ) {
|
||||||
|
return chunkX + "." + chunkZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user