| | |
| | | #import PlayerFamilyStore
|
| | | 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, tick):
|
| | | ''' 玩家最终登录成功处理, 由 MapServer DoPlayerRealLoginOK 通知
|
| | | 该函数为地图最终登录成功才会执行到,以后一些功能类的登录处理建议均写到这里
|
| | | 旧的功能先不动( __DoPlayerLoginServer 函数中的功能),如果有登录相关的bug再考虑是否移动到此函数
|
| | | '''
|
| | | |
| | | GameWorld.Log("GameServer->DoPlayerRealLoginOK", curPlayer.GetPlayerID())
|
| | | |
| | | if not PlayerControl.GetIsTJG(curPlayer):
|
| | | #家族副本boss状态通知
|
| | | PlayerFamilyBoss.OnLogin(curPlayer)
|
| | | #魅力
|
| | | PlayerCharm.OnPlayerLogin(curPlayer)
|
| | | #情缘
|
| | | PlayerLove.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
|
| | |
|
| | | ## 增加高手玩家上线广播
|
| | |
| | | __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
|
| | |
| | | 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_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
|
| | |
|
| | | ## 玩家切换真实地图
|