Block serialization
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
package mc.world.generated_world;
|
||||
|
||||
import mc.core.block.Block;
|
||||
import mc.core.block.BlockFactory;
|
||||
import mc.core.block.BlockType;
|
||||
import mc.core.serialization.BlockDeserializer;
|
||||
import mc.core.serialization.BlockSerializer;
|
||||
import mc.core.world.Chunk;
|
||||
|
||||
/**
|
||||
* Prototype
|
||||
*/
|
||||
public class BlockSerializerDeserializer implements BlockSerializer, BlockDeserializer {
|
||||
|
||||
private BlockFactory blockFactory;
|
||||
private Chunk chunk;
|
||||
|
||||
public BlockSerializerDeserializer(BlockFactory blockFactory, Chunk chunk) {
|
||||
this.blockFactory = blockFactory;
|
||||
this.chunk = chunk;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Block deserialize(byte[] bytes) {
|
||||
int id = bytes[0] + 128;
|
||||
int meta = bytes[1] >> 4;
|
||||
int x = (bytes[1] & 0xf) + chunk.getX() * 16;
|
||||
int y = bytes[2] >> 4 + chunk.getY() * 16;
|
||||
int z = (bytes[2] & 0xf) + chunk.getZ() * 16;
|
||||
BlockType type = BlockType.values()[id];
|
||||
Block block = blockFactory.create(type, meta);
|
||||
block.getLocation().setX(x);
|
||||
block.getLocation().setY(y);
|
||||
block.getLocation().setZ(z);
|
||||
return block;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] serialize(Block block) {
|
||||
byte[] bytes = new byte[3];
|
||||
bytes[0] = (byte) ((block.getId() - 128) & 0xff);
|
||||
bytes[1] = (byte) ((block.getMeta() << 4) | (block.getLocation().getBlockX() % 16));
|
||||
bytes[2] = (byte) (((block.getLocation().getBlockZ() % 16) << 4) | (block.getLocation().getBlockZ() % 16));
|
||||
return bytes;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user