From faab6664c69039689bd4df387a3eea007ce89926 Mon Sep 17 00:00:00 2001 From: bixilon Date: Wed, 3 Jun 2020 15:21:22 +0200 Subject: [PATCH] wip world data types (chunk, ...) --- .../datatypes}/BlockPosition.java | 5 ++- .../minosoft/game/datatypes/Chunk.java | 23 ++++++++++++ .../minosoft/game/datatypes/ChunkColumn.java | 23 ++++++++++++ .../game/datatypes/ChunkColumnLocation.java | 31 ++++++++++++++++ .../game/datatypes/ChunkLocation.java | 37 +++++++++++++++++++ .../datatypes}/Difficulty.java | 2 +- .../datatypes}/Dimension.java | 2 +- .../{objects => game/datatypes}/GameMode.java | 2 +- .../datatypes}/LevelType.java | 2 +- .../minosoft/game/datatypes/World.java | 24 ++++++++++++ .../minosoft/game/datatypes/WorldBlock.java | 7 ++++ .../clientbound/play/PacketJoinGame.java | 8 ++-- .../protocol/protocol/InByteBuffer.java | 2 +- .../protocol/protocol/OutByteBuffer.java | 2 +- 14 files changed, 159 insertions(+), 11 deletions(-) rename src/main/java/de/bixilon/minosoft/{objects => game/datatypes}/BlockPosition.java (83%) create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumnLocation.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/ChunkLocation.java rename src/main/java/de/bixilon/minosoft/{objects => game/datatypes}/Difficulty.java (90%) rename src/main/java/de/bixilon/minosoft/{objects => game/datatypes}/Dimension.java (89%) rename src/main/java/de/bixilon/minosoft/{objects => game/datatypes}/GameMode.java (90%) rename src/main/java/de/bixilon/minosoft/{objects => game/datatypes}/LevelType.java (92%) create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/World.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java diff --git a/src/main/java/de/bixilon/minosoft/objects/BlockPosition.java b/src/main/java/de/bixilon/minosoft/game/datatypes/BlockPosition.java similarity index 83% rename from src/main/java/de/bixilon/minosoft/objects/BlockPosition.java rename to src/main/java/de/bixilon/minosoft/game/datatypes/BlockPosition.java index 7b32d9036..11f10fd9a 100644 --- a/src/main/java/de/bixilon/minosoft/objects/BlockPosition.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/BlockPosition.java @@ -1,4 +1,4 @@ -package de.bixilon.minosoft.objects; +package de.bixilon.minosoft.game.datatypes; public class BlockPosition { int x; @@ -27,6 +27,9 @@ public class BlockPosition { @Override public boolean equals(Object obj) { + if (super.equals(obj)) { + return true; + } BlockPosition pos = (BlockPosition) obj; return pos.getX() == getX() && pos.getY() == getY() && pos.getZ() == getZ(); } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java b/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java new file mode 100644 index 000000000..3226ca3ff --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java @@ -0,0 +1,23 @@ +package de.bixilon.minosoft.game.datatypes; + +import java.util.HashMap; + +/** + * Collection of 16x16x16 blocks + */ +public class Chunk { + private final HashMap blocks; + + public Chunk() { + blocks = new HashMap<>(); + } + + public WorldBlock getWorldBlock(ChunkLocation loc) { + //ToDo will return air if null + return blocks.get(loc); + } + + public WorldBlock getWorldBlock(byte x, byte y, byte z) { + return getWorldBlock(new ChunkLocation(x, y, z)); + } +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java new file mode 100644 index 000000000..c71f6fc55 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java @@ -0,0 +1,23 @@ +package de.bixilon.minosoft.game.datatypes; + +import java.util.HashMap; + +/** + * Collection of 16 chunks + */ +public class ChunkColumn { + private final HashMap chunks; + + public ChunkColumn(int x, int z) { + chunks = new HashMap<>(); + } + + public WorldBlock getWorldBlock(byte x, short y, byte z) { + if (x > 16 || y > 255 || z > 16 || x < 0 || y < 0 || z < 0) { + 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); + } + +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumnLocation.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumnLocation.java new file mode 100644 index 000000000..a676f971d --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumnLocation.java @@ -0,0 +1,31 @@ +package de.bixilon.minosoft.game.datatypes; + +/** + * Chunk X and Z location (block position / 16, rounded down) + */ +public class ChunkColumnLocation { + int x; + int z; + + public ChunkColumnLocation(int x, int z) { + this.x = x; + this.z = z; + } + + public int getX() { + return x; + } + + public int getZ() { + return z; + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + return true; + } + ChunkColumnLocation that = (ChunkColumnLocation) obj; + return getX() == that.getX() && getZ() == that.getZ(); + } +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkLocation.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkLocation.java new file mode 100644 index 000000000..2c38fb3cb --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkLocation.java @@ -0,0 +1,37 @@ +package de.bixilon.minosoft.game.datatypes; + +/** + * Chunk X, Y and Z location (max 16x16x16) + */ +public class ChunkLocation { + byte x; + byte y; + byte z; + + public ChunkLocation(byte x, byte y, byte z) { + this.x = x; + this.y = y; + this.z = z; + } + + public byte getX() { + return x; + } + + public byte getY() { + return y; + } + + public byte getZ() { + return z; + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + return true; + } + ChunkLocation that = (ChunkLocation) obj; + return getX() == that.getX() && getY() == that.getY() && getZ() == that.getZ(); + } +} diff --git a/src/main/java/de/bixilon/minosoft/objects/Difficulty.java b/src/main/java/de/bixilon/minosoft/game/datatypes/Difficulty.java similarity index 90% rename from src/main/java/de/bixilon/minosoft/objects/Difficulty.java rename to src/main/java/de/bixilon/minosoft/game/datatypes/Difficulty.java index 1b943e6f3..0101ffc4d 100644 --- a/src/main/java/de/bixilon/minosoft/objects/Difficulty.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/Difficulty.java @@ -1,4 +1,4 @@ -package de.bixilon.minosoft.objects; +package de.bixilon.minosoft.game.datatypes; public enum Difficulty { PEACEFUL(0), diff --git a/src/main/java/de/bixilon/minosoft/objects/Dimension.java b/src/main/java/de/bixilon/minosoft/game/datatypes/Dimension.java similarity index 89% rename from src/main/java/de/bixilon/minosoft/objects/Dimension.java rename to src/main/java/de/bixilon/minosoft/game/datatypes/Dimension.java index 660be6946..721bdb656 100644 --- a/src/main/java/de/bixilon/minosoft/objects/Dimension.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/Dimension.java @@ -1,4 +1,4 @@ -package de.bixilon.minosoft.objects; +package de.bixilon.minosoft.game.datatypes; public enum Dimension { NETHER(-1), diff --git a/src/main/java/de/bixilon/minosoft/objects/GameMode.java b/src/main/java/de/bixilon/minosoft/game/datatypes/GameMode.java similarity index 90% rename from src/main/java/de/bixilon/minosoft/objects/GameMode.java rename to src/main/java/de/bixilon/minosoft/game/datatypes/GameMode.java index 22b3640d0..0913fa828 100644 --- a/src/main/java/de/bixilon/minosoft/objects/GameMode.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/GameMode.java @@ -1,4 +1,4 @@ -package de.bixilon.minosoft.objects; +package de.bixilon.minosoft.game.datatypes; public enum GameMode { SURVIVAL(0), diff --git a/src/main/java/de/bixilon/minosoft/objects/LevelType.java b/src/main/java/de/bixilon/minosoft/game/datatypes/LevelType.java similarity index 92% rename from src/main/java/de/bixilon/minosoft/objects/LevelType.java rename to src/main/java/de/bixilon/minosoft/game/datatypes/LevelType.java index 0d7b532cf..bba161b24 100644 --- a/src/main/java/de/bixilon/minosoft/objects/LevelType.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/LevelType.java @@ -1,4 +1,4 @@ -package de.bixilon.minosoft.objects; +package de.bixilon.minosoft.game.datatypes; public enum LevelType { DEFAULT("default"), diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/World.java b/src/main/java/de/bixilon/minosoft/game/datatypes/World.java new file mode 100644 index 000000000..4a1298fdd --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/World.java @@ -0,0 +1,24 @@ +package de.bixilon.minosoft.game.datatypes; + +import java.util.HashMap; + +/** + * Collection of ChunkColumns + */ +public class World { + public final HashMap chunks; + final String name; + + public World(String name) { + this.name = name; + chunks = new HashMap<>(); + } + + public String getName() { + return name; + } + + public ChunkColumn getChunkColumn(ChunkColumnLocation loc) { + 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 new file mode 100644 index 000000000..6ab7dc1cd --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java @@ -0,0 +1,7 @@ +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 { +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java index 46829dc07..187e8e6d3 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java @@ -1,10 +1,10 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.game.datatypes.Difficulty; +import de.bixilon.minosoft.game.datatypes.Dimension; +import de.bixilon.minosoft.game.datatypes.GameMode; +import de.bixilon.minosoft.game.datatypes.LevelType; import de.bixilon.minosoft.logging.Log; -import de.bixilon.minosoft.objects.Difficulty; -import de.bixilon.minosoft.objects.Dimension; -import de.bixilon.minosoft.objects.GameMode; -import de.bixilon.minosoft.objects.LevelType; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; import de.bixilon.minosoft.protocol.protocol.PacketHandler; diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java index 43e62798a..deb27d035 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/InByteBuffer.java @@ -1,6 +1,6 @@ package de.bixilon.minosoft.protocol.protocol; -import de.bixilon.minosoft.objects.BlockPosition; +import de.bixilon.minosoft.game.datatypes.BlockPosition; import org.json.JSONObject; import java.nio.ByteBuffer; diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java index eb5410638..2a3133d07 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/OutByteBuffer.java @@ -1,6 +1,6 @@ package de.bixilon.minosoft.protocol.protocol; -import de.bixilon.minosoft.objects.BlockPosition; +import de.bixilon.minosoft.game.datatypes.BlockPosition; import org.json.JSONObject; import java.nio.ByteBuffer;