using ProtoCSStruct; using Sog; namespace World { public static class QueryRoleInfoSvc { public static CSPlayerQueryOtherRoleInfoRes queryRes = new CSPlayerQueryOtherRoleInfoRes(); //保证serverId哪里来的返回到哪去,packet.ObjectID 保证为发起查询的玩家uid public static void OnPlayerQueryOtherRoleInfoReq(uint serverId, StructPacket packet) { ref CSPlayerQueryOtherRoleInfoReq req = ref packet.GetMessage(); PlayerInfoWorld fromPlayer = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(packet.ObjectID); if (fromPlayer == null || fromPlayer.IsOnline == false) { TraceLog.Error("fromPlayer uid {0} is not exist or offline", packet.ObjectID); return; } long nowSec = WorldServerUtils.GetTimeSecond(); PlayerInfoWorld targetPlayer = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(req.TargetUid); SSPlayerQueryOfflineRoleReq query = new SSPlayerQueryOfflineRoleReq(); query.TargetUid = req.TargetUid; query.FromUid = packet.ObjectID; query.FromRealm = fromPlayer.RealmID; query.FromServerID = serverId; //这个不定是从GameServer来的,有可能是FriendServer等服务器来的 query.QueryRoleType = req.QueryRoleType; TraceLog.Trace("QueryRoleInfoSvc.OnPlayerQueryOtherRoleInfoReq req fromUid {0} targetUid {1} fromRealm {2} fromServerID {3} queryRoleType {4}", packet.ObjectID, req.TargetUid, fromPlayer.RealmID, serverId, req.QueryRoleType); //1:是否机器人 if (RobotUtils.IsRobotByUid(req.TargetUid)) { SendQueryRobotResToServer(serverId, req.TargetUid, packet.ObjectID, fromPlayer.RealmID, req.QueryRoleType); return; } //2:在线 if (targetPlayer != null && targetPlayer.IsOnline) { //领地查看无视逻辑服限制 if ( !WorldServerUtils.CheckIsSameLogicWorld(fromPlayer.RealmID, targetPlayer.RealmID)) { //不是同一个logicWorld TraceLog.Error("QueryRoleInfoSvc.OnPlayerQueryOtherRoleInfoReq not same logicWorld from {0} {1} target {2} {3}", fromPlayer.UserID, fromPlayer.RealmID, targetPlayer.UserID, targetPlayer.RealmID); return; } //这里借用下SSPlayerQueryOfflineRoleReq这个去game服务器 WorldServerUtils.GetPacketSender().SendToServerByID(targetPlayer.GameServerID, (int)SSGameMsgID.PlayerQueryOfflineRoleReq, ref query, packet.ObjectID); return; } //3:不在线,看看缓存中有没有 ref OneRoleCacheStruct oneCache = ref WorldServerUtils.GetRoleCacheInfoSvc().GetOneRoleCacheStructByUid(req.TargetUid); if (oneCache.IsNull() == false) { //领地查看无视逻辑服限制 if (!WorldServerUtils.CheckIsSameLogicWorld(fromPlayer.RealmID, oneCache.realmId)) { //不是同一个logicWorld TraceLog.Error("QueryRoleInfoSvc.OnPlayerQueryOtherRoleInfoReq not same logicWorld from {0} {1} target {2} {3}", fromPlayer.UserID, fromPlayer.RealmID, req.TargetUid, oneCache.realmId); return; } //更新下访问时间 oneCache.LastAccessTime = nowSec; SendQueryResToServer(serverId, packet.ObjectID, ref oneCache, req.QueryRoleType); return; } //4:都没有只能去数据库看看 //发送查询玩家信息的协议到DB,返回world处理 uint dbServerID = DBServerIDUtils.GetGameDBServerID(req.TargetUid); WorldServerUtils.GetPacketSender().SendToServerByID(dbServerID, (int)SSGameMsgID.PlayerQueryOfflineRoleReq, ref query, packet.ObjectID); } public static void OnPlayerQueryOfflineRoleRes(StructPacket packet) { ref SSPlayerQueryOfflineRoleRes res = ref packet.GetMessage(); if (res.Ret != CSErrCode.None) { SendErrQueryResToServer(res.CallBackReq.FromServerID, res.CallBackReq.FromUid, res.Ret, res.CallBackReq.QueryRoleType); return; } if (!WorldServerUtils.CheckIsSameLogicWorld(res.CallBackReq.FromRealm, res.TargetRealmId)) { //不是同一个logicWorld TraceLog.Error("QueryRoleInfoSvc.OnPlayerQueryOfflineRoleRes not same logicWorld from {0} {1} target {2} {3}", res.CallBackReq.FromUid, res.CallBackReq.FromRealm, res.CallBackReq.TargetUid, res.TargetRealmId); return; } if (res.TargetIsOnline == false) { //创建一个缓存数据 ref OneRoleCacheStruct one = ref WorldServerUtils.GetRoleCacheInfoSvc().AddOneRoleCacheByUid(res.CallBackReq.TargetUid); if (one.IsNull()) { SendErrQueryResToServer(res.CallBackReq.FromServerID, res.CallBackReq.FromUid, CSErrCode.Fail, res.CallBackReq.QueryRoleType); return; } one.realmId = res.TargetRealmId; //缓存下数据 CopyDBRoleInfoToRoleCacheStruct(ref res, ref one); //哪里来的通知到哪里去 SendQueryResToServer(res.CallBackReq.FromServerID, res.CallBackReq.FromUid, ref one, res.CallBackReq.QueryRoleType); } else { OneRoleCacheStruct one = new OneRoleCacheStruct(); one.realmId = res.TargetRealmId; CopyDBRoleInfoToRoleCacheStruct(ref res, ref one); //哪里来的通知到哪里去 SendQueryResToServer(res.CallBackReq.FromServerID, res.CallBackReq.FromUid, ref one, res.CallBackReq.QueryRoleType); } } private static void CopyDBRoleInfoToRoleCacheStruct(ref SSPlayerQueryOfflineRoleRes res, ref OneRoleCacheStruct one) { one.LastAccessTime = WorldServerUtils.GetTimeSecond(); one.LastUpdateTime = WorldServerUtils.GetTimeSecond(); FillRoleBaseInfo(ref res.RoleBase, ref res.RoleData, ref one.showInfo.RoleBaseInfo); long nowSec = WorldServerUtils.GetTimeSecond(); one.showInfo.HeroInfo.PropView.Knight.PropVal.Clear(); HeroPropUtils.FillHeroInfo(ref one.showInfo.HeroInfo, ref res.RoleData); } public static void FillRoleBaseInfo(ref DBRoleBase roleBase, ref DBRoleData roleData, ref RoleBaseInfo roleBaseInfo) { roleBaseInfo.Uid = roleBase.Uid; roleBaseInfo.Level = roleBase.Level; roleBaseInfo.Gender = roleBase.Gender; roleBaseInfo.Icon.SetString(roleBase.Icon.ToString()); roleBaseInfo.Nick.SetString(roleBase.Nick.ToString()); roleBaseInfo.IconFrameId = roleData.IconFrameData.IconFrameId; roleBaseInfo.Power = (int)roleBase.Power; } private static void SendErrQueryResToServer(uint fromServerID, long fromUid, CSErrCode ret, QueryRoleType queryRoleType) { queryRes.Clear(); queryRes.Ret = ret; queryRes.FromUid = fromUid; queryRes.QueryRoleType = queryRoleType; WorldServerUtils.GetPacketSender().SendToServerByID(fromServerID, (int)CSGameMsgID.PlayerQueryOtherRoleInfoRes, ref queryRes, fromUid); } private static void SendQueryResToServer(uint serverId, long fromUid, ref OneRoleCacheStruct oneCache, QueryRoleType queryRoleType) { queryRes.Clear(); queryRes.Ret = CSErrCode.None; queryRes.FromUid = fromUid; queryRes.TargetRealmId = oneCache.realmId; queryRes.ShowInfo = oneCache.showInfo; queryRes.QueryRoleType = queryRoleType; queryRes.ShowInfo.RoleBaseInfo.RealmName.SetString(WorldServerUtils.GetRealmName(queryRes.TargetRealmId)); WorldServerUtils.GetPacketSender().SendToServerByID(serverId, (int)CSGameMsgID.PlayerQueryOtherRoleInfoRes, ref queryRes, fromUid); } private static void SendQueryRobotResToServer(uint serverId, long uid, long fromUid, int realmID, QueryRoleType queryRoleType) { queryRes.Clear(); queryRes.Ret = CSErrCode.None; queryRes.FromUid = fromUid; queryRes.TargetRealmId = realmID; queryRes.QueryRoleType = queryRoleType; RobotUtils.FillRobotInfo(uid, ref queryRes.ShowInfo); queryRes.ShowInfo.RoleBaseInfo.RealmName.SetString(WorldServerUtils.GetRealmName(queryRes.TargetRealmId)); WorldServerUtils.GetPacketSender().SendToServerByID(serverId, (int)CSGameMsgID.PlayerQueryOtherRoleInfoRes, ref queryRes, fromUid); } public static void OnTick5Second(long nowSec) { //1:如果有玩家登录的时候,也要移除下缓存里面的数据(现在不弄,之后看移植到哪里去) //2:如果空间快满了,缓存超过10分钟就删除,一次删除一个 RoleCacheInfoSvc cacheInfo = WorldServerUtils.GetRoleCacheInfoSvc(); if (cacheInfo.RoleCacheIsFull() == false) { return; } long rmUid = 0; foreach (var uid_pos in cacheInfo.m_selfIDMap) { ref OneRoleCacheStruct one = ref cacheInfo.GetOneRoleCacheStructByUid(uid_pos.Key); if (one.IsNull() == false && one.LastAccessTime + 600 >= nowSec) { rmUid = uid_pos.Key; break; } } if (rmUid > 0) { cacheInfo.RemoveOneRoleCacheByUid(rmUid); } } //搜索玩家 public static void OnPlayerSearchRoleBynameReq(StructPacket packet) { ref CSPlayerSearchRoleByNameReq req = ref packet.GetMessage(); if (req.TargetName.Length == 0) { return; } PlayerInfoWorld fromPlayer = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(packet.ObjectID); if (fromPlayer == null || fromPlayer.IsOnline == false) { TraceLog.Error("OnPlayerSearchRoleBynameReq fromPlayer uid {0} is not exist or offline", packet.ObjectID); return; } SSPlayerSearchRoleDBByNameReq dbReq = new SSPlayerSearchRoleDBByNameReq(); dbReq.FromUid = fromPlayer.UserID; dbReq.TargetName = req.TargetName; dbReq.FromRealm = fromPlayer.RealmID; uint dbServerID = DBServerIDUtils.GetGameDBServerID(fromPlayer.UserID); WorldServerUtils.GetPacketSender().SendToServerByID(dbServerID, (int)SSGameMsgID.PlayerSearchRoledbBynameReq, ref dbReq, packet.ObjectID); } public static void OnPlayerSearchRoledbBynameRes(StructPacket packet) { ref SSPlayerSearchRoleDBByNameRes res = ref packet.GetMessage(); PlayerInfoWorld fromPlayer = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(res.FromUid); if (fromPlayer == null || fromPlayer.IsOnline == false) { TraceLog.Error("fromPlayer uid {0} is not exist or offline", packet.ObjectID); return; } WorldServerUtils.GetPacketSender().SendToServerByID(fromPlayer.GameServerID, (int)SSGameMsgID.PlayerSearchRoledbBynameRes, ref res, packet.ObjectID); } public static void OnQueryRoleBaseInfoListReq(uint remoteAppID, StructPacket packet) { ref SSQueryRoleBaseInfoListReq req = ref packet.GetMessage(); PlayerInfoWorld fromPlayer = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(packet.ObjectID); if (fromPlayer == null || fromPlayer.IsOnline == false) { TraceLog.Error("QueryRoleInfoSvc.OnQueryRoleBaseInfoListReq fromPlayer uid {0} is not exist or offline", packet.ObjectID); return; } SSQueryRoleBaseInfoListRes res = new SSQueryRoleBaseInfoListRes(); res.Type = req.Type; for (int i = 0; i < req.RoleBaseInfoList.Count; i++) { PlayerInfoWorld targetPlayer = WorldServerUtils.GetPlayerTableOp().GetPlayerInfo(req.RoleBaseInfoList[i].Uid); if(targetPlayer != null) //优先以PlayerInfoWorld为准 { RoleBaseInfo roleBaseInfo = new RoleBaseInfo(); DBRoleData roleData = new DBRoleData(); FillRoleBaseInfo(ref targetPlayer.roleBase, ref roleData, ref roleBaseInfo); roleBaseInfo.ChatBlackTime = req.RoleBaseInfoList[i].ChatBlackTime; res.RoleBaseInfoList.Add(roleBaseInfo); } else { ref OneRoleCacheStruct oneCache = ref WorldServerUtils.GetRoleCacheInfoSvc().GetOneRoleCacheStructByUid(req.RoleBaseInfoList[i].Uid); if (oneCache.IsNull() == false) { RoleBaseInfo roleBaseInfo = new RoleBaseInfo(); roleBaseInfo.CopyFrom(ref oneCache.showInfo.RoleBaseInfo); roleBaseInfo.ChatBlackTime = req.RoleBaseInfoList[i].ChatBlackTime; res.RoleBaseInfoList.Add(roleBaseInfo); //不在线的话,以缓存的为主 } else { res.RoleBaseInfoList.Add(req.RoleBaseInfoList[i]); //缓存没有,就以发来的进行返回 } } } WorldServerUtils.GetPacketSender().SendToServerByID(remoteAppID, (int)SSGameMsgID.QueryRoleBaseInfoListRes, ref res, packet.ObjectID); } } }