Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class WorldData extends WorldSavedData {
- private static final String IDENTITY = "PlacedBlocksData";
- public WorldData()
- {
- super(IDENTITY);
- }
- public static WorldData get(World world)
- {
- WorldData data = (WorldData) world.getPerWorldStorage().loadData(WorldData.class, IDENTITY);
- if(data == null)
- {
- data = new WorldData();
- world.getPerWorldStorage().setData(IDENTITY, data);
- }
- return data;
- }
- @Override
- public void writeToNBT(NBTTagCompound nbt)
- {
- NBTTagList chunkList = new NBTTagList();
- long data;// <--- Store all data within that
- /** Loops through each dimension */
- int numOfDimensions = ChunkBlockPos.dimensionToChunkPos.size();
- for(int dimensionID = 0; dimensionID < numOfDimensions; dimensionID++)
- {
- /** Loops through each chunk within said dimension */
- int numOfChunks = ChunkBlockPos.dimensionToChunkPos.get(dimensionID).size();
- for(int chunkID = 0; chunkID < numOfChunks; chunkID++)
- {
- //Store data about the chunk in left most bits of data
- data = (ChunkBlockPos.dimensionToChunkPos.get(dimensionID).get(chunkID).getTrueValue() << 16);
- /** Loops through each block within the chunk (Inside the hashmap)*/
- Iterator mapIter = ChunkBlockPos.dimensionToChunkPos.get(dimensionID).get(chunkID).subBlockPos.keySet().iterator();
- while(mapIter.hasNext())
- {
- data |= ((ChunkBlockPos)mapIter.next()).blockPos & 0xFFFF;
- NBTTagCompound blockData = new NBTTagCompound();
- blockData.setLong("DATA", data);
- chunkList.appendTag(blockData);
- }
- }
- }
- nbt.setTag(IDENTITY, chunkList);
- }
- @Override
- public void readFromNBT(NBTTagCompound nbt)
- {
- NBTTagList list = nbt.getTagList(IDENTITY, NBT.TAG_LIST);
- for(int i = 0; i < list.tagCount(); i++)
- {
- int[] data = getBlockInfoFromData(list.getCompoundTagAt(i).getLong("DATA"));
- //Create the chunkBlockPos
- ChunkBlockPos chunkBlockPos = new ChunkBlockPos(data[3],data[5],data[4]);
- //Create the chunkPos
- ChunkPos chunkPos = new ChunkPos(data[1], data[2], data[0]);
- //Add data to ram
- ChunkBlockPos.InsertEntry(chunkBlockPos, chunkPos);
- }
- }
- /**
- * @return [0]-Dimension [1]-ChunkX [2]-ChunkZ [3]-blockX [4]-BlockZ [5]-BlockY
- */
- public static final int[] getBlockInfoFromData(long data)
- {
- //Needs careful testing
- int dimesion = (int) ((data & 0xF000000000000000L) >>> 60);
- int chunkX = (int) ((data & 0xFFFFFC000000000L) >>> 38);
- int chunkZ = (int) ((data & 0x3FFFFF0000L) >>> 16);
- int blockX = (int) ((data & 0xF000) >>> 12);
- int blockZ = (int) ((data & 0xF00) >>> 8);
- int blockY = (int) ((data & 0xFF));
- return new int[]{dimesion, chunkX, chunkZ, blockX, blockZ, blockY};
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement