hxp
2024-09-04 c7de89ae0c2999d9d2585dc63df28eac36a443e1
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFB.py
@@ -33,8 +33,10 @@
import IPY_PlayerDefine
import CrossBattlefield
import CrossRealmPlayer
import CrossChampionship
import DataRecordPack
import CrossRealmMsg
import PyDataManager
import ShareDefine
import CrossBoss
import time
@@ -63,8 +65,9 @@
## 跨服地图动态分配的虚拟线路信息 {(mapID, copyMapID):CrossCopyMapInfo, ...}
class CrossCopyMapInfo():
    
    def __init__(self, zoneID, funcLineID):
    def __init__(self, zoneID, funcMapID, funcLineID):
        self.zoneID = zoneID
        self.funcMapID = funcMapID
        self.funcLineID = funcLineID
        self.newFuncLineNum = 0
        self.realMapID = 0
@@ -94,9 +97,28 @@
            
        return totalPlayerCount
    
    def IsMustCopyMapPlayer(self, playerID):
    def IsMustCopyMapPlayer(self, playerID, checkTeam=True):
        ## 是否必定在此分线的玩家, 在请求队列里 或 曾经进入到该分线的,都强制认为属于该分线的玩家
        return playerID in self.waitPlayerDict or playerID in self.enterPlayerIDList
        if playerID in self.waitPlayerDict or playerID in self.enterPlayerIDList:
            return True
        if self.openState != IPY_PlayerDefine.fbosOpen:
            return False
        if not checkTeam:
            return False
        # 队友强制在一起
        funcTeamMgr = PyDataManager.GetDBPyFuncTeamManager()
        teamID = funcTeamMgr.GetPlayerTeamID(playerID, self.funcMapID)
        if not teamID:
            return False
        funcTeam = funcTeamMgr.GetFuncTeam(teamID)
        if not funcTeam:
            return False
        for memID in funcTeam.GetMemberIDList():
            if memID in self.waitPlayerDict or memID in self.enterPlayerIDList:
                GameWorld.DebugLog("强制和队友在一条线路!  funcMapID=%s,memID=%s,realMapID=%s,copyMapID=%s"
                                   % (self.funcMapID, memID, self.realMapID, self.copyMapID), playerID)
                return True
        return False
        
    def OnRequestEnterCrossCopyMap(self, playerID, tick, copyMapPlayerMax, includeOffline):
        if not copyMapPlayerMax or self.IsMustCopyMapPlayer(playerID):
@@ -147,6 +169,10 @@
    mapID = msgData["MapID"]
    funcLineID = msgData["FuncLineID"]
    playerLV = msgData["LV"]
    if mapID == ChConfig.Def_FBMapID_CrossChampionship:
        CrossChampionship.OnRequestChampionshipVSRoom(playerID, serverGroupID)
        return
    
    zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID)
    if not zoneIpyData:
@@ -251,7 +277,7 @@
        
    realMapID, copyMapID, openState = tagCopyMapObj.realMapID, tagCopyMapObj.copyMapID, tagCopyMapObj.openState
    
    if openState == IPY_PlayerDefine.fbosWaitForClose:
    if openState >= IPY_PlayerDefine.fbosWaitForClose:
        PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossFBClose")
        GameWorld.ErrLog("分流的副本线路关闭中! mapID=%s,funcLineID=%s,zoneID=%s,realMapID=%s,copyMapID=%s,openState=%s" 
                         % (mapID, funcLineID, zoneID, realMapID, copyMapID, openState), playerID)
@@ -338,7 +364,7 @@
        
        copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key]
        openState = copyMapObj.openState
        if openState == IPY_PlayerDefine.fbosWaitForClose:
        if openState >= IPY_PlayerDefine.fbosWaitForClose:
            # 没有限制分流人数的情况,代表都在同一场,这种情况下当副本已经在关闭的状态下,则代表已经结束了,不可再进入
            if not shuntPlayerMax:
                PlayerControl.NotifyCodeCross(serverGroupID, playerID, "CrossFBClose")
@@ -451,7 +477,7 @@
    newFuncLineObj.copyMapID = copyMapID
    newFuncLineObj.newFuncLineNum = newFuncLineNum
    
    copyMapObj = CrossCopyMapInfo(zoneID, funcLineID)
    copyMapObj = CrossCopyMapInfo(zoneID, mapID, funcLineID)
    copyMapObj.realMapID = realMapID
    copyMapObj.copyMapID = copyMapID
    copyMapObj.newFuncLineNum = newFuncLineNum
@@ -468,6 +494,15 @@
    msgInfo = str([copyMapID, propertyID, funcLineDataCache])
    GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, 0, realMapID, "OpenFB", msgInfo, len(msgInfo))
    return copyMapObj
def SendMapOpenFBEx(realMapID, copyPropertyList):
    ## 通知地图开启副本线路
    # @param realMapID: 地图ID
    # @param copyPropertyList: [[copyMapID, propertyID], ...]
    msgInfo = str(copyPropertyList)
    GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, 0, realMapID, "OpenFBEx", msgInfo, len(msgInfo))
    GameWorld.Log("SendMapOpenFBEx: realMapID=%s,msgInfo=%s" % (realMapID, msgInfo))
    return
def OpenCrossDynamicLineBySys(zoneID, mapID, funcLineIDList, checkExist):
    ## 系统开启跨服动态线路
@@ -515,7 +550,11 @@
        OnCrossDynamicLineClose(realMapID, copyMapID)
    elif state == IPY_PlayerDefine.fbosOpen:
        OnCrossDynamicLineOpen(mapID, realMapID, copyMapID)
    else:
        key = (realMapID, copyMapID)
        if key in PyGameData.g_crossDynamicLineCopyMapInfo:
            copyMapObj = PyGameData.g_crossDynamicLineCopyMapInfo[key]
            copyMapObj.openState = state
    return
def OnCrossDynamicLineOpen(mapID, realMapID, copyMapID):
@@ -714,6 +753,7 @@
#  @param sendCMD: 请求的命令 根据请求类型和请求命令来决定最终操作
#  @return None
def EnterFBLine(curPlayer, queryCallName, sendCMD, tick):
    playerID = curPlayer.GetPlayerID()
    GameWorld.Log("EnterFBLine()...queryCallName=%s,sendCMD=%s" % (queryCallName, sendCMD), curPlayer.GetPlayerID())
    playerManager = GameWorld.GetPlayerManager()
    try:
@@ -758,10 +798,6 @@
        if not GameWorldFamilyWar.CheckPlayerCanEnterFamilyWarFBMap(curPlayer):
            return
        
    elif tagMapID == ChConfig.Def_FBMapID_FamilyBossMap:
        if not PlayerFamilyBoss.CheckIsFamilyBossFBOpen(curPlayer.GetFamilyID(), tagMapID):
            GameWorld.Log("EnterFBLine mapID=%s is familyBossFB, but is not open!" % tagMapID)
            return
    #守卫人皇 是否已参加
    elif tagMapID == ChConfig.Def_FBMapID_FamilyInvade:
        if curPlayer.GetFamilyID() in PyGameData.g_swrhJoinRecord:
@@ -787,3 +823,49 @@
    playerManager.MapServer_QueryPlayer(curPlayer.GetPlayerID(), ChConfig.queryType_EnterFB, 0, tagMapID,
                queryCallName, sendCMD, len(sendCMD), curPlayer.GetRouteServerIndex())
    return
def Send_CrossServerMsg_EnterVSRoomRet(vsRoomDict, serverGroupIDList=None):
    ## 发送子服跨服对战房间请求进入结果
    # @param vsRoomDict: {roomID:{playerID:playerInfo, ...}, }
    #      playerInfo key
    #            serverGroupID    所属服务器分组ID
    #            regMapInfo        传送跨服注册信息 [registerMap, mapID, dataMapID, copyMapID, posX, posY]
    CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_EnterVSRoomRet, vsRoomDict, serverGroupIDList)
    return
def CrossServerMsg_EnterVSRoomRet(msgData, tick):
    ## 跨服对战房间请求进入结果
    curServerGroupID = GameWorld.GetServerGroupID()
    GameWorld.DebugLog("=== 跨服PK对战房间请求进入结果  === curServerGroupID=%s" % curServerGroupID)
    vsRoomDict = msgData
    for roomID, playerDict in vsRoomDict.items():
        GameWorld.DebugLog("    roomID=%s,playerDict=%s" % (roomID, playerDict))
        for playerID, playerInfo in playerDict.items():
            if "serverGroupID" in playerInfo:
                serverGroupID = playerInfo["serverGroupID"]
                if serverGroupID != curServerGroupID:
                    GameWorld.DebugLog("        不是本服玩家,不处理!playerID=%s,serverGroupID=%s" % (playerID, serverGroupID))
                    continue
            player = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
            if not player:
                GameWorld.DebugLog("        玩家不在线, playerID=%s" % (playerID))
                continue
            if PlayerControl.GetIsTJG(player):
                GameWorld.DebugLog("        玩家脱机中, playerID=%s" % (playerID))
                continue
            if "regMapInfo" not in playerInfo:
                continue
            regMapInfo = playerInfo["regMapInfo"]
            if len(regMapInfo) != 6:
                continue
            registerMap, mapID, dataMapID, copyMapID, posX, posY = regMapInfo
            PlayerControl.SetVsRoomId(player, roomID, True)
            # 通知地图玩家匹配成功, 上传数据, 准备进入跨服服务器
            CrossRealmPlayer.SendCrossRealmReg(player, registerMap, mapID, dataMapID, copyMapID, posX, posY)
    return