Example #1
0
    public void saveAll()
    {
        if (!isServer)
        {
            Debug.LogError("trying to save the world but i'm not the server!");
            return;
        }
        if (!Directory.Exists(savePath))
        {
            Directory.CreateDirectory(savePath);
        }
        List <Chunk> toSave = new List <Chunk>(loadedChunks.Values.Count + saveBuffer.Values.Count);

        foreach (var chunk in loadedChunks.Values)
        {
            toSave.Add(chunk);
        }
        foreach (var chunk in saveBuffer.Values)
        {
            if (!toSave.Contains(chunk))
            {
                toSave.Add(chunk);
            }
        }
        foreach (var chunk in toSave)
        {
            ChunkSerializer.writeChunkToFile(chunk);
        }
    }
Example #2
0
        /// <summary>
        /// Save the current chunk in a file
        /// </summary>
        public void Save()
        {
            string filename = InfoToFileName(position, trength, seed, threshold, size, noiseScale);

            byte[] serialized = ChunkSerializer.Serialize(this);
            File.WriteAllBytes(@"save\" + filename, serialized);
        }
Example #3
0
 //if called from a client and the client has to request the chunk, return null
 public Chunk getChunk(Vector3Int chunkCoords)
 {
     if (!chunkInBounds(chunkCoords))
     {
         return(null);
     }
     if (loadedChunks.TryGetValue(chunkCoords, out Chunk chunk))
     {
         if (chunk.valid)
         {
             return(chunk);
         }
         else
         {
             return(null);
         }
     }
     if (isServer)
     {
         if ((chunk = ChunkSerializer.readChunk(chunkCoords)) != null)
         {
             loadedChunks.TryAdd(chunkCoords, chunk);
             return(chunk);
         }
         else
         {
             return(null);
         }
     }
     else
     {
         WorldManager.singleton.SendRequestChunk(chunkCoords);
         return(null);
     }
 }
Example #4
0
    //returns true if the chunk successfully loaded (so it needs to be meshed)
    public bool loadChunkFromFile(Vector3Int coords)
    {
        if (!isServer)
        {
            Debug.LogError("loading chunk from file but i'm not the server!");
            return(false);
        }
        if (!chunkInBounds(coords))
        {
            return(false);
        }
        if (loadedChunks.ContainsKey(coords))
        {
            Debug.Log("loading already loaded chunk");
            return(false);
        }
        else
        {
            Chunk read = ChunkSerializer.readChunk(coords);
            if (read != null)
            {
                loadedChunks.TryAdd(coords, read);
            }
        }

        return(false);
    }
Example #5
0
        public void Save(string outputFile)
        {
            string?directory;

            if (File.Exists(outputFile) && File.GetAttributes(outputFile).HasFlag(FileAttributes.Directory))
            {
                directory = outputFile;
            }
            else
            {
                directory = Path.GetDirectoryName(outputFile);
            }

            if (directory == null)
            {
                return;
            }

            EngineSerializer engineSerializer = new EngineSerializer();

            engineSerializer.Save(this, directory);
            GameplaySerializer gameplaySerializer = new GameplaySerializer();

            gameplaySerializer.Save(this, directory);

            for (int i = 0; i < terrainChunks.Count; i++)
            {
                ChunkSerializer chunkSerializer = new ChunkSerializer();
                chunkSerializer.Save(this, directory, i);
            }
        }
Example #6
0
    //client requests block update to server
    public static void setBlock(Position pos, Block block)
    {
        Field message = new Field();

        message.addField("pos").setCoordinates(pos);
        message.addField("block").setBytes(ChunkSerializer.serializeBlock(block));
        send(TCPMessageID.SET_BLOCK, message);
    }
Example #7
0
    void setBlock(Field message)
    {
        Position pos = message.getField("pos").getCoordinates();

        lock (BlockThread.actionLock)
        {
            pos.getChunk().setBlock(pos, ChunkSerializer.deserializeBlock(message.getField("block").getBytes(), true));
        }
    }
Example #8
0
 public ChunkData(Region region, NBTContent chunk)
 {
     containingRegion = region;
     sourceNBT        = chunk;
     ChunkSerializer.ReadBlocksFromNBT(this, chunk.dataVersion);
     RecalculateSectionRange();
     ReadEntitiesAndTileEntitiesFromNBT(chunk.contents);
     ReadBiomesFromNBT(chunk);
 }
Example #9
0
        public static void WriteChunk(this NetOutgoingMessage message, Chunk chunk)
        {
            message.Write(chunk.X);
            message.Write(chunk.Y);
            message.Write(chunk.Z);

            var chunkSerializer = new ChunkSerializer();

            message.WriteBytesWithCompression(chunkSerializer.ToByteArray(chunk));
        }
Example #10
0
        void LoadChunkFromDisk(Int3 pos)
        {
            var savePath = WorldSavePath;

            using (var file = File.OpenRead(savePath + pos.ToString())) {
                using (var reader = new BinaryReader(file)) {
                    var data = ChunkSerializer.Deserialize(reader);
                    Task.Factory.StartNew(() => { UnpackChunk(pos, data); });
                }
            }
        }
Example #11
0
        public static Chunk ReadChunk(this NetIncomingMessage message)
        {
            var x     = message.ReadInt32();
            var y     = message.ReadInt32();
            var z     = message.ReadInt32();
            var bytes = message.ReadBytesWithCompression();

            var chunkSerializer = new ChunkSerializer();

            return(chunkSerializer.FromByteArray(x, y, z, bytes));
        }
Example #12
0
    public void Save(ChunkSerializer serializer)
    {
        serializer.BeginChunk(SOLID_SIMULATION_ID);

        for (int y = 0; y < m_layers.Length; ++y)
        {
            var layer = m_layers[y];
            serializer.Write(layer);
        }

        serializer.EndChunk();
    }
Example #13
0
 public void Serialize(NetworkWriter writer)
 {
     writer.WriteBoolean(willFulfill);
     writer.WriteInt32(chunkPos.x);
     writer.WriteInt32(chunkPos.y);
     writer.WriteInt32(chunkPos.z);
     writer.WriteBoolean(chunk != null);
     if (chunk != null)
     {
         ChunkSerializer.writeChunkToNetwork(chunk, writer);
     }
 }
 public override void ProcessMessage(byte[] rawCommand)
 {
     base.ProcessMessage(rawCommand);
     using (var str = new MemoryStream(rawCommand)) {
         using (var reader = new BinaryReader(str)) {
             var data = ChunkSerializer.Deserialize(reader);
             EventManager.Fire(new OnClientReceiveChunk()
             {
                 Data = data
             });
         }
     }
 }
Example #15
0
        private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (chunkNameBox.Text.Length == 0)
            {
                MessageBox.Show("Please enter a name for the Chunk", "No Chunk Name", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            SaveFileDialog save = new SaveFileDialog();

            save.Filter = "FrostTree Chunk Format|*.ftc";
            save.Title  = "Save a Chunk";
            save.ShowDialog();

            if (save.FileName != "")
            {
                System.IO.FileStream fs = (System.IO.FileStream)save.OpenFile();

                switch (save.FilterIndex)
                {
                case 1:

                    Chunk c = new Chunk();
                    c.Name    = chunkNameBox.Text;
                    c.tilemap = new int[Program.RoomHeight * Program.RoomWidth];

                    for (int i = 0; i < Program.room.GetLength(0); i++)
                    {
                        for (int j = 0; j < Program.room.GetLength(0); j++)
                        {
                            c.tilemap[(j * Program.RoomHeight) + i] = Program.room[i, j];
                        }
                    }

                    List <Chunk.ChunkAttribute> attribList = new List <Chunk.ChunkAttribute>();
                    foreach (ListViewItem lvi in listView1.Items)
                    {
                        Chunk.ChunkAttribute ca = new Chunk.ChunkAttribute();
                        ca.AttributeName = lvi.Text;
                        attribList.Add(ca);
                    }
                    c.Attributes = attribList.ToArray();

                    ChunkSerializer.WriteChunk(fs, c);

                    break;
                }

                fs.Close();
            }
        }
Example #16
0
        void SendChunkToClient(PlayerChunkLoadState state, ChunkData data, Int3 index)
        {
            state.SentChunks.Add(index);
            var blockCount = (data.Height + 1) * 16 * 16;

            using (var str = new MemoryStream(_chunkSendBuffer)) {
                using (var writer = new BinaryWriter(str)) {
                    var count = ChunkSerializer.Serialize(data, writer, true);
                    var dst   = new byte[count];
                    System.Array.Copy(_chunkSendBuffer, dst, count);
                    ServerController.Instance.SendRawNetMessage(state.Client, ServerPacketID.ChunkInit, dst, false);
                }
            }
        }
Example #17
0
    //server updates a block to client
    private static void updateBlock(Field message)
    {
        if (ServerNetworkManager.isServer())
        {
            return;
        }
        Position pos   = message.getField("pos").getCoordinates();
        Block    block = ChunkSerializer.deserializeBlock(message.getField("block").getBytes(), false);

        if (pos.getChunk() != null)
        {
            MainThread.runAction(() => pos.getChunk().setBlock(pos, block));
        }
    }
Example #18
0
 public void deserialize(byte[] data, int length)
 {
     if (blocks == null)
     {
         blocks = new Block[size, size, size];
     }
     lock (blocks)
     {
         //Profiler.BeginSample("Loading chunks");
         blocksModified = ChunkSerializer.deserializeBlocks(blocks, data, length, ServerNetworkManager.isServer());
         deserialized   = true;
         untouchedChunk = length == 0;
         finishInitialization();
     }
 }
Example #19
0
    public void Save(ChunkSerializer serializer)
    {
        serializer.BeginChunk(LIQUID_SIMULATION_ID);

        serializer.Write(m_min_dirty_cell_per_layer);
        serializer.Write(m_max_dirty_cell_per_layer);

        for (int y = 0; y < m_layers.Length; ++y)
        {
            var layer = m_layers[y];
            serializer.Write(layer);
        }

        serializer.EndChunk();
    }
Example #20
0
    public static void updateBlock(Position pos, Block block)
    {
        if (!isHosting)
        {
            return;
        }
        Field message = new Field();

        message.addField("pos").setCoordinates(pos);
        message.addField("block").setBytes(ChunkSerializer.serializeBlock(block));
        foreach (Client c in clients)
        {
            c.send(TCPMessageID.UPDATE_BLOCK, message);
        }
    }
Example #21
0
 public void Deserialize(NetworkReader reader)
 {
     willFulfill = reader.ReadBoolean();
     chunkPos.x  = reader.ReadInt32();
     chunkPos.y  = reader.ReadInt32();
     chunkPos.z  = reader.ReadInt32();
     if (reader.ReadBoolean())
     {
         chunk = ChunkSerializer.readChunk(reader);
     }
     else
     {
         chunk = null;
     }
 }
Example #22
0
    public static void Load(VoxelTerrain terrain)
    {
        foreach (var file in Directory.GetFiles(LevelPath(terrain.LevelName), "*.chunk"))
        {
            Debug.Log("Related files: " + file);
            Vector3 chunkPosition;
            if (!ChunkSerializer.GetChunkPosition(file, out chunkPosition))
            {
                return;
            }

            var chunk = terrain.GetChunk((int)chunkPosition.x, (int)chunkPosition.y, (int)chunkPosition.z);
            ChunkSerializer.Deserialize(chunk, file);
        }
    }
Example #23
0
    public bool LoadTerrain(string fullname)
    {
        BinaryFormatter bf   = new BinaryFormatter();
        FileStream      file = File.Open(fullname, FileMode.Open);
        ChunkSerializer cs   = (ChunkSerializer)bf.Deserialize(file);

        file.Close();
        if (mainChunk == null)
        {
            GameObject g = new GameObject("chunk");
            mainChunk = g.AddComponent <Chunk>();
        }
        mainChunk.LoadChunkData(cs);
        FollowingCamera.main.WeNeedUpdate();
        return(true);
    }
Example #24
0
        void SaveChunkToDisk(Int3 pos, ChunkData data)
        {
            var savePath = WorldSavePath;

            try {
                using (var file = File.Create(savePath + pos.ToString())) {
                    using (var chunkWriter = new BinaryWriter(file)) {
                        ChunkSerializer.Serialize(data, chunkWriter, true);
                    }
                }
            } catch (Exception e) {
                UnityEngine.Debug.LogError(e.ToString());
                _chunkSaveQueue.Enqueue(new KeyValuePair <Int3, ChunkData>(pos, data));                //Если по какой-то причине не получилось сохраниться на диск, то возвращаем чанк в конец очереди.
            }

            _saveData.ChunkLibrary.Add(pos);
        }
Example #25
0
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Stream         st   = null;
            OpenFileDialog open = new OpenFileDialog();

            open.Filter           = "FrostTree Chunk Format|*.ftc";
            open.Title            = "Load a Chunk";
            open.RestoreDirectory = true;

            if (open.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    if ((st = open.OpenFile()) != null)
                    {
                        using (st)
                        {
                            Chunk c = ChunkSerializer.ReadChunk(st);

                            clearGUI();

                            chunkNameBox.Text = c.Name;

                            foreach (Chunk.ChunkAttribute attr in c.Attributes)
                            {
                                listView1.Items.Add(attr.AttributeName);
                            }

                            listView1.Invalidate();

                            for (int i = 0; i < Program.room.GetLength(0); i++)
                            {
                                for (int j = 0; j < Program.room.GetLength(0); j++)
                                {
                                    Program.room[i, j] = c.tilemap[(j * Program.RoomHeight) + i];
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Could not read Chunk from disk. Original error: \n" + ex.Message);
                }
            }
        }
Example #26
0
    public Chunk GetChunk(int x, int y, int z)
    {
        var worldX = Mathf.Floor(x / 8f);
        var worldY = Mathf.Floor(y / 8f);
        var worldZ = Mathf.Floor(z / 8f);

        var   pos = new Vector3(worldX * 8f, worldY * 8f, worldZ * 8f);
        Chunk chunk;

        if (!Chunks.TryGetValue(pos, out chunk))
        {
            var chunkObj = new GameObject();
            chunkObj.transform.parent = transform;
            chunkObj.name             = "chunk_" + worldX + "_" + worldY + "_" + worldZ;
            Chunks[pos] = chunk = chunkObj.AddComponent <Chunk>();

            chunk.ChunkPosition      = pos;
            chunk.Parent             = this;
            chunk.transform.position = pos;

            var chunkRender = chunkObj.AddComponent <ChunkRender>();
        }

        if (!chunk.Loaded)
        {
            chunk.ChunkPosition      = pos;
            chunk.Parent             = this;
            chunk.transform.position = pos;
            chunk.Loaded             = true;
            var filename = string.Format("{0}.{1}.{2}.chunk", pos.x, pos.y, pos.z);
            var filepath = Path.Combine(VoxelLoader.LevelPath(LevelName), filename);

            if (File.Exists(filepath))
            {
                Debug.Log("Chunk not loaded, pulling from: " + filepath);
                ChunkSerializer.Deserialize(chunk, filepath);
            }
            else
            {
                Debug.Log("Skipping load chunk as file does not exist: " + filepath);
            }
        }

        return(chunk);
    }
Example #27
0
        /// <summary>
        /// Attempt to load this chunk from a file
        /// </summary>
        public static Chunk TryLoadFromFile(Vector3Int pos, float trength, long seed, float threshold, ComputeShader compute, MonoBehaviour generator, MeshGenModel.Visualizer visualizer, int size = 16, float noiseScale = 1f)
        {
            if (!Directory.Exists(@"save\"))
            {
                Directory.CreateDirectory(@"save\");
            }

            string filename = InfoToFileName(pos, trength, seed, threshold, size, noiseScale);

            if (File.Exists(@"save\" + filename))
            {
                return(ChunkSerializer.Deserialize(File.ReadAllBytes(@"save\" + filename), compute, generator, visualizer));
            }
            else
            {
                return(new Chunk(pos, trength, seed, threshold, compute, generator, visualizer, size, noiseScale));
            }
        }
Example #28
0
    public byte[] CreateSaveData()
    {
        var chunk_serializer = new ChunkSerializer();

        m_solid_simulation.Save(chunk_serializer);
        m_liquid_simulation.Save(chunk_serializer);

        chunk_serializer.Finalize(out var data, out int data_length);

        var compressed_stream = new MemoryStream();

        using (var dstream = new DeflateStream(compressed_stream, System.IO.Compression.CompressionLevel.Fastest))
        {
            dstream.Write(data, 0, data_length);
            dstream.Close();
            return(compressed_stream.ToArray());
        }
    }
Example #29
0
    public static void Save(VoxelTerrain terrain, bool onlyDirty)
    {
        var baseFolder = LevelPath(terrain.LevelName);

        Directory.CreateDirectory(baseFolder);
        foreach (var chunk in terrain.Chunks.Values)
        {
            if (onlyDirty && !chunk.IsDataDirty)
            {
                continue;
            }

            var pos      = chunk.ChunkPosition;
            var filename = Path.Combine(baseFolder, string.Format("{0}.{1}.{2}.chunk", pos.x, pos.y, pos.z));
            Debug.Log("Saving chunk: " + filename);
            ChunkSerializer.Serialize(chunk, filename);
            chunk.IsDataDirty = false;
        }
    }
Example #30
0
    public World(string savePath, string name, GameObject explosionParticles, bool isServer)
    {
        if (isServer)
        {
            this.savePath = savePath;
            ChunkSerializer.updateWorldInfo(new WorldInfo {
                fileName = name, lastPlayed = System.DateTime.Now
            });
            if (!Directory.Exists(savePath))
            {
                Directory.CreateDirectory(savePath);
            }
            ChunkSerializer.savePath = savePath;
            players = new Dictionary <NetworkConnection, Entity>();
        }

        explosionParticlesPool = Pool <GameObject> .createEntityPool(explosionParticles, this);

        infinite      = true;
        this.isServer = isServer;
    }