почти успешная загрузка карты
зафиксированы следующие ошибки: - не прогружаются некоторые чанки (совсем); - не отображаюся некоторые чанки (пока не пнёшь); - секция чанка некоректно загружается, если там есть сундук; - местами некорректно отображаются данные о block light.
This commit is contained in:
@@ -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() +
|
||||
'}';
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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),
|
||||
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<BlockType> 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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user