почти успешная загрузка карты
зафиксированы следующие ошибки: - не прогружаются некоторые чанки (совсем); - не отображаюся некоторые чанки (пока не пнёшь); - секция чанка некоректно загружается, если там есть сундук; - местами некорректно отображаются данные о block light.
This commit is contained in:
@@ -1,17 +1,15 @@
|
|||||||
package mc.world.anvil;
|
package mc.world.anvil;
|
||||||
|
|
||||||
import com.flowpowered.nbt.Tag;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import mc.core.world.block.Block;
|
import mc.core.world.block.Block;
|
||||||
import mc.core.world.block.BlockLocation;
|
import mc.core.world.block.BlockLocation;
|
||||||
import mc.core.world.block.BlockType;
|
import mc.core.world.block.BlockType;
|
||||||
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AnvilBlock implements Block {
|
public class AnvilBlock implements Block {
|
||||||
private final AnvilChunkSection chunkSection;
|
private final AnvilChunkSection chunkSection;
|
||||||
private final BlockLocation location;
|
private final BlockLocation location;
|
||||||
|
private BlockLocation globalLocation;
|
||||||
|
|
||||||
public AnvilBlock(AnvilChunkSection chunkSection, int x, int y, int z) {
|
public AnvilBlock(AnvilChunkSection chunkSection, int x, int y, int z) {
|
||||||
this.chunkSection = chunkSection;
|
this.chunkSection = chunkSection;
|
||||||
@@ -30,20 +28,31 @@ public class AnvilBlock implements Block {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockType getBlockType() {
|
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);
|
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
|
@Override
|
||||||
public BlockLocation getLocation() {
|
public BlockLocation getLocation() {
|
||||||
return location;
|
if (globalLocation == null) {
|
||||||
|
globalLocation = location.toGlobal(chunkSection);
|
||||||
|
}
|
||||||
|
return globalLocation;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "AnvilBlock{" +
|
return "AnvilBlock{" +
|
||||||
"location=" + location +
|
"location=" + getLocation() +
|
||||||
", type=" + getBlockType() +
|
", type=" + getBlockType() +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package mc.core.world.block;
|
|||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
import mc.core.world.chunk.ChunkSection;
|
||||||
|
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@@ -20,6 +21,14 @@ public class BlockLocation implements Cloneable {
|
|||||||
this.z = z;
|
this.z = z;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BlockLocation toGlobal(ChunkSection chunkSection) {
|
||||||
|
return new BlockLocation(
|
||||||
|
(chunkSection.getX() << 8) + x,
|
||||||
|
(chunkSection.getY() << 8) + y,
|
||||||
|
(chunkSection.getZ() << 8) + z
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockLocation clone() {
|
public BlockLocation clone() {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ package mc.core.world.block;
|
|||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public enum BlockType {
|
public enum BlockType {
|
||||||
AIR(0, 0),
|
AIR(0, 0),
|
||||||
@@ -15,23 +17,119 @@ public enum BlockType {
|
|||||||
ANDESITE(1, 5),
|
ANDESITE(1, 5),
|
||||||
GRASS(2, 0),
|
GRASS(2, 0),
|
||||||
DIRT(3, 0),
|
DIRT(3, 0),
|
||||||
|
COBBLESTONE(4, 0),
|
||||||
BEDROCK(7, 0),
|
BEDROCK(7, 0),
|
||||||
WATER(9, 0),
|
FLOWING_WATER (8, 0),
|
||||||
LAVA(11, 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),
|
SAND(12, 0),
|
||||||
GOLD_ORE(14, 0),
|
GRAVEL(13, 0),
|
||||||
IRON_ORE(15, 0),
|
ORE_GOLD(14, 0),
|
||||||
COAL_ORE(16, 0),
|
ORE_IRON(15, 0),
|
||||||
LAPIS_ORE(21, 0),
|
ORE_COAL(16, 0),
|
||||||
DIAMOND_ORE(56, 0),
|
WOOD_OAK (17, 0),
|
||||||
REDSTONE_ORE(73, 0),
|
WOOD_SPRUCE (17, 1),
|
||||||
SNOW(78, 0);
|
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) {
|
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());
|
Stream<BlockType> stream = Arrays.stream(BlockType.values());
|
||||||
return stream.filter(blockType -> blockType.id == id && blockType.meta == meta)
|
return stream.filter(blockType -> blockType.id == id && blockType.meta == meta)
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElse(BlockType.AIR);
|
.orElseGet(() -> {
|
||||||
|
log.warn("Unknow block type: {}:{}", id, meta);
|
||||||
|
return BEDROCK;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
|
|||||||
@@ -149,13 +149,13 @@ public class ChunkDataPacket implements SCPacket {
|
|||||||
|
|
||||||
for (int y = 0; y < 16; y++) {
|
for (int y = 0; y < 16; y++) {
|
||||||
for (int z = 0; z < 16; z++) {
|
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.addBlock(chunkSection.getBlockLocal(x, y, z));
|
||||||
palettedChunkSection.addSkyLight(chunkSection.getSkyLightLocal(x, y, z));
|
palettedChunkSection.addSkyLight(chunkSection.getSkyLightLocal(x, y, z));
|
||||||
|
|
||||||
if (biomeWrite) {
|
if (biomeWrite) {
|
||||||
biomes.writeByte(chunkSection.getBiomeLocal(x, z).getId());
|
biomes.writeByte(chunkSection.getBiomeLocal(x, z).getId());
|
||||||
if (x == 15 && z == 15) {
|
if (x == 0 && z == 15) {
|
||||||
biomeWrite = false;
|
biomeWrite = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user