Пример #1
0
        internal void DelUsers(params ulong[] users)
        {
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;

            foreach (ulong user in users)
            {
                foreach (WeakReference info in m_Users.Values)
                {
                    UserInfo userInfo = info.Target as UserInfo;
                    if (userInfo != null)
                    {
                        JsonMessageSyncQuitRoom syncQuitRoomMsg = new JsonMessageSyncQuitRoom();
                        syncQuitRoomMsg.m_Guid     = userInfo.Guid;
                        syncQuitRoomMsg.m_QuitGuid = user;
                        JsonMessageDispatcher.SendDcoreMessage(userInfo.NodeName, syncQuitRoomMsg);
                        LogSys.Log(LOG_TYPE.DEBUG, "SyncQuitRoom,receiver:{0},guid:{1}", userInfo.Guid, user);
                    }
                }
            }
            foreach (ulong user in users)
            {
                UserInfo info = dataProcess.GetUserInfo(user);
                if (null != info)
                {
                    info.Room       = null;
                    info.IsPrepared = false;
                    LogSys.Log(LOG_TYPE.DEBUG, "LeaveRoom:{0}", user);
                }
                m_Users.Remove(user);
            }
            UpdateUserCount();
        }
Пример #2
0
 internal void HandleArenaBuyFightCount(ulong guid, int handle)
 {
     LogSys.Log(LOG_TYPE.DEBUG, "--handle arena buy fight count!");
     JsonMessageWithGuid resultMsg = new JsonMessageWithGuid(JsonMessageID.ArenaBuyFightCountResult);
     resultMsg.m_Guid = guid;
     ArkCrossEngineMessage.Msg_LC_ArenaBuyFightCountResult protoData = new ArkCrossEngineMessage.Msg_LC_ArenaBuyFightCountResult();
     ArenaInfo own_arena = m_ArenaSystem.GetArenaInfoById(guid);
     UserInfo user = LobbyServer.Instance.DataProcessScheduler.GetUserInfo(guid);
     DataProcessScheduler scheduler = LobbyServer.Instance.DataProcessScheduler;
     protoData.CurBuyTime = 0;
     protoData.CurFightCount = 0;
     protoData.Result = (int)GeneralOperationResult.LC_Failure_Arena_NotFindTarget;
     if (own_arena != null && user != null && scheduler != null)
     {
         ArenaBuyFightCountConfig buy_config = ArenaConfigProvider.Instance.BuyFightCountConfig.GetDataById(own_arena.FightCountBuyTime + 1);
         if (user.Vip >= buy_config.RequireVipLevel && user.Gold >= buy_config.Cost)
         {
             if (own_arena.LeftFightCount < own_arena.MaxFightCount)
             {
                 own_arena.FightCountBuyTime += 1;
                 own_arena.LeftFightCount = own_arena.MaxFightCount;
                 protoData.Result = (int)GeneralOperationResult.LC_Succeed;
             }
             else
             {
                 protoData.Result = (int)GeneralOperationResult.LC_Failure_Full;
             }
             protoData.CurBuyTime = own_arena.FightCountBuyTime;
             protoData.CurFightCount = own_arena.LeftFightCount;
         }
     }
     resultMsg.m_ProtoData = protoData;
     JsonMessageDispatcher.SendDcoreMessage(handle, resultMsg);
     LogSys.Log(LOG_TYPE.DEBUG, "--send arena buy fight count result!");
 }
Пример #3
0
        internal void AllocLobbyRoom(ulong[] users, int type)
        {
            int  roomId = m_LobbyInfo.CreateAutoRoom(users, type);
            long time   = TimeUtility.GetServerMilliseconds();

            DataProcessScheduler dataProcess    = LobbyServer.Instance.DataProcessScheduler;
            JsonMessageWithGuid  matchResultMsg = new JsonMessageWithGuid(JsonMessageID.MatchResult);

            foreach (ulong user in users)
            {
                UserInfo info = dataProcess.GetUserInfo(user);
                if (info != null)
                {
                    info.LastNotifyMatchTime = time;
                    matchResultMsg.m_Guid    = user;
                    ArkCrossEngineMessage.Msg_LC_MatchResult protoData = new ArkCrossEngineMessage.Msg_LC_MatchResult();
                    protoData.m_Result         = (int)TeamOperateResult.OR_Succeed;
                    matchResultMsg.m_ProtoData = protoData;
                    JsonMessageDispatcher.SendDcoreMessage(info.NodeName, matchResultMsg);
                    ///
                    dataProcess.RecordCampaignAction(user, type);
                }
            }

            LogSys.Log(LOG_TYPE.DEBUG, "Alloc lobby room for {0} users, roomid {1} scene {2}", users.Length, roomId, type);
        }
Пример #4
0
        private void RecordChallengeAction(ArenaInfo challenger, ArenaInfo target, bool IsSuccess)
        {
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;

            if (null == challenger && null == target)
            {
                return;
            }
            UserInfo user1 = dataProcess.GetUserInfo(challenger.GetId());
            UserInfo user2 = dataProcess.GetUserInfo(target.GetId());

            if (null == user1 || null == user2)
            {
                return;
            }
            AccountInfo challenger_acc = dataProcess.FindAccountInfoById(user1.AccountId);

            if (null != challenger_acc)
            {
                int c_ct          = challenger.FightPartners.Count;
                int c_partner_frt = 0 < c_ct ? challenger.FightPartners[0].Id : 0;
                int c_partner_scd = 1 < c_ct ? challenger.FightPartners[1].Id : 0;
                int c_partner_thd = 2 < c_ct ? challenger.FightPartners[2].Id : 0;
                int t_ct          = target.FightPartners.Count;
                int t_partner_frt = 0 < t_ct ? target.FightPartners[0].Id : 0;
                int t_partner_scd = 1 < t_ct ? target.FightPartners[1].Id : 0;
                int t_partner_thd = 2 < t_ct ? target.FightPartners[2].Id : 0;
                /// norm log
                LogSys.NormLog("arena", LobbyConfig.AppKeyStr, challenger_acc.ClientGameVersion, Module.arena,
                               LobbyConfig.LogNormVersionStr, "C0500", challenger_acc.LogicServerId,
                               user1.AccountId, user1.Guid, user1.Level, user1.HeroId, user1.FightingScore, c_partner_frt, c_partner_scd, c_partner_thd,
                               user2.AccountId, user2.Guid, user2.Level, user2.HeroId, user2.FightingScore, t_partner_frt, t_partner_scd, t_partner_thd,
                               challenger.GetRank(), IsSuccess ? 1 : 0);
            }
        }
Пример #5
0
        internal GroupInfo CreateGroup(ulong guid, int count)
        {
            GroupInfo group;

            if (!m_Groups.TryGetValue(guid, out group))
            {
                DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
                UserInfo             creator     = dataProcess.GetUserInfo(guid);
                if (null != creator && UserState.Online == creator.CurrentState)
                {
                    group             = NewGroupInfo();
                    group.CreatorGuid = guid;
                    group.Count       = count;
                    GroupMemberInfo member = new GroupMemberInfo();
                    member.Guid          = guid;
                    member.HeroId        = creator.HeroId;
                    member.Nick          = creator.Nickname;
                    member.Level         = creator.Level;
                    member.FightingScore = creator.FightingScore;
                    member.Status        = creator.CurrentState;
                    List <GroupMemberInfo> members = new List <GroupMemberInfo>();
                    members.Add(member);
                    group.Members = members;
                    m_Groups.Add(guid, group);
                    UserInfo info = dataProcess.GetUserInfo(guid);
                    if (info != null)
                    {
                        info.Group = group;
                    }
                }
            }
            return(group);
        }
Пример #6
0
        internal void HandleBuyLife(ulong guid)
        {
            DataProcessScheduler scheduler = LobbyServer.Instance.DataProcessScheduler;

            if (null == scheduler)
            {
                return;
            }
            // 响应玩家要求复活
            UserInfo user   = scheduler.GetUserInfo(guid);
            bool     result = false;

            if (null != user)
            {
                int reliveStoneId = ItemConfigProvider.Instance.GetReliveStoneId();
                if (user.ItemBag.GetItemCount(reliveStoneId, 0) >= 1)
                {
                    scheduler.ConsumeItem(guid, user.ItemBag.GetItemData(reliveStoneId, 0), 1, GainItemType.Props, ConsumeItemWay.BuyLife, false, "BuyLife");
                    result = true;
                }
                else if (user.Gold >= 50)
                {
                    int consume = 50;
                    scheduler.ConsumeAsset(guid, consume, ConsumeAssetType.BuyLife, AssetType.Glod, "BuyLife");
                    result = true;
                }
                if (result)
                {
                    user.CurrentBattleInfo.DeadCount += 1;
                    if (null != user.Room)
                    {
                        Msg_LR_UserReLive.Builder resultBuilder = Msg_LR_UserReLive.CreateBuilder();
                        RoomInfo room = m_LobbyInfo.GetRoomByID(user.CurrentRoomID);
                        resultBuilder.SetUserGuid(guid);
                        resultBuilder.SetRoomID(user.CurrentRoomID);
                        LobbyServer.Instance.RoomSvrChannel.Send(room.RoomServerName, resultBuilder.Build());
                    }
                    JsonMessageWithGuid blrMsg = new JsonMessageWithGuid(JsonMessageID.BuyLifeResult);
                    blrMsg.m_Guid = guid;
                    ArkCrossEngineMessage.Msg_LC_BuyLifeResult protoData = new ArkCrossEngineMessage.Msg_LC_BuyLifeResult();
                    protoData.m_Succeed    = result;
                    protoData.m_CurDiamond = (int)user.Gold;
                    blrMsg.m_ProtoData     = protoData;
                    JsonMessageDispatcher.SendDcoreMessage(user.NodeName, blrMsg);
                }
                else
                {
                    JsonMessageWithGuid blrMsg = new JsonMessageWithGuid(JsonMessageID.BuyLifeResult);
                    blrMsg.m_Guid = guid;
                    ArkCrossEngineMessage.Msg_LC_BuyLifeResult protoData = new ArkCrossEngineMessage.Msg_LC_BuyLifeResult();
                    protoData.m_Succeed    = result;
                    protoData.m_CurDiamond = (int)user.Gold;
                    blrMsg.m_ProtoData     = protoData;
                    JsonMessageDispatcher.SendDcoreMessage(user.NodeName, blrMsg);
                }
            }
            //JsonMessageDispatcher.SendDcoreMessage(user.NodeName, );
        }
Пример #7
0
        internal override bool CanMatchMpve(ulong guid, out List <string> nick, out List <TeamOperateResult> ret)
        {
            nick = new List <string>();
            ret  = new List <TeamOperateResult>();
            DataProcessScheduler scheduler = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             player    = scheduler.GetUserInfo(guid);

            if (null != player)
            {
                bool isTeam = null == player.Group ? false : true;
                if (isTeam)
                {
                    if (player.Guid == player.Group.CreatorGuid)
                    {
                        foreach (GroupMemberInfo m in player.Group.Members)
                        {
                            UserInfo member = scheduler.GetUserInfo(m.Guid);
                            if (null != member)
                            {
                                if (member.Level < MpveMatchHelper.PlatformDefenseUnlockLevel)
                                {
                                    nick.Add(m.Nick);
                                    ret.Add(TeamOperateResult.OR_LevelError);
                                }
                                if (member.CurrentState != UserState.Online)
                                {
                                    nick.Add(m.Nick);
                                    ret.Add(TeamOperateResult.OR_Busyness);
                                    break;
                                }
                            }
                        }
                    }
                    else
                    {
                        ret.Add(TeamOperateResult.OR_NotCaptain);
                    }
                }
                else
                {
                    if (player.Level < MpveMatchHelper.PlatformDefenseUnlockLevel)
                    {
                        ret.Add(TeamOperateResult.OR_LevelError);
                    }
                    if (player.CurrentState != UserState.Online)
                    {
                        ret.Add(TeamOperateResult.OR_Busyness);
                    }
                }
            }
            else
            {
                ret.Add(TeamOperateResult.OR_Unknown);
            }
            return(ret.Count > 0 ? false : true);
        }
Пример #8
0
        internal TeamOperateResult RequestJoinGroup(ulong guid, ulong groupid)
        {
            TeamOperateResult result = TeamOperateResult.OR_Busyness;

            if (guid == groupid)
            {
                return(result);
            }
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             intrant     = dataProcess.GetUserInfo(guid);

            if (null != intrant && UserState.Online == intrant.CurrentState)
            {
                GroupInfo ginfo;
                if (m_Groups.TryGetValue(groupid, out ginfo))
                {
                    if (null != ginfo.Confirms &&
                        ginfo.Confirms.Count < GroupInfo.c_ConfirmNumMax)
                    {
                        bool ishave = false;
                        foreach (GroupMemberInfo info in ginfo.Confirms)
                        {
                            if (info.Guid == guid)
                            {
                                ishave = true;
                                result = TeamOperateResult.OR_Exists;
                                break;
                            }
                        }
                        if (!ishave)
                        {
                            GroupMemberInfo member = new GroupMemberInfo();
                            member.Guid          = guid;
                            member.HeroId        = intrant.HeroId;
                            member.Nick          = intrant.Nickname;
                            member.Level         = intrant.Level;
                            member.FightingScore = intrant.FightingScore;
                            member.Status        = intrant.CurrentState;
                            ginfo.Confirms.Add(member);
                            result = TeamOperateResult.OR_Succeed;
                        }
                    }
                    else
                    {
                        result = TeamOperateResult.OR_Overflow;
                    }
                }
            }
            return(result);
        }
Пример #9
0
        private void ExtractMailAttachment(MailInfo info, ulong userGuid)
        {
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;

            dataProcess.DispatchAction(dataProcess.DoAddAssets, userGuid, info.m_Money, info.m_Gold, 0, info.m_Stamina, GainConsumePos.Mail.ToString());

            int itemCt = info.m_Items.Count;

            for (int itemIx = 0; itemIx < itemCt; ++itemIx)
            {
                MailItem item = info.m_Items[itemIx];
                dataProcess.DispatchAction(dataProcess.DoAddItem, userGuid, item.m_ItemId, item.m_ItemNum, GainConsumePos.Mail.ToString());
            }
        }
Пример #10
0
        internal void AccountLogin(string accountKey, int opcode, int channelId, string data, int login_server_id, string client_game_version, string client_login_ip, string unique_identifier, string system, string game_channel_id, string nodeName)
        {
            ServerBridgeThread bridgeThread = LobbyServer.Instance.ServerBridgeThread;

            if (bridgeThread.CurActionNum < 30000)
            {
                LogSys.Log(LOG_TYPE.INFO, "Account connected: {0}, Login type: AccountLogin", accountKey);
            }
            /// Normlog
            LogSys.NormLog("serverevent", LobbyConfig.AppKeyStr, LobbyConfig.LogNormVersionStr, system, game_channel_id,
                           unique_identifier, "null", (int)ServerEventCode.VerifyToken, client_game_version);
            //账号登录模式下,首先向Billing服务器验证账号,获取accountId
            //注意这里的回调执行线程是在ServerBridgeThread线程。
            VerifyAccount(accountKey, opcode, channelId, data, (BillingClient.VerifyAccountCB)((a, ret, accountId) =>
            {
                if (ret == true)
                {
                    if (m_KickedUsers.ContainsKey(accountId))
                    {
                        LogSys.Log(LOG_TYPE.WARN, ConsoleColor.Green, "Account verify success but user is a kicked user. account:{0}, id:{1}", accountKey, accountId);

                        JsonMessageAccountLoginResult replyMsg = new JsonMessageAccountLoginResult();
                        replyMsg.m_Account   = accountKey;
                        replyMsg.m_AccountId = "";
                        replyMsg.m_Result    = (int)AccountLoginResult.Error;
                        JsonMessageDispatcher.SendDcoreMessage(nodeName, replyMsg);
                    }
                    else
                    {
                        LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Green, "Account verify success. account:{0}, id:{1}", accountKey, accountId);

                        DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
                        dataProcess.DispatchAction(dataProcess.DoAccountLogin, accountKey, accountId, login_server_id, client_game_version, client_login_ip, unique_identifier, system, game_channel_id, nodeName);
                    }
                }
                else
                {
                    LogSys.Log(LOG_TYPE.INFO, ConsoleColor.Yellow, "Account verify failed. account:{0}", accountKey);
                    JsonMessageAccountLoginResult replyMsg = new JsonMessageAccountLoginResult();
                    replyMsg.m_Account   = accountKey;
                    replyMsg.m_AccountId = "";
                    replyMsg.m_Result    = (int)AccountLoginResult.Error;
                    JsonMessageDispatcher.SendDcoreMessage(nodeName, replyMsg);
                }
                /// norm log
                LogSys.NormLog("serverevent", LobbyConfig.AppKeyStr, LobbyConfig.LogNormVersionStr, system, game_channel_id,
                               unique_identifier, accountId, (int)ServerEventCode.VerifyResult, client_game_version);
            }));
        }
Пример #11
0
        internal void GetStarList(ulong guid, int start, int count)
        {
            DataProcessScheduler scheduler = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             user      = scheduler.GetUserInfo(guid);

            if (null != user)
            {
                if (start < 0)
                {
                    start = 0;
                }
                int ct  = m_GowStars.Count;
                int end = start + count;
                if (end > ct)
                {
                    end = ct;
                }
                JsonMessageWithGuid aaMsg = new JsonMessageWithGuid(JsonMessageID.SyncGowStarList);
                aaMsg.m_Guid = guid;
                ArkCrossEngineMessage.Msg_LC_SyncGowStarList protoData = new ArkCrossEngineMessage.Msg_LC_SyncGowStarList();
                for (int i = start; i < end; ++i)
                {
                    UserInfo member = scheduler.GetUserInfo(m_GowStars[i].m_Guid);
                    if (null != member)
                    {
                        m_GowStars[i].m_Level         = member.Level;
                        m_GowStars[i].m_FightingScore = member.FightingScore;
                    }
                    ArkCrossEngineMessage.Msg_LC_SyncGowStarList.GowStarInfoForMessage info = new ArkCrossEngineMessage.Msg_LC_SyncGowStarList.GowStarInfoForMessage();
                    info.m_Guid                     = m_GowStars[i].m_Guid;
                    info.m_GowElo                   = m_GowStars[i].m_GowElo;
                    info.m_Nick                     = m_GowStars[i].m_Nick;
                    info.m_HeroId                   = m_GowStars[i].m_HeroId;
                    info.m_Level                    = m_GowStars[i].m_Level;
                    info.m_FightingScore            = m_GowStars[i].m_FightingScore;
                    info.m_RankId                   = m_GowStars[i].m_RankId;
                    info.m_Point                    = m_GowStars[i].m_Point;
                    info.m_CriticalTotalMatches     = m_GowStars[i].m_CriticalTotalMatches;
                    info.m_CriticalAmassWinMatches  = m_GowStars[i].m_CriticalAmassWinMatches;
                    info.m_CriticalAmassLossMatches = m_GowStars[i].m_CriticalAmassLossMatches;
                    protoData.m_Stars.Add(info);
                }
                if (protoData.m_Stars.Count > 0)
                {
                    aaMsg.m_ProtoData = protoData;
                    JsonMessageDispatcher.SendDcoreMessage(user.NodeName, aaMsg);
                }
            }
        }
Пример #12
0
        internal void SendModuleMail(ModuleMailInfo moduleMail, int validityPeriod)
        {
            moduleMail.m_MailGuid   = GenMailGuid();
            moduleMail.m_SendTime   = DateTime.Now;
            moduleMail.m_ExpiryDate = moduleMail.m_SendTime.AddDays(validityPeriod);
            m_ModuleMails.Add(moduleMail);
            JsonMessageNotifyNewMail newMailMsg  = new JsonMessageNotifyNewMail();
            DataProcessScheduler     dataProcess = LobbyServer.Instance.DataProcessScheduler;

            dataProcess.VisitUsers((UserInfo userInfo) =>
            {
                newMailMsg.m_Guid = userInfo.Guid;
                JsonMessageDispatcher.SendDcoreMessage(userInfo.NodeName, newMailMsg);
            });
        }
Пример #13
0
        internal void ReadMail(ulong userGuid, ulong mailGuid)
        {
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(userGuid);

            if (null != user)
            {
                List <MailInfo> mails;
                if (m_UserMails.TryGetValue(userGuid, out mails))
                {
                    if (null != mails)
                    {
                        int ct    = mails.Count;
                        int index = 0;
                        for (; index < ct; ++index)
                        {
                            if (mails[index].m_MailGuid == mailGuid)
                            {
                                MailInfo info = mails[index];
                                info.m_AlreadyRead = true;
                                break;
                            }
                        }
                    }
                }
                MailStateInfo mailStateInfo = user.MailStateInfo;
                int           wholeCt       = m_WholeMails.Count;
                for (int index = 0; index < wholeCt; ++index)
                {
                    MailInfo info = m_WholeMails[index];
                    if (info.m_MailGuid == mailGuid)
                    {
                        mailStateInfo.ReadMail(mailGuid);
                        break;
                    }
                }
                int moduleCt = m_ModuleMails.Count;
                for (int index = 0; index < moduleCt; ++index)
                {
                    ModuleMailInfo mailInfo = m_ModuleMails[index];
                    if (mailInfo.m_MailGuid == mailGuid)
                    {
                        mailStateInfo.ReadMail(mailGuid);
                        break;
                    }
                }
            }
        }
Пример #14
0
        internal void HandleRequestGowPrize(ulong guid)
        {
            DataProcessScheduler scheduler = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             user      = scheduler.GetUserInfo(guid);

            if (null == user || null == user.GowInfo)
            {
                return;
            }
            GowPrizeConfig cfg = GowConfigProvider.Instance.FindGowPrizeConfig(user.GowInfo.RankId);

            if (null != cfg)
            {
                ProvideGowPrize(guid, cfg);
            }
        }
Пример #15
0
        private void ProvideGowPrize(ulong guid, GowPrizeConfig cfg)
        {
            DataProcessScheduler scheduler = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             user      = scheduler.GetUserInfo(guid);

            if (null == user)
            {
                return;
            }
            JsonMessageWithGuid pgpMsg = new JsonMessageWithGuid(JsonMessageID.RequestGowPrize);

            pgpMsg.m_Guid = guid;
            ArkCrossEngineMessage.Msg_LC_RequestGowPrizeResult protoData = new ArkCrossEngineMessage.Msg_LC_RequestGowPrizeResult();
            if (user.GowInfo.IsAcquirePrize)
            {
                protoData.m_Result = (int)GeneralOperationResult.LC_Failure_Unknown;
            }
            else
            {
                int money_incr = cfg.Money;
                int gold_incr  = cfg.Gold;
                protoData.m_Money = money_incr;
                protoData.m_Gold  = gold_incr;
                scheduler.DispatchAction(scheduler.DoAddAssets, guid, money_incr, gold_incr, 0, 0, GainConsumePos.Gow.ToString());
                if (null != cfg.Items && cfg.Items.Count > 0)
                {
                    for (int i = 0; i < cfg.Items.Count; ++i)
                    {
                        GowPrizeItem item = cfg.Items[i];
                        if (null != item)
                        {
                            scheduler.DispatchAction(scheduler.DoAddItem, guid, item.ItemId, item.ItemNum, GainConsumePos.Gow.ToString());
                            ArkCrossEngineMessage.Msg_LC_RequestGowPrizeResult.AwardItemInfo itemDataMsg =
                                new ArkCrossEngineMessage.Msg_LC_RequestGowPrizeResult.AwardItemInfo();
                            itemDataMsg.m_Id  = item.ItemId;
                            itemDataMsg.m_Num = item.ItemNum;
                            protoData.m_Items.Add(itemDataMsg);
                        }
                    }
                }
                protoData.m_Result          = (int)GeneralOperationResult.LC_Succeed;
                user.GowInfo.IsAcquirePrize = true;
            }
            pgpMsg.m_ProtoData = protoData;
            JsonMessageDispatcher.SendDcoreMessage(user.NodeName, pgpMsg);
        }
Пример #16
0
        private void RecordPvpAction(UserInfo win, UserInfo lost)
        {
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;

            if (null != win && null != lost)
            {
                AccountInfo win_acc  = dataProcess.FindAccountInfoById(win.AccountId);
                AccountInfo lost_acc = dataProcess.FindAccountInfoById(lost.AccountId);
                if (null != win_acc && null != lost_acc)
                {
                    /// norm log
                    LogSys.NormLog("pvp", LobbyConfig.AppKeyStr, win_acc.ClientGameVersion, Module.pvp, LobbyConfig.LogNormVersionStr,
                                   "C0400", win_acc.LogicServerId, win.AccountId, win.Guid, win.Level, win.HeroId, win.FightingScore,
                                   lost.AccountId, lost.Guid, lost.Level, lost.HeroId, lost.FightingScore, 1);
                }
            }
        }
Пример #17
0
        protected override void OnTick()
        {
            long curTime = TimeUtility.GetServerMilliseconds();

            if (m_LastLogTime + 60000 < curTime)
            {
                m_LastLogTime = curTime;
                DebugPoolCount((string msg) =>
                {
                    LogSys.Log(LOG_TYPE.INFO, "GmServerThread.ActionQueue {0}", msg);
                });
            }

            const int c_MaxIterationPerTick = 100;

            if (IsLobbyFull() || GetTotalQueueingCount() <= 0)
            {
                //大厅已经满或者没有排队的玩家,多休息1秒
                System.Threading.Thread.Sleep(1000);
            }
            else
            {
                DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
                for (int i = 0; i < c_MaxIterationPerTick; ++i)
                {
                    foreach (KeyValuePair <int, Queue <string> > pair in m_QueueingAccounts)
                    {
                        int            serverId = pair.Key;
                        Queue <string> queue    = pair.Value;
                        if (queue.Count > 0 && CanEnter(serverId))
                        {
                            string accountKey = queue.Dequeue();
                            IncEnterCount(serverId);
                            LoginInfo info;
                            if (m_QueueingInfos.TryRemove(accountKey, out info) && info.LoginServerId == serverId)
                            {
                                dataProcess.DispatchAction(dataProcess.DoAccountLoginWithoutQueueing, accountKey, info.AccountId, info.LoginServerId, info.ClientGameVersion, info.ClientLoginIp, info.UniqueIdentifier, info.System, info.ChannelId, info.NodeName);
                                ++i;
                            }
                        }
                    }
                }
            }
        }
Пример #18
0
        internal bool HaveMail(ulong userGuid)
        {
            bool ret = false;
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(userGuid);

            if (null != user)
            {
                List <MailInfo> userMails;
                if (m_UserMails.TryGetValue(userGuid, out userMails) && userMails.Count > 0)
                {
                    ret = true;
                }
                MailStateInfo mailStateInfo = user.MailStateInfo;
                int           wholeMailCt   = m_WholeMails.Count;
                for (int ix = 0; ix < wholeMailCt; ++ix)
                {
                    MailInfo mailInfo = m_WholeMails[ix];
                    if (mailInfo.m_LevelDemand <= user.Level && mailInfo.m_SendTime >= user.CreateTime && mailInfo.m_ExpiryDate >= DateTime.Now && !mailStateInfo.IsAlreadyReceived(mailInfo.m_MailGuid))
                    {
                        ret = true;
                        break;
                    }
                }
                int moduleMailCt = m_ModuleMails.Count;
                for (int ix = 0; ix < moduleMailCt; ++ix)
                {
                    ModuleMailInfo     mailInfo = m_ModuleMails[ix];
                    IModuleMailHandler handler  = GetModuleMailHandler(mailInfo.m_Module);
                    if (null != handler)
                    {
                        if (handler.HaveMail(mailInfo, user))
                        {
                            ret = true;
                            break;
                        }
                    }
                }
            }
            return(ret);
        }
Пример #19
0
        internal void DirectLogin(string accountKey, int loginServerId, string nodeName)
        {
            LogSys.Log(LOG_TYPE.INFO, "Account connected: {0}, Login type: DirectLogin", accountKey);
            //直接登录模式下默认accountId与设备标识accountKey相同
            //TO DO:不同设备的设备标识会不会有重复?会不会与Billing返回的accountId重复?
            string accountId = accountKey;

            if (m_KickedUsers.ContainsKey(accountId))
            {
                JsonMessageAccountLoginResult replyMsg = new JsonMessageAccountLoginResult();
                replyMsg.m_Account   = accountKey;
                replyMsg.m_AccountId = "";
                replyMsg.m_Result    = (int)AccountLoginResult.Error;
                JsonMessageDispatcher.SendDcoreMessage(nodeName, replyMsg);
            }
            else
            {
                DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
                dataProcess.DispatchAction(dataProcess.DoAccountLogin, accountKey, accountId, loginServerId, "", "", "", "", "", nodeName);
            }
        }
Пример #20
0
        internal void SendUserMail(MailInfo userMail, int validityPeriod)
        {
            userMail.m_MailGuid   = GenMailGuid();
            userMail.m_SendTime   = DateTime.Now;
            userMail.m_ExpiryDate = userMail.m_SendTime.AddDays(validityPeriod);
            List <MailInfo> mails = null;

            if (!m_UserMails.TryGetValue(userMail.m_Receiver, out mails))
            {
                mails = new List <MailInfo>();
                m_UserMails.Add(userMail.m_Receiver, mails);
            }
            mails.Add(userMail);
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(userMail.m_Receiver);

            if (null != user && user.CurrentState != UserState.DropOrOffline)
            {
                JsonMessageNotifyNewMail newMailMsg = new JsonMessageNotifyNewMail();
                newMailMsg.m_Guid = userMail.m_Receiver;
                JsonMessageDispatcher.SendDcoreMessage(user.NodeName, newMailMsg);
            }
        }
Пример #21
0
        internal void AddUsers(int camp, params ulong[] users)
        {
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;

            foreach (ulong user in users)
            {
                UserInfo info = dataProcess.GetUserInfo(user);
                if (info != null)
                {
                    info.Room       = this;
                    info.IsPrepared = false;
                    info.CampId     = camp;
                    if (m_Users.ContainsKey(user))
                    {
                        m_Users[user] = new WeakReference(info);
                    }
                    else
                    {
                        m_Users.Add(user, new WeakReference(info));
                    }
                }
            }
            UpdateUserCount();
        }
Пример #22
0
 internal void CloseRoom()
 {
     //清空房间内玩家数据
     foreach (WeakReference info in m_Users.Values)
     {
         UserInfo user = info.Target as UserInfo;
         if (user != null)
         {
             if (user.CurrentState == UserState.Room)
             {
                 user.CurrentState = UserState.Online;
             }
             user.ResetRoomInfo();
             if (user.IsDisconnected)
             {
                 DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
                 dataProcess.DispatchAction(dataProcess.DoUserLogoff, user.Guid);
             }
         }
     }
     m_Users.Clear();
     this.CurrentState = RoomState.Close;  //房间进入关闭状态
     LogSys.Log(LOG_TYPE.INFO, "Lobby Room Close, roomID:{0}", RoomId);
 }
Пример #23
0
        internal void RequestSinglePVE(ulong guid, int sceneId)
        {
            Data_SceneConfig cfg = SceneConfigProvider.Instance.GetSceneConfigById(sceneId);

            if (null == cfg || cfg.m_Type == (int)SceneTypeEnum.TYPE_PVE)
            {
                //单人pve不建立房间,直接开始游戏(todo:奖励记到人身上[多人的奖励也是这样])
                DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
                UserInfo             user        = dataProcess.GetUserInfo(guid);
                if (user != null)
                {
                    user.CurrentBattleInfo.init(sceneId, user.HeroId);
                    SyncCombatData(user);
                    JsonMessageWithGuid startGameResultMsg = new JsonMessageWithGuid(JsonMessageID.StartGameResult);
                    startGameResultMsg.m_Guid = user.Guid;
                    ArkCrossEngineMessage.Msg_LC_StartGameResult protoData = new ArkCrossEngineMessage.Msg_LC_StartGameResult();
                    GeneralOperationResult result = GeneralOperationResult.LC_Succeed;
                    if (user.CurStamina >= cfg.m_CostStamina)
                    {
                        if (!GlobalVariables.Instance.IsDebug)
                        {
                            int preSceneId = SceneConfigProvider.Instance.GetPreSceneId(sceneId);
                            if (-1 != preSceneId)
                            {
                                if (!user.SceneData.ContainsKey(preSceneId))
                                {
                                    LogSystem.Error("player {0} try to enter an Illegal scene {1}", user.Guid, sceneId);
                                    return;
                                }
                            }
                            if (cfg.m_SubType == (int)SceneSubTypeEnum.TYPE_ELITE && user.GetCompletedSceneCount(sceneId) >= user.MaxEliteSceneCompletedCount)
                            {
                                LogSystem.Error("player {0} enter an Elite scene {1} too many times {2}", user.Guid, sceneId, user.GetCompletedSceneCount(sceneId));
                                return;
                            }
                        }
                        protoData.server_ip   = "127.0.0.1";
                        protoData.server_port = 9001;
                        protoData.key         = user.Key;
                        protoData.hero_id     = user.HeroId;
                        protoData.camp_id     = (int)CampIdEnum.Blue;
                        protoData.scene_type  = sceneId;
                        protoData.match_key   = user.CurrentBattleInfo.MatchKey;
                        result            = GeneralOperationResult.LC_Succeed;
                        user.CurrentState = UserState.Pve;
                    }
                    else
                    {
                        result = GeneralOperationResult.LC_Failure_CostError;
                    }
                    protoData.result = (int)result;
                    startGameResultMsg.m_ProtoData = protoData;
                    JsonMessageDispatcher.SendDcoreMessage(user.NodeName, startGameResultMsg);
                    LogSys.Log(LOG_TYPE.INFO, "Single Player Room will run on Lobby without room and roomserver, user {0} scene {1}", guid, sceneId);
                    /// norm log
                    AccountInfo accountInfo = dataProcess.FindAccountInfoById(user.AccountId);
                    if (null != accountInfo)
                    {
                        /// pvefight
                        LogSys.NormLog("PVEfight", LobbyConfig.AppKeyStr, accountInfo.ClientGameVersion, Module.pvefight, LobbyConfig.LogNormVersionStr,
                                       "B4110", accountInfo.LogicServerId, accountInfo.AccountId, user.Guid, user.Level, sceneId, (int)FightingType.General, "null",
                                       (int)PvefightResult.Failure, "null", "null");
                    }
                }
            }
        }
Пример #24
0
        internal void ReceiveMail(ulong userGuid, ulong mailGuid)
        {
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(userGuid);

            if (null != user)
            {
                List <MailInfo> mails;
                if (m_UserMails.TryGetValue(userGuid, out mails))
                {
                    if (null != mails)
                    {
                        MailInfo info  = null;
                        int      ct    = mails.Count;
                        int      index = 0;
                        for (; index < ct; ++index)
                        {
                            if (mails[index].m_MailGuid == mailGuid)
                            {
                                info = mails[index];
                                break;
                            }
                        }
                        if (null != info)
                        {
                            mails.RemoveAt(index);
                            ExtractMailAttachment(info, userGuid);
                        }
                    }
                }
                MailStateInfo mailStateInfo = user.MailStateInfo;
                if (!mailStateInfo.IsAlreadyReceived(mailGuid))
                {
                    int wholeCt = m_WholeMails.Count;
                    for (int index = 0; index < wholeCt; ++index)
                    {
                        MailInfo info = m_WholeMails[index];
                        if (info.m_MailGuid == mailGuid)
                        {
                            mailStateInfo.ReceiveMail(mailGuid);
                            if (info.m_LevelDemand <= user.Level && info.m_SendTime >= user.CreateTime && info.m_ExpiryDate >= DateTime.Now)
                            {
                                ExtractMailAttachment(info, userGuid);
                            }
                        }
                    }
                    int moduleCt = m_ModuleMails.Count;
                    for (int index = 0; index < moduleCt; ++index)
                    {
                        ModuleMailInfo mailInfo = m_ModuleMails[index];
                        if (mailInfo.m_MailGuid == mailGuid)
                        {
                            mailStateInfo.ReceiveMail(mailGuid);
                            if (mailInfo.m_SendTime >= user.CreateTime && mailInfo.m_ExpiryDate >= DateTime.Now)
                            {
                                IModuleMailHandler handler = GetModuleMailHandler(mailInfo.m_Module);
                                if (null != handler)
                                {
                                    MailInfo info = handler.GetMail(mailInfo, user, true);
                                    if (null != info)
                                    {
                                        ExtractMailAttachment(info, userGuid);
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            }
        }
Пример #25
0
        internal void GetMailList(ulong userGuid)
        {
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
            UserInfo             user        = dataProcess.GetUserInfo(userGuid);

            if (null != user)
            {
                List <MailInfoForMessage> mailList = new List <MailInfoForMessage>();
                List <MailInfo>           mails;
                if (m_UserMails.TryGetValue(userGuid, out mails))
                {
                    int ct = mails.Count;
                    for (int ix = 0; ix < ct; ++ix)
                    {
                        MailInfo mailInfo = mails[ix];
                        if (mailInfo.m_ExpiryDate >= DateTime.Now)
                        {
                            MailInfoForMessage mailInfoForMsg = new MailInfoForMessage();
                            mailInfoForMsg.m_AlreadyRead = mailInfo.m_AlreadyRead;
                            mailInfoForMsg.m_MailGuid    = mailInfo.m_MailGuid;
                            mailInfoForMsg.m_Module      = (int)mailInfo.m_Module;
                            mailInfoForMsg.m_Title       = mailInfo.m_Title;
                            mailInfoForMsg.m_Sender      = mailInfo.m_Sender;
                            mailInfoForMsg.m_SendTime    = mailInfo.m_SendTime;
                            mailInfoForMsg.m_Text        = mailInfo.m_Text;
                            mailInfoForMsg.m_Money       = mailInfo.m_Money;
                            mailInfoForMsg.m_Gold        = mailInfo.m_Gold;
                            mailInfoForMsg.m_Stamina     = mailInfo.m_Stamina;
                            int itemCt = mailInfo.m_Items.Count;
                            if (itemCt > 0)
                            {
                                mailInfoForMsg.m_Items = new MailItemForMessage[itemCt];
                                for (int index = 0; index < itemCt; ++index)
                                {
                                    MailItemForMessage mailItem = new MailItemForMessage();
                                    mailItem.m_ItemId             = mailInfo.m_Items[index].m_ItemId;
                                    mailItem.m_ItemNum            = mailInfo.m_Items[index].m_ItemNum;
                                    mailInfoForMsg.m_Items[index] = mailItem;
                                }
                            }
                            mailList.Add(mailInfoForMsg);
                        }
                    }
                }
                MailStateInfo mailStateInfo = user.MailStateInfo;
                //这里不对用户数据加锁,因为用户的邮件状态的改变都在这个线程完成(除上线时的数据加载)
                int wholeMailCt = m_WholeMails.Count;
                for (int ix = 0; ix < wholeMailCt; ++ix)
                {
                    MailInfo mailInfo = m_WholeMails[ix];
                    if (mailInfo.m_LevelDemand <= user.Level && mailInfo.m_SendTime >= user.CreateTime && mailInfo.m_ExpiryDate >= DateTime.Now && !mailStateInfo.IsAlreadyReceived(mailInfo.m_MailGuid))
                    {
                        if (!mailStateInfo.HaveMail(mailInfo.m_MailGuid))
                        {
                            mailStateInfo.AddMail(mailInfo.m_MailGuid, mailInfo.m_ExpiryDate);
                        }
                        MailInfoForMessage mailInfoForMsg = new MailInfoForMessage();
                        mailInfoForMsg.m_AlreadyRead = mailStateInfo.IsAlreadyRead(mailInfo.m_MailGuid);
                        mailInfoForMsg.m_MailGuid    = mailInfo.m_MailGuid;
                        mailInfoForMsg.m_Module      = (int)mailInfo.m_Module;
                        mailInfoForMsg.m_Title       = mailInfo.m_Title;
                        mailInfoForMsg.m_Sender      = mailInfo.m_Sender;
                        mailInfoForMsg.m_SendTime    = mailInfo.m_SendTime;
                        mailInfoForMsg.m_Text        = mailInfo.m_Text;
                        mailInfoForMsg.m_Money       = mailInfo.m_Money;
                        mailInfoForMsg.m_Gold        = mailInfo.m_Gold;
                        mailInfoForMsg.m_Stamina     = mailInfo.m_Stamina;
                        int itemCt = mailInfo.m_Items.Count;
                        if (itemCt > 0)
                        {
                            mailInfoForMsg.m_Items = new MailItemForMessage[itemCt];
                            for (int index = 0; index < itemCt; ++index)
                            {
                                MailItemForMessage mailItem = new MailItemForMessage();
                                mailItem.m_ItemId             = mailInfo.m_Items[index].m_ItemId;
                                mailItem.m_ItemNum            = mailInfo.m_Items[index].m_ItemNum;
                                mailInfoForMsg.m_Items[index] = mailItem;
                            }
                        }
                        mailList.Add(mailInfoForMsg);
                    }
                }
                int moduleMailCt = m_ModuleMails.Count;
                for (int ix = 0; ix < moduleMailCt; ++ix)
                {
                    ModuleMailInfo moduleMailInfo = m_ModuleMails[ix];
                    if (moduleMailInfo.m_SendTime >= user.CreateTime && moduleMailInfo.m_ExpiryDate >= DateTime.Now && !mailStateInfo.IsAlreadyReceived(moduleMailInfo.m_MailGuid))
                    {
                        if (!mailStateInfo.HaveMail(moduleMailInfo.m_MailGuid))
                        {
                            mailStateInfo.AddMail(moduleMailInfo.m_MailGuid, moduleMailInfo.m_ExpiryDate);
                        }
                        IModuleMailHandler handler = GetModuleMailHandler(moduleMailInfo.m_Module);
                        if (null != handler)
                        {
                            MailInfo mailInfo = handler.GetMail(moduleMailInfo, user, false);
                            if (null != mailInfo)
                            {
                                MailInfoForMessage mailInfoForMsg = new MailInfoForMessage();
                                mailInfoForMsg.m_AlreadyRead = mailStateInfo.IsAlreadyRead(moduleMailInfo.m_MailGuid);
                                mailInfoForMsg.m_MailGuid    = mailInfo.m_MailGuid;
                                mailInfoForMsg.m_Module      = (int)mailInfo.m_Module;
                                mailInfoForMsg.m_Title       = mailInfo.m_Title;
                                mailInfoForMsg.m_Sender      = mailInfo.m_Sender;
                                mailInfoForMsg.m_SendTime    = mailInfo.m_SendTime;
                                mailInfoForMsg.m_Text        = mailInfo.m_Text;
                                mailInfoForMsg.m_Money       = mailInfo.m_Money;
                                mailInfoForMsg.m_Gold        = mailInfo.m_Gold;
                                mailInfoForMsg.m_Stamina     = mailInfo.m_Stamina;
                                int itemCt = mailInfo.m_Items.Count;
                                if (itemCt > 0)
                                {
                                    mailInfoForMsg.m_Items = new MailItemForMessage[itemCt];
                                    for (int index = 0; index < itemCt; ++index)
                                    {
                                        MailItemForMessage mailItem = new MailItemForMessage();
                                        mailItem.m_ItemId             = mailInfo.m_Items[index].m_ItemId;
                                        mailItem.m_ItemNum            = mailInfo.m_Items[index].m_ItemNum;
                                        mailInfoForMsg.m_Items[index] = mailItem;
                                    }
                                }
                                mailList.Add(mailInfoForMsg);
                            }
                        }
                    }
                }
                JsonMessageSyncMailList syncMailListMsg = new JsonMessageSyncMailList();
                syncMailListMsg.m_Guid  = userGuid;
                syncMailListMsg.m_Mails = mailList.ToArray();
                JsonMessageDispatcher.SendDcoreMessage(user.NodeName, syncMailListMsg);
            }
        }
Пример #26
0
        internal void AutoJoinGroup(ulong guid, ulong groupid)
        {
            if (guid == groupid)
            {
                return;
            }
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
            GroupInfo            info;

            if (m_Groups.TryGetValue(groupid, out info))
            {
                if (info.Count > info.Members.Count)
                {
                    UserInfo player = dataProcess.GetUserInfo(guid);
                    if (null != player)
                    {
                        GroupMemberInfo member = new GroupMemberInfo();
                        member.Guid          = guid;
                        member.HeroId        = player.HeroId;
                        member.Nick          = player.Nickname;
                        member.Level         = player.Level;
                        member.FightingScore = player.FightingScore;
                        member.Status        = player.CurrentState;
                        bool isExist = false;
                        foreach (GroupMemberInfo atom in info.Members)
                        {
                            if (atom.Guid == guid)
                            {
                                isExist = true;
                                break;
                            }
                        }
                        if (!isExist)
                        {
                            info.Members.Add(member);
                            player.Group = info;
                        }
                    }
                }
            }
            else
            {
                UserInfo creator = dataProcess.GetUserInfo(groupid);
                UserInfo intrant = dataProcess.GetUserInfo(guid);
                if (null != creator && null != intrant)
                {
                    GroupInfo group = NewGroupInfo();
                    group.CreatorGuid = groupid;
                    group.Count       = GroupInfo.c_MemberNumMax;
                    List <GroupMemberInfo> members = new List <GroupMemberInfo>();
                    GroupMemberInfo        leader  = new GroupMemberInfo();
                    leader.Guid          = groupid;
                    leader.HeroId        = creator.HeroId;
                    leader.Nick          = creator.Nickname;
                    leader.Level         = creator.Level;
                    leader.FightingScore = creator.FightingScore;
                    leader.Status        = creator.CurrentState;
                    members.Add(leader);
                    GroupMemberInfo member = new GroupMemberInfo();
                    member.Guid          = guid;
                    member.HeroId        = intrant.HeroId;
                    member.Nick          = intrant.Nickname;
                    member.Level         = intrant.Level;
                    member.FightingScore = intrant.FightingScore;
                    member.Status        = intrant.CurrentState;
                    members.Add(member);
                    group.Members = members;
                    m_Groups.Add(groupid, group);
                    ///
                    creator.Group = group;
                    intrant.Group = group;
                }
            }
        }
Пример #27
0
        internal TeamOperateResult JoinGroup(ulong guid, ulong groupid, int count)
        {
            if (guid == groupid)
            {
                return(TeamOperateResult.OR_Unknown);
            }
            DataProcessScheduler dataProcess = LobbyServer.Instance.DataProcessScheduler;
            TeamOperateResult    result      = TeamOperateResult.OR_OutDate;
            GroupInfo            info;

            if (m_Groups.TryGetValue(groupid, out info))
            {
                if (info.Count > info.Members.Count)
                {
                    UserInfo player = dataProcess.GetUserInfo(guid);
                    if (null != player && player.CurrentState == UserState.Online)
                    {
                        GroupMemberInfo member = new GroupMemberInfo();
                        member.Guid          = guid;
                        member.HeroId        = player.HeroId;
                        member.Nick          = player.Nickname;
                        member.Level         = player.Level;
                        member.FightingScore = player.FightingScore;
                        member.Status        = player.CurrentState;
                        bool isExist = false;
                        foreach (GroupMemberInfo atom in info.Members)
                        {
                            if (atom.Guid == guid)
                            {
                                isExist = true;
                                result  = TeamOperateResult.OR_Exists;
                                break;
                            }
                        }
                        if (!isExist)
                        {
                            info.Members.Add(member);
                            player.Group = info;
                            result       = TeamOperateResult.OR_Succeed;
                        }
                    }
                }
                else
                {
                    result = TeamOperateResult.OR_Overflow;
                }
            }
            else
            {
                UserInfo creator = dataProcess.GetUserInfo(groupid);
                UserInfo intrant = dataProcess.GetUserInfo(guid);
                if (null != creator && creator.CurrentState == UserState.Online &&
                    null != intrant && intrant.CurrentState == UserState.Online)
                {
                    GroupInfo group = NewGroupInfo();
                    group.CreatorGuid = groupid;
                    group.Count       = count;
                    List <GroupMemberInfo> members = new List <GroupMemberInfo>();
                    GroupMemberInfo        leader  = new GroupMemberInfo();
                    leader.Guid          = groupid;
                    leader.HeroId        = creator.HeroId;
                    leader.Nick          = creator.Nickname;
                    leader.Level         = creator.Level;
                    leader.FightingScore = creator.FightingScore;
                    leader.Status        = creator.CurrentState;
                    members.Add(leader);
                    GroupMemberInfo member = new GroupMemberInfo();
                    member.Guid          = guid;
                    member.HeroId        = intrant.HeroId;
                    member.Nick          = intrant.Nickname;
                    member.Level         = intrant.Level;
                    member.FightingScore = intrant.FightingScore;
                    member.Status        = intrant.CurrentState;
                    members.Add(member);
                    group.Members = members;
                    m_Groups.Add(groupid, group);
                    ///
                    creator.Group = group;
                    intrant.Group = group;
                    result        = TeamOperateResult.OR_Succeed;
                }
                else
                {
                    result = TeamOperateResult.OR_OutDate;
                }
            }
            return(result);
        }
Пример #28
0
        //领取礼品
        internal GeneralOperationResult ExchangeGift(ulong userGuid, string giftcode, out int giftId)
        {
            giftId = 0;
            GeneralOperationResult ret       = GeneralOperationResult.LC_Failure_Unknown;
            DataProcessScheduler   scheduler = LobbyServer.Instance.DataProcessScheduler;
            UserInfo user = scheduler.GetUserInfo(userGuid);

            if (null != user)
            {
                GiftCodeInfo giftcodeInfo = null;
                m_GiftCodes.TryGetValue(giftcode, out giftcodeInfo);
                if (giftcodeInfo != null)
                {
                    giftId = giftcodeInfo.GiftId;
                    Dictionary <int, int> giftCountDict = null;
                    if (m_UserGiftCountDict.TryGetValue(user.Guid, out giftCountDict))
                    {
                        int count = 0;
                        if (giftCountDict.TryGetValue(giftId, out count))
                        {
                            if (count >= s_UserMaxGiftCount)
                            {
                                //该种礼包的领取次数超过限制
                                ret = GeneralOperationResult.LC_Failure_Overflow;
                                return(ret);
                            }
                        }
                    }
                    if (giftcodeInfo.IsUsed == false)
                    {
                        //礼品码可用
                        GiftConfig giftConfig = GiftConfigProvider.Instance.GetDataById(giftcodeInfo.GiftId);
                        if (null != giftConfig)
                        {
                            //扣
                            giftcodeInfo.IsUsed   = true;
                            giftcodeInfo.UserGuid = userGuid;
                            if (giftCountDict != null)
                            {
                                int count = 0;
                                if (giftCountDict.TryGetValue(giftId, out count))
                                {
                                    giftCountDict[giftId]++;
                                }
                                else
                                {
                                    giftCountDict.Add(giftId, 1);
                                }
                            }
                            else
                            {
                                giftCountDict = new Dictionary <int, int>();
                                giftCountDict.Add(giftId, 1);
                                m_UserGiftCountDict.Add(userGuid, giftCountDict);
                            }
                            var ds_thread = LobbyServer.Instance.DataStoreThread;
                            if (ds_thread.DataStoreAvailable)
                            {
                                ds_thread.DSSaveGiftCode(giftcodeInfo, true);
                            }
                            //给
                            for (int i = 0; i < giftConfig.ItemIdList.Count; ++i)
                            {
                                if (giftConfig.ItemIdList[i] > 0)
                                {
                                    scheduler.DispatchAction(scheduler.DoAddItem, userGuid, giftConfig.ItemIdList[i], giftConfig.ItemNumList[i], GainConsumePos.Gift.ToString());
                                }
                            }
                            ret = GeneralOperationResult.LC_Succeed;
                        }
                    }
                    else
                    {
                        //礼品码已经使用
                        ret = GeneralOperationResult.LC_Failure_Code_Used;
                    }
                }
                else
                {
                    //礼品码错误
                    ret = GeneralOperationResult.LC_Failure_Code_Error;
                }
            }
            return(ret);
        }