diff --git a/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaData.java b/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaData.java index e3a3f324f..9dc854728 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaData.java +++ b/src/main/java/de/bixilon/minosoft/data/entities/EntityMetaData.java @@ -199,7 +199,7 @@ public class EntityMetaData { } public boolean getBitMask(EntityMetaDataFields field, int bitMask) { - return BitByte.isBitMask(getInt(field), bitMask); + return BitByte.isBitMask(getByte(field), bitMask); } public Object get(EntityMetaDataFields field) { @@ -231,14 +231,7 @@ public class EntityMetaData { } public int getInt(EntityMetaDataFields field) { - Object object = get(field); - if (object instanceof Integer i) { - return i; - } - if (object instanceof Byte b) { - return b; - } - return 0; + return (int) get(field); } public Short getShort(EntityMetaDataFields field) { diff --git a/src/main/java/de/bixilon/minosoft/data/world/Chunk.java b/src/main/java/de/bixilon/minosoft/data/world/Chunk.java index 8ba597b19..6b3a5b522 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/Chunk.java +++ b/src/main/java/de/bixilon/minosoft/data/world/Chunk.java @@ -13,6 +13,7 @@ package de.bixilon.minosoft.data.world; +import de.bixilon.minosoft.data.entities.block.BlockEntityMetaData; import de.bixilon.minosoft.data.mappings.blocks.Block; import java.util.HashMap; @@ -61,4 +62,25 @@ public class Chunk { createSection(section); sections.get(section).setBlock(location.getInChunkSectionLocation(), block); } + + + public void setBlockEntityData(InChunkLocation position, BlockEntityMetaData data) { + ChunkSection section = sections.get((byte) (position.getY() / 16)); + if (section == null) { + return; + } + section.setBlockEntityData(position.getInChunkSectionLocation(), data); + } + + public BlockEntityMetaData getBlockEntityData(InChunkLocation position) { + ChunkSection section = sections.get((byte) (position.getY() / 16)); + if (section == null) { + return null; + } + return section.getBlockEntityData(position.getInChunkSectionLocation()); + } + + public void setBlockEntityData(HashMap blockEntities) { + blockEntities.forEach(this::setBlockEntityData); + } } diff --git a/src/main/java/de/bixilon/minosoft/data/world/ChunkSection.java b/src/main/java/de/bixilon/minosoft/data/world/ChunkSection.java index 9d3a14791..9b4a78e91 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/ChunkSection.java +++ b/src/main/java/de/bixilon/minosoft/data/world/ChunkSection.java @@ -13,6 +13,7 @@ package de.bixilon.minosoft.data.world; +import de.bixilon.minosoft.data.entities.block.BlockEntityMetaData; import de.bixilon.minosoft.data.mappings.blocks.Block; import java.util.HashMap; @@ -21,7 +22,8 @@ import java.util.HashMap; * Collection of 16x16x16 blocks */ public class ChunkSection { - final HashMap blocks; + private final HashMap blocks; + private final HashMap blockEntityMeta = new HashMap<>(); public ChunkSection(HashMap blocks) { this.blocks = blocks; @@ -40,10 +42,27 @@ public class ChunkSection { } public void setBlock(int x, int y, int z, Block block) { - blocks.put(new InChunkSectionLocation(x, y, z), block); + setBlock(new InChunkSectionLocation(x, y, z), block); } public void setBlock(InChunkSectionLocation location, Block block) { + if (blocks.get(location).equals(block)) { + return; + } blocks.put(location, block); + blockEntityMeta.remove(location); + } + + public void setBlockEntityData(InChunkSectionLocation position, BlockEntityMetaData data) { + // ToDo check if block is really a block entity (command block, spawner, skull, flower pot) + blockEntityMeta.put(position, data); + } + + public BlockEntityMetaData getBlockEntityData(InChunkSectionLocation position) { + return blockEntityMeta.get(position); + } + + public void setBlockEntityData(HashMap blockEntities) { + blockEntities.forEach(blockEntityMeta::put); } } diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.java b/src/main/java/de/bixilon/minosoft/data/world/World.java index 65312e5a2..3707d4a5a 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.java +++ b/src/main/java/de/bixilon/minosoft/data/world/World.java @@ -27,7 +27,6 @@ import java.util.HashMap; public class World { final HashMap chunks = new HashMap<>(); final HashMap entities = new HashMap<>(); - final HashMap blockEntityMeta = new HashMap<>(); boolean hardcore; boolean raining; Dimension dimension; // used for sky color, etc @@ -108,15 +107,22 @@ public class World { } public void setBlockEntityData(BlockPosition position, BlockEntityMetaData data) { - // ToDo check if block is really a block entity (command block, spawner, skull, flower pot) - blockEntityMeta.put(position, data); + Chunk chunk = chunks.get(position.getChunkLocation()); + if (chunk == null) { + return; + } + chunk.setBlockEntityData(position.getInChunkLocation(), data); } public BlockEntityMetaData getBlockEntityData(BlockPosition position) { - return blockEntityMeta.get(position); + Chunk chunk = chunks.get(position.getChunkLocation()); + if (chunk == null) { + return null; + } + return chunk.getBlockEntityData(position.getInChunkLocation()); } public void setBlockEntityData(HashMap blockEntities) { - blockEntities.forEach(blockEntityMeta::put); + blockEntities.forEach(this::setBlockEntityData); } }