public void SaveWorldAndLoadedChunks() { int size = GManager.MAX_CHUNK_SIZE; foreach (KeyValuePair <Vector2Int, Chunk> ch in chunks) { int iX = ch.Key.x / size; int iZ = ch.Key.y / size; ChunkArea area = currAreas.Find(a => a.iX == iX && a.iZ == iZ); ChunkInfo chI = ch.Value.getChunkInfo(); if (area != null) { Vector3 pos = new Vector3(ch.Value.selfPosInt.x, 0, ch.Value.selfPosInt.y); area.chunks.TryGetValue(pos, out ChunkInfo inf); if (inf == null) { area.chunks.Add(pos, chI); } else { area.chunks[pos] = chI; } } } currAreas.ForEach(a => { using (FileStream fileStream = File.Open(chunksPath + "chA" + a.iX + "" + a.iZ + ".dat", FileMode.OpenOrCreate)) { binFormatter.Serialize(fileStream, a); } }); SaveWorld(); }
public void Update() { if (GManager.done && !myDone) { int size = GManager.MAX_CHUNK_SIZE; if (!canLoad) { StartCoroutine(GManager.self.generate(Vector2.zero)); } else { using (FileStream fileStream = File.Open(persisPath + "w.dat", FileMode.Open)) { worldInfo = (WorldInfo)binFormatter.Deserialize(fileStream); GManager.self.LoadDefault(worldInfo); } int aX = (int)worldInfo.playerPos.x / (size * size); int aZ = (int)worldInfo.playerPos.z / (size * size); using (FileStream fileStream = File.Open(chunksPath + "chA" + aX + "" + aZ + ".dat", FileMode.Open)) { ChunkArea chArea = (ChunkArea)binFormatter.Deserialize(fileStream); chArea.chunks.Where(ch => Vector3.Distance(worldInfo.playerPos, ch.Key) < 50f) .ToList().ForEach(ch => StartCoroutine(LoadChunk(ch.Key, ch.Value))); currAreas.Add(chArea); } GManager.self.LoadPlayerInfo(); } myDone = true; } if (myDone) { if (Input.GetKeyUp(KeyCode.S)) { SaveWorldAndLoadedChunks(); } } }