hxp
2019-04-19 2ef7331900344b29d633c4170a8b272b96d0a872
6459 【后端】【2.0】缥缈仙域开发单(优化跨服boss状态同步)
3个文件已修改
87 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Bossall.py 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/GMShell.py 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/Bossall.py
@@ -18,25 +18,41 @@
import GameWorldBoss
import GameWorld
import time
import CrossBoss
## 执行逻辑
#  @param curPlayer 当前玩家
#  @param gmList []
#  @return None
def OnExec(curPlayer, gmList):
    bossIDList = []
    for i, bossInfo in enumerate(PyGameData.g_sortBOSSRefreshList):
        bossID, killedTime, refreshTime = bossInfo
        isAlive = GameWorldBoss.__GetIsAlive(bossID)
        if isAlive:
            continue
        refreshTime = 0
        killedTime = 0
        PyGameData.g_sortBOSSRefreshList[i] = [bossID, killedTime, refreshTime]
        bossIDList.append(bossID)
    curTime = int(time.time())
    PyGameData.g_sortBOSSRefreshList.sort(key=lambda asd:max(0, asd[2] - (curTime - asd[1])))
    bossIDList = __Bossall()
    GameWorld.DebugAnswer(curPlayer, "重生boss:%s" % bossIDList)
    return
def OnMergeServerExec(cmdMsgList, tick):
    bossIDList = __Bossall()
    GameWorld.DebugLog("重生boss:%s" % bossIDList)
    return
def OnGetMergeParam(curPlayer):
    return []
def __Bossall():
    isCrossServer = GameWorld.IsCrossServer()
    bossIDList = []
    for bossInfo in PyGameData.g_sortBOSSRefreshList:
        bossID = bossInfo[0]
        if isCrossServer:
            zoneID = bossInfo[3]
            isAlive = CrossBoss.__GetCrossBossIsAlive(zoneID, bossID)
        else:
            isAlive = GameWorldBoss.__GetIsAlive(bossID)
        if isAlive:
            continue
        bossInfo[1] = 0
        bossInfo[2] = 0
        bossIDList.append(bossID)
    curTime = int(time.time())
    PyGameData.g_sortBOSSRefreshList.sort(key=lambda asd:max(0, asd[2] - (curTime - asd[1])))
    return bossIDList
ServerPython/CoreServerGroup/GameServer/Script/GM/GMShell.py
@@ -19,6 +19,7 @@
import GameWorld
import Commands
import IPY_GameServer
import CrossRealmMsg
import PyGameData
import traceback
import GMCommon
@@ -86,14 +87,13 @@
            GameWorld.Log("###使用GM命令 = %s错误,玩家不是GM"%(callFunName), curPlayer.GetPlayerID())
            return
        
        #非跨服服务器下使用跨服专属GM命令,则发送到跨服
        #非跨服服务器下使用跨服GM命令,则发送到跨服
        if not GameWorld.IsCrossServer():
            callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callFunName, "OnGetMergeParam"))
            if callFunc != None:
                extendParamList = callFunc(curPlayer)
                alist.extend(extendParamList)
                #MergeChildMsg.SendMergerChildToCenterStringData(ShareDefine.ClientServerMsg_GMCMD, alist)
                return
                CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_GMCMD, alist)
            
        callFunc = GameWorld.GetExecFunc(Commands, "%s.%s"%(callFunName, "OnExec"))
        if callFunc == None:
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
@@ -197,16 +197,20 @@
    if not zoneID:
        return
    
    if __GetCrossBossIsAlive(zoneID, bossID) != isAlive:
    __SetCrossBossIsAlive(zoneID, bossID, isAlive)
    if isAlive:
            # 广播子服跨服boss复活
            SendClientServerCrossBossState(mapID, zoneID, {bossID:isAlive})
    return
def SendClientServerCrossBossState(mapID, zoneID, bossStateDict={}):
        # 广播子服跨服boss复活
        zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
        if zoneIpyData != None:
            serverGroupIDList = zoneIpyData.GetServerGroupIDList()
            stateInfo = [zoneID, bossID, isAlive]
        stateInfo = [zoneID, bossStateDict]
            CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
    return
def __SetKilledRecord(bossRecData, killedTime, playerName):
@@ -272,13 +276,13 @@
                bossRecData = __GetCrossBossRecData(zoneID, bossID)
                killedTime = GetRecKilledTime(bossRecData)
                refreshTime = GetRecRefreshTime(bossRecData)
                PyGameData.g_sortBOSSRefreshList.append([bossID, killedTime, refreshTime, zoneID])
                PyGameData.g_sortBOSSRefreshList.append([bossID, killedTime, refreshTime, zoneID, mapID])
        PyGameData.g_sortBOSSRefreshList.sort(key=lambda asd:max(0, asd[2] - (curTime - asd[1])))
        
    #GameWorld.DebugLog("检查boss复活: PyGameData.g_sortBOSSRefreshList=%s" % PyGameData.g_sortBOSSRefreshList)
    syncBOSSIDList = []
    zoneMapBossStateDict = {}
    for bossInfo in PyGameData.g_sortBOSSRefreshList:
        bossID, killedTime, refreshTime, zoneID = bossInfo
        bossID, killedTime, refreshTime, zoneID, mapID = bossInfo
        isAlive = __GetCrossBossIsAlive(zoneID, bossID)
        if isAlive:
            #GameWorld.DebugLog("    zoneID=%s,bossID=%s,未被击杀!" % (zoneID, bossID))
@@ -289,12 +293,21 @@
            #GameWorld.DebugLog("    zoneID=%s,bossID=%s,refreshTime=%s,curTime=%s,killedTime=%s,重生倒计时秒(%s)!" % (zoneID, bossID, refreshTime, curTime, killedTime, rebornSecond))
            break
        
        __SetCrossBossIsAlive(zoneID, bossID, 1)
        syncBOSSIDList.append(bossID)
        isAlive = 1
        __SetCrossBossIsAlive(zoneID, bossID, isAlive)
        key = (mapID, zoneID)
        if key not in zoneMapBossStateDict:
            zoneMapBossStateDict[key] = {}
        bossStateDict = zoneMapBossStateDict[key]
        bossStateDict[bossID] = isAlive
        
        GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID), 1)
        GameWorld.DebugLog("    通知MapServer重生: zoneID=%s,bossID=%s,killedTime=%s,rebornSecond=%s" % (zoneID, bossID, killedTime, rebornSecond))
        
    for key, bossStateDict in zoneMapBossStateDict.items():
        mapID, zoneID = key
        SendClientServerCrossBossState(mapID, zoneID, bossStateDict)
    return
def GetCrossBossIsAliveOrCanReborn(zoneID, bossID):
@@ -388,13 +401,17 @@
def CrossServerMsg_CrossBossState(msgInfo):
    ## 收到跨服服务器同步的跨服boss状态
    
    zoneID, bossID, isAlive = msgInfo
    GameWorld.DebugLog("收到跨服服务器同步的跨服boss状态: zoneID=%s, bossID=%s, isAlive=%s" % (zoneID, bossID, isAlive))
    zoneID, bossStateDict = msgInfo
    GameWorld.DebugLog("收到跨服服务器同步的跨服boss状态: zoneID=%s, bossStateDict=%s" % (zoneID, bossStateDict))
    
    aliveBossIDList = []
    for bossID, isAlive in bossStateDict.items():
    __SetCrossBossIsAlive(zoneID, bossID, isAlive)
    if isAlive:
        Sync_CrossBossInfo(None, [bossID])
            aliveBossIDList.append(bossID)
    if aliveBossIDList:
        Sync_CrossBossInfo(None, aliveBossIDList)
        
    return