diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java b/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java index 3226ca3ff..e8ca88f67 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java @@ -8,12 +8,11 @@ import java.util.HashMap; public class Chunk { private final HashMap blocks; - public Chunk() { - blocks = new HashMap<>(); + public Chunk(HashMap blocks) { + this.blocks = blocks; } public WorldBlock getWorldBlock(ChunkLocation loc) { - //ToDo will return air if null return blocks.get(loc); } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java index c71f6fc55..ef0898239 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java @@ -1,5 +1,7 @@ package de.bixilon.minosoft.game.datatypes; +import de.bixilon.minosoft.game.datatypes.blocks.Blocks; + import java.util.HashMap; /** @@ -7,9 +9,13 @@ import java.util.HashMap; */ public class ChunkColumn { private final HashMap chunks; + final int x; + final int z; public ChunkColumn(int x, int z) { chunks = new HashMap<>(); + this.x = x; + this.z = z; } public WorldBlock getWorldBlock(byte x, short y, byte z) { @@ -17,7 +23,14 @@ public class ChunkColumn { throw new IllegalArgumentException(String.format("Invalid chunk location %s %s %s", x, y, z)); } byte heightNumber = (byte) (y / 16); - return chunks.get(heightNumber).getWorldBlock(x, (byte) (y - (heightNumber * 16)), z); + BlockPosition pos = new BlockPosition(this.x * 16 + x, y, this.z * 16 + z); + if (heightNumber == 0) { + return Blocks.getBlockInstance(Blocks.DIRT, pos); + } else { + return Blocks.getBlockInstance(Blocks.AIR, pos); + } + //ToDo + //return chunks.get(heightNumber).getWorldBlock(x, (byte) (y - (heightNumber * 16)), z); } } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/World.java b/src/main/java/de/bixilon/minosoft/game/datatypes/World.java index 4a1298fdd..481eadd35 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/World.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/World.java @@ -19,6 +19,8 @@ public class World { } public ChunkColumn getChunkColumn(ChunkColumnLocation loc) { - return chunks.get(loc); + return new ChunkColumn(loc.getX(), loc.getZ()); + //ToDo + //return chunks.get(loc); } } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java b/src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java index 6ab7dc1cd..71dd8b8ac 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java @@ -3,5 +3,6 @@ package de.bixilon.minosoft.game.datatypes; /** * Basically raw chunk stuff. This is not a block like dirt (it can be). Can be dirt, a flower, fire, torch, sapling, fluid (water/lava), nether wart, banner, ... */ -public class WorldBlock { +public interface WorldBlock { + BlockPosition getBlockPosition(); } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Air.java b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Air.java new file mode 100644 index 000000000..e15902db7 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Air.java @@ -0,0 +1,26 @@ +package de.bixilon.minosoft.game.datatypes.blocks; + +import de.bixilon.minosoft.game.datatypes.BlockPosition; + +public class Air implements Block { + final BlockPosition position; + + public Air(BlockPosition position) { + this.position = position; + } + + @Override + public BlockPosition getBlockPosition() { + return position; + } + + @Override + public int getLegacyId() { + return 0; + } + + @Override + public String getLegacyIdentifier() { + return "minecraft:air"; + } +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Block.java b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Block.java new file mode 100644 index 000000000..254f0062e --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Block.java @@ -0,0 +1,11 @@ +package de.bixilon.minosoft.game.datatypes.blocks; + +import de.bixilon.minosoft.game.datatypes.WorldBlock; + +public interface Block extends WorldBlock { + + String getLegacyIdentifier(); + + int getLegacyId(); + +} \ No newline at end of file diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Blocks.java b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Blocks.java new file mode 100644 index 000000000..e9c491245 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Blocks.java @@ -0,0 +1,33 @@ +package de.bixilon.minosoft.game.datatypes.blocks; + +import de.bixilon.minosoft.game.datatypes.BlockPosition; + +import java.lang.reflect.InvocationTargetException; + +public enum Blocks { + DIRT(Dirt.class), + AIR(Air.class); + + private final Class clazz; + + Blocks(Class clazz) { + this.clazz = clazz; + } + + public static Block getBlockInstance(Class clazz, BlockPosition pos) { + try { + return clazz.getConstructor(BlockPosition.class).newInstance(pos); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + e.printStackTrace(); + throw new RuntimeException("Invalid block constructor!"); + } + } + + public static Block getBlockInstance(Blocks b, BlockPosition pos) { + return getBlockInstance(b.getClazz(), pos); + } + + public Class getClazz() { + return clazz; + } +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Dirt.java b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Dirt.java new file mode 100644 index 000000000..27a063986 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Dirt.java @@ -0,0 +1,26 @@ +package de.bixilon.minosoft.game.datatypes.blocks; + +import de.bixilon.minosoft.game.datatypes.BlockPosition; + +public class Dirt implements Block { + final BlockPosition position; + + public Dirt(BlockPosition position) { + this.position = position; + } + + @Override + public BlockPosition getBlockPosition() { + return position; + } + + @Override + public int getLegacyId() { + return 0; + } + + @Override + public String getLegacyIdentifier() { + return "minecraft:dirt"; + } +}