package makamys.lodmod.renderer; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.nio.file.Path; import net.minecraft.client.Minecraft; import net.minecraft.entity.Entity; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.chunk.Chunk; public class LODRegion { private LODChunk[][] data = new LODChunk[32][32]; int regionX, regionZ; public LODRegion(int regionX, int regionZ) { this.regionX = regionX; this.regionZ = regionZ; for(int i = 0; i < 32; i++) { for(int j = 0; j < 32; j++) { data[i][j] = new LODChunk(regionX * 32 + i, regionZ * 32 + j); } } } public static LODRegion load(int regionX, int regionZ) { return new LODRegion(regionX, regionZ); // TODO } public void save(Path saveDir) { try { Path savePath = saveDir.resolve("lod").resolve(regionX + "," + regionZ + ".lod"); File saveFile = savePath.toFile(); saveFile.getParentFile().mkdirs(); NBTTagCompound nbt = new NBTTagCompound(); nbt.setByte("V", (byte)0); NBTTagList list = new NBTTagList(); for(int i = 0; i < 32; i++) { for(int j = 0; j < 32; j++) { if(data[i][j] != null) { list.appendTag(data[i][j].saveToNBT()); } } } nbt.setTag("chunks", list); CompressedStreamTools.writeCompressed(nbt, new FileOutputStream(saveFile)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public LODChunk getChunkAbsolute(int chunkXAbs, int chunkZAbs) { return getChunk(chunkXAbs - regionX * 32, chunkZAbs - regionZ * 32); } public LODChunk getChunk(int x, int z) { if(x >= 0 && x < 32 && z >= 0 && z < 32) { return data[x][z]; } else { return null; } } public LODChunk putChunk(Chunk chunk) { int relX = chunk.xPosition - regionX * 32; int relZ = chunk.zPosition - regionZ * 32; if(relX >= 0 && relX < 32 && relZ >= 0 && relZ < 32) { data[relX][relZ].chunk = chunk; data[relX][relZ].waitingForData = false; return data[relX][relZ]; } return null; } public void tick(Entity player) { for(int i = 0; i < 32; i++) { for(int j = 0; j < 32; j++) { LODChunk chunk = data[i][j]; if(chunk != null) { chunk.tick(player); } } } } }