public static void SaveWalkableGridChunk(int chunkX, int chunkY, WalkableGridChunk chunk) { var chunkPathPersistent = Path.Combine(Util.Util.GetWalkableGridSavePath(), persistentIdentifier + (chunkX < 0 ? "m" + Math.Abs(chunkX) : "" + chunkX) + "_" + (chunkY < 0 ? "m" + Math.Abs(chunkY) : "" + chunkY)); var chunkPath = Path.Combine(Util.Util.GetWalkableGridSavePath(), (chunkX < 0 ? "m" + Math.Abs(chunkX) : "" + chunkX) + "_" + (chunkY < 0 ? "m" + Math.Abs(chunkY) : "" + chunkY)); fileLocks.Enter(chunkPath); try { byte[] bytes; var savePath = chunk.IsPersistent ? chunkPathPersistent : chunkPath; chunk.copyDataTo(out bytes); File.WriteAllBytes(savePath, bytes); // We delete the other chunk var deletePath = chunk.IsPersistent ? chunkPath : chunkPathPersistent; if (File.Exists(deletePath)) { File.Delete(deletePath); } } finally { fileLocks.Exit(chunkPath); } }
public static WalkableGridChunk LoadWalkableGridChunk(int chunkX, int chunkY) { var chunkPathPersistent = Path.Combine(Util.Util.GetWalkableGridSavePath(), persistentIdentifier + (chunkX < 0 ? "m" + Math.Abs(chunkX) : "" + chunkX) + "_" + (chunkY < 0 ? "m" + Math.Abs(chunkY) : "" + chunkY)); var chunkPathPersistentExists = File.Exists(chunkPathPersistent); var chunkPath = Path.Combine(Util.Util.GetWalkableGridSavePath(), (chunkX < 0 ? "m" + Math.Abs(chunkX) : "" + chunkX) + "_" + (chunkY < 0 ? "m" + Math.Abs(chunkY) : "" + chunkY)); if (!chunkPathPersistentExists && !File.Exists(chunkPath)) { SimulationGame.WorldGenerator.generateChunk(chunkX * WalkableGrid.WalkableGridBlockChunkSize.X, chunkY * WalkableGrid.WalkableGridBlockChunkSize.Y); } fileLocks.Enter(chunkPath); try { var loadPath = chunkPathPersistentExists ? chunkPathPersistent : chunkPath; var content = File.ReadAllBytes(loadPath); return(WalkableGridChunk.CreateChunkFrom(chunkX, chunkY, ref content)); } finally { fileLocks.Exit(chunkPath); } }
// Create WorldGridChunks public void Build() { //ElevationGenerator.PrintHeightMap(this); for (int i = 0; i < WorldSegmentChunkSize.X; i++) { for (int j = 0; j < WorldSegmentChunkSize.Y; j++) { var worldGridChunkExists = WorldLoader.DoesWorldGridChunkExist(startChunkPosition.X + i, startChunkPosition.Y + j); if (worldGridChunkExists == true) { continue; } if (Blocks[i * WorldGrid.WorldChunkBlockSize.X, j *WorldGrid.WorldChunkBlockSize.Y].BlockId == BlockType.Invalid) { continue; } var chunkBlockPosition = new Point(startBlockPosition.X + i * WorldGrid.WorldChunkBlockSize.X, startBlockPosition.Y + j * WorldGrid.WorldChunkBlockSize.Y); WorldGridChunk worldGridChunk = new WorldGridChunk(WorldGrid.BlockSize.X * chunkBlockPosition.X, WorldGrid.BlockSize.Y * chunkBlockPosition.Y); WalkableGridChunk walkableGridChunk = WalkableGridChunk.CreateEmpty(startChunkPosition.X + i, startChunkPosition.Y + j); worldGridChunk.SetBiomeType(Biome); for (int x = 0; x < WorldGrid.WorldChunkBlockSize.X; x++) { for (int y = 0; y < WorldGrid.WorldChunkBlockSize.Y; y++) { var blockPosition = new Point(chunkBlockPosition.X + x, chunkBlockPosition.Y + y); var worldSegmentPosition = new Point(i * WorldGrid.WorldChunkBlockSize.X + x, j * WorldGrid.WorldChunkBlockSize.Y + y); worldGridChunk.SetBlockType(blockPosition.X, blockPosition.Y, Blocks[worldSegmentPosition.X, worldSegmentPosition.Y].BlockId); if (CollisionUtils.IsBlockBlocking(Blocks[worldSegmentPosition.X, worldSegmentPosition.Y].BlockId)) { walkableGridChunk.SetWalkable(blockPosition.X, blockPosition.Y, false); } } } WorldLoader.SaveWorldGridChunk(startChunkPosition.X + i, startChunkPosition.Y + j, worldGridChunk); WorldLoader.SaveWalkableGridChunk(startChunkPosition.X + i, startChunkPosition.Y + j, walkableGridChunk); } } }