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(); }
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!"); }
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); }
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); } }
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); }
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, ); }
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); }
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); }
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()); } }
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); })); }
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); } } }
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); }); }
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; } } } }
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); } }
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); }
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); } } }
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; } } } } } }
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); }
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); } }
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); } }
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(); }
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); }
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"); } } } }
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; } } } } }
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); } }
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; } } }
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); }
//领取礼品 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); }