Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        // 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);
                }
            }
        }