| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #---------------------------------------------------------------------
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | #---------------------------------------------------------------------
|
| | | ##@package GY_Query_PlayerMirror
|
| | | ##@package Player.RemoteQuery.GY_Query_PlayerMirror
|
| | | #
|
| | | # @todo:玩家镜像打包数据
|
| | | # @author hxp
|
| | | # @date 2024-10-17
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 玩家镜像打包数据
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2024-10-17 15:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import GameWorld
|
| | | import PlayerEventCounter
|
| | | import ChPlayer
|
| | | import GameServerRefresh
|
| | | import MirrorAttack
|
| | | import PlayerViewCacheTube
|
| | | import PlayerControl
|
| | | import ChConfig
|
| | | #---------------------------------------------------------------------
|
| | |
|
| | | # @param query_Type 请求类型
|
| | |
| | | # @param tick 当前时间
|
| | | # @return "True" or "False" or ""
|
| | | def DoLogic(query_Type, query_ID, packCMDList, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(query_ID)
|
| | | GameWorld.DebugLog("GY_Query_PlayerMirror DoLogic", query_ID)
|
| | | msgInfo, packDataDict = packCMDList
|
| | | msgType = msgInfo["msgType"]
|
| | | # 镜像战斗
|
| | | if msgType == "MirrorBattle":
|
| | | curPlayer = None
|
| | | playerID = msgInfo.get("playerID", 0)
|
| | | if playerID:
|
| | | curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
|
| | | if not curPlayer or curPlayer.IsEmpty():
|
| | | return ''
|
| | | MirrorAttack.OnMirrorBattleInit(msgInfo, packDataDict, curPlayer)
|
| | | |
| | | # 其他功能
|
| | | elif msgType == "":
|
| | | pass
|
| | |
|
| | | if not curPlayer or curPlayer.IsEmpty():
|
| | | return ''
|
| | | playerData = packCMDList['playerData']
|
| | | # playerData为base64后的数据
|
| | | mirrorPlayer = GameWorld.GetGameWorld().CreateMirrorPlayer(playerData, curPlayer.GetPosX(), curPlayer.GetPosY())
|
| | | |
| | |
|
| | | #CreateMirrorPlayer 中会调用到 ChPlayer.PlayerLogin
|
| | | #是否镜像玩家 判断 mirrorPlayer.GetRealPlayerID()是否为0
|
| | | #python自己处理,以下逻辑,可以在DoPlayerLogin函数最后 判断是镜像玩家后统一处理
|
| | |
|
| | | index = mirrorPlayer.GetIndex()
|
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | PlayerEventCounter.GameServer_InitOK(index, tick)
|
| | | ChPlayer.LoadMapOK(index, tick)
|
| | | GameServerRefresh.GameSever_PlayerInitOK(index, tick)
|
| | | return ''
|
| | |
|
| | |
|
| | | def DoResult(curPlayer , callFunName , funResult , tick):
|
| | | GameWorld.DebugLog("GY_Query_PlayerMirror DoResult %s" % str(funResult), curPlayer.GetPlayerID())
|
| | | funResult = eval(funResult)
|
| | | if not funResult:
|
| | | return
|
| | | msgType = funResult[0]
|
| | | msgData = funResult[1]
|
| | | |
| | | if msgType == "PackDataSyncState":
|
| | | isCross, isNeed = msgData
|
| | | __UpdPackDataSyncState(curPlayer, isCross, isNeed)
|
| | | |
| | | elif msgType == "PullPlayerPackData":
|
| | | msgInfo = msgData
|
| | | __DoPullPlayerPackData(curPlayer, msgInfo, tick)
|
| | | |
| | | return
|
| | |
|
| | | def __UpdPackDataSyncState(curPlayer, isCross, isNeed):
|
| | | ## 更新打包数据同步状态,这里只更新状态即可,具体同步由定时同步处理
|
| | | syncState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
|
| | | if isCross:
|
| | | updSyncState = (1 if isNeed else 0) * 10 + syncState % 10
|
| | | else:
|
| | | updSyncState = syncState / 10 + (1 if isNeed else 0)
|
| | | if syncState == updSyncState:
|
| | | return
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PackDataSyncState, syncState)
|
| | | GameWorld.DebugLog("更新打包数据同步状态: isCross=%s,isNeed=%s,syncState=%s,updSyncState=%s" |
| | | % (isCross, isNeed, syncState, updSyncState), curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | | def __DoPullPlayerPackData(curPlayer, msgInfo, tick):
|
| | | pullFrom = msgInfo.get("pullFrom")
|
| | | isCross = False
|
| | | # 0 或 非本服代表跨服需要
|
| | | if pullFrom == 0 or (pullFrom > 0 and pullFrom != GameWorld.GetServerGroupID()):
|
| | | isCross = True
|
| | | __UpdPackDataSyncState(curPlayer, isCross, 1)
|
| | | PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, forcePackData=True, packMsg=msgInfo)
|
| | | return
|
| | |
|
| | |
|
| | |
|