//如果当前本机客户端没有产生生物群落,而其他客户端产生生物群落时,将产生的生物群落更新到当前客户端上
        public void EnqueueUpdatePopulation(NetChunk netChunk)
        {
            NetPriorityChunk priorityChunk = new NetPriorityChunk(netChunk);

            priorityChunk.Priority = GetPriority(netChunk.chunkPos, netChunk.curPlayerInChunkPos);
            generatorWorker.EnNetGeneratorQueue(priorityChunk);
        }
        //将从服务器端获取的数据序列化成chunk数据(联机使用)
        public void EnqueueNetChunk(NetChunk netChunk)
        {
            NetPriorityChunk priorityChunk = new NetPriorityChunk(netChunk);

            priorityChunk.Priority = GetPriority(netChunk.chunkPos, netChunk.curPlayerInChunkPos);
            persistanceWorker.EnNetChunkLoadQueue(priorityChunk);
        }
 public void EnNetChunkLoadQueue(NetPriorityChunk netPriorityChunk)
 {
     lock (_netChunkLoadQueue)
     {
         _netChunkLoadQueue.Enqueue(netPriorityChunk, netPriorityChunk.Priority);
     }
 }
示例#4
0
 public void EnNetGeneratorQueue(NetPriorityChunk priorityChunk)
 {
     lock (_netGeneratorQueue)
     {
         if (_netGeneratorQueue.Count > _netGeneratorQueue.MaxSize)
         {
             return;
         }
         _netGeneratorQueue.Enqueue(priorityChunk, priorityChunk.Priority);
     }
 }
示例#5
0
        private void NetGeneratorWorker()
        {
            NetPriorityChunk netPriorityChunk = DeNetGeneratorQueue();

            if (netPriorityChunk != null)
            {
                Chunk chunk = netPriorityChunk.netChunk.chunk;
                if (!netPriorityChunk.netChunk.chunkData.isExist)
                {
                    WorldPos pos = chunk.worldPos;
                    if (World.world.GetChunk(pos.x, pos.y, pos.z) == null)
                    {
                        return;
                    }
                    if (!chunk.isTerrainDataPrepared)
                    {
                        _terrainControlGenerator.Generate(chunk);
                        if (WorldConfig.Instance.CaveEnable)
                        {
                            _cavesGenerator.generate(chunk);
                        }
                        chunk.isTerrainDataPrepared = true;
                        chunk.isUpdate = true;
                        //这里是地形数据在本机上产生时,需要发送到服务器上
                        EventManager.SendEvent(EventMacro.CHUNK_DATA_GENERATE_FINISH, chunk);
                    }
                }
                //如果服务器上已经有最新的数据,拿到最新的数据更改
                if (netPriorityChunk.netChunk.chunkData.hasChangeData)
                {
                    ClientChangedChunkData changedData = netPriorityChunk.netChunk.chunkData.changedData;
                    chunk.UpdateSign(changedData.sign);
                    if (changedData.list.Count > 0)
                    {
                        for (int i = 0; i < changedData.list.Count; i++)
                        {
                            ClientChangedBlock changedBlock = changedData.list[i];
                            chunk.UpdateClientChangedBlock(changedBlock);
                        }
                        ReculateChunkLightAndAround(chunk);
                    }
                }
                CheckAroundChunkAndGeneratorPopulation(chunk, true);
            }

            ////////////////////////////////////////////////////
            //收到服务器同步的大块更改数据
            refreshNetArea();
        }
        //联机的时候的持续化工作
        private void NetPersistanceWorker()
        {
            //网络
            //从本地数据加载作为网络数据
            NetChunkData netLoadChunkData = DeNetLoadQueue();

            if (netLoadChunkData != null)
            {
                bool succ = WorldPersistanceManager.Instance.LoadNetChunk(netLoadChunkData);
                if (succ)
                {
                    netLoadChunkData.isExist = true;
                }
                else
                {
                    netLoadChunkData.isExist = false;
                }
                _manager.EnResponseNetChunkData(netLoadChunkData);
            }
            //从网络数据加载保存为本地数据
            NetChunkData netSaveChunkData = DeNetSaveQueue();

            if (netSaveChunkData != null)
            {
                WorldPersistanceManager.Instance.SaveNetChunk(netSaveChunkData);
            }

            //从网络数据加载作为内存数据
            NetPriorityChunk requestNetChunk = DeNetChunkLoadQueue();

            if (requestNetChunk != null)
            {
                requestNetChunk.netChunk.chunk.InitData();
                if (requestNetChunk.netChunk.chunkData.isExist)
                {
                    requestNetChunk.netChunk.chunk = WorldPersistanceManager.Instance.GetChunk(requestNetChunk.netChunk);
                    //当从网络上获取到区块数据,并产生的时候,发送到服务器上
                    EventManager.SendEvent(EventMacro.CHUNK_DATA_GENERATE_FINISH, requestNetChunk.netChunk.chunk);
                }
                else
                {
                    //如果当前客户端是主机,尝试从本机读取数据
                    if (NetManager.Instance.client.isMainClient)
                    {
                        if (WorldConfig.Instance.loadInMap)
                        {
                            if (WorldPersistanceManager.Instance.LoadChunk(requestNetChunk.netChunk.chunk))
                            {
                                //当从本地上获取到区块数据,并产生的时候,发送到服务器上
                                EventManager.SendEvent(EventMacro.CHUNK_DATA_GENERATE_FINISH, requestNetChunk.netChunk.chunk);
                            }
                        }
                    }
                }
                _manager.generatorWorker.EnNetGeneratorQueue(requestNetChunk);
            }

            //将内存数据序列化为网络数据
            NetRemovedChunk netSaveChunk = DeNetChunkSaveQueue();

            if (netSaveChunk != null)
            {
                EventManager.SendEvent(EventMacro.CHUNK_DATA_REMOVE_FINISH, netSaveChunk);
                _manager.EnqueueWaitRemove(netSaveChunk.chunk);
            }
        }