From be91e114df0b5b35919965d00145fca72eca53df Mon Sep 17 00:00:00 2001 From: Forwolk Date: Thu, 26 Jul 2018 13:51:46 +0300 Subject: [PATCH] Block serialization --- .../java/mc/core/block/AbstractBlock.java | 7 ++- core/src/main/java/mc/core/block/Block.java | 12 ++--- .../main/java/mc/core/block/BlockFactory.java | 17 +++++++ .../core/serialization/BlockDeserializer.java | 6 +++ .../core/serialization/BlockSerializer.java | 6 +++ .../mc/core/serialization/Deserializer.java | 5 ++ .../mc/core/serialization/Serializer.java | 5 ++ .../BlockSerializerDeserializer.java | 46 +++++++++++++++++++ 8 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 core/src/main/java/mc/core/block/BlockFactory.java create mode 100644 core/src/main/java/mc/core/serialization/BlockDeserializer.java create mode 100644 core/src/main/java/mc/core/serialization/BlockSerializer.java create mode 100644 core/src/main/java/mc/core/serialization/Deserializer.java create mode 100644 core/src/main/java/mc/core/serialization/Serializer.java create mode 100644 generated_world/src/main/java/mc/world/generated_world/BlockSerializerDeserializer.java diff --git a/core/src/main/java/mc/core/block/AbstractBlock.java b/core/src/main/java/mc/core/block/AbstractBlock.java index 7b17761..11f3f7f 100644 --- a/core/src/main/java/mc/core/block/AbstractBlock.java +++ b/core/src/main/java/mc/core/block/AbstractBlock.java @@ -7,7 +7,7 @@ import mc.core.Location; public abstract class AbstractBlock implements Block { @Getter@Setter private Location location; - @Getter@Setter + @Getter private int meta; @Getter private final BlockType blockType; @@ -16,6 +16,11 @@ public abstract class AbstractBlock implements Block { this.blockType = type; } + protected AbstractBlock(BlockType type, int meta) { + this.blockType = type; + this.meta = meta; + } + @Override public int getId() { return blockType.getId(); diff --git a/core/src/main/java/mc/core/block/Block.java b/core/src/main/java/mc/core/block/Block.java index a34f328..ea03afb 100644 --- a/core/src/main/java/mc/core/block/Block.java +++ b/core/src/main/java/mc/core/block/Block.java @@ -3,20 +3,20 @@ package mc.core.block; import mc.core.Location; /** - * Serialize info about block + * Serialization block info * * +------------+--------+------------+ * | param | range | bits | * +------------+--------+------------+ - * | id | 0-255 | 8 | + * | id | 0:255 | 8 | * +------------+--------+------------+ - * | meta | 0-15 | 4 | + * | meta | 0:15 | 4 | * +------------+--------+------------+ - * | x | 0-15 | 4 | + * | x | 0:15 | 4 | * +------------+--------+------------+ - * | y | 0-15 | 4 | + * | y | 0:15 | 4 | * +------------+--------+------------+ - * | z | 0-15 | 4 | + * | z | 0:15 | 4 | * +------------+--------+------------+ * * Total: 24 bits per block (3 bytes) diff --git a/core/src/main/java/mc/core/block/BlockFactory.java b/core/src/main/java/mc/core/block/BlockFactory.java new file mode 100644 index 0000000..2007c48 --- /dev/null +++ b/core/src/main/java/mc/core/block/BlockFactory.java @@ -0,0 +1,17 @@ +package mc.core.block; + +public class BlockFactory { + + public Block create(BlockType blockType, int meta) { + return new EmbeddedBlock(blockType, meta); + } + + /** + * For first-time generation + */ + private class EmbeddedBlock extends AbstractBlock { + EmbeddedBlock(BlockType type, int meta) { + super(type, meta); + } + } +} diff --git a/core/src/main/java/mc/core/serialization/BlockDeserializer.java b/core/src/main/java/mc/core/serialization/BlockDeserializer.java new file mode 100644 index 0000000..dfdbc89 --- /dev/null +++ b/core/src/main/java/mc/core/serialization/BlockDeserializer.java @@ -0,0 +1,6 @@ +package mc.core.serialization; + +import mc.core.block.Block; + +public interface BlockDeserializer extends Deserializer { +} diff --git a/core/src/main/java/mc/core/serialization/BlockSerializer.java b/core/src/main/java/mc/core/serialization/BlockSerializer.java new file mode 100644 index 0000000..1e5730d --- /dev/null +++ b/core/src/main/java/mc/core/serialization/BlockSerializer.java @@ -0,0 +1,6 @@ +package mc.core.serialization; + +import mc.core.block.Block; + +public interface BlockSerializer extends Serializer { +} diff --git a/core/src/main/java/mc/core/serialization/Deserializer.java b/core/src/main/java/mc/core/serialization/Deserializer.java new file mode 100644 index 0000000..ab4332b --- /dev/null +++ b/core/src/main/java/mc/core/serialization/Deserializer.java @@ -0,0 +1,5 @@ +package mc.core.serialization; + +public interface Deserializer { + T deserialize (byte[] bytes); +} diff --git a/core/src/main/java/mc/core/serialization/Serializer.java b/core/src/main/java/mc/core/serialization/Serializer.java new file mode 100644 index 0000000..8823b3c --- /dev/null +++ b/core/src/main/java/mc/core/serialization/Serializer.java @@ -0,0 +1,5 @@ +package mc.core.serialization; + +public interface Serializer { + byte[] serialize (T t); +} diff --git a/generated_world/src/main/java/mc/world/generated_world/BlockSerializerDeserializer.java b/generated_world/src/main/java/mc/world/generated_world/BlockSerializerDeserializer.java new file mode 100644 index 0000000..718a420 --- /dev/null +++ b/generated_world/src/main/java/mc/world/generated_world/BlockSerializerDeserializer.java @@ -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; + } +}