/* Sog 游戏基础库 2016 by zouwei */ using System.Collections.Generic; using System.Linq; using Sog; using ProtoCSStruct; using Sog.Log; using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Game { // 系统消息: ping chat sysnotice public class SysHandler : BasePacketHandler { public override int GetServiceType() { return GameServiceType.SysHandler; } //销毁的时候置空 public override void Dispose() { } public SysHandler() { } public override void HandlerClientPacket(PlayerSession playerSession, StructPacket packet) { if (playerSession.Player == null) { TraceLog.Debug("SysHandler HandlerClientPacket drop message id {0} because session {1} no player object", packet.MsgID, playerSession.SessionID); return; } switch (packet.MsgID) { case (int)CSGameMsgID.Ping: ProcessPing(playerSession, packet); break; case (int)CSGameMsgID.Gmcmd: GmCmdSvc.OnCliGmCmd(playerSession, packet); break; case (int)CSGameMsgID.RenameReq: PlayerOnGame player = playerSession.Player; ProcessRenameReq(player, packet); break; case (int)CSGameMsgID.ChangeIconReq: ProcessChangeIconReq(playerSession, packet); break; case (int)CSGameMsgID.CliReportBillReq: ProcessCliReportBillReq(playerSession, packet); break; case (int)CSGameMsgID.SaveClientDataReq: ProcessSaveClientDataReq(playerSession, packet); break; case (int)CSGameMsgID.SaveClientBitFlagReq: ClientBitFlagSvc.ProcessSaveClientBitFlagReq(playerSession, packet); break; case (int)CSGameMsgID.TipOffPlayerReq: ProcessTipOffPlayerReq(playerSession, packet); break; case (int)CSGameMsgID.HideMyInfoReq: ProcessHideMyInfoReq(playerSession, packet); break; case (int)CSGameMsgID.RolebaseChgReq: ProcessRolebaseChgReq(playerSession, packet); break; case (int)CSGameMsgID.PlayerSearchRoleBynameReq: //直接给world就好了 GameServerUtils.GetPacketSender().SendToWorldServer(packet, playerSession.Player.UserID); break; case (int)CSGameMsgID.PlayerQueryOtherRoleInfoReq: OnPlayerQueryOtherRoleInfoReq(playerSession.Player, packet); break; case (int)CSGameMsgID.LogClientBdcReq: BillLogWriter.Instance.SendCliToBillBDCLogSvr(packet); break; case (int)CSGameMsgID.LogClientTaReq: BillLogWriter.Instance.SendCliToBillTALogSvr(packet); break; case (int)CSGameMsgID.SetLanguageReq: OnSetLanguageReq(playerSession, packet); break; case (int)CSGameMsgID.PowerCliReq: OnPowerCliReq(playerSession.Player, packet); break; case (int)CSGameMsgID.SyspaychanelReq: OnSysPayChanelReq(playerSession.Player, packet); break; case (int)CSGameMsgID.TalentActiveReq: TalentSvc.OnActiveOption(playerSession.Player,packet); break; case (int)CSGameMsgID.TalentOptionsReq: TalentSvc.OnTalentOption(playerSession.Player,packet); break; default: break; } } public override void HandlerServerPacket(uint serverID, StructPacket packet) { switch (packet.MsgID) { //case (int)CSGameMsgID.ChatRes: // ChatSvc.OnChatRes(serverID, packet); // break; //case (int)SSGameMsgID.ChatConsumeReq: // ChatSvc.OnChatConsumeReq(serverID, packet); // break; //case (int)CSGameMsgID.QueryOtherDetailRes:重复了 // OnQueryOtherDetailRes(serverID, packet); // break; //case (int)CSGameMsgID.GagChatNotify: // OnGagChatNotify(serverID, packet); // break; case (int)SSMsgID.RealmBriefRes: OnRealmBriefRes(serverID, packet); break; case (int)SSGameMsgID.StatisticsChg: OnStatisticsChg(serverID, packet); break; case (int)SSGameMsgID.DealgmcmdNotify: GmCmdSvc.OnWorldNotifyDealGmCmd(packet); break; case (int)SSGameMsgID.PlayerQueryOfflineRoleReq: OnPlayerQueryOfflineRoleReq(serverID, packet); break; case (int)SSGameMsgID.PlayerSearchRoledbBynameRes: //数据库查询后返回了 OnPlayerSearchRoledbBynameRes(serverID, packet); break; case (int)CSGameMsgID.PlayerQueryOtherRoleInfoRes: //数据库查询后返回了 OnPlayerQueryOtherRoleInfoRes(serverID, packet); break; case (int)SSGameMsgID.CheckDirtyStringRes: DirtyStringSvc.OnCheckDirtyStringRes(serverID, packet); break; case (int)SSGameMsgID.PlaydataOpRes: OnPlaydataOpRes(serverID, packet); break; case (int)SSGameMsgID.GmChangeRoleNameReq: ProcessSSRenameReq(serverID, packet); break; default: break; } } private int ProcessPing(PlayerSession playerSession, StructPacket packet) { ref CSPing pingReq = ref packet.GetMessage(); PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Debug("SysHandler.ProcessPing no player object, session {0}", playerSession.SessionID); return -2; } long now = GameServerUtils.GetTimeMs(); //记一下时间 player.PingInfo.LastRecvPingTime = GameServerUtils.GetTimeSecond(); //客户端发给服务器 if (pingReq.ServerTime == 0) { pingReq.ServerTime = now; SendToPlayer(playerSession, packet); return 0; } long thisPing = now - pingReq.ServerTime; //统计客户端的ping player.Trace("SysHandler.ProcessPing player {0} ping {1} clienttime {2} servertime {3}" , player.UserID, thisPing, pingReq.ClientTime, pingReq.ServerTime); if (player.PingInfo.MaxPingTime < thisPing) { player.PingInfo.MaxPingTime = thisPing; } if (player.PingInfo.MinPingTime == 0 || player.PingInfo.MinPingTime > thisPing) { player.PingInfo.MinPingTime = thisPing; } player.PingInfo.TotalPingTime += thisPing; player.PingInfo.PingCount++; long nowSecond = GameServerUtils.GetTimeSecond(); //一分钟log一条ping消息 if (nowSecond - player.PingInfo.LastLogTime >= 60) { player.PingInfo.LastLogTime = nowSecond; GameBillLogUtils.LogPlayerPingInfo(player.UserID, player.PingInfo); player.Trace("SysHandler.ProcessPing player {0} min {1} max {2} avg {3}" , player.UserID, player.PingInfo.MinPingTime, player.PingInfo.MaxPingTime, player.PingInfo.TotalPingTime / player.PingInfo.PingCount); } return 0; } public void ProcessRenameReq(PlayerOnGame player, StructPacket packet) { if (player == null) { return; } ref CSRenameReq req = ref packet.GetMessage(); CSRenameRes res = new CSRenameRes(); res.NewName = req.NewName; string newNameStr = req.NewName.GetString(); int iRet = PlayerUtils.CheckRenameValid(newNameStr); if (iRet != 0) { player.Trace("SysHandler.ProcessRenameReq uid {0} CheckRenameValid failed ret {1} newNameStr [{2}]" , player.UserID, iRet, newNameStr); res.Ret = (int)CSErrCode.IncludeIllegalWord; player.SendToClient((int)CSGameMsgID.RenameRes, ref res); return; } DirtyStringSvc.DealDirtyStringCheck(player, DirtyStringCheckType.CSRenameReq, ref req, newNameStr); } public void ProcessSSRenameReq(uint serverID, StructPacket packet) { ref SSGmChangeRoleNameReq req = ref packet.GetMessage(); TraceLog.Debug("SysHandler-ProcessSSRenameReq req:{0}", req.ToString()); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(req.Uid); if (player == null) { TraceLog.Error("SysHandler.ProcessSSRenameReq query uid {0} not in memory,skip" , packet.ObjectID); return; } SSGmChangeRoleNameRes res = new SSGmChangeRoleNameRes(); res.Name = req.Name; res.Uid = req.Uid; res.Id = req.Id; string newNameStr = req.Name.GetString(); int iRet = PlayerUtils.CheckRenameValid(newNameStr); if (iRet != 0) { player.Trace("SysHandler.ProcessSSRenameReq uid {0} CheckRenameValid failed ret {1} newNameStr [{2}]" , player.UserID, iRet, newNameStr); res.Ret = (int)CSErrCode.IncludeIllegalWord; GameServerUtils.GetPacketSender().SendToServerByID(serverID, (int)SSGameMsgID.GmChangeRoleNameRes, ref res, player.UserID); return; } DirtyStringSvc.DealDirtyStringCheck(player, DirtyStringCheckType.SSRenameReq, ref req, newNameStr); } private void ProcessChangeIconReq(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("SysHandler.ProcessChangeIconReq uid {0} no player", playerSession.UserID); return; } ref CSChangeIconReq req = ref packet.GetMessage(); var res = new CSChangeIconRes { Ret = -1, NewIcon = req.NewIcon }; string newIcon = req.NewIcon.GetString(); if (string.IsNullOrEmpty(newIcon) || newIcon.Equals("nil")) { TraceLog.Trace("SysHandler.ProcessChangeIconReq uid {0} req invalid icon {1}", player.UserID, newIcon); player.SendToClient((int)CSGameMsgID.ChangeIconRes, ref res); return; } if (!int.TryParse(newIcon, out int iconId) || iconId == 0) { TraceLog.Trace("SysHandler.ProcessChangeIconReq uid {0} req invalid icon {1}", player.UserID, newIcon); player.SendToClient((int)CSGameMsgID.ChangeIconRes, ref res); return; } if (!SysSvc.IsPlayerIconUnlock(player, iconId)) { TraceLog.Trace("SysHandler.ProcessChangeIconReq uid {0} icon {1} is lock", player.UserID, iconId); player.SendToClient((int)CSGameMsgID.ChangeIconRes, ref res); var notify = new CSIconDataNotify { Data = player.RoleData.IconData }; player.SendToClient((int)CSGameMsgID.IconDataNotify, ref notify); return; } player.RoleBase.Icon = req.NewIcon; player.MakeDirty(); player.Trace("SysHandler.ProcessChangeIconReq uid {0} change new icon {1}", player.UserID, newIcon); res.Ret = 0; player.SendToClient((int)CSGameMsgID.ChangeIconRes, ref res); PlayerNotify.NotifyPlayerShowInfoChange(player); GameServerUtils.GetPlayerDataSvc().UpdateRoleBriefToDB(player); } private void ProcessCliReportBillReq(PlayerSession playerSession, StructPacket packet) { ref CSCliReportBillReq req = ref packet.GetMessage(); string strContent = ""; if (req.ReportStr.IsEmpty() == false) { strContent = req.ReportStr.GetString().Replace("\n", " "); strContent = strContent.Replace("\r", " "); } GameBillLogUtils.LogCliReportBill(playerSession.UserID, req.ReportType.GetString(), strContent); } private void ProcessSaveClientDataReq(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("SysHandler.ProcessSaveClientDataReq no player object uid {0}" , playerSession.UserID); return; } ref CSSaveClientDataReq req = ref packet.GetMessage(); int maxLength = 256; //设一下最大值,不能超过256字节 if (req.ClientData.Count > maxLength) { player.Error("SysHandler.ProcessSaveClientDataReq uid {0} data length too long, max {1}" , playerSession.UserID, maxLength); return; } player.unimportanceData.ClientData = req.ClientData; player.MakeDirty(); CSSaveClientDataRes res = new CSSaveClientDataRes(); res.ClientData = req.ClientData; player.SendToClient((int)CSGameMsgID.SaveClientDataRes, ref res); player.Trace("SysHandler.ProcessSaveClientDataReq uid {0} ", playerSession.UserID); } private void OnQueryOtherDetailRes(uint serverID, StructPacket packet) { ref var res = ref packet.GetMessage(); //发给客户端的 PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(packet.ObjectID); if (player == null) { TraceLog.Trace("SysHandler.OnQueryOtherDetailRes query uid {0} not in memory,skip" , packet.ObjectID); return; } player.SendToClient(packet); } private void OnPlayerQueryOtherRoleInfoRes(uint serverID, StructPacket packet) { //发给客户端的 PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(packet.ObjectID); if (player == null) { TraceLog.Trace("SysHandler.OnPlayerQueryOtherRoleInfoRes query uid {0} not in memory,skip" , packet.ObjectID); return; } ref var res = ref packet.GetMessage(); if (res.QueryRoleType == QueryRoleType.CBC) { CBattleSvc.CbcPlayerRes(ref res); } else { player.SendToClient(packet); } } private void OnPlaydataOpRes(uint serverID, StructPacket packet) { // ref var res = ref packet.GetMessage(); TraceLog.Debug("SysHandler-OnPlaydataOpRes res:{0}", res.ToString()); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(res.Uid); if (player == null) { TraceLog.Error("SysHandler.OnPlaydataOpRes query uid {0} not in memory,skip" , packet.ObjectID); return; } UnifyOp op = new UnifyOp(player, BillChangeItemReason.OssPlayerData); for (int i = 0; i < res.OpData.Count; i++) { var opData = res.OpData[i]; if (opData.Id <= player.RoleData.OssMaxPlayerDataId) { continue; } else { player.RoleData.OssMaxPlayerDataId = opData.Id; } op = new UnifyOp(player, BillChangeItemReason.OssPlayerData, opData.Id.ToString()); CSErrCode code = CSErrCode.None; switch (opData.Type) { case OpPlayDataHandleType.None: break; case OpPlayDataHandleType.Currency: if (opData.OpType == 2) { op.AddItem(opData.OpId.ToString(), opData.OpNum); } else if (opData.OpType == 1) { op.CostItem(opData.OpId.ToString(), opData.OpNum); } break; case OpPlayDataHandleType.Hero: if (opData.OpType == 2) { //op.AddHero((int)opData.OpId, opData.OpNum); } else if (opData.OpType == 1) { } break; case OpPlayDataHandleType.BagItem: if (opData.OpType == 2) { op.AddItem(opData.OpId.ToString(), opData.OpNum); } else if (opData.OpType == 1) { op.CostItem(opData.OpId.ToString(), opData.OpNum); } break; case OpPlayDataHandleType.BagEquip: if (opData.OpType == 2) { } else if (opData.OpType == 1) { } break; case OpPlayDataHandleType.VipActivity: break; case OpPlayDataHandleType.Debug: TraceLog.Error("SysHandler - OnPlaydataOpRes uid:{4} id:{0} opId:{1} OpType:{2} OpNum:{3}", opData.Id, opData.OpId, opData.OpType, opData.OpNum, res.Uid); code = CSErrCode.SysFailure; break; default: code = CSErrCode.SysFailure; break; } if (code != CSErrCode.None) { TraceLog.Error("SysHandler-OnPlaydataOpRes error, code {0}", code); continue; } code = op.CheckOp(); if (code != CSErrCode.None) { TraceLog.Error("SysHandler-OnPlaydataOpRes error,op check code {0}", code); continue; } code = op.DoOp(); if (code != CSErrCode.None) { TraceLog.Error("SysHandler-OnPlaydataOpRes error,op doop code {0}", code); continue; } else { TraceLog.Trace("SysHandler-OnPlaydataOpRes success uid {0} id {1}", player.UserID, opData.Id); //bill Log } } // 结束后判断最大值是否更新 if (res.MaxId > player.RoleData.OssMaxPlayerDataId) player.RoleData.OssMaxPlayerDataId = res.MaxId; return; } private void ProcessTipOffPlayerReq(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("SysHandler.ProcessTipOffPlayerReq no player object uid {0}" , playerSession.UserID); return; } //转给world GameServerUtils.GetPacketSender().SendToWorldServer(packet, player.UserID); } private void OnGagChatNotify(uint serverID, StructPacket packet) { ref var gagChatNotify = ref packet.GetMessage(); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(packet.ObjectID); if (player == null) { TraceLog.Trace("SysHandler.OnGagChatNotify uid {0} not in memory", packet.ObjectID); return; } player.GagChatEndTime = gagChatNotify.GagEndTime; player.SendToClient(packet); } private void ProcessHideMyInfoReq(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("SysHandler.ProcessHideMyInfoReq no player object uid {0}" , playerSession.UserID); return; } ref CSHideMyInfoReq req = ref packet.GetMessage(); if (req.Hide != 0 && req.Hide != 1) { player.Error("SysHandler.ProcessHideMyInfoReq player uid {0} invalid param hide {1}" , player.UserID, req.Hide); return; } player.RoleData.OtherData.HideMyInfo = req.Hide; player.MakeDirty(); //好友里也需要,发给world GameServerUtils.GetPacketSender().SendToWorldServer(packet, player.UserID); CSHideMyInfoRes res = new CSHideMyInfoRes(); res.Hide = req.Hide; player.Debug("SysHandler.ProcessHideMyInfoReq player uid {0} hide {1} success" , player.UserID, req.Hide); player.SendToClient((int)CSGameMsgID.HideMyInfoRes, ref res); GameBillLogUtils.LogHideMyInfo(player.UserID, req.Hide); } private void OnSetLanguageReq(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("SysHandler.OnSetLanguageReq no player object uid {0}", playerSession.UserID); return; } ref var req = ref packet.GetMessage(); req.Lang.SetString(Sog.Lang.LanguageUtils.GetLangByClientOsLanguage(req.Lang.GetString())); playerSession.Lang = req.Lang.GetString(); player.Lang = playerSession.Lang; player.RoleBase.Lang.SetString(playerSession.Lang); player.MakeDirty(); //转给world GameServerUtils.GetPacketSender().SendToWorldServer(packet, player.UserID); // 转给mail GameServerUtils.GetPacketSender().SendToMailServer((int)CSGameMsgID.SetLanguageReq, ref req, player.UserID); TraceLog.Trace("SysHandler.OnSetLanguageReq uid {0} lang {1}", player.UserID, req.Lang); var res = new CSSetLanguageRes(); res.Lang = req.Lang; player.SendToClient((int)CSGameMsgID.SetLanguageRes, ref res); } private void OnRealmBriefRes(uint serverID, StructPacket packet) { ref var res = ref packet.GetMessage(); var svrData = GameServerUtils.GetGameServerData(); for (int i = 0; i < res.RealmList.Count; i++) { var realm = new RealmBriefInfo(ref res.RealmList[i]); svrData.m_allRealm[realm.realmId] = realm; } if (!res.RealmListMd5.IsEmpty()) { svrData.recvRealmListMd5 = res.RealmListMd5.GetString(); } TraceLog.Trace("OnRealmBriefRes count {0} svrData.recvRealmListMd5 {1}", svrData.m_allRealm.Count, svrData.recvRealmListMd5); } private void OnStatisticsChg(uint serverID, StructPacket packet) { ref var notify = ref packet.GetMessage(); long uid = packet.ObjectID; var player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(uid); if (player == null) { TraceLog.Error("SysHandler.OnStatisticsChg uid {0} not in table", uid); return; } //bool updateToWorld = false; var rolechgOp = new RoleStatChgOp(player); for (int i = 0; i < notify.ChgStat.Count; i++) { ref var iv = ref notify.ChgStat[i]; rolechgOp.AddIDDaily(iv.Id, iv.Value); // if (iv.Id == (int)CSRoleStatisticsID.BrokeGrantsCount) //{ // updateToWorld = true; // } } rolechgOp.NotifyClient(); //if (updateToWorld) //{ // PlayerNotify.NotifySimpleRoleDataToWorld(player); //} } private int CheckRolebaseChg(PlayerOnGame player, ref CSRolebaseChgReq req) { var nick = req.Nick.GetString(); var gender = req.Gender; if (string.IsNullOrEmpty(nick)) { return -1; } if (gender > 2 || gender < 0) { return -1; } var bInvalidGender = gender == player.GetGender(); var bInvalidNick = nick == player.GetNick(); // 两个都没改 if (bInvalidNick && bInvalidGender) { return -1; } return 0; } private void ProcessRolebaseChgReq(PlayerSession playerSession, StructPacket packet) { PlayerOnGame player = playerSession.Player; if (player == null) { TraceLog.Error("SysHandler.ProcessRolebaseChgReq no player object uid {0}", playerSession.UserID); return; } ref var req = ref packet.GetMessage(); var res = new CSRolebaseChgRes(); if (CheckRolebaseChg(player, ref req) != 0) { TraceLog.Error("SysHandler.ProcessRolebaseChgReq uid {0} CheckRolebaseChg no invaild", player.UserID); res.Ret = -1; SendToPlayer(playerSession, (int)CSGameMsgID.RolebaseChgRes, ref res); return; } if (req.Nick.GetString() != player.GetNick()) { //保存在other里 player.RoleData.OtherData.NewNick = req.Nick; player.RoleBase.Nick = req.Nick; } if (player.GetGender() != req.Gender) { //保存在other里 player.RoleData.OtherData.NewGender = req.Gender; player.RoleBase.Gender = req.Gender; } player.MakeDirty(); //通知world PlayerNotify.NotifyWorldPlayerRolebaseChangeUpdate(player); TraceLog.Trace("SysHandler.ProcessRolebaseChgReq uid {0} nick {1} gender {2} success" , player.UserID, player.GetNick(), player.GetGender()); res.Ret = 0; res.Nick.SetString(player.GetNick()); res.Gender = player.GetGender(); SendToPlayer(playerSession, (int)CSGameMsgID.RolebaseChgRes, ref res); } public void OnPlayerQueryOtherRoleInfoReq(PlayerOnGame player, StructPacket packet) { ref CSPlayerQueryOtherRoleInfoReq req = ref packet.GetMessage(); PlayerOnGame target = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(req.TargetUid); if (target == null) { //直接给world就好了 GameServerUtils.GetPacketSender().SendToWorldServer(packet, player.UserID); } else { CSPlayerQueryOtherRoleInfoRes queryRes = new CSPlayerQueryOtherRoleInfoRes(); queryRes.FromUid = player.UserID; queryRes.Ret = CSErrCode.None; queryRes.QueryRoleType = req.QueryRoleType; HeroPropUtils.FillHeroInfo(ref queryRes.ShowInfo.HeroInfo, ref target.RoleData ); PlayerUtils.GetRoleBaseInfo(target, ref queryRes.ShowInfo.RoleBaseInfo); player.SendToClient((int)CSGameMsgID.PlayerQueryOtherRoleInfoRes, ref queryRes); } } //这里只是借用下个协议,实际上world检测到在线,发到这里来拿TargetUid的数据的 private void OnPlayerQueryOfflineRoleReq(uint serverID, StructPacket packet) { ref SSPlayerQueryOfflineRoleReq queryRoleReq = ref packet.GetMessage(); SSPlayerQueryOfflineRoleRes queryRoleRes = new SSPlayerQueryOfflineRoleRes(); queryRoleRes.Ret = CSErrCode.None; queryRoleRes.CallBackReq.CopyFrom(ref queryRoleReq); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(queryRoleReq.TargetUid); if (player == null) { TraceLog.Error("SysHandler.OnPlayerQueryOfflineRoleReq uid {0} not in table", queryRoleReq.TargetUid); queryRoleRes.Ret = CSErrCode.SysFailure; } else { queryRoleRes.TargetIsOnline = player.SessionID > 0; queryRoleRes.RoleBase.CopyFrom(ref player.RoleBase); queryRoleRes.RoleData.CopyFrom(ref player.RoleData); queryRoleRes.TargetRealmId = player.RealmID; } GameServerUtils.GetPacketSender().SendToServerByID(serverID, (int)SSGameMsgID.PlayerQueryOfflineRoleRes, ref queryRoleRes, packet.ObjectID); } private void OnPlayerSearchRoledbBynameRes(uint serverID, StructPacket packet) { ref SSPlayerSearchRoleDBByNameRes dbRes = ref packet.GetMessage(); PlayerOnGame player = GameServerUtils.GetPlayerTableOp().GetPlayerByUid(dbRes.FromUid); if (player == null) { TraceLog.Error("OnPlayerSearchRoledbBynameRes FromUid {0} not in table", dbRes.FromUid); return; } CSPlayerSearchRoleByNameRes res = new CSPlayerSearchRoleByNameRes(); res.Ret = dbRes.Ret; if (dbRes.Ret == CSErrCode.None) { res.TargetUid.CopyFrom(ref dbRes.TargetUid); } SendToPlayer(player, (int)CSGameMsgID.PlayerSearchRoleBynameRes, ref res); } private void OnPowerCliReq(PlayerOnGame player, StructPacket packet) { ref CsPowerCliReq req = ref packet.GetMessage(); PlayerNotify.NotifyPlayerPowerChange(player, 1, req.BoxChange); GameServerUtils.GetEventHandlerMgr().TriggerHeroPowerChanged(player, player.RoleBase.Power); } private void OnSysPayChanelReq(PlayerOnGame player, StructPacket packet) { ref var req = ref packet.GetMessage(); var res = new CSSysPayChanelRes(); res.Seq = req.Seq; var config = GameServerUtils.GetServerConfig(); res.ClosePayChanel = config.closePayChanel; player.SendToClient((int)CSGameMsgID.SyspaychanelRes, ref res); } public class SysSvc { // 更新调查问卷地址 public static void RealmOnline(int realmId) { var online = GameServerUtils.GetGameServerData().realmOnline; if (!online.ContainsKey(realmId)) { online[realmId] = 0; } online[realmId]++; } public static void RealmOffline(int realmId) { var online = GameServerUtils.GetGameServerData().realmOnline; if (online.ContainsKey(realmId)) { online[realmId]--; } } public static void updateSysPayChanel(PlayerOnGame player) { var config = GameServerUtils.GetServerConfig(); if (player.RoleData.OtherData.ClosePayChanel != config.closePayChanel) { player.RoleData.OtherData.ClosePayChanel = config.closePayChanel; var res = new CSSysPayChanelRes(); res.ClosePayChanel = config.closePayChanel; player.SendToClient((int)CSGameMsgID.SyspaychanelRes, ref res); player.MakeDirty(); } } public static bool IsPlayerIconUnlock(PlayerOnGame player, int iconId) { //GameServerUtils.GetSequenceCheckIndex(iconId, out int index, out int bitIdx); //if (index < 0 || index >= player.RoleData.IconData.IconUnlockBits.Count) //{ // TraceLog.Error("SysSvc.IsPlayerIconUnlock uid {0} icon {1} no space", player.UserID, iconId); // return false; //} //return GameServerUtils.CheckInSequence(bitIdx, player.RoleData.IconData.IconUnlockBits[index]); for (int i = 0; i < player.RoleData.IconData.Unlocked.Count; i++) { if (player.RoleData.IconData.Unlocked.Get(i) == iconId) { return true; } } return false; } } } }