diff --git a/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java b/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java index 95316a5..a445b0f 100644 --- a/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java +++ b/anvil-loader/src/main/java/mc/world/anvil/AnvilBlock.java @@ -1,17 +1,15 @@ package mc.world.anvil; -import com.flowpowered.nbt.Tag; import lombok.extern.slf4j.Slf4j; import mc.core.world.block.Block; import mc.core.world.block.BlockLocation; import mc.core.world.block.BlockType; -import java.util.stream.Stream; - @Slf4j public class AnvilBlock implements Block { private final AnvilChunkSection chunkSection; private final BlockLocation location; + private BlockLocation globalLocation; public AnvilBlock(AnvilChunkSection chunkSection, int x, int y, int z) { this.chunkSection = chunkSection; @@ -30,20 +28,31 @@ public class AnvilBlock implements Block { @Override public BlockType getBlockType() { - final byte id = chunkSection.getBlocks().get((location.getY() * 256) + (location.getZ() * 16) + location.getX()); + final byte id = chunkSection.getBlocks().get((location.getY() << 8) + (location.getZ() << 4) + location.getX()); final int meta = chunkSection.getBlocksMeta().get(location); - return BlockType.getByIdMeta(id, meta); + BlockType type = BlockType.getByIdMeta(id & 0xFF, meta); + if (type.equals(BlockType.BEDROCK) && id != 7) { + log.warn("ChunkSection: {},{},{} | Block: {}", + chunkSection.getX(), + chunkSection.getY(), + chunkSection.getZ(), + location.toString()); + } + return type; } @Override public BlockLocation getLocation() { - return location; + if (globalLocation == null) { + globalLocation = location.toGlobal(chunkSection); + } + return globalLocation; } @Override public String toString() { return "AnvilBlock{" + - "location=" + location + + "location=" + getLocation() + ", type=" + getBlockType() + '}'; } diff --git a/core/src/main/java/mc/core/world/block/BlockLocation.java b/core/src/main/java/mc/core/world/block/BlockLocation.java index 9ac33f0..e5220c5 100644 --- a/core/src/main/java/mc/core/world/block/BlockLocation.java +++ b/core/src/main/java/mc/core/world/block/BlockLocation.java @@ -3,6 +3,7 @@ package mc.core.world.block; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import mc.core.world.chunk.ChunkSection; @NoArgsConstructor @AllArgsConstructor @@ -20,6 +21,14 @@ public class BlockLocation implements Cloneable { this.z = z; } + public BlockLocation toGlobal(ChunkSection chunkSection) { + return new BlockLocation( + (chunkSection.getX() << 8) + x, + (chunkSection.getY() << 8) + y, + (chunkSection.getZ() << 8) + z + ); + } + @Override public BlockLocation clone() { try { diff --git a/core/src/main/java/mc/core/world/block/BlockType.java b/core/src/main/java/mc/core/world/block/BlockType.java index 0eaffa1..b071649 100644 --- a/core/src/main/java/mc/core/world/block/BlockType.java +++ b/core/src/main/java/mc/core/world/block/BlockType.java @@ -2,10 +2,12 @@ package mc.core.world.block; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import java.util.Arrays; import java.util.stream.Stream; +@Slf4j @RequiredArgsConstructor public enum BlockType { AIR(0, 0), @@ -15,23 +17,119 @@ public enum BlockType { ANDESITE(1, 5), GRASS(2, 0), DIRT(3, 0), + COBBLESTONE(4, 0), BEDROCK(7, 0), - WATER(9, 0), - LAVA(11, 0), + FLOWING_WATER (8, 0), + FLOWING_WATER_1(8, 1), + FLOWING_WATER_2(8, 2), + FLOWING_WATER_3(8, 3), + FLOWING_WATER_4(8, 4), + FLOWING_WATER_5(8, 5), + FLOWING_WATER_6(8, 6), + FLOWING_WATER_7(8, 7), + WATER (9, 0), + WATER_1 (9, 1), + WATER_2 (9, 2), + WATER_3 (9, 3), + WATER_4 (9, 4), + WATER_5 (9, 5), + WATER_6 (9, 6), + WATER_7 (9, 7), + WATER_8 (9, 8), + WATER_9 (9, 9), + WATER_10(9, 10), + WATER_11(9, 11), + WATER_12(9, 12), + WATER_13(9, 13), + WATER_14(9, 14), + WATER_15(9, 15), + FLOWING_LAVA (10, 0), + FLOWING_LAVA_1(10, 1), + FLOWING_LAVA_2(10, 2), + FLOWING_LAVA_3(10, 3), + FLOWING_LAVA_4(10, 4), + FLOWING_LAVA_5(10, 5), + FLOWING_LAVA_6(10, 6), + FLOWING_LAVA_7(10, 7), + LAVA (11, 0), + LAVA_1 (11, 1), + LAVA_2 (11, 2), + LAVA_3 (11, 3), + LAVA_4 (11, 4), + LAVA_5 (11, 5), + LAVA_6 (11, 6), + LAVA_7 (11, 7), + LAVA_8 (11, 8), + LAVA_9 (11, 9), + LAVA_10(11, 10), + LAVA_11(11, 11), + LAVA_12(11, 12), + LAVA_13(11, 13), + LAVA_14(11, 14), + LAVA_15(11, 15), SAND(12, 0), - GOLD_ORE(14, 0), - IRON_ORE(15, 0), - COAL_ORE(16, 0), - LAPIS_ORE(21, 0), - DIAMOND_ORE(56, 0), - REDSTONE_ORE(73, 0), - SNOW(78, 0); + GRAVEL(13, 0), + ORE_GOLD(14, 0), + ORE_IRON(15, 0), + ORE_COAL(16, 0), + WOOD_OAK (17, 0), + WOOD_SPRUCE (17, 1), + WOOD_BIRCH (17, 2), + WOOD_JUNGLE (17, 3), + WOOD_BIRCH_X(17, 4), + WOOD_BIRCH_Z(17, 8), + LEAVES_OAK (18, 0), + LEAVES_SPRUCE(18, 1), + LEAVES_BIRCH (18, 2), + LEAVES_JUNGLE(18, 3), + LEAVES_8 (18, 8), + LEAVES_9 (18, 9), + LEAVES_10 (18, 10), + ORE_LAPIS(21, 0), + SANDSTONE(24, 0), + TALLGRASS(31, 1), + DANDELION(37, 0), + POPPY(38, 0), + MUSHROOM_BROWN(39, 0), + MUSHROOM_RED(40, 0), + MOSS_STONE(48, 0), + OBSIDIAN(49, 0), + MONSTER_SPAWNER(52, 0), + //BAG CHUNK +// CHEST_NORTH(54, 2), +// CHEST_SOUTH(54, 3), +// CHEST_WEST (54, 4), +// CHEST_EAST (54, 5), + ORE_DIAMOND(56, 0), + ORE_REDSTONE(73, 0), + ORE_GLOWING_REDSTONE(74, 0), + SNOW(78, 0), + CLAY(82, 0), + SUGAR_CANES(83, 0), + PUMPKIN_SOUTH(86, 0), + PUMPKIN_WEST (86, 1), + PUMPKIN_NORTH(86, 2), + PUMPKIN_EAST (86, 3), + STONE_MONSTER_EGG(97, 0), + ORE_EMERALD(129, 0), + LILAC(175, 1), + ROSE_BUSH(175, 4), + PEONY(175, 5), + ROSE_BUSH_10(175, 10); public static BlockType getByIdMeta(int id, int meta) { + if (id < 0) { + log.warn("Incorrect id \"{}\"", id); + return BEDROCK; + } + Stream stream = Arrays.stream(BlockType.values()); return stream.filter(blockType -> blockType.id == id && blockType.meta == meta) .findFirst() - .orElse(BlockType.AIR); + .orElseGet(() -> { + log.warn("Unknow block type: {}:{}", id, meta); + return BEDROCK; + }); } @Getter diff --git a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java index 0c74029..c90651e 100644 --- a/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java +++ b/proto_1.12.2/src/main/java/mc/core/network/proto_1_12_2/packets/ChunkDataPacket.java @@ -149,13 +149,13 @@ public class ChunkDataPacket implements SCPacket { for (int y = 0; y < 16; y++) { for (int z = 0; z < 16; z++) { - for (int x = 0; x < 16; x++) { + for (int x = 15; x >= 0; x--) { palettedChunkSection.addBlock(chunkSection.getBlockLocal(x, y, z)); palettedChunkSection.addSkyLight(chunkSection.getSkyLightLocal(x, y, z)); if (biomeWrite) { biomes.writeByte(chunkSection.getBiomeLocal(x, z).getId()); - if (x == 15 && z == 15) { + if (x == 0 && z == 15) { biomeWrite = false; } }