private void OnChunkDataSave(object[] param) { NetRemovedChunk savedChunk = param[0] as NetRemovedChunk; if (savedChunk.needSave) { Chunk chunk = savedChunk.chunk; for (int i = 0; i < savedChunk.changedEntityInfos.Count; i++) { EntityData entityData = new EntityData(); ClientEntityInfo info = savedChunk.changedEntityInfos[i]; entityData.id = info.entityId; entityData.type = info.type; entityData.pos = info.position; entityData.exData = info.extData; chunk.AddEntityData(entityData); } NetChunkData netChunkData = WorldPersistanceManager.Instance.GetNetChunkData(chunk, roleId); //如果当前客户端是主机客户端,直接保存文件到当前本地,否则,将数据发送给服务器,保存在主机 if (isMainClient) { World.world.WorldGenerator.DataProcessorManager.EnqueueSaveNetChunkData(netChunkData); } else { PlayerSaveChunkOnServerPackage package = PackageFactory.GetPackage(PackageType.PlayerSaveChunkOnServer) as PlayerSaveChunkOnServerPackage; package.pos = chunk.worldPos; package.chunkByteData = netChunkData.data.data; package.compressType = (byte)netChunkData.data.compressType; package.roleId = netChunkData.roleId; SendPackage(package); } } }
private void InitServerMainPlayerInfo() { //初始化主玩家的一些信息 MainClientInitPackage package = PackageFactory.GetPackage(PackageType.MainClientInit) as MainClientInitPackage; GameObject mainPlayer = HasActionObjectManager.Instance.playerManager.getMyPlayer(); package.roleId = roleId; package.position = mainPlayer.transform.position; package.aoId = mainPlayer.GetComponent <PlayerAttributes>().aoId; package.playerId = mainPlayer.GetComponent <PlayerAttributes>().playerId; package.worldConfigName = WorldConfig.Instance.name; package.seed = WorldConfig.Instance.seed; package.time = DayNightTime.Instance.TotalTime; SendPackage(package); //初始化当前玩家内存中的chunk信息到服务器 foreach (var key in World.world.chunks) { WorldPos chunkPos = key.Key; int sign = key.Value.GetSign(); PlayerAddChunkPackage addChunkPackage = PackageFactory.GetPackage(PackageType.PlayerAddChunk) as PlayerAddChunkPackage; addChunkPackage.pos = chunkPos; addChunkPackage.sign = sign; SendPackage(addChunkPackage); } //初始化主玩家的entity信息到服务器上(暂时只同步怪物) MainClientEntityInitPackage entityInitPackage = PackageFactory.GetPackage(PackageType.MainClientEntityInit) as MainClientEntityInitPackage; List <ClientEntityInfo> list = new List <ClientEntityInfo>(); List <GameObject> listMonster = HasActionObjectManager.Instance.monsterManager.listObj(); for (int i = 0; i < listMonster.Count; i++) { GOMonsterController controller = listMonster[i].GetComponent <GOMonsterController>(); ClientEntityInfo info = new ClientEntityInfo(); EntityData entityData = controller.GetEntityData(); info.roleId = roleId; info.aoId = controller.monsterAttribute.aoId; info.entityId = entityData.id; info.type = EntityType.MONSTER; info.position = entityData.pos; info.extData = entityData.exData; list.Add(info); } entityInitPackage.entityInfos = list; SendPackage(entityInitPackage); }
private void OnChunkDataRemoveFinish(object[] param) { NetRemovedChunk netRemovedChunk = param[0] as NetRemovedChunk; Chunk chunk = netRemovedChunk.chunk; //当chunk为移除时,向服务器发送chunk移除消息 PlayerRemoveChunkPackage removePackage = PackageFactory.GetPackage(PackageType.PlayerRemoveChunk) as PlayerRemoveChunkPackage; removePackage.pos = chunk.worldPos; SendPackage(removePackage); if (netRemovedChunk.needSave) { for (int i = 0; i < netRemovedChunk.changedEntityInfos.Count; i++) { EntityData entityData = new EntityData(); ClientEntityInfo info = netRemovedChunk.changedEntityInfos[i]; entityData.id = info.entityId; entityData.type = info.type; entityData.pos = info.position; entityData.exData = info.extData; chunk.AddEntityData(entityData); } NetChunkData netChunkData = WorldPersistanceManager.Instance.GetNetChunkData(chunk, roleId); //如果当前客户端是主机客户端,直接保存文件到当前本地,否则,将数据发送给服务器,保存在主机 if (isMainClient) { World.world.WorldGenerator.DataProcessorManager.EnqueueSaveNetChunkData(netChunkData); } else { // //上面已经移除掉了 // //先移除 // PlayerRemoveChunkPackage removeChunkPackage = PackageFactory.GetPackage(PackageType.PlayerRemoveChunk) as PlayerRemoveChunkPackage; // removeChunkPackage.pos = chunk.worldPos; // SendPackage(removeChunkPackage); //先需要从服务器上拿最新的entity数据,更新后再保存 //再保存 PlayerSaveChunkOnServerPackage package = PackageFactory.GetPackage(PackageType.PlayerSaveChunkOnServer) as PlayerSaveChunkOnServerPackage; package.pos = chunk.worldPos; package.chunkByteData = netChunkData.data.data; package.compressType = (byte)netChunkData.data.compressType; package.roleId = netChunkData.roleId; SendPackage(package); } } }