Minestom/src/main/java/net/minestom/server/instance/batch/ChunkBatch.java

96 lines
2.7 KiB
Java
Raw Normal View History

2020-04-24 03:25:58 +02:00
package net.minestom.server.instance.batch;
2019-08-19 17:04:19 +02:00
2020-04-24 03:25:58 +02:00
import net.minestom.server.data.Data;
import net.minestom.server.instance.Chunk;
import net.minestom.server.instance.ChunkGenerator;
import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.utils.SerializerUtils;
2019-08-23 15:37:38 +02:00
2019-08-19 17:04:19 +02:00
import java.util.ArrayList;
2019-09-23 19:56:08 +02:00
import java.util.Collections;
2019-08-19 17:04:19 +02:00
import java.util.List;
import java.util.function.Consumer;
2019-08-19 17:04:19 +02:00
2019-08-27 05:23:25 +02:00
/**
* Use chunk coordinate (0-16) instead of world's
*/
2020-03-29 20:58:30 +02:00
public class ChunkBatch implements InstanceBatch {
2019-08-19 17:04:19 +02:00
2019-08-24 20:34:01 +02:00
private InstanceContainer instance;
2019-08-19 17:04:19 +02:00
private Chunk chunk;
2019-09-23 19:56:08 +02:00
private List<BlockData> dataList = Collections.synchronizedList(new ArrayList<>());
2019-08-19 17:04:19 +02:00
2019-08-24 20:34:01 +02:00
public ChunkBatch(InstanceContainer instance, Chunk chunk) {
2019-08-19 17:04:19 +02:00
this.instance = instance;
this.chunk = chunk;
}
@Override
2019-09-15 13:42:36 +02:00
public void setBlock(int x, int y, int z, short blockId, Data data) {
2020-02-09 15:34:09 +01:00
addBlockData((byte) x, (byte) y, (byte) z, false, blockId, data);
2019-08-19 17:04:19 +02:00
}
@Override
2019-09-15 13:42:36 +02:00
public void setCustomBlock(int x, int y, int z, short blockId, Data data) {
2020-02-09 15:34:09 +01:00
addBlockData((byte) x, (byte) y, (byte) z, true, blockId, data);
}
private void addBlockData(byte x, byte y, byte z, boolean customBlock, short blockId, Data data) {
2019-09-15 13:42:36 +02:00
BlockData blockData = new BlockData();
2020-02-09 15:34:09 +01:00
blockData.x = x;
blockData.y = y;
blockData.z = z;
blockData.isCustomBlock = customBlock;
2019-09-15 13:42:36 +02:00
blockData.blockId = blockId;
blockData.data = data;
this.dataList.add(blockData);
2019-08-19 17:04:19 +02:00
}
2019-09-07 11:42:33 +02:00
public void flushChunkGenerator(ChunkGenerator chunkGenerator, Consumer<Chunk> callback) {
batchesPool.execute(() -> {
chunkGenerator.generateChunkData(this, chunk.getChunkX(), chunk.getChunkZ());
singleThreadFlush(callback);
});
}
public void flush(Consumer<Chunk> callback) {
2019-09-07 11:42:33 +02:00
batchesPool.execute(() -> {
singleThreadFlush(callback);
});
}
private void singleThreadFlush(Consumer<Chunk> callback) {
2019-08-19 17:04:19 +02:00
synchronized (chunk) {
2019-09-07 11:42:33 +02:00
for (BlockData data : dataList) {
data.apply(chunk);
}
chunk.refreshDataPacket();
instance.sendChunkUpdate(chunk);
if (callback != null)
callback.accept(chunk);
2019-08-19 17:04:19 +02:00
}
}
private class BlockData {
private byte x, y, z;
2019-09-14 19:27:25 +02:00
private boolean isCustomBlock;
2019-08-19 17:04:19 +02:00
private short blockId;
2019-09-15 13:42:36 +02:00
private Data data;
2019-08-19 17:04:19 +02:00
public void apply(Chunk chunk) {
2020-04-05 17:46:29 +02:00
int index = SerializerUtils.chunkCoordToIndex(x, y, z);
2019-09-14 19:27:25 +02:00
if (!isCustomBlock) {
2020-04-05 17:46:29 +02:00
chunk.UNSAFE_setBlock(index, blockId, data);
2019-08-19 17:04:19 +02:00
} else {
2020-04-05 17:46:29 +02:00
chunk.UNSAFE_setCustomBlock(index, blockId, data);
2019-08-19 17:04:19 +02:00
}
}
}
}