示例#1
0
        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);
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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);
        }
示例#5
0
        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);
        }
示例#7
0
        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);
                    }
                }
            }
        }
示例#8
0
        //--------------------------------------
        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);
                        }
                    }));
                }
            }
        }