package com.ingotpowered.world; import com.ingotpowered.api.Position; import com.ingotpowered.api.world.Block; import com.ingotpowered.api.world.Chunk; import com.ingotpowered.api.world.ChunkPosition; import com.ingotpowered.api.world.World; import com.ingotpowered.entity.IngotEntity; import java.util.Set; public class IngotChunk implements Chunk { public static final int WIDTH = 16, DEPTH = 16, HEIGHT = 256; public static final int SIZE = WIDTH * HEIGHT * DEPTH; public World world; public byte[] blockIDs, blockData, skyLight, blockLight; public ChunkPosition position; public Set<IngotEntity> entities; public IngotChunk(ChunkPosition position) { this(position, new byte[SIZE]); } public IngotChunk(ChunkPosition position, byte[] chunkContent) { for(int i = 0; i < chunkContent.length; i++) chunkContent[i] = 2; this.position = position; this.blockIDs = chunkContent; this.blockData = new byte[SIZE]; this.skyLight = new byte[SIZE]; this.blockLight = new byte[SIZE]; } private int getDataPosition(int x, int y, int z) { return y * (WIDTH * HEIGHT) + (z * WIDTH) + x; } private Position getPositionData(int data) { int rm = data % (WIDTH * HEIGHT); int y = (data - rm) / (WIDTH * HEIGHT); int rm2 = rm % WIDTH; int z = (rm - rm2) / WIDTH; return new Position(rm2, y, z); } @Override public World getWorld() { return world; } @Override public ChunkPosition getPosition() { return position; } @Override public int getX() { return position.getX(); } @Override public int getZ() { return position.getZ(); } //TBH.. not sure how blocks/other data is getting stored @Override public Block getBlock(int x, int y, int z) { //TODO: Write block retrieval return null; } public byte[] getChunkData() { byte[] data = new byte[(((4096 * 5 / 2) + 2048) * 16) + 256]; //byte[] data = new byte[(4096 + 2048 + 2048 + 2048 + 0) * 16 + 256]; int pos = 0; for (int i = 0; i < blockIDs.length; i++) { byte type = 2 << 4;// blockIDs[i]; type = (byte)((type & 0xfff0) | blockData[i]); data[pos++] = (byte)(type & 0xff); data[pos++] = (byte)(type >> 8); } /*System.arraycopy(blockIDs, 0, data, 0, blockIDs.length); for (int i = 0; i < blockData.length; i += 2) { byte meta1 = blockData[i]; byte meta2 = blockData[i + 1]; data[pos++] = (byte) ((meta2 << 4) | meta1); }*/ // skylight TODO for (int i = 0; i < skyLight.length; i += 2) { byte light1 = 15; //skyLight[i]; byte light2 = 15; //skyLight[i + 1]; data[pos++] = (byte) ((light2 << 4) | light1); } // blocklight TODO for (int i = 0; i < blockLight.length; i += 2) { byte light1 = 15; //blockLight[i]; byte light2 = 15; //blockLight[i + 1]; data[pos++] = (byte) ((light2 << 4) | light1); } // biome for (int i = 0; i < 256; i++) data[pos++] = 4; // TODO biome data, just set it to forest if (pos != data.length) throw new IllegalStateException("Illegal Pos: " + pos + " vs " + data.length); return data; } }