| | |
| | | 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
|
| | | #import PlayerSealDemon
|
| | | import PlayerBillboard
|
| | | import PlayerLVAward
|
| | | import PlayerDuJie
|
| | |
| | | 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 CrossRealmPK
|
| | | import AuctionHouse
|
| | | import PlayerAssist
|
| | | import PlayerFB
|
| | | import PlayerLove
|
| | | import PlayerCharm
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | 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
|
| | |
|
| | | #---------------------------------------------------------------------
|
| | |
| | | #玩家队伍初始化
|
| | | PlayerTeam.OnPlayerLoginRefreshTeam(curPlayer, tick)
|
| | | PlayerCompensation.NotifyPlayerCompensation(curPlayer)
|
| | | __UpdOnedayJobPlayerLoginoffTime(curPlayer)
|
| | |
|
| | | if not PlayerControl.GetIsTJG(curPlayer):
|
| | | # 只有通知逻辑的应该放此处减少IO,如有逻辑处理存储等不可放在此处
|
| | |
| | | #仙盟宴会
|
| | | PlayerFamilyParty.OnPlayerLogin(curPlayer)
|
| | | #封魔坛
|
| | | PlayerSealDemon.OnPlayerLogin(curPlayer)
|
| | | #PlayerSealDemon.OnPlayerLogin(curPlayer)
|
| | | #仙魔之争
|
| | | PlayerXMZZ.OnXMZZOnLogin(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()
|
| | | #副本助战
|
| | | PlayerFBHelpBattle.OnHelpPlayerLogin(curPlayer)
|
| | | #竞技场
|
| | | GameWorldArena.OnPlayerLogin(curPlayer)
|
| | | #跨服PK
|
| | | CrossRealmPK.OnPlayerLogin(curPlayer)
|
| | | #诛仙BOSS
|
| | | PlayerZhuXianBoss.OnPlayerLogin(curPlayer)
|
| | | |
| | | #骑宠boss状态通知
|
| | | PlayerHorsePetBoss.OnLogin(curPlayer)
|
| | | #协助
|
| | | PlayerAssist.OnPlayerLogin(curPlayer, False)
|
| | | #天星塔
|
| | | GameWorldSkyTower.OnPlayerLogin(curPlayer)
|
| | | GMT_CTG.OnPlayerLogin(curPlayer)
|
| | | |
| | | else:
|
| | | #协助
|
| | | PlayerAssist.OnPlayerLogin(curPlayer, True)
|
| | | |
| | | 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
|
| | | |
| | | if not PlayerControl.GetIsTJG(curPlayer):
|
| | | #家族副本boss状态通知
|
| | | PlayerFamilyBoss.OnLogin(curPlayer)
|
| | | #魅力
|
| | | PlayerCharm.OnPlayerLogin(curPlayer)
|
| | | #情缘
|
| | | PlayerLove.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
|
| | |
|
| | | ## 增加高手玩家上线广播
|
| | |
| | | if checkMark not in ShareDefine.BillboardTypeList:
|
| | | continue
|
| | |
|
| | | if checkMark in [ShareDefine.Def_BT_HighLadder]:
|
| | | continue
|
| | | |
| | | billboard = GameWorld.GetBillboard().FindBillboard(checkMark)
|
| | | if not billboard:
|
| | | continue
|
| | |
| | | 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:
|
| | |
| | | __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
|
| | |
| | | # @remarks 函数详细说明.
|
| | | def __Func_PlayerDisconnect(curPlayer, tick):
|
| | |
|
| | | if GameWorld.IsCrossServer():
|
| | | PlayerFB.OnPlayerDisconnectCrossServer(curPlayer)
|
| | | |
| | | #跨服匹配PK
|
| | | CrossRealmPK.OnLeaveServer(curPlayer)
|
| | |
|
| | |
| | | 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())
|
| | | |
| | | return
|
| | |
|
| | | ## 设置玩家离线时间
|
| | |
| | | # @return None
|
| | | # @remarks 函数详细说明.
|
| | | def SetPlayerOfflineTime(curPlayer):
|
| | | if PlayerControl.GetIsTJG(curPlayer):
|
| | | return
|
| | | #if PlayerControl.GetIsTJG(curPlayer):
|
| | | # return
|
| | |
|
| | | curPlayerID = curPlayer.GetPlayerID()
|
| | | curFamily = curPlayer.GetFamily()
|
| | |
| | |
|
| | | playerStatePack = IPY_GameServer.IPY_GRefreshPlayerProperty()
|
| | | packValue = playerStatePack.GetValue()
|
| | | packValueEx = playerStatePack.GetValueEx()
|
| | | packType = playerStatePack.GetType()
|
| | |
|
| | | #---特殊逻辑处理---
|
| | |
| | | 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)
|
| | |
| | | return
|
| | |
|
| | | if packType == IPY_GameServer.CDBPlayerRefresh_FightPower:
|
| | | curPlayer.SetFightPower(packValue)
|
| | | curPlayer.SetFightPower(packValue, packValueEx)
|
| | | return
|
| | |
|
| | | if packType == IPY_GameServer.CDBPlayerRefresh_ExAttr2:
|
| | |
| | | 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:
|
| | |
| | |
|
| | | 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:
|
| | | # #这里应该通知组队那边刷新
|
| | |
| | | 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)
|
| | |
|
| | | 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_OfficialRank:
|
| | | curPlayer.SetOfficialRank(packValue)
|
| | | PlayerSocial.UpdateSocialInfo(curPlayer, packType, packValue)
|
| | | PlayerSocial.UpdateSocialInfo(curPlayer.GetID(), packType, packValue)
|
| | | #更新排行榜的境界
|
| | | PlayerBillboard.UpdateBillboardRealm(curPlayer)
|
| | |
|
| | |
| | | GameWorldBoss.OnPlayerChangeMap(curPlayer)
|
| | | PlayerFamily.OnPlayerChangeMap(curPlayer, tick)
|
| | | PlayerFamilyParty.OnPlayerChangeMap(curPlayer, tick)
|
| | | GameWorldFamilyWar.OnPlayerChangeMap(curPlayer)
|
| | | return
|
| | |
|
| | | ## 玩家切换真实地图
|
| | |
| | | #改到mapServer登录成功通知
|
| | | #Sync_PyServerDataTimeToClient(curPlayer, tick)
|
| | |
|
| | | if GameWorld.IsCrossServer():
|
| | | PlayerFB.PlayerLoginLoadCrossMapOK(curPlayer)
|
| | | |
| | | PlayerTeam.OnPlayerReadMapOK(curPlayer, tick)
|
| | |
|
| | | #刷新人物日期状态
|
| | |
| | | #{
|
| | | # 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
|