internal static Msg_LR_RoomUserInfo BuildRoomUserInfo(UserInfo info, float x, float y) { //todo:加锁 Msg_LR_RoomUserInfo ruiBuilder = new Msg_LR_RoomUserInfo(); ruiBuilder.Guid = info.Guid; ruiBuilder.Nick = info.Nickname; ruiBuilder.Key = info.Key; ruiBuilder.Hero = info.HeroId; ruiBuilder.Camp = info.CampId; ruiBuilder.IsMachine = false; ruiBuilder.Level = info.Level; ruiBuilder.SummonerSkillId = info.SummonerSkillId; /// int memberCount = info.MemberInfos.Count; if (memberCount > 0) { Msg_LR_RoomUserInfo.MemberInfo[] memberList = new Msg_LR_RoomUserInfo.MemberInfo[memberCount]; for (int i = 0; i < memberCount; ++i) { memberList[i] = new Msg_LR_RoomUserInfo.MemberInfo(); memberList[i].Hero = info.MemberInfos[i].HeroId; memberList[i].Level = info.MemberInfos[i].Level; } } if (x > 0 && y > 0) { ruiBuilder.EnterX = x; ruiBuilder.EnterY = y; } return(ruiBuilder); }
private void RequestEnterSceneRoom(UserInfo info, int roomId, int hp, int mp, float x, float y) { RoomInfo room = m_LobbyInfo.GetRoomByID(roomId); if (null != room) { int campId = (int)CampIdEnum.Blue; room.AddUsers(campId, info.Guid); Msg_LR_EnterScene enterSceneMsg = new Msg_LR_EnterScene(); enterSceneMsg.UserGuid = info.Guid; enterSceneMsg.RoomId = roomId; Msg_LR_RoomUserInfo ruiBuilder = info.RoomUserInfo; ruiBuilder.Key = info.Key; ruiBuilder.Camp = info.CampId; if (hp > 0 && mp > 0) { enterSceneMsg.HP = hp; enterSceneMsg.MP = mp; } if (x > 0 && y > 0) { ruiBuilder.EnterX = x; ruiBuilder.EnterY = y; } enterSceneMsg.UserInfo = ruiBuilder; LobbyServer.Instance.RoomSvrChannel.Send(room.RoomServerName, enterSceneMsg); LogSys.Log(LOG_TYPE.DEBUG, "Request enter field, user {0} room {1}", info.Guid, roomId); } }
public void EnterScene(User newUser) { Msg_LR_RoomUserInfo lobbyUserData = newUser.LobbyUserData; if (null == lobbyUserData) { return; } TableConfig.Actor cfg = TableConfig.ActorProvider.Instance.GetActor(lobbyUserData.Hero); EntityInfo info = m_EntityMgr.AddEntity(0, lobbyUserData.Camp, cfg, string.Empty); info.SetUnitId(EntityInfo.c_StartUserUnitId + info.GetId()); info.GetMovementStateInfo().FormationIndex = 0; if (null != m_SceneConfig) { info.GetMovementStateInfo().SetPosition2D(m_SceneConfig.EnterX + (Helper.Random.NextFloat() - 0.5f) * m_SceneConfig.EnterRadius, m_SceneConfig.EnterY + (Helper.Random.NextFloat() - 0.5f) * m_SceneConfig.EnterRadius); } newUser.Info = info; AttrCalculator.Calc(info); if (newUser.HaveHpArmor) { info.Hp = newUser.Hp; info.Energy = newUser.Energy; } else { info.Hp = newUser.Info.HpMax; info.Energy = newUser.Info.EnergyMax; } info.SceneContext = m_SceneContext; AddCareList(info); if (newUser.IsEntered) { var args = m_StorySystem.NewBoxedValueList(); args.Add(info.GetId()); args.Add(info.GetUnitId()); args.Add(info.GetCampId()); args.Add(info.GetMovementStateInfo().PositionX); args.Add(info.GetMovementStateInfo().PositionZ); m_StorySystem.SendMessage("user_enter_scene", args); } }
internal static Msg_LR_RoomUserInfo BuildRoomUserInfo(UserInfo info, float x, float y) { //todo:加锁 Msg_LR_RoomUserInfo ruiBuilder = new Msg_LR_RoomUserInfo(); ruiBuilder.Guid = info.Guid; ruiBuilder.Nick = info.Nickname; ruiBuilder.Key = info.Key; ruiBuilder.Hero = info.HeroId; ruiBuilder.Camp = info.CampId; ruiBuilder.IsMachine = false; ruiBuilder.Level = info.Level; if (x > 0 && y > 0) { ruiBuilder.EnterX = x; ruiBuilder.EnterY = y; } return(ruiBuilder); }
internal void EnterScene(User newUser) { Msg_LR_RoomUserInfo lobbyUserData = newUser.LobbyUserData; if (null == lobbyUserData) { return; } TableConfig.Actor cfg = TableConfig.ActorProvider.Instance.GetActor(lobbyUserData.Hero); EntityInfo info = m_EntityMgr.AddEntity(0, lobbyUserData.Camp, cfg, (int)AiStateLogicId.Entity_Leader); info.SetUnitId(EntityInfo.c_StartUserUnitId + info.GetId()); info.GetMovementStateInfo().FormationIndex = 0; if (null != m_SceneConfig) { info.GetMovementStateInfo().SetPosition2D(m_SceneConfig.EnterX + (Helper.Random.NextFloat() - 0.5f) * m_SceneConfig.EnterRadius, m_SceneConfig.EnterY + (Helper.Random.NextFloat() - 0.5f) * m_SceneConfig.EnterRadius); } newUser.Info = info; AttrCalculator.Calc(info); if (newUser.HaveHpArmor) { info.SetHp(Operate_Type.OT_Absolute, newUser.Hp); info.SetEnergy(Operate_Type.OT_Absolute, newUser.Energy); } else { info.SetHp(Operate_Type.OT_Absolute, newUser.Info.GetActualProperty().HpMax); info.SetEnergy(Operate_Type.OT_Absolute, newUser.Info.GetActualProperty().EnergyMax); } info.SceneContext = m_SceneContext; AddCareList(info); if (newUser.IsEntered) { m_StorySystem.SendMessage("user_enter_scene", info.GetId(), info.GetUnitId(), info.GetCampId(), info.GetMovementStateInfo().PositionX, info.GetMovementStateInfo().PositionZ); } }
//-------------------------------------------------------------------------------------------------------------------------- //这些方法是一些工具方法,后面需要重新考虑并发相关的处理。 //-------------------------------------------------------------------------------------------------------------------------- internal UserInfo AddOrUpdateUserInfo(Msg_LB_BigworldUserBaseInfo baseUserInfo, Msg_LR_RoomUserInfo roomUserInfo, int leftLifeTime) { ulong guid = roomUserInfo.Guid; UserInfo info; if (!m_UserInfos.TryGetValue(guid, out info)) { info = NewUserInfo(); info.Key = GenerateKey(); } info.BaseUserInfo = baseUserInfo; info.RoomUserInfo = roomUserInfo; info.LeftLife = leftLifeTime; info.CurrentState = UserState.Online; m_UserInfos.AddOrUpdate(guid, info, (g, u) => info); m_GuidByNickname.AddOrUpdate(info.Nickname, guid, (n, g) => guid); ActivateUserGuid(guid); return(info); }
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 HandleEnterScene(Msg_LR_EnterScene msg, PBChannel channel, int handle, uint seq) { ulong guid = msg.UserGuid; int roomId = msg.RoomID; bool isFieldThread; int ix = GetActiveRoomThreadIndex(roomId, out isFieldThread); if (ix < 0) { Msg_RL_EnterSceneResult replyBuilder = new Msg_RL_EnterSceneResult(); replyBuilder.UserGuid = guid; replyBuilder.RoomID = roomId; replyBuilder.Result = (int)SceneOperationResultEnum.Cant_Find_Room; channel.Send(replyBuilder); } else { RoomThread roomThread; if (isFieldThread) { roomThread = field_roomthread_list_[ix]; } else { roomThread = roomthread_list_[ix]; } Msg_LR_RoomUserInfo rui = msg.UserInfo; 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.HandleEnterScene]", rsUser.LocalID, rui.Guid, rui.Key); user_pool_.FreeUser(rsUser.LocalID); Msg_RL_EnterSceneResult replyBuilder = new Msg_RL_EnterSceneResult(); replyBuilder.UserGuid = guid; replyBuilder.RoomID = roomId; replyBuilder.Result = (int)SceneOperationResultEnum.User_Key_Exist; channel.Send(replyBuilder); } else { rsUser.LobbyUserData = rui; if (rui.IsMachine == true) { rsUser.UserControlState = (int)UserControlState.Ai; } else { rsUser.UserControlState = (int)UserControlState.User; } if (msg.HP > 0 && msg.MP > 0) { rsUser.SetHpArmor(msg.HP, msg.MP); } if (rui.EnterX > 0 && rui.EnterY > 0) { rsUser.SetEnterPoint(rui.EnterX, rui.EnterY); } roomThread.QueueAction(roomThread.AddUser, rsUser, roomId, (MyAction <bool, int, User>)((bool success, int sceneId, User user) => { if (success) { Msg_RL_EnterSceneResult replyBuilder = new Msg_RL_EnterSceneResult(); replyBuilder.UserGuid = guid; replyBuilder.RoomID = roomId; replyBuilder.Result = (int)SceneOperationResultEnum.Success; channel.Send(replyBuilder); } else { Msg_RL_EnterSceneResult replyBuilder = new Msg_RL_EnterSceneResult(); replyBuilder.UserGuid = guid; replyBuilder.RoomID = roomId; replyBuilder.Result = (int)SceneOperationResultEnum.Cant_Find_Room; channel.Send(replyBuilder); } })); } } }