6459 【后端】【2.0】缥缈仙域开发单(优化跨服boss状态同步)
| | |
| | | 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
|
| | |
|
| | |
| | | import GameWorld
|
| | | import Commands
|
| | | import IPY_GameServer
|
| | | import CrossRealmMsg
|
| | | import PyGameData
|
| | | import traceback
|
| | | import GMCommon
|
| | |
| | | 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:
|
| | | #没有此命令
|
| | |
| | | if not zoneID:
|
| | | return
|
| | |
|
| | | __SetCrossBossIsAlive(zoneID, bossID, isAlive)
|
| | | |
| | | if isAlive:
|
| | | # 广播子服跨服boss复活
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
|
| | | if zoneIpyData != None:
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | | stateInfo = [zoneID, bossID, isAlive]
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
|
| | | |
| | | 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, bossStateDict]
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
|
| | | return
|
| | |
|
| | | def __SetKilledRecord(bossRecData, killedTime, playerName):
|
| | |
| | | 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))
|
| | |
| | | #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):
|
| | |
| | | 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))
|
| | |
|
| | | __SetCrossBossIsAlive(zoneID, bossID, isAlive)
|
| | | aliveBossIDList = []
|
| | | for bossID, isAlive in bossStateDict.items():
|
| | | __SetCrossBossIsAlive(zoneID, bossID, isAlive)
|
| | | if isAlive:
|
| | | aliveBossIDList.append(bossID)
|
| | |
|
| | | if isAlive:
|
| | | Sync_CrossBossInfo(None, [bossID])
|
| | | if aliveBossIDList:
|
| | | Sync_CrossBossInfo(None, aliveBossIDList)
|
| | |
|
| | | return
|
| | |
|