From 2941a7635bb04ca59afa820b51a23aca9dc70eb9 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期二, 29 十月 2019 11:59:23 +0800 Subject: [PATCH] 4610 【恺英】【bug】脱机上线报错 --- ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py | 96 ++++++++++++++++++++++++++++++++++++------------ 1 files changed, 72 insertions(+), 24 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py index 8c1feaa..0d71834 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py @@ -27,28 +27,21 @@ 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 PlayerSocial import PlayerFamilyParty import PlayerSealDemon @@ -61,6 +54,7 @@ import PlayerGeTui import PlayerStore import GameWorldActionControl +import GameWorldFamilyWar import PlayerFBHelpBattle import GMT_CTG import PyGameData @@ -68,6 +62,7 @@ import IPY_PlayerDefine import CrossRealmPK import AuctionHouse +import PlayerFB #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -133,6 +128,7 @@ #玩家队伍初始化 PlayerTeam.OnPlayerLoginRefreshTeam(curPlayer, tick) PlayerCompensation.NotifyPlayerCompensation(curPlayer) + __UpdOnedayJobPlayerLoginoffTime(curPlayer) if not PlayerControl.GetIsTJG(curPlayer): # 只有通知逻辑的应该放此处减少IO,如有逻辑处理存储等不可放在此处 @@ -179,6 +175,7 @@ #守卫人皇 PlayerFamilySWRH.OnLogin(curPlayer) PlayerTalk.LoginChatMi(curPlayer) + PlayerTalk.NotifyTalkCache(curPlayer) PlayerGeTui.CleanNewGuyCallBackGeTui(curPlayer.GetID()) #活动 GameWorldActionControl.OnPlayerLogin(curPlayer) @@ -190,8 +187,39 @@ CrossRealmPK.OnPlayerLogin(curPlayer) #诛仙BOSS PlayerZhuXianBoss.OnPlayerLogin(curPlayer) - + #骑宠boss状态通知 + PlayerHorsePetBoss.OnLogin(curPlayer) GMT_CTG.OnPlayerLogin(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 ## 增加高手玩家上线广播 @@ -222,9 +250,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 @@ -243,11 +268,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: @@ -503,6 +524,9 @@ # @remarks 函数详细说明. def __Func_PlayerDisconnect(curPlayer, tick): + if GameWorld.IsCrossServer(): + PlayerFB.OnPlayerDisconnectCrossServer(curPlayer) + #跨服匹配PK CrossRealmPK.OnLeaveServer(curPlayer) @@ -512,6 +536,7 @@ PlayerFamily.PlayerLogoffRefreshFamily(curPlayer, tick) PlayerFriend.OnPlayerDisconnect(curPlayer, tick) + __UpdOnedayJobPlayerLoginoffTime(curPlayer) PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick) # 设置家族成员离线时间 SetPlayerOfflineTime(curPlayer) @@ -519,6 +544,11 @@ AuctionHouse.OnPlayerLeaveServer(curPlayer) #------------镖车逻辑 #TruckPlayerDisconnectProcess(curPlayer, tick) + + if not PlayerControl.GetIsTJG(curPlayer): + playerID = curPlayer.GetPlayerID() + PyGameData.g_unTJLogoffTime[playerID] = int(time.time()) + return ## 设置玩家离线时间 @@ -623,8 +653,6 @@ elif packType == IPY_GameServer.CDBPlayerRefresh_Job: curPlayer.SetJob(packValue) - elif packType == IPY_GameServer.CDBPlayerRefresh_ExAttr1: - PlayerControl.SetJobRank(curPlayer, packValue) # elif packType == IPY_GameServer.CDBPlayerRefresh_CurrentPlayerType: # #这里应该通知组队那边刷新 @@ -646,6 +674,10 @@ 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) @@ -691,6 +723,7 @@ GameWorldBoss.OnPlayerChangeMap(curPlayer) PlayerFamily.OnPlayerChangeMap(curPlayer, tick) PlayerFamilyParty.OnPlayerChangeMap(curPlayer, tick) + GameWorldFamilyWar.OnPlayerChangeMap(curPlayer) return ## 玩家切换真实地图 @@ -768,6 +801,9 @@ #改到mapServer登录成功通知 #Sync_PyServerDataTimeToClient(curPlayer, tick) + if GameWorld.IsCrossServer(): + PlayerFB.PlayerLoginLoadCrossMapOK(curPlayer) + PlayerTeam.OnPlayerReadMapOK(curPlayer, tick) #刷新人物日期状态 @@ -881,17 +917,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 -- Gitblit v1.8.0