Plex-FAWE/worldedit-core/src/main/java/com/boydti/fawe/beta/implementation/packet/ChunkPacket.java

129 lines
3.5 KiB
Java

package com.boydti.fawe.beta.implementation.packet;
import com.boydti.fawe.Fawe;
import com.boydti.fawe.FaweCache;
import com.boydti.fawe.beta.IBlocks;
import com.boydti.fawe.object.FaweOutputStream;
import com.boydti.fawe.object.io.FastByteArrayOutputStream;
import com.sk89q.jnbt.CompoundTag;
import java.util.HashMap;
import java.util.function.Function;
import java.util.function.Supplier;
public class ChunkPacket implements Function<byte[], byte[]>, Supplier<byte[]> {
private final boolean full;
private final Supplier<IBlocks> chunkSupplier;
private IBlocks chunk;
private int chunkX;
private int chunkZ;
private byte[] sectionBytes;
private Object nativePacket;
public ChunkPacket(int chunkX, int chunkZ, Supplier<IBlocks> chunkSupplier, boolean replaceAllSections) {
this.chunkX = chunkX;
this.chunkZ = chunkZ;
this.chunkSupplier = chunkSupplier;
this.full = replaceAllSections;
}
public int getChunkX() {
return chunkX;
}
public int getChunkZ() {
return chunkZ;
}
public synchronized void setPosition(int chunkX, int chunkZ) {
this.chunkX = chunkX;
this.chunkZ = chunkZ;
nativePacket = null;
}
public boolean isFull() {
return full;
}
public IBlocks getChunk() {
if (this.chunk == null) {
synchronized (this) {
if (this.chunk == null) {
this.chunk = chunkSupplier.get();
}
}
}
return chunk;
}
public byte[] getSectionBytes() {
byte[] tmp = this.sectionBytes;
if (tmp == null) {
synchronized (this) {
if (sectionBytes == null) {
IBlocks tmpChunk = getChunk();
byte[] buf = FaweCache.IMP.BYTE_BUFFER_8192.get();
sectionBytes = tmpChunk.toByteArray(buf, tmpChunk.getBitMask(), this.full, Fawe.imp().isChunksStretched());
}
tmp = sectionBytes;
}
}
return tmp;
}
public Object getNativePacket() {
return nativePacket;
}
public void setNativePacket(Object nativePacket) {
this.nativePacket = nativePacket;
}
@Override
@Deprecated
public byte[] get() {
return apply(FaweCache.IMP.BYTE_BUFFER_8192.get());
}
public CompoundTag getHeightMap() {
HashMap<String, Object> map = new HashMap<>();
map.put("MOTION_BLOCKING", new long[36]);
CompoundTag tag = FaweCache.IMP.asTag(map);
// TODO
return tag;
}
@Override
public byte[] apply(byte[] buffer) {
try {
byte[] sectionBytes = getSectionBytes();
FastByteArrayOutputStream baos = new FastByteArrayOutputStream(buffer);
FaweOutputStream fos = new FaweOutputStream(baos);
fos.writeInt(this.chunkX);
fos.writeInt(this.chunkZ);
fos.writeBoolean(this.full);
fos.writeVarInt(getChunk().getBitMask());
fos.writeNBT("", getHeightMap());
fos.writeVarInt(sectionBytes.length);
fos.write(sectionBytes);
// TODO entities / NBT
//Set<CompoundTag> entities = chunk.getEntities();
//Map<BlockVector3, CompoundTag> tiles = chunk.getTiles();
fos.writeVarInt(0); // (Entities / NBT)
return baos.toByteArray();
} catch (Throwable e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}