save blockEntities in ChunkSection and not in World

This commit is contained in:
Bixilon 2020-11-19 18:59:07 +01:00
parent afb39712c8
commit 28e62f0f86
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
4 changed files with 56 additions and 16 deletions

View File

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

View File

@ -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<InChunkLocation, BlockEntityMetaData> blockEntities) {
blockEntities.forEach(this::setBlockEntityData);
}
}

View File

@ -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<InChunkSectionLocation, Block> blocks;
private final HashMap<InChunkSectionLocation, Block> blocks;
private final HashMap<InChunkSectionLocation, BlockEntityMetaData> blockEntityMeta = new HashMap<>();
public ChunkSection(HashMap<InChunkSectionLocation, Block> 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<InChunkSectionLocation, BlockEntityMetaData> blockEntities) {
blockEntities.forEach(blockEntityMeta::put);
}
}

View File

@ -27,7 +27,6 @@ import java.util.HashMap;
public class World {
final HashMap<ChunkLocation, Chunk> chunks = new HashMap<>();
final HashMap<Integer, Entity> entities = new HashMap<>();
final HashMap<BlockPosition, BlockEntityMetaData> 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<BlockPosition, BlockEntityMetaData> blockEntities) {
blockEntities.forEach(blockEntityMeta::put);
blockEntities.forEach(this::setBlockEntityData);
}
}