From b64a09543ef7543d307d851a3c1fdeebefff38e4 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 11 十二月 2024 14:09:09 +0800 Subject: [PATCH] 10318 【英文】【越南】【BT】【砍树】统一增加奖励获得封包(商店事件DataEx增加同步商店类型) --- ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 424 +++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 366 insertions(+), 58 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py index adbb5c7..1dd27a2 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py @@ -27,31 +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 PlayerZhuXianBoss import PlayerXMZZ -import GameWorldShopItem import PlayerTruck -import HighLadder -import EventReport +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 @@ -61,13 +54,80 @@ 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 +import CrossYaomoBoss +import CrossRealmMsg +import PlayerViewCache +import PlayerFuncTeam +import PyDataManager +import GameWorldMineArea +import PlayerPackData +import PlayerRecData +import GameWorship +import GameXiangong #--------------------------------------------------------------------- + +#--------------------------------------------------------------------- + +class OnlinePlayerMgr(): + ''' 在线玩家管理,子服跨服通用 + 注:跨服服务器时,玩家不一定在跨服服务器,只是表示有同步到跨服服务器的在线玩家,且不是所有玩家都有同步 + ''' + + def __init__(self): + self.onlinePlayerDict = {} # 在线玩家 {playerID:serverGroupID, ...} + return + + def IsOnline(self, playerID): return playerID in self.onlinePlayerDict + + def __SetOnline(self, playerID, serverGroupID): + self.onlinePlayerDict[playerID] = serverGroupID + return + + def __SetOffline(self, playerID, serverGroupID): + self.onlinePlayerDict.pop(playerID, None) + return + + def SetOnlineState(self, playerID, isOnline, serverGroupID=0): + if isOnline: + self.__SetOnline(playerID, serverGroupID) + else: + self.__SetOffline(playerID, serverGroupID) + return + + def GetOfflineValue(self, playerID, viewCache=None): + ## 离线值:0-在线;1-离线;>1-上次离线时间戳,可用于计算离线多久了;当取不到玩家信息时用1代表已离线; + if playerID in self.onlinePlayerDict: + return 0 + offlineValue = 1 + if viewCache and viewCache.OffTime: + offlineValue = viewCache.OffTime + return offlineValue + +def GetOnlinePlayerMgr(): + mgr = PyGameData.g_onlinePlayerMgr + if mgr == None: + mgr = OnlinePlayerMgr() + PyGameData.g_onlinePlayerMgr = mgr + return mgr #--------------------------------------------------------------------- @@ -91,9 +151,7 @@ except: curPlayer.Kick(IPY_PlayerDefine.disWaitForPlayerLoinError) import traceback - GameWorld.ErrLog("玩家上线逻辑错误~~~~~\r\n%s" % traceback.format_exc()) - if GameWorld.GetGameWorld().GetDebugLevel(): - raise Exception("玩家上线逻辑错误~~~~\r\n%s" % traceback.format_exc()) + GameWorld.RaiseException("玩家上线逻辑错误\r\n%s" % traceback.format_exc()) return #--------------------------------------------------------------------- @@ -124,6 +182,8 @@ if GameWorld.IsCrossServer(): #跨服PK CrossRealmPK.OnPlayerLoginCrossServer(curPlayer) + #协助 + PlayerAssist.OnPlayerLoginCrossServer(curPlayer) return #玩家家族刷新 @@ -131,7 +191,9 @@ 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,如有逻辑处理存储等不可放在此处 @@ -149,18 +211,20 @@ PlayerTruck.SyncPlayerTruckStartTime(curPlayer) #通知玩家交易所挂单情况 PlayerBourse.OnPlayerLogin(curPlayer) - + #拍卖行 + AuctionHouse.OnPlayerLogin(curPlayer) + #上线广播 __CheckWorldNotifyOnLogin(curPlayer, tick) #仙盟红包 PlayerFamilyRedPacket.OnPlayerLogin(curPlayer) #仙盟仓库 - PlayerFamilyStore.OnPlayerLogin(curPlayer) + #PlayerFamilyStore.OnPlayerLogin(curPlayer) #仙盟宴会 PlayerFamilyParty.OnPlayerLogin(curPlayer) #封魔坛 - PlayerSealDemon.OnPlayerLogin(curPlayer) + #PlayerSealDemon.OnPlayerLogin(curPlayer) #仙魔之争 PlayerXMZZ.OnXMZZOnLogin(curPlayer) #等级奖励 @@ -169,26 +233,110 @@ 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() - #副本助战 - PlayerFBHelpBattle.OnHelpPlayerLogin(curPlayer) + #竞技场 + GameWorldArena.OnPlayerLogin(curPlayer) #跨服PK CrossRealmPK.OnPlayerLogin(curPlayer) + #幸运云购 + CrossLuckyCloudBuy.OnPlayerLogin(curPlayer) #诛仙BOSS PlayerZhuXianBoss.OnPlayerLogin(curPlayer) - + #骑宠boss状态通知 + PlayerHorsePetBoss.OnLogin(curPlayer) + #协助 + PlayerAssist.OnPlayerLogin(curPlayer) + #天星塔 + GameWorldSkyTower.OnPlayerLogin(curPlayer) + #福地 + GameWorldMineArea.OnPlayerLogin(curPlayer) GMT_CTG.OnPlayerLogin(curPlayer) + + 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) + #膜拜 + GameWorship.OnPlayerLogin(curPlayer) + #跨服战场 + CrossBattlefield.OnPlayerLogin(curPlayer) + #跨服排位 + CrossChampionship.OnPlayerLogin(curPlayer, tick) + #跨服全民充值 + CrossActAllRecharge.OnPlayerLogin(curPlayer) + #跨服妖魔boss + CrossYaomoBoss.OnPlayerLogin(curPlayer) + #玩家记录 + PlayerRecData.OnPlayerLogin(curPlayer) + PlayerPackData.OnPlayerLogin(curPlayer) + #在线状态变更,放最后 + __OnPlayerOnlineStateChange(curPlayer, True) + + if isMixServerFirstLogin: + PlayerCharm.OnMixServerFirstLogin(curPlayer) + + PyGameData.g_noPlayerLoginWarningMailState = 2 + 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 ## 增加高手玩家上线广播 @@ -219,9 +367,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 @@ -240,11 +385,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: @@ -486,9 +627,7 @@ __Func_PlayerDisconnect(curPlayer, tick) except: import traceback - GameWorld.ErrLog("玩家下线逻辑错误~~~~~\r\n%s" % traceback.format_exc()) - if GameWorld.GetGameWorld().GetDebugLevel(): - raise Exception("玩家下线逻辑错误~~~~\r\n%s" % traceback.format_exc()) + GameWorld.RaiseException("玩家下线逻辑错误\r\n%s" % traceback.format_exc()) #调用底层下线 curPlayer.DoDisconnect() return @@ -500,6 +639,10 @@ # @remarks 函数详细说明. def __Func_PlayerDisconnect(curPlayer, tick): + if GameWorld.IsCrossServer(): + PlayerFB.OnPlayerDisconnectCrossServer(curPlayer) + return + #跨服匹配PK CrossRealmPK.OnLeaveServer(curPlayer) @@ -509,12 +652,135 @@ PlayerFamily.PlayerLogoffRefreshFamily(curPlayer, tick) PlayerFriend.OnPlayerDisconnect(curPlayer, tick) - PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick) + __UpdOnedayJobPlayerLoginoffTime(curPlayer) + #PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick) # 设置家族成员离线时间 SetPlayerOfflineTime(curPlayer) - + #拍卖行 + AuctionHouse.OnPlayerLeaveServer(curPlayer) + #协助 + PlayerAssist.OnLeaveServer(curPlayer) + #红包 + PlayerFamilyRedPacket.OnLeaveServer(curPlayer) #------------镖车逻辑 #TruckPlayerDisconnectProcess(curPlayer, tick) + + if not PlayerControl.GetIsTJG(curPlayer): + playerID = curPlayer.GetPlayerID() + PyGameData.g_unTJLogoffTime[playerID] = int(time.time()) + PyGameData.g_xiangongCanLikeTimeDict.pop(playerID, None) + + #在线状态变更,放最后 + __OnPlayerOnlineStateChange(curPlayer, False) + return + +def __OnPlayerOnlineStateChange(curPlayer, isOnline): + ## 在线状态变更 + if PlayerControl.GetIsTJG(curPlayer): + return + + playerID = curPlayer.GetPlayerID() + olMgr = GetOnlinePlayerMgr() + olMgr.SetOnlineState(playerID, isOnline) + + #relatedPlayerIDList = [] # 本服相关玩家 + #offlineValue = olMgr.GetOfflineValue(playerID, PlayerViewCache.FindViewCache(playerID)) + #SyncRelatedPlayerOnlineState(playerID, offlineValue, relatedPlayerIDList) + + if curPlayer.GetLV() < 50: + #GameWorld.DebugLog("跨服相关功能未开启,不同步在线状态到跨服服务器! LV=%s" % curPlayer.GetLV(), curPlayer.GetPlayerID()) + return + + cacheBase = PlayerViewCache.GetSyncCrossCacheBase(curPlayer) + dataMsg = {"playerID":playerID, "isOnline":isOnline, "cacheBase":cacheBase} + CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_PlayerLoginout, dataMsg) + return + +def ClientServerMsg_PlayerLoginout(serverGroupID, msgData): + ## 收到子服玩家上下线 + + playerID = msgData["playerID"] + isOnline = msgData["isOnline"] + cacheBase = msgData["cacheBase"] + + isLogout = not isOnline + olMgr = GetOnlinePlayerMgr() + olMgr.SetOnlineState(playerID, isOnline, cacheBase.get("ServerGroupID", 0)) + + PlayerViewCache.UpdCrossCacheBase(playerID, cacheBase, isLogout) + serverID = GameWorld.GetAccIDServerID(cacheBase["AccID"]) + + # 上线 + if isOnline: + # 需要管理跨服在线状态时,默认需要同步缓存信息 + syncStateInfo = {"playerID":playerID, "ViewCacheCross":1} + packDataMgr = PyDataManager.GetDBPlayerPackDataManager() + if playerID in packDataMgr.playerPackDataDict: + syncStateInfo["PackDataCross"] = 1 + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PlayerPackDataState, syncStateInfo, [serverGroupID]) + + GameXiangong.OnPlayerLogin_CrossLogic(serverGroupID, serverID, playerID) + + # 下线 + else: + pass + + SyncCrossPlayerOnlineStateToRelatedPlayer(playerID) + return + +def SyncCrossPlayerOnlineStateToRelatedPlayer(playerID): + ## 同步跨服玩家在线状态给相关玩家 + + relatedPlayerIDList = [] + + # 功能队伍 + funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager() + playerTeamIDDict = funcTeamMgr.GetPlayerTeamIDDict(playerID) + for _, teamID in playerTeamIDDict.items(): + funcTeam = funcTeamMgr.GetFuncTeam(teamID) + if not funcTeam: + continue + relatedPlayerIDList += funcTeam.GetMemberIDList() + + # 其他... + + # 去重汇总 + relatedPlayerIDList = list(set(relatedPlayerIDList)) + if playerID in relatedPlayerIDList: + relatedPlayerIDList.remove(playerID) + if not relatedPlayerIDList: + return + + offlineValue = GetOnlinePlayerMgr().GetOfflineValue(playerID, PlayerViewCache.FindViewCache(playerID)) + dataMsg = {"loginoutPlayerID":playerID, "offlineValue":offlineValue, "relatedPlayerIDList":relatedPlayerIDList} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PlayerLoginout, dataMsg) + return + +def CrossServerMsg_PlayerLoginout(msgData): + ## 收到跨服服务器信息 - 玩家上下线状态变更 + loginoutPlayerID = msgData["loginoutPlayerID"] + offlineValue = msgData["offlineValue"] + relatedPlayerIDList = msgData["relatedPlayerIDList"] + SyncRelatedPlayerOnlineState(loginoutPlayerID, offlineValue, relatedPlayerIDList, 1) + return + +def SyncRelatedPlayerOnlineState(loginoutPlayerID, offlineValue, relatedPlayerIDList, isCross=0): + clientPack = None + playerMgr = GameWorld.GetPlayerManager() + for playerID in relatedPlayerIDList: + if not PlayerControl.GetDBPlayerAccIDByID(playerID): + continue + curPlayer = playerMgr.FindPlayerByID(playerID) + if not curPlayer or not curPlayer.GetInitOK(): + continue + + if not clientPack: + clientPack = ChPyNetSendPack.tagGCRelatedPlayerOnlineState() + clientPack.PlayerID = loginoutPlayerID + clientPack.OfflineValue = offlineValue + clientPack.IsCross = isCross + + NetPackCommon.SendFakePack(curPlayer, clientPack) return ## 设置玩家离线时间 @@ -522,8 +788,8 @@ # @return None # @remarks 函数详细说明. def SetPlayerOfflineTime(curPlayer): - if PlayerControl.GetIsTJG(curPlayer): - return + #if PlayerControl.GetIsTJG(curPlayer): + # return curPlayerID = curPlayer.GetPlayerID() curFamily = curPlayer.GetFamily() @@ -577,11 +843,21 @@ playerStatePack = IPY_GameServer.IPY_GRefreshPlayerProperty() packValue = playerStatePack.GetValue() + packValueEx = playerStatePack.GetValueEx() packType = playerStatePack.GetType() + #packValueTotal = packValue + packValueEx * ChConfig.Def_PerPointValue #---特殊逻辑处理--- if packType == ShareDefine.CDBPlayerRefresh_ForbidenTalk: PlayerControl.SetGMForbidenTalk(curPlayer, packValue) + return + + if packType == ShareDefine.CDBPlayerRefresh_ExAttr17: + PlayerControl.SetPlayerAccState(curPlayer, packValue) + return + + if packType == ShareDefine.CDBPlayerRefresh_ExAttr19: + PlayerControl.SetLeaveFamilyTimeEx(curPlayer, packValue) return if packType == IPY_GameServer.CDBPlayerRefresh_State: @@ -599,7 +875,7 @@ return if packType == IPY_GameServer.CDBPlayerRefresh_FightPower: - curPlayer.SetFightPower(packValue) + curPlayer.SetFightPower(packValue, packValueEx) return if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr2: @@ -607,20 +883,27 @@ 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) #玩家等级记录 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: # #这里应该通知组队那边刷新 @@ -642,24 +925,37 @@ 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_ExAttr11: - PlayerControl.SetTodayXianyuanCoin(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) #更新排行榜的境界 PlayerBillboard.UpdateBillboardRealm(curPlayer) + elif packType == IPY_GameServer.CDBPlayerRefresh_Face: + curPlayer.SetFace(packValue) + PlayerBillboard.UpdateBillboardFace(curPlayer) + elif packType == IPY_GameServer.CDBPlayerRefresh_HairColor: + #c++头像外框 用头发颜色通知 - 遗漏问题 + curPlayer.SetFacePic(packValue) + PlayerBillboard.UpdateBillboardFacePic(curPlayer) + #社交信息 + PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue) #组队成员刷新 PlayerTeam.PlayerTeamMemberRefresh(curPlayer, packType, packValue, tick) #家族刷新 @@ -684,6 +980,7 @@ GameWorldBoss.OnPlayerChangeMap(curPlayer) PlayerFamily.OnPlayerChangeMap(curPlayer, tick) PlayerFamilyParty.OnPlayerChangeMap(curPlayer, tick) + GameWorldFamilyWar.OnPlayerChangeMap(curPlayer) return ## 玩家切换真实地图 @@ -761,6 +1058,9 @@ #改到mapServer登录成功通知 #Sync_PyServerDataTimeToClient(curPlayer, tick) + if GameWorld.IsCrossServer(): + PlayerFB.PlayerLoginLoadCrossMapOK(curPlayer) + PlayerTeam.OnPlayerReadMapOK(curPlayer, tick) #刷新人物日期状态 @@ -874,17 +1174,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 @@ -1097,11 +1409,6 @@ # @param tick 时间戳 # @return None def Sync_PyServerDataTimeToClient(curPlayer, tick): - - if not GameWorld.RefurbishPlayerTick(curPlayer, ChConfig.TYPE_Player_Tick_SyncClientTick, tick): - #间隔未到 - return - # 服务器时间 serverTime = GameWorld.GetServerTime() if not serverTime: @@ -1115,7 +1422,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