From 166093e6412b648a69990adfa8e77380a3f2b76c Mon Sep 17 00:00:00 2001 From: bixilon Date: Thu, 4 Jun 2020 00:29:22 +0200 Subject: [PATCH] update chunk data types --- .../game/datatypes/BlockPosition.java | 4 + .../minosoft/game/datatypes/Chunk.java | 29 +++-- .../minosoft/game/datatypes/ChunkColumn.java | 36 ------ .../game/datatypes/ChunkColumnLocation.java | 31 ------ .../game/datatypes/ChunkLocation.java | 20 ++-- .../minosoft/game/datatypes/ChunkNibble.java | 24 ++++ .../game/datatypes/ChunkNibbleLocation.java | 37 +++++++ .../minosoft/game/datatypes/Identifier.java | 35 ++++++ .../minosoft/game/datatypes/World.java | 17 ++- .../minosoft/game/datatypes/WorldBlock.java | 8 -- .../minosoft/game/datatypes/blocks/Air.java | 26 ----- .../minosoft/game/datatypes/blocks/Block.java | 51 ++++++++- .../game/datatypes/blocks/BlockRotation.java | 104 ++++++++++++++++++ .../game/datatypes/blocks/Blocks.java | 33 ------ .../minosoft/game/datatypes/blocks/Dirt.java | 26 ----- .../clientbound/play/PlayChunkBulk.java | 93 ++++++++++++++++ .../protocol/protocol/PacketHandler.java | 8 +- .../minosoft/protocol/protocol/Protocol.java | 6 +- .../de/bixilon/minosoft/util/BitByte.java | 10 +- 19 files changed, 398 insertions(+), 200 deletions(-) delete mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java delete mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumnLocation.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibble.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibbleLocation.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/Identifier.java delete mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java delete mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Air.java create mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/blocks/BlockRotation.java delete mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Blocks.java delete mode 100644 src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Dirt.java create mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PlayChunkBulk.java diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/BlockPosition.java b/src/main/java/de/bixilon/minosoft/game/datatypes/BlockPosition.java index 11f10fd9a..de99e776a 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/BlockPosition.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/BlockPosition.java @@ -33,4 +33,8 @@ public class BlockPosition { BlockPosition pos = (BlockPosition) obj; return pos.getX() == getX() && pos.getY() == getY() && pos.getZ() == getZ(); } + + public ChunkLocation getChunkLocation() { + return new ChunkLocation(getX() / 16, getZ() / 16); + } } 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 e8ca88f67..6a39c7714 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/Chunk.java @@ -1,22 +1,33 @@ package de.bixilon.minosoft.game.datatypes; +import de.bixilon.minosoft.game.datatypes.blocks.Block; + import java.util.HashMap; /** - * Collection of 16x16x16 blocks + * Collection of 16 chunks */ public class Chunk { - private final HashMap blocks; + private final HashMap chunks; - public Chunk(HashMap blocks) { - this.blocks = blocks; + public Chunk(HashMap chunks) { + this.chunks = chunks; } - public WorldBlock getWorldBlock(ChunkLocation loc) { - return blocks.get(loc); + public Block getBlock(int x, int y, int 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 section = (byte) (y / 16); + if (section == 0) { + return Block.COBBLESTONE; + } else if (section == 1) { + return Block.DIRT; + } else { + return Block.AIR; + } + //ToDo + //return chunks.get(section).getBlock(x, y % 16,z); } - 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 deleted file mode 100644 index ef0898239..000000000 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumn.java +++ /dev/null @@ -1,36 +0,0 @@ -package de.bixilon.minosoft.game.datatypes; - -import de.bixilon.minosoft.game.datatypes.blocks.Blocks; - -import java.util.HashMap; - -/** - * Collection of 16 chunks - */ -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) { - 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); - 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/ChunkColumnLocation.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumnLocation.java deleted file mode 100644 index a676f971d..000000000 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkColumnLocation.java +++ /dev/null @@ -1,31 +0,0 @@ -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 index 2c38fb3cb..dc02b2e52 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkLocation.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkLocation.java @@ -1,28 +1,22 @@ package de.bixilon.minosoft.game.datatypes; /** - * Chunk X, Y and Z location (max 16x16x16) + * Chunk X and Z location (block position / 16, rounded down) */ public class ChunkLocation { - byte x; - byte y; - byte z; + int x; + int z; - public ChunkLocation(byte x, byte y, byte z) { + public ChunkLocation(int x, int z) { this.x = x; - this.y = y; this.z = z; } - public byte getX() { + public int getX() { return x; } - public byte getY() { - return y; - } - - public byte getZ() { + public int getZ() { return z; } @@ -32,6 +26,6 @@ public class ChunkLocation { return true; } ChunkLocation that = (ChunkLocation) obj; - return getX() == that.getX() && getY() == that.getY() && getZ() == that.getZ(); + return getX() == that.getX() && getZ() == that.getZ(); } } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibble.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibble.java new file mode 100644 index 000000000..8747c801a --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibble.java @@ -0,0 +1,24 @@ +package de.bixilon.minosoft.game.datatypes; + +import de.bixilon.minosoft.game.datatypes.blocks.Block; + +import java.util.HashMap; + +/** + * Collection of 16x16x16 blocks + */ +public class ChunkNibble { + private final HashMap blocks; + + public ChunkNibble(HashMap blocks) { + this.blocks = blocks; + } + + public Block getBlock(ChunkNibbleLocation loc) { + return blocks.get(loc); + } + + public Block getBlock(int x, int y, int z) { + return getBlock(new ChunkNibbleLocation(x, y, z)); + } +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibbleLocation.java b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibbleLocation.java new file mode 100644 index 000000000..16eeafc7a --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/ChunkNibbleLocation.java @@ -0,0 +1,37 @@ +package de.bixilon.minosoft.game.datatypes; + +/** + * Chunk X, Y and Z location (max 16x16x16) + */ +public class ChunkNibbleLocation { + int x; + int y; + int z; + + public ChunkNibbleLocation(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getZ() { + return z; + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj)) { + return true; + } + ChunkNibbleLocation that = (ChunkNibbleLocation) obj; + return getX() == that.getX() && getY() == that.getY() && getZ() == that.getZ(); + } +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/Identifier.java b/src/main/java/de/bixilon/minosoft/game/datatypes/Identifier.java new file mode 100644 index 000000000..14aa068b6 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/Identifier.java @@ -0,0 +1,35 @@ +package de.bixilon.minosoft.game.datatypes; + +public class Identifier { + final String legacy; + String mod = "minecraft"; // by default minecraft + String water; + + public Identifier(String mod, String legacy, String water) { // water for water update name (post 1.13.x) + this.mod = mod; + this.legacy = legacy; + this.water = water; + } + + public Identifier(String legacy, String water) { + this.legacy = legacy; + this.water = water; + } + + public Identifier(String name) { + // legacy and water are the same + this.legacy = name; + } + + public String getMod() { + return mod; + } + + public String getLegacy() { + return legacy; + } + + public String getWaterUpdateName() { + return ((water == null) ? legacy : water); + } +} 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 481eadd35..c895e1d30 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/World.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/World.java @@ -1,12 +1,14 @@ package de.bixilon.minosoft.game.datatypes; +import de.bixilon.minosoft.game.datatypes.blocks.Block; + import java.util.HashMap; /** * Collection of ChunkColumns */ public class World { - public final HashMap chunks; + public final HashMap chunks; final String name; public World(String name) { @@ -18,9 +20,16 @@ public class World { return name; } - public ChunkColumn getChunkColumn(ChunkColumnLocation loc) { - return new ChunkColumn(loc.getX(), loc.getZ()); + public Chunk getChunk(ChunkLocation loc) { + return chunks.get(loc); + } + + public Block getBlock(BlockPosition pos) { //ToDo - //return chunks.get(loc); + ChunkLocation loc = pos.getChunkLocation(); + if (getChunk(loc) != null) { + return getChunk(loc).getBlock(pos.getX() % 16, pos.getX(), pos.getZ() % 16); + } + return Block.AIR; } } diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java b/src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java deleted file mode 100644 index 71dd8b8ac..000000000 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/WorldBlock.java +++ /dev/null @@ -1,8 +0,0 @@ -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 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 deleted file mode 100644 index e15902db7..000000000 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Air.java +++ /dev/null @@ -1,26 +0,0 @@ -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 index 254f0062e..8f36fc3fc 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Block.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Block.java @@ -1,11 +1,52 @@ package de.bixilon.minosoft.game.datatypes.blocks; -import de.bixilon.minosoft.game.datatypes.WorldBlock; +import de.bixilon.minosoft.game.datatypes.Identifier; -public interface Block extends WorldBlock { +public enum Block { + AIR(new Identifier("air"), 0), + DIRT(new Identifier("stone"), 1), + GRASS(new Identifier("grass"), 2), + COBBLESTONE(new Identifier("stone"), 4), + WHITE_WOOL(new Identifier("wool"), 35, 0), + RED_WOOL(new Identifier("wool", "red_wool"), 35, 14), + DROPPER(new Identifier("dropper", "dropper"), 158, BlockRotation.RotationType.NORMAL); - String getLegacyIdentifier(); + Identifier identifier; + int legacyId; + int legacyData; + BlockRotation.RotationType rotationType; - int getLegacyId(); + Block(Identifier identifier, int legacyId, BlockRotation.RotationType rotationType) { + this.identifier = identifier; + this.legacyId = legacyId; + this.rotationType = rotationType; + } -} \ No newline at end of file + Block(Identifier identifier, int legacyId, int legacyData) { + this.identifier = identifier; + this.legacyId = legacyId; + this.legacyData = legacyData; + } + + Block(Identifier identifier, int legacyId) { + this.identifier = identifier; + this.legacyId = legacyId; + } + + public Identifier getIdentifier() { + return identifier; + } + + + public int getLegacyId() { + return legacyId; + } + + public int getLegacyData() { + return legacyData; + } + + public BlockRotation.RotationType getRotationType() { + return rotationType; + } +} diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/BlockRotation.java b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/BlockRotation.java new file mode 100644 index 000000000..80c1658d3 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/BlockRotation.java @@ -0,0 +1,104 @@ +package de.bixilon.minosoft.game.datatypes.blocks; + +public interface BlockRotation { + + int getId(); + + enum RotationType { + BARELY, + NORMAL, + EXTENDED + } + + enum Barely implements BlockRotation { + EAST(0), + NORTH(1), + SOUTH(2), + WEST(3); + + int id; + + Barely(int id) { + this.id = id; + } + + public static Barely byId(int id) { + for (Barely b : values()) { + if (b.getId() == id) { + return b; + } + } + return null; + } + + public int getId() { + return id; + } + } + + enum Normal implements BlockRotation { + DOWN(0), + EAST(1), + NORTH(2), + SOUTH(3), + UP(4), + WEST(5); + + int id; + + Normal(int id) { + this.id = id; + } + + public static Normal byId(int id) { + for (Normal n : values()) { + if (n.getId() == id) { + return n; + } + } + return null; + } + + public int getId() { + return id; + } + } + + enum Extended implements BlockRotation { + SOUTH(0), + SOUTH_SOUTH_WEST(1), + SOUTH_WEST(2), + WEST_SOUTH_WEST(3), + WEST(4), + WEST_NORTH_WEST(5), + NORTH_WEST(6), + NORTH_NORTH_WEST(7), + NORTH(8), + NORTH_NORTH_EAST(9), + NORTH_EAST(10), + EAST_NORTH_EAST(11), + EAST(12), + EAST_SOUTH_EAST(13), + SOUTH_EAST(14), + SOUTH_SOUTH_EAST(15); + + int id; + + Extended(int id) { + this.id = id; + } + + public static Extended byId(int id) { + for (Extended e : values()) { + if (e.getId() == id) { + return e; + } + } + return null; + } + + public int getId() { + return id; + } + } +} 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 deleted file mode 100644 index e9c491245..000000000 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Blocks.java +++ /dev/null @@ -1,33 +0,0 @@ -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 deleted file mode 100644 index 27a063986..000000000 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/blocks/Dirt.java +++ /dev/null @@ -1,26 +0,0 @@ -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"; - } -} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PlayChunkBulk.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PlayChunkBulk.java new file mode 100644 index 000000000..e43c6ca6f --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PlayChunkBulk.java @@ -0,0 +1,93 @@ +package de.bixilon.minosoft.protocol.packets.clientbound.play; + +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InByteBuffer; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; +import de.bixilon.minosoft.util.BitByte; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.DataFormatException; +import java.util.zip.Inflater; + +public class PlayChunkBulk implements ClientboundPacket { + short chunkColumnCount; + + + @Override + public void read(InPacketBuffer buffer, ProtocolVersion v) { + switch (v) { + case VERSION_1_7_10: + // ToDo only implement once, not twice (chunk data and chunk bulk) + this.chunkColumnCount = buffer.readShort(); + int dataLen = buffer.readInteger(); + boolean containsSkyLight = buffer.readBoolean(); + byte[] data = buffer.readBytes(dataLen); + + // decompressing chunk data + Inflater inflater = new Inflater(); + inflater.setInput(data, 0, dataLen); + byte[] result = new byte[4096]; + ByteArrayOutputStream stream = new ByteArrayOutputStream(dataLen); + try { + while (!inflater.finished()) { + stream.write(result, 0, inflater.inflate(result)); + } + } catch (DataFormatException e) { + e.printStackTrace(); + } finally { + try { + stream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + InByteBuffer decompressed = new InByteBuffer(stream.toByteArray()); + + // chunk meta data + for (int i = 0; i < chunkColumnCount; i++) { + int x = buffer.readInteger(); + int y = buffer.readInteger(); + short primaryBitMask = buffer.readShort(); + short addBitMask = buffer.readShort(); + System.out.println(String.format("Meta data: %s %s", x, y)); + + for (int c = 0; c < 16; c++) { // max sections per chunks in chunk column + if (BitByte.isBitSet(primaryBitMask, c)) { + short[] blockType = BitByte.byteArrayToShortArray(decompressed.readBytes(4096)); // 16 * 16 * 16 + byte[] metadata = decompressed.readBytes(2048); // 16 * 16 * 16 / 2 (only half bit per block) + byte[] light; + if (containsSkyLight) { + light = decompressed.readBytes(2048); + } + byte[] addBlockType; + if (BitByte.isBitSet(addBitMask, c)) { + addBlockType = decompressed.readBytes(2048); + } + byte[] biome = decompressed.readBytes(256); + + + } + + } + } + + break; + } + log(); + } + + @Override + public void log() { + Log.protocol(String.format("Chunk bulk packet received (chunks: %s)", chunkColumnCount)); + } + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java index d5a6dc72b..8314b55f0 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -5,10 +5,7 @@ import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketEncryptionKeyRequest; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketLoginDisconnect; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketLoginSuccess; -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketJoinGame; -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketKeepAlive; -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketPlayerInfo; -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketTimeUpdate; +import de.bixilon.minosoft.protocol.packets.clientbound.play.*; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusPong; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusResponse; import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketEncryptionResponse; @@ -68,4 +65,7 @@ public class PacketHandler { public void handle(PacketKeepAlive pkg) { connection.sendPacket(new PacketKeepAliveResponse(pkg.getId())); } + + public void handle(PlayChunkBulk pkg) { + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java index 6afcc7347..8a8dfb1ef 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java @@ -4,10 +4,7 @@ import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketEncryptionKeyRequest; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketLoginDisconnect; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketLoginSuccess; -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketJoinGame; -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketKeepAlive; -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketPlayerInfo; -import de.bixilon.minosoft.protocol.packets.clientbound.play.PacketTimeUpdate; +import de.bixilon.minosoft.protocol.packets.clientbound.play.*; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusPong; import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusResponse; @@ -41,5 +38,6 @@ public interface Protocol { packetClassMapping.put(Packets.Clientbound.PLAY_PLAYER_INFO, PacketPlayerInfo.class); packetClassMapping.put(Packets.Clientbound.PLAY_TIME_UPDATE, PacketTimeUpdate.class); packetClassMapping.put(Packets.Clientbound.PLAY_KEEP_ALIVE, PacketKeepAlive.class); + packetClassMapping.put(Packets.Clientbound.PLAY_CHUNK_BULK, PlayChunkBulk.class); } } \ No newline at end of file diff --git a/src/main/java/de/bixilon/minosoft/util/BitByte.java b/src/main/java/de/bixilon/minosoft/util/BitByte.java index 061107452..f5aaa41e1 100644 --- a/src/main/java/de/bixilon/minosoft/util/BitByte.java +++ b/src/main/java/de/bixilon/minosoft/util/BitByte.java @@ -1,10 +1,18 @@ package de.bixilon.minosoft.util; public class BitByte { - public static boolean isBitSet(byte in, int pos) { + public static boolean isBitSet(int in, int pos) { boolean bitSet; int mask = 1 << pos; bitSet = ((in & mask) == mask); return bitSet; } + + public static short[] byteArrayToShortArray(byte[] readBytes) { + short[] ret = new short[readBytes.length]; + for (int i = 0; i < readBytes.length; i++) { + ret[0] = readBytes[0]; + } + return ret; + } }