From 94ee1c7ab1faeaf57443860b46d057f4328706db Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 18 十月 2022 18:14:17 +0800 Subject: [PATCH] 9437 【越南】【后端】天帝礼包(AA60封包增加同步需要选择个数) --- ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 363 ++++++++++++++++++++++++++++++++++----------------- 1 files changed, 242 insertions(+), 121 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py index 1774473..100d495 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py @@ -27,35 +27,24 @@ import GMCommon import ShareDefine #import PlayerFamilyTech -import PlayerDataCollect import time import ChPyNetSendPack import NetPackCommon import GameDataRecord -import GameConfig -import ReadChConfig import UpdatePlayerName import GameWorldBoss import PlayerFamilyBoss -#import PlayerManorWar import PlayerBourse -import GameWorldActionTeHui +import PlayerZhuXianBoss import PlayerXMZZ -import GameWorldMergePK -import GameWorldShopItem -import MergeChildMsg import PlayerTruck -import PlayerMergeEvent -import HighLadder -import EventReport -import MergePlayer +import PlayerHorsePetBoss import PlayerCompensation import PlayerFamilyRedPacket -import PlayerFamilyStore -import PyDataManager +#import PlayerFamilyStore import PlayerSocial import PlayerFamilyParty -import PlayerSealDemon +#import PlayerSealDemon import PlayerBillboard import PlayerLVAward import PlayerDuJie @@ -63,19 +52,52 @@ import IpyGameDataPY import PlayerTalk import PlayerGeTui +import PlayerStore import GameWorldActionControl +import GameWorldFamilyWar +import PlayerFBHelpBattle +import GameWorldSkyTower import GMT_CTG import PyGameData +import GMShell +import IPY_PlayerDefine +import GameWorldArena +import CrossLuckyCloudBuy +import CrossRealmPK +import CrossChampionship +import AuctionHouse +import PlayerAssist +import PlayerFB +import PlayerLove +import PlayerCharm +import CrossRealmPlayer +import CrossBattlefield +import CrossActAllRecharge #--------------------------------------------------------------------- #--------------------------------------------------------------------- + +def DoRefreshMainServerRole(curPlayer): + ## 刷新本服角色信息 + + curTeam = curPlayer.GetTeam() + if curTeam: + PlayerTeam.Sync_TeamMemberInfo(curTeam) + return + ## 玩家登录初始化(封包参数) # @param index 玩家索引 # @param tick 当前时间 # @return None # @remarks 登陆顺序, PlayerLogin->PlayerLoadMapState(PlayerLoginLoadMapOK), 此处未设置初始化状态 def PlayerLogin(index, tick): - GameWorld.GetPsycoFunc(__Func_PlayerLogin)(index, tick) + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + try: + __Func_PlayerLogin(curPlayer, tick) + except: + curPlayer.Kick(IPY_PlayerDefine.disWaitForPlayerLoinError) + import traceback + GameWorld.RaiseException("玩家上线逻辑错误\r\n%s" % traceback.format_exc()) return #--------------------------------------------------------------------- @@ -84,22 +106,40 @@ # @param tick 当前时间 # @return None # @remarks 登陆顺序, PlayerLogin->PlayerLoadMapState(PlayerLoginLoadMapOK), 此处未设置初始化状态 -def __Func_PlayerLogin(index, tick): +def __Func_PlayerLogin(curPlayer, tick): - #玩家登录初始化 - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + GameWorld.Log("__Func_PlayerLogin mapID=%s" % curPlayer.GetMapID(), curPlayer.GetPlayerID()) + curPlayer.SetDict(ChConfig.Def_PDict_LoginMapID, curPlayer.GetMapID()) #玩家在线时间初始化 InitPlayerOnLineTime(curPlayer, tick) #玩家响应信息初始化 InitPlayerOnLineReply(curPlayer, tick) # 统计登入人数 GameDataRecord.PlayerLoginRecord(curPlayer, tick) + __DoPlayerLoginServer(curPlayer, tick) + + #通知地图服务器自己初始化成功 + curPlayer.MapServer_InitOK() + return + +def __DoPlayerLoginServer(curPlayer, tick): + ''' 玩家登录需要处理的内容,本服及跨服服务器分开 + ''' + if GameWorld.IsCrossServer(): + #跨服PK + CrossRealmPK.OnPlayerLoginCrossServer(curPlayer) + #协助 + PlayerAssist.OnPlayerLoginCrossServer(curPlayer) + return + #玩家家族刷新 #家族任务需要刷新 FamilyLV, 地图服务器需要知道FamilyLV来通知玩家家族任务次数 PlayerFamily.PlayerLoginRefreshFamily(curPlayer, tick) #玩家队伍初始化 PlayerTeam.OnPlayerLoginRefreshTeam(curPlayer, tick) - PlayerCompensation.NotifyPlayerCompensation(curPlayer) + #PlayerCompensation.NotifyPlayerCompensation(curPlayer) + __UpdOnedayJobPlayerLoginoffTime(curPlayer) + CrossRealmPlayer.OnPlayerLogin(curPlayer) if not PlayerControl.GetIsTJG(curPlayer): # 只有通知逻辑的应该放此处减少IO,如有逻辑处理存储等不可放在此处 @@ -109,59 +149,128 @@ #通知玩家登陆信息,来自运营方 #DoLogic_LoginUserData(curPlayer) - #通知开服天数 - PlayerEventCounter.Sync_OpenServerDay(curPlayer) + #通知开服天数, 登录时改为地图通知,因为GameServer的PlayerLogin在地图之后,前端有些功能处理需要提前得到开服天 + #PlayerEventCounter.Sync_OpenServerDay(curPlayer) # 通知广播信息 GMCommon.SendBroadCastToClient(curPlayer) - - - # 在非跨服服务器上线时,在跨服PK赛期间如果roomID不为0则重置 - #if not GameWorld.IsMergeServer() and GameWorldMergePK.IsMergePKMatchOpen() \ - # and curPlayer.GetVsRoomId() != 0: - # PlayerControl.SetVsRoomId(curPlayer, 0) PlayerTruck.SyncPlayerTruckStartTime(curPlayer) #通知玩家交易所挂单情况 PlayerBourse.OnPlayerLogin(curPlayer) - + #拍卖行 + AuctionHouse.OnPlayerLogin(curPlayer) + #上线广播 __CheckWorldNotifyOnLogin(curPlayer, tick) - #上线奖励处理 - #PlayerMergeEvent.MergeEventOnPlayerLogin(curPlayer) - #MergePlayer.OnPlayerLogin(curPlayer) #仙盟红包 PlayerFamilyRedPacket.OnPlayerLogin(curPlayer) #仙盟仓库 - PlayerFamilyStore.OnPlayerLogin(curPlayer) + #PlayerFamilyStore.OnPlayerLogin(curPlayer) #仙盟宴会 PlayerFamilyParty.OnPlayerLogin(curPlayer) #封魔坛 - PlayerSealDemon.OnPlayerLogin(curPlayer) + #PlayerSealDemon.OnPlayerLogin(curPlayer) #仙魔之争 PlayerXMZZ.OnXMZZOnLogin(curPlayer) #等级奖励 PlayerLVAward.OnPlayerLogin(curPlayer) - + #商店购买次数 + PlayerStore.OnPlayerLogin(curPlayer) #通知世界boss信息 GameWorldBoss.OnPlayerLogin(curPlayer) - #家族副本boss状态通知 - PlayerFamilyBoss.OnLogin(curPlayer) #渡劫 PlayerDuJie.OnPlayerLogin(curPlayer) #守卫人皇 PlayerFamilySWRH.OnLogin(curPlayer) PlayerTalk.LoginChatMi(curPlayer) - PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID()) + PlayerTalk.NotifyTalkCache(curPlayer) + #PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID()) #活动 GameWorldActionControl.OnPlayerLogin(curPlayer) #玩家等级记录 PyGameData.g_todayPlayerLVDict[curPlayer.GetID()] = curPlayer.GetLV() - + #竞技场 + GameWorldArena.OnPlayerLogin(curPlayer) + #跨服PK + CrossRealmPK.OnPlayerLogin(curPlayer) + #幸运云购 + CrossLuckyCloudBuy.OnPlayerLogin(curPlayer) + #诛仙BOSS + PlayerZhuXianBoss.OnPlayerLogin(curPlayer) + #骑宠boss状态通知 + PlayerHorsePetBoss.OnLogin(curPlayer) + #协助 + PlayerAssist.OnPlayerLogin(curPlayer) + #天星塔 + GameWorldSkyTower.OnPlayerLogin(curPlayer) GMT_CTG.OnPlayerLogin(curPlayer) - #通知地图服务器自己初始化成功 - curPlayer.MapServer_InitOK() + else: + pass + + return + +def DoPlayerRealLoginOK(curPlayer, loginMsg, tick): + ''' 玩家最终登录成功处理, 由 MapServer DoPlayerRealLoginOK 通知 + 该函数为地图最终登录成功才会执行到,以后一些功能类的登录处理建议均写到这里 + 旧的功能先不动( __DoPlayerLoginServer 函数中的功能),如果有登录相关的bug再考虑是否移动到此函数 + ''' + isMixServerFirstLogin = loginMsg[0] + GameWorld.Log("GameServer->DoPlayerRealLoginOK, isMixServerFirstLogin=%s" % isMixServerFirstLogin, curPlayer.GetPlayerID()) + + if GameWorld.IsCrossServer(): + return + + PyGameData.g_dbPlayerIDMap[curPlayer.GetPlayerID()] = curPlayer.GetAccID() + + if not PlayerControl.GetIsTJG(curPlayer): + #家族副本boss状态通知 + PlayerFamilyBoss.OnLogin(curPlayer) + #魅力 + PlayerCharm.OnPlayerLogin(curPlayer) + #情缘 + PlayerLove.OnPlayerLogin(curPlayer) + #跨服战场 + CrossBattlefield.OnPlayerLogin(curPlayer) + #跨服排位 + CrossChampionship.OnPlayerLogin(curPlayer, tick) + #跨服全民充值 + CrossActAllRecharge.OnPlayerLogin(curPlayer) + + if isMixServerFirstLogin: + PlayerCharm.OnMixServerFirstLogin(curPlayer) + + return + +def __UpdOnedayJobPlayerLoginoffTime(curPlayer): + ## 更新一天内职业对应玩家登录、离线时间 + job = curPlayer.GetJob() + playerID = curPlayer.GetPlayerID() + if job not in PyGameData.g_onedayJobPlayerLoginoffTimeDict: + PyGameData.g_onedayJobPlayerLoginoffTimeDict[job] = {} + playerLoginoffTimeDict = PyGameData.g_onedayJobPlayerLoginoffTimeDict[job] + playerLoginoffTimeDict[playerID] = int(time.time()) + #GameWorld.DebugLog("更新职业对应玩家登录离线时间: %s" % PyGameData.g_onedayJobPlayerLoginoffTimeDict) + return + +def CheckOnedayJobPlayerLoginoffTimeout(): + ## 检查一天内职业对应玩家登录、离线时间超时玩家,每小时检查一次 + + maxTime = 24 * 3600 # 暂定24小时 + curTime = int(time.time()) + #GameWorld.DebugLog("处理24小时内在线的角色职业玩家: curTime=%s,maxTime=%s, %s" % (curTime, maxTime, PyGameData.g_onedayJobPlayerLoginoffTimeDict)) + + playerManager = GameWorld.GetPlayerManager() + for playerDict in PyGameData.g_onedayJobPlayerLoginoffTimeDict.values(): + for playerID, loginoffTime in playerDict.items(): + if playerManager.FindPlayerByID(playerID): + #GameWorld.DebugLog(" 在线不处理, playerID=%s" % playerID) + continue + if curTime - loginoffTime > maxTime: + playerDict.pop(playerID) + #GameWorld.DebugLog(" 超时玩家,移除! playerID=%s,loginoffTime=%s" % (playerID, loginoffTime)) + #GameWorld.DebugLog(" 处理完毕,剩余玩家! %s" % PyGameData.g_onedayJobPlayerLoginoffTimeDict) return ## 增加高手玩家上线广播 @@ -169,7 +278,7 @@ # @return None def __CheckWorldNotifyOnLogin(curPlayer, tick): # 跨服服务器不广播 - if GameWorld.IsMergeServer(): + if GameWorld.IsCrossServer(): return limitLV = IpyGameDataPY.GetFuncCfg("BillBoardPlayerLoginNotify", 2) # 最低等级限制 @@ -192,9 +301,6 @@ if checkMark not in ShareDefine.BillboardTypeList: continue - if checkMark in [ShareDefine.Def_BT_HighLadder]: - continue - billboard = GameWorld.GetBillboard().FindBillboard(checkMark) if not billboard: continue @@ -213,11 +319,7 @@ objBillboard = billboard.At(index) if curPlayer.GetID() == objBillboard.GetID(): msgMark = notifyDict[order] - break -# # 竞技场 -# elif checkMark == "HighLadder": -# highLadderOrder = HighLadder.GetPlayerOrder(curPlayer.GetID()) + 1 -# msgMark = notifyDict.get(highLadderOrder, "") + break # 有可以广播的,马上广播,退出,不再检查 if msgMark: @@ -243,44 +345,6 @@ diff_Time = loginTime - logoffTime #天数 * 24小时 * 60 分钟 + 秒 return diff_Time.days * 24 * 60 * 60 + diff_Time.seconds - -## 统计客户端跨服赛激活时间 -# @param index 玩家索引 -# @return None -def SendMergeWarOpen(curPlayer): - # 发送跨服赛服务器信息 - mapConfig = GameConfig.GetConfig() - mergeServerIP = mapConfig.get("MergeServerIP") - mergeServerPort = mapConfig.get("MergeServerPort") - if not mergeServerIP: - return - mergeServerInfo = ChPyNetSendPack.tagMergeServerInfo() - mergeServerInfo.ServerIPLen = len(mergeServerIP) - mergeServerInfo.ServerIP = mergeServerIP - mergeServerInfo.Port = mergeServerPort - mergeServerInfo.IsMergeServer = GameWorld.IsMergeServer() - NetPackCommon.SendFakePack(curPlayer, mergeServerInfo) - return - -## 跨服赛通知奖励 -# @param curPlayer: 玩家实例 -# @return: None -def MSGetReward(curPlayer): - #PlayerCanGetReward.SynClient_CanGetRewardList(curPlayer) - return - - -## 通知首次开服时间 -# @param curPlayer: 玩家实例 -# @return: None -def Sync_InitOpenServerTime(curPlayer): -# initOpenServerTime = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_InitOpenServerTime) -# packData = ChPyNetSendPack.tagInitOpenServerTime() -# packData.Clear() -# packData.Time = initOpenServerTime -# NetPackCommon.SendFakePack(curPlayer, packData) - return - ## 运营登陆信息处理 # @param curPlayer @@ -492,7 +556,14 @@ # @return None # @remarks 函数详细说明. def PlayerDisconnect(index, tick): - GameWorld.GetPsycoFunc(__Func_PlayerDisconnect)(index, tick) + curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) + try: + __Func_PlayerDisconnect(curPlayer, tick) + except: + import traceback + GameWorld.RaiseException("玩家下线逻辑错误\r\n%s" % traceback.format_exc()) + #调用底层下线 + curPlayer.DoDisconnect() return ## 玩家下线(封包参数) @@ -500,11 +571,13 @@ # @param tick 当前时间 # @return None # @remarks 函数详细说明. -def __Func_PlayerDisconnect(index, tick): - curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) +def __Func_PlayerDisconnect(curPlayer, tick): + if GameWorld.IsCrossServer(): + PlayerFB.OnPlayerDisconnectCrossServer(curPlayer) + #跨服匹配PK - #GameWorldMergePK.OnLeaveServer(curPlayer) + CrossRealmPK.OnLeaveServer(curPlayer) #组队玩家离线 PlayerTeam.DoPlayerLogOffTeamLogic(curPlayer, tick) @@ -512,15 +585,23 @@ PlayerFamily.PlayerLogoffRefreshFamily(curPlayer, tick) PlayerFriend.OnPlayerDisconnect(curPlayer, tick) - PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick) + __UpdOnedayJobPlayerLoginoffTime(curPlayer) + #PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick) # 设置家族成员离线时间 SetPlayerOfflineTime(curPlayer) - - #MergePlayer.OnPlayerLeaveGotoMergeServer(curPlayer, tick) + #拍卖行 + AuctionHouse.OnPlayerLeaveServer(curPlayer) + #协助 + PlayerAssist.OnLeaveServer(curPlayer) + #红包 + PlayerFamilyRedPacket.OnLeaveServer(curPlayer) #------------镖车逻辑 #TruckPlayerDisconnectProcess(curPlayer, tick) - #调用底层下线 - curPlayer.DoDisconnect() + + if not PlayerControl.GetIsTJG(curPlayer): + playerID = curPlayer.GetPlayerID() + PyGameData.g_unTJLogoffTime[playerID] = int(time.time()) + return ## 设置玩家离线时间 @@ -528,8 +609,8 @@ # @return None # @remarks 函数详细说明. def SetPlayerOfflineTime(curPlayer): - if PlayerControl.GetIsTJG(curPlayer): - return + #if PlayerControl.GetIsTJG(curPlayer): + # return curPlayerID = curPlayer.GetPlayerID() curFamily = curPlayer.GetFamily() @@ -583,6 +664,7 @@ playerStatePack = IPY_GameServer.IPY_GRefreshPlayerProperty() packValue = playerStatePack.GetValue() + packValueEx = playerStatePack.GetValueEx() packType = playerStatePack.GetType() #---特殊逻辑处理--- @@ -590,6 +672,10 @@ PlayerControl.SetGMForbidenTalk(curPlayer, packValue) return + if packType == ShareDefine.CDBPlayerRefresh_ExAttr17: + PlayerControl.SetPlayerAccState(curPlayer, packValue) + return + if packType == IPY_GameServer.CDBPlayerRefresh_State: # 脱机在线 PlayerControl.SetIsTJG(curPlayer, packValue) @@ -605,12 +691,7 @@ return if packType == IPY_GameServer.CDBPlayerRefresh_FightPower: - curPlayer.SetFightPower(packValue) - return - - if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr10: - #设置玩家跨服预赛排位 - PlayerControl.SetMergeWarRank(curPlayer, packValue) + curPlayer.SetFightPower(packValue, packValueEx) return if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr2: @@ -618,20 +699,28 @@ PlayerTeam.SetTeamCheckState(curPlayer, packValue) return + #if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr1: + # PlayerControl.SetAssistTagPlayerID(curPlayer, packValue) + # return + + if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr3: + PlayerControl.SetFBFuncLineID(curPlayer, packValue) + return + #---常规逻辑处理--- elif packType == IPY_GameServer.CDBPlayerRefresh_LV: curPlayer.SetLV(packValue) - PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue) + PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue) #玩家等级记录 playerID = curPlayer.GetID() if playerID in PyGameData.g_todayPlayerLVDict: PyGameData.g_todayPlayerLVDict[playerID] = packValue elif packType == IPY_GameServer.CDBPlayerRefresh_Job: + if packValue != curPlayer.GetJob(): + PlayerBillboard.DelJobFightPowerBillboard(curPlayer, curPlayer.GetJob()) curPlayer.SetJob(packValue) - elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr1: - PlayerControl.SetJobRank(curPlayer, packValue) # elif packType == IPY_GameServer.CDBPlayerRefresh_CurrentPlayerType: # #这里应该通知组队那边刷新 @@ -653,15 +742,26 @@ elif packType == IPY_GameServer.CDBPlayerRefresh_VIPLv: curPlayer.SetVIPLv(packValue); # __RefreshTeamState(curPlayer) + + elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr5: + PlayerControl.SetCrossMapID(curPlayer, packValue, False) + elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr9: - PlayerControl.SetVIPExpireTime(curPlayer, packValue) + curPlayer.SetExAttr9(packValue) + #PlayerControl.SetVIPExpireTime(curPlayer, packValue) + + elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr10: + PlayerControl.SetChatBubbleBox(curPlayer, packValue) + + elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr13: + PlayerControl.SetPlayerServerGroupID(curPlayer, packValue) elif packType == IPY_GameServer.CDBPlayerRefresh_OperateInfo: curPlayer.SetOperateInfo(packValue); elif packType == IPY_GameServer.CDBPlayerRefresh_OfficialRank: curPlayer.SetOfficialRank(packValue) - PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue) + PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue) #更新排行榜的境界 PlayerBillboard.UpdateBillboardRealm(curPlayer) @@ -669,7 +769,8 @@ PlayerTeam.PlayerTeamMemberRefresh(curPlayer, packType, packValue, tick) #家族刷新 PlayerFamily.PlayerRefresh(curPlayer, tick) - + #副本助战 + PlayerFBHelpBattle.UpdateCheckInPlayerInfoByRefresh(curPlayer, packType, packValue) return ## 玩家切换地图的响应(参数 -> 当前玩家,当前时间) @@ -687,6 +788,8 @@ PlayerTeam.OnPlayerChangeMap(curPlayer, tick) GameWorldBoss.OnPlayerChangeMap(curPlayer) PlayerFamily.OnPlayerChangeMap(curPlayer, tick) + PlayerFamilyParty.OnPlayerChangeMap(curPlayer, tick) + GameWorldFamilyWar.OnPlayerChangeMap(curPlayer) return ## 玩家切换真实地图 @@ -764,7 +867,10 @@ #改到mapServer登录成功通知 #Sync_PyServerDataTimeToClient(curPlayer, tick) - #PlayerTeam.OnPlayerReadMapOK(curPlayer, tick) + if GameWorld.IsCrossServer(): + PlayerFB.PlayerLoginLoadCrossMapOK(curPlayer) + + PlayerTeam.OnPlayerReadMapOK(curPlayer, tick) #刷新人物日期状态 PlayerEventCounter.UpdatePlayerLoginTime(curPlayer) @@ -777,7 +883,7 @@ #=============================================================================== #自己已经初始化成功 curPlayer.SetInitOK(True) - + GMShell.OnPlayerLogin(curPlayer) #发送请求至目标地图(任务需要登陆家族长触发事件) __RefreshFamilyToMapServer(curPlayer) return @@ -877,17 +983,29 @@ #{ # tagHead Head; # DWORD MapID; -# BYTE FBLineID; -# BYTE IsAllLine; +# BYTE LineCount; +# BYTE LineIDList[LineCount]; //个数为0时代表查全部 #}; def ClinetQueryFBLinePlayerCnt(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) queryMapID = clientData.MapID - fbLineID = clientData.FBLineID - isAllLine = clientData.IsAllLine + queryFBLineIDList = clientData.LineIDList playerManager = GameWorld.GetPlayerManager() - sendCMD = str([queryMapID, fbLineID, isAllLine]) + if queryMapID in ChConfig.Def_CrossMapIDList: + fbLinePlayerInfoDict = PyGameData.g_crossFBFuncLinePlayerCountInfo.get(queryMapID, {}) + if not queryFBLineIDList: + resultInfo = [queryMapID, fbLinePlayerInfoDict] + else: + defaultInfo = [0] # 与本服结构相同,默认0人 + queryFBLineInfo = {} + for lineID in queryFBLineIDList: + queryFBLineInfo[lineID] = fbLinePlayerInfoDict.get(lineID, defaultInfo) + resultInfo = [queryMapID, queryFBLineInfo] + QueryFBLinePlayerCntResult(curPlayer, resultInfo) + return + + sendCMD = str([queryMapID, queryFBLineIDList]) playerManager.MapServer_QueryPlayer(curPlayer.GetPlayerID(), 0, 0, queryMapID, 'FBLinePlayerCnt', sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex()) return @@ -903,11 +1021,13 @@ fblinePack = ChPyNetSendPack.tagGCFBLinePlayerCnt() fblinePack.MapID = tagMapID fblinePack.FBLineInfoList = [] - for lineID, playerCnt in fbLinePlayerCntDict.items(): + for lineID, infoList in fbLinePlayerCntDict.items(): mapLineState = ChPyNetSendPack.tagGCFBLineInfo() mapLineState.Clear() mapLineState.FBLineID = lineID - mapLineState.PlayerCnt = playerCnt + mapLineState.PlayerCnt = infoList[0] if infoList else 0 + mapLineState.ExtraStr = infoList[1] if len(infoList) > 1 else '' + mapLineState.ExtraStrLen = len(mapLineState.ExtraStr) fblinePack.FBLineInfoList.append(mapLineState) fblinePack.Count = len(fblinePack.FBLineInfoList) @@ -1116,7 +1236,8 @@ serverDateTime.Hour = serverTime.hour serverDateTime.Minute = serverTime.minute serverDateTime.Second = serverTime.second - serverDateTime.MicSecond = serverTime.microsecond + serverDateTime.MicSecond = serverTime.microsecond + serverDateTime.CrossServerTime = GameWorld.GetCrossServerTimeStr() # 通知客户端同步时间 NetPackCommon.SendFakePack(curPlayer, serverDateTime) -- Gitblit v1.8.0