//如果当前本机客户端没有产生生物群落,而其他客户端产生生物群落时,将产生的生物群落更新到当前客户端上 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); } }
public void EnNetGeneratorQueue(NetPriorityChunk priorityChunk) { lock (_netGeneratorQueue) { if (_netGeneratorQueue.Count > _netGeneratorQueue.MaxSize) { return; } _netGeneratorQueue.Enqueue(priorityChunk, priorityChunk.Priority); } }
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); } }