internal void Tick() { if (this.CurrentState == RoomState.End) { //游戏结束状态:检测数据存储是否完成 //等待每个玩家游戏数据存储完成后,将房间状态改为Close关闭状态 int count = 0; foreach (bool flag in m_UserDSFlags.Values) { if (flag == true) { count++; } } if (count == m_UserDSFlags.Count) { m_UserDSFlags.Clear(); this.CloseRoom(); } } //清除不在游戏中的玩家数据 if (UserCount > 0) { m_RecycledGuids.Clear(); foreach (KeyValuePair <ulong, WeakReference> pair in m_Users) { ulong guid = pair.Key; UserInfo info = pair.Value.Target as UserInfo; if (info == null || info.IsRecycled || info.CurrentState == UserState.DropOrOffline || info.Guid != guid) { m_RecycledGuids.Add(guid); LogSys.Log(LOG_TYPE.DEBUG, "Room {0} has a exception user {1} !!!", m_RoomId, guid); } } if (m_RecycledGuids.Count > 0) { foreach (ulong guid in m_RecycledGuids) { m_Users.Remove(guid); } UpdateUserCount(); } } //准备过程处理 if (!m_IsPrepared) { if (UserCount > 0) { long curTime = TimeUtility.GetServerMilliseconds(); bool canLog = false; if (m_LastLogTime + 1000 < curTime) { m_LastLogTime = curTime; canLog = true; } if (canLog) { LogSys.Log(LOG_TYPE.DEBUG, "Room {0} will on {1}", m_RoomId, m_RoomServerName); } foreach (KeyValuePair <ulong, WeakReference> pair in m_Users) { ulong guid = pair.Key; UserInfo info = pair.Value.Target as UserInfo; if (info != null) { if (info.LastNotifyMatchTime + 5000 < curTime) { info.LastNotifyMatchTime = curTime; JsonMessageWithGuid mrMsg = new JsonMessageWithGuid(JsonMessageID.MatchResult); mrMsg.m_Guid = guid; ArkCrossEngineMessage.Msg_LC_MatchResult protoData = new ArkCrossEngineMessage.Msg_LC_MatchResult(); protoData.m_Result = (int)TeamOperateResult.OR_Succeed; mrMsg.m_ProtoData = protoData; JsonMessageDispatcher.SendDcoreMessage(info.NodeName, mrMsg); } if (canLog) { LogSys.Log(LOG_TYPE.DEBUG, "==>User(guid:{0} acc:{1} key:{2}) State {3} key guid:{4}", info.Guid, info.AccountId, info.Key, info.IsPrepared, guid); } } else { if (canLog) { LogSys.Log(LOG_TYPE.DEBUG, "==>Oops, a null user, ignore him !!!"); } } } //检查成员状态,如果都准备好则通知RoomServer创建副本 bool isOk = true; foreach (KeyValuePair <ulong, WeakReference> pair in m_Users) { ulong guid = pair.Key; UserInfo info = pair.Value.Target as UserInfo; if (info != null && !info.IsPrepared && guid == info.Guid) { isOk = false; break; } } if (isOk) { m_IsPrepared = true; Msg_LR_CreateBattleRoom.Builder cbrBuilder = Msg_LR_CreateBattleRoom.CreateBuilder(); cbrBuilder.SetRoomId(RoomId); cbrBuilder.SetSceneType(SceneType); foreach (KeyValuePair <ulong, WeakReference> pair in m_Users) { ulong guid = pair.Key; UserInfo info = pair.Value.Target as UserInfo; if (info != null && guid == info.Guid) { Msg_LR_RoomUserInfo.Builder ruiBuilder = Msg_LR_RoomUserInfo.CreateBuilder(); ruiBuilder.SetGuid(info.Guid); ruiBuilder.SetNick(info.Nickname); ruiBuilder.SetKey(info.Key); ruiBuilder.SetHero(info.HeroId); ruiBuilder.SetCamp(info.CampId); ruiBuilder.SetIsMachine(info.IsMachine); ruiBuilder.SetLevel(info.Level); int arg_score = info.FightingScore; if (null != info.Group && null != info.Group.Members) { foreach (GroupMemberInfo m in info.Group.Members) { UserInfo member = LobbyServer.Instance.DataProcessScheduler.GetUserInfo(m.Guid); if (null != member && member.Guid != guid) { if (member.FightingScore > arg_score) { arg_score = member.FightingScore; } } } } arg_score = (int)(arg_score * 0.8); ruiBuilder.SetArgScore(arg_score); /// Msg_LR_RoomUserInfo.Types.SkillInfo.Builder[] skill_assit = new Msg_LR_RoomUserInfo.Types.SkillInfo.Builder[4]; for (int i = 0; i < skill_assit.Length; i++) { skill_assit[i] = Msg_LR_RoomUserInfo.Types.SkillInfo.CreateBuilder(); skill_assit[i].SetSkillId(0); skill_assit[i].SetSkillLevel(0); } if (null != info.Skill && null != info.Skill.Skills) { int cur_preset_index = info.Skill.CurPresetIndex; if (cur_preset_index >= 0) { for (int i = 0; i < skill_assit.Length; i++) { for (int j = 0; j < info.Skill.Skills.Count; j++) { if (info.Skill.Skills[j].Postions.Presets[cur_preset_index] == (SlotPosition)(i + 1)) { skill_assit[i].SetSkillId(info.Skill.Skills[j].ID); skill_assit[i].SetSkillLevel(info.Skill.Skills[j].Level); break; } } } for (int i = 0; i < skill_assit.Length; i++) { ruiBuilder.SkillsList.Add(skill_assit[i].Build()); } ruiBuilder.SetPresetIndex(cur_preset_index); } } /// if (null != info.Equip && null != info.Equip.Armor) { for (int i = 0; i < info.Equip.Armor.Length; i++) { Msg_LR_RoomUserInfo.Types.EquipInfo.Builder equip_assit = Msg_LR_RoomUserInfo.Types.EquipInfo.CreateBuilder(); equip_assit.SetEquipId(info.Equip.Armor[i].ItemId); equip_assit.SetEquipLevel(info.Equip.Armor[i].Level); equip_assit.SetEquipRandomProperty(info.Equip.Armor[i].AppendProperty); ruiBuilder.EquipsList.Add(equip_assit.Build()); } } /// if (null != info.Legacy && null != info.Legacy.SevenArcs) { for (int i = 0; i < info.Legacy.SevenArcs.Length; i++) { Msg_LR_RoomUserInfo.Types.LegacyInfo.Builder legacy_assit = Msg_LR_RoomUserInfo.Types.LegacyInfo.CreateBuilder(); legacy_assit.SetLegacyId(info.Legacy.SevenArcs[i].ItemId); legacy_assit.SetLegacyLevel(info.Legacy.SevenArcs[i].Level); legacy_assit.SetLegacyRandomProperty(info.Legacy.SevenArcs[i].AppendProperty); legacy_assit.SetLegacyIsUnlock(info.Legacy.SevenArcs[i].IsUnlock); ruiBuilder.LegacysList.Add(legacy_assit.Build()); } } /// if (null != info.XSoul) { foreach (ItemInfo item in info.XSoul.GetAllXSoulPartData().Values) { Msg_LR_RoomUserInfo.Types.XSoulDataInfo.Builder xsoul_msg = Msg_LR_RoomUserInfo.Types.XSoulDataInfo.CreateBuilder(); xsoul_msg.ItemId = item.ItemId; xsoul_msg.Level = item.Level; xsoul_msg.ModelLevel = item.ShowModelLevel; xsoul_msg.Experience = item.Experience; ruiBuilder.XSoulsList.Add(xsoul_msg.Build()); } } // partner PartnerInfo partnerInfo = info.PartnerStateInfo.GetActivePartner(); if (null != partnerInfo) { Msg_LR_RoomUserInfo.Types.PartnerInfo.Builder partner = Msg_LR_RoomUserInfo.Types.PartnerInfo.CreateBuilder(); partner.SetPartnerId(partnerInfo.Id); partner.SetPartnerLevel(partnerInfo.CurAdditionLevel); partner.SetPartnerStage(partnerInfo.CurSkillStage); ruiBuilder.SetPartner(partner); } cbrBuilder.AddUsers(ruiBuilder.Build()); } } //sirius TODO:在此处确定要连接的RoomServer LobbyServer.Instance.RoomSvrChannel.Send(m_RoomServerName, cbrBuilder.Build()); this.CurrentState = RoomState.Start; //房间启动状态 this.StartTime = DateTime.Now; LogSys.Log(LOG_TYPE.INFO, "Multi Play Room will run on Roomserver {0} roomid {1} scene {2} for {3} users ...", m_RoomServerName, RoomId, SceneType, UserCount); } } } }
//-------------------------------------- private void HandleCreateBattleRoom(Msg_LR_CreateBattleRoom createRoomMsg, PBChannel channel, int handle, uint seq) { LogSys.Log(LOG_TYPE.DEBUG, "channel:{0}, seq:{1}", channel, seq); bool canContinue = true; //先检查是否玩家已经在room上。 foreach (Msg_LR_RoomUserInfo rui in createRoomMsg.UsersList) { if (RoomPeerMgr.Instance.IsKeyExist(rui.Key)) { canContinue = false; LogSys.Log(LOG_TYPE.WARN, "User is already in room. UserGuid:{0}, Key:{1}", rui.Guid, rui.Key); break; } } if (!canContinue) { Msg_RL_ReplyCreateBattleRoom.Builder replyBuilder0 = Msg_RL_ReplyCreateBattleRoom.CreateBuilder(); replyBuilder0.SetRoomId(createRoomMsg.RoomId); replyBuilder0.SetIsSuccess(false); channel.Send(replyBuilder0.Build()); return; } List <User> users = new List <User>(); foreach (Msg_LR_RoomUserInfo rui in createRoomMsg.UsersList) { User rsUser = user_pool_.NewUser(); LogSys.Log(LOG_TYPE.INFO, "NewUser {0} for {1} {2}", rsUser.LocalID, rui.Guid, rui.Key); rsUser.Init(); if (!rsUser.SetKey(rui.Key)) { LogSys.Log(LOG_TYPE.WARN, "user who's key is {0} already in room!", rui.Key); LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for {1} {2}, [RoomManager.HandleCreateBattleRoom]", rsUser.LocalID, rui.Guid, rui.Key); user_pool_.FreeUser(rsUser.LocalID); continue; } rsUser.Guid = rui.Guid; rsUser.Name = rui.Nick; rsUser.HeroId = rui.Hero; rsUser.CampId = rui.Camp; rsUser.Level = rui.Level; rsUser.ArgFightingScore = rui.ArgScore; if (rui.IsMachine == true) { rsUser.UserControlState = (int)UserControlState.Ai; } else { rsUser.UserControlState = (int)UserControlState.User; } //装备数据 for (int index = 0; index < rui.ShopEquipmentsIdCount; ++index) { rsUser.ShopEquipmentsId.Add(rui.GetShopEquipmentsId(index)); } if (null != rsUser.Skill) { rsUser.Skill.Clear(); for (int i = 0; i < rui.SkillsCount; i++) { SkillTransmitArg skill_arg = new SkillTransmitArg(); skill_arg.SkillId = rui.SkillsList[i].SkillId; skill_arg.SkillLevel = rui.SkillsList[i].SkillLevel; rsUser.Skill.Add(skill_arg); } if (rui.HasPresetIndex) { rsUser.PresetIndex = rui.PresetIndex; } } /// if (null != rsUser.Equip) { rsUser.Equip.Clear(); for (int i = 0; i < rui.EquipsCount; i++) { ItemTransmitArg equip_arg = new ItemTransmitArg(); equip_arg.ItemId = rui.EquipsList[i].EquipId; equip_arg.ItemLevel = rui.EquipsList[i].EquipLevel; equip_arg.ItemRandomProperty = rui.EquipsList[i].EquipRandomProperty; rsUser.Equip.Add(equip_arg); } } /// if (null != rsUser.Legacy) { rsUser.Legacy.Clear(); for (int i = 0; i < rui.LegacysCount; i++) { ItemTransmitArg legacy_arg = new ItemTransmitArg(); legacy_arg.ItemId = rui.LegacysList[i].LegacyId; legacy_arg.ItemLevel = rui.LegacysList[i].LegacyLevel; legacy_arg.ItemRandomProperty = rui.LegacysList[i].LegacyRandomProperty; legacy_arg.IsUnlock = rui.LegacysList[i].LegacyIsUnlock; rsUser.Legacy.Add(legacy_arg); } } /// if (null != rsUser.XSouls) { rsUser.XSouls.GetAllXSoulPartData().Clear(); for (int i = 0; i < rui.XSoulsCount; i++) { ItemDataInfo item = new ItemDataInfo(); item.ItemId = rui.XSoulsList[i].ItemId; item.Level = rui.XSoulsList[i].Level; item.Experience = rui.XSoulsList[i].Experience; ItemConfig configer = ItemConfigProvider.Instance.GetDataById(item.ItemId); item.ItemConfig = configer; if (configer != null) { XSoulPartInfo part_info = new XSoulPartInfo((XSoulPart)configer.m_WearParts, item); part_info.ShowModelLevel = rui.XSoulsList[i].ModelLevel; rsUser.XSouls.SetXSoulPartData((XSoulPart)configer.m_WearParts, part_info); } } } // partner if (null != rui.Partner) { PartnerConfig partnerConfig = PartnerConfigProvider.Instance.GetDataById(rui.Partner.PartnerId); if (null != partnerConfig) { PartnerInfo partnerInfo = new PartnerInfo(partnerConfig); partnerInfo.CurAdditionLevel = rui.Partner.PartnerLevel; partnerInfo.CurSkillStage = rui.Partner.PartnerStage; rsUser.Partner = partnerInfo; } } users.Add(rsUser); LogSys.Log(LOG_TYPE.DEBUG, "enter room {0} scene {1} user info guid={2}, name={3}, key={4}, camp={5}", createRoomMsg.RoomId, createRoomMsg.SceneType, rui.Guid, rui.Nick, rui.Key, rui.Camp); } //临时测试人机机制 /* * Data_SceneConfig sceneCfg = SceneConfigProvider.Instance.GetSceneConfigById(createRoomMsg.SceneType); * if (1 == createRoomMsg.UsersCount && null != sceneCfg && sceneCfg.m_Type == (int)SceneTypeEnum.TYPE_PVP) { * for (int i = 0; i < 9; ++i) { * User rsUser = room_mgr_.NewUser(); * rsUser.Init(); * rsUser.SetKey(0xffffffff); * rsUser.Guid = 0xffffffff; * rsUser.Name = "Computer" + i; * rsUser.HeroId = CrossEngineHelper.Random.Next(1, 3); * rsUser.CampId = (i < 4 ? (int)CampIdEnum.Blue : (int)CampIdEnum.Red); * rsUser.UserControlState = (int)UserControlState.Ai; * users.Add(rsUser); * LogSys.Log(LOG_TYPE.DEBUG, "Computer enter room"); * } * } */ bool ret = false; if (users.Count == 0) { LogSys.Log(LOG_TYPE.WARN, "no user enter room"); ret = false; } else { ret = ActiveRoom(createRoomMsg.RoomId, createRoomMsg.SceneType, users.ToArray()); } if (ret) { LogSys.Log(LOG_TYPE.DEBUG, "user enter room success."); } else { LogSys.Log(LOG_TYPE.DEBUG, "user enter room failed!"); } Msg_RL_ReplyCreateBattleRoom.Builder replyBuilder = Msg_RL_ReplyCreateBattleRoom.CreateBuilder(); replyBuilder.SetRoomId(createRoomMsg.RoomId); replyBuilder.SetIsSuccess(ret); channel.Send(replyBuilder.Build()); }