From ad158391ff62df48198a5411e5950e578dc3c43c Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 11 四月 2019 14:42:21 +0800 Subject: [PATCH] 6459 【后端】【2.0】缥缈仙域开发单(可进入跨服妖王地图支持分区,增加竞争归属逻辑) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py | 59 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 42 insertions(+), 17 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py index 283cdf3..bdf7df7 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py @@ -55,14 +55,22 @@ ## 获取地图跨服boss所属分区 if dataMapID not in ChConfig.Def_CrossMapIDList: return 0 - if dataMapID not in ChConfig.Def_CrossZoneMapTableName: - GameWorld.ErrLog("跨服boss没有分区表!dataMapID=%s" % dataMapID) + # 固定线路分配的 + if dataMapID in ChConfig.Def_CrossZoneMapTableName: + tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID] + zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID) + if not zoneIpyData: + return 0 + return zoneIpyData.GetZoneID() + + # 动态线路分配的 + elif dataMapID in ChConfig.Def_CrossDynamicLineMap: + zoneLineDict = PyGameData.g_crossDynamicLineInfo.get(dataMapID, {}) # {dataMapID:{(zoneID, funcLineID):[mapID, copyMapID], ...}, ...} + for zoneLineInfo, mapCopyInfo in zoneLineDict.items(): + if realMapID == mapCopyInfo[0] and copyMapID == mapCopyInfo[1]: + return zoneLineInfo[0] return 0 - tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID] - zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID) - if not zoneIpyData: - return 0 - return zoneIpyData.GetZoneID() + return 0 def __GetCrossBossRecData(zoneID, bossID): ## 获取跨服Boss Rec数据 @@ -234,18 +242,21 @@ curTime = int(time.time()) if not PyGameData.g_sortBOSSRefreshList: + crossZoneName = GameWorld.GetCrossZoneName() ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(ipyDataMgr.GetBOSSInfoCount()): ipyData = ipyDataMgr.GetBOSSInfoByIndex(i) bossID = ipyData.GetNPCID() mapID = ipyData.GetMapID() - if mapID not in ChConfig.Def_CrossZoneMapTableName: + if mapID not in ChConfig.Def_CrossZoneTypeName: continue - tableName = ChConfig.Def_CrossZoneMapTableName[mapID] - if not hasattr(ipyDataMgr, "Get%sCount" % tableName): + zoneTypeName = ChConfig.Def_CrossZoneTypeName[mapID] + if not hasattr(ipyDataMgr, "Get%sCount" % zoneTypeName): continue - for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()): - zoneIpyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i) + for i in xrange(getattr(ipyDataMgr, "Get%sCount" % zoneTypeName)()): + zoneIpyData = getattr(ipyDataMgr, "Get%sByIndex" % zoneTypeName)(i) + if zoneIpyData.GetCrossZoneName() != crossZoneName: + continue zoneID = zoneIpyData.GetZoneID() bossRecData = __GetCrossBossRecData(zoneID, bossID) killedTime = GetRecKilledTime(bossRecData) @@ -275,24 +286,38 @@ return +def GetCrossBossIsAliveOrCanReborn(zoneID, bossID): + ##BOSS是否活着或者可重生 + if __GetCrossBossIsAlive(zoneID, bossID): + return True + bossRecData = __GetCrossBossRecData(zoneID, bossID) + killedTime = GetRecKilledTime(bossRecData) + refreshTime = GetRecRefreshTime(bossRecData) + curTime = int(time.time()) + rebornSecond = max(0, refreshTime - (curTime - killedTime)) + return rebornSecond == 0 + def OnCrossMapServerInitOK(): __SendMapServerAliveCrossBoss() return def __SendMapServerAliveCrossBoss(): ## 同步当前还活着的boss,防止地图重启后已经刷新的boss不刷新 + crossZoneName = GameWorld.GetCrossZoneName() ipyDataMgr = IpyGameDataPY.IPY_Data() for i in xrange(IpyGameDataPY.IPY_Data().GetBOSSInfoCount()): ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i) bossID = ipyData.GetNPCID() mapID = ipyData.GetMapID() - if mapID not in ChConfig.Def_CrossZoneMapTableName: + if mapID not in ChConfig.Def_CrossZoneTypeName: continue - tableName = ChConfig.Def_CrossZoneMapTableName[mapID] - if not hasattr(ipyDataMgr, "Get%sCount" % tableName): + zoneTypeName = ChConfig.Def_CrossZoneTypeName[mapID] + if not hasattr(ipyDataMgr, "Get%sCount" % zoneTypeName): continue - for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()): - zoneIpyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i) + for i in xrange(getattr(ipyDataMgr, "Get%sCount" % zoneTypeName)()): + zoneIpyData = getattr(ipyDataMgr, "Get%sByIndex" % zoneTypeName)(i) + if zoneIpyData.GetCrossZoneName() != crossZoneName: + continue zoneID = zoneIpyData.GetZoneID() isAlive = __GetCrossBossIsAlive(zoneID, bossID) if not isAlive: -- Gitblit v1.8.0