Archived
0

почти успешная загрузка карты

зафиксированы следующие ошибки:
- не прогружаются некоторые чанки (совсем);
- не отображаюся некоторые чанки (пока не пнёшь);
- секция чанка некоректно загружается, если там есть сундук;
- местами некорректно отображаются данные о block light.
This commit is contained in:
2018-11-04 15:20:07 +03:00
parent 70835fe1ea
commit bd2991abaa
4 changed files with 135 additions and 19 deletions

View File

@@ -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() +
'}';
}

View File

@@ -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 {

View File

@@ -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

View File

@@ -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;
}
}