ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/CrossRealmPlayer.py
@@ -15,10 +15,13 @@
#"""Version = 2018-12-21 18:00"""
#-------------------------------------------------------------------------------
import GameWorld
import PyGameData
import ReadChConfig
import PlayerControl
import IpyGameDataPY
import IPY_GameWorld
import ChPyNetSendPack
import NetPackCommon
import ShareDefine
import ChConfig
import FBLogic
@@ -36,26 +39,28 @@
    
    return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
def GetServerCrossZoneIpyData(mapID, serverGroupID=0):
    ## 获取本服对应跨服玩法分区地图信息
    if mapID not in ChConfig.Def_CrossZoneTableName:
def GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID):
    ## 获取跨服分区
    zoneTypeName = ChConfig.Def_CrossZoneTypeName.get(mapID, "CrossZoneComm")
    crossZoneName = GameWorld.GetCrossZoneName()
    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition(zoneTypeName, {"CrossZoneName":crossZoneName}, True)
    if not ipyDataList:
        return
    if not serverGroupID:
        serverGroupID = GameWorld.GetServerGroupID()
    tableName = ChConfig.Def_CrossZoneTableName[mapID]
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
        return
    for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
        ipyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i)
    for ipyData in ipyDataList:
        serverGroupIDList = ipyData.GetServerGroupIDList()
        for serverGroupIDInfo in serverGroupIDList:
            if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \
                or (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID):
                return ipyData
    GameWorld.ErrLog("没有找到跨服玩法对应分区! mapID=%s, serverGroupID=%s, zoneTypeName=%s" % (mapID, serverGroupID, zoneTypeName))
    return
def GetServerCrossZoneMapIpyData(zoneID, mapID):
    ## 获取本服对应跨服玩法分区地图信息 - 仅适用于固定地图及虚拟分线的跨服玩法
    if mapID not in ChConfig.Def_CrossZoneMapTableName:
        return
    tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
    return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":zoneID})
def IsCrossServerOpen():
    ## 跨服服务器是否开放中
@@ -145,24 +150,47 @@
def DoEnterCrossRealm(curPlayer):
    ## 玩家进入跨服处理,本服的逻辑处理
    curPlayer.SetVisible(False)
    curPlayer.SetSight(0)
    curPet = curPlayer.GetPetMgr().GetFightPet()
    if curPet:
        curPet.SetVisible(False)
    PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
    return
def DoExitCrossRealm(curPlayer):
    ## 玩家退出跨服处理,本服的逻辑处理
    GameWorld.Log("DoExitCrossRealm...", curPlayer.GetPlayerID())
    curPlayer.SetVisible(True)
    curPlayer.SetSight(1)
    curPlayer.RefreshView()
    curPlayer.SetSight(ChConfig.Def_PlayerSight_Default)
    curPlayer.RefreshView()
    curPet = curPlayer.GetPetMgr().GetFightPet()
    if curPet:
        curPet.SetVisible(True)
    PlayerControl.SetPlayerSightLevel(curPlayer, 0)
    if PlayerControl.GetCrossMapID(curPlayer):
        PlayerControl.SetCrossMapID(curPlayer, 0)
    return
def GetPlayerCrossActInfo(curPlayer, actName):
    ## 获取跨服玩家对应的跨服活动信息
    actInfoDict = PyGameData.g_crossActInfoDict.get(actName, {})
    if not actInfoDict:
        return {}
    playerServerID = GameWorld.GetPlayerServerID(curPlayer)
    for actInfo in actInfoDict.values():
        if ShareDefine.ActKey_ServerIDRangeList not in actInfo:
            continue
        serverIDRangeList = actInfo[ShareDefine.ActKey_ServerIDRangeList]
        if not serverIDRangeList:
            # 全服开启
            return actInfo
        for serverIDA, serverIDB in serverIDRangeList:
            if serverIDA <= playerServerID <= serverIDB:
                return actInfo
    return {}
def NotifyCrossActEnd(curPlayer, actName):
    '''通知跨服运营活动结束
                    防止跨服服务器与子服时间不一致导致可能出现活动实际已关闭
                    但是前端根据本服服务器时间判断还未关闭,可能引起玩家误以为活动未关闭而引发的一系列问题
                    前端跨服活动显隐规则:
                    显示:根据通知的活动包 且 时间>=活动开始日期 才显示
                    关闭:收到后端通知的活动结束包 或 时间>=活动结束日期 则直接关闭活动界面
    '''
    clientPack = ChPyNetSendPack.tagGCCrossActEnd()
    clientPack.ActName = actName
    clientPack.ActNameLen = len(clientPack.ActName)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return