hxp
2024-10-17 f51835257345c50c4d3e5e0ecda7455401fb76ad
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/RemoteQuery/GY_Query_PlayerMirror.py
@@ -1,14 +1,25 @@
#!/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 请求类型
@@ -17,26 +28,67 @@
#  @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