From d50410deaed69bc1a07dcb02b0816f9321a34a69 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期五, 19 四月 2019 17:39:36 +0800
Subject: [PATCH] 6457 【后端】【2.0】缥缈仙域开发单(宝藏流程调整)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py | 170 +++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 112 insertions(+), 58 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
index f2dec64..e7b0983 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py
@@ -26,6 +26,7 @@
import CrossRealmMsg
import ShareDefine
import PyGameData
+import PlayerFB
import time
@@ -51,15 +52,22 @@
g_bossRecDataDict = {} # boss对应rec记录缓存 {(zoneID, bossID):recData, ...}
-def GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID):
+def GetCrossBossZoneID(mapID, realMapID, copyMapID):
## 获取地图跨服boss所属分区
- if dataMapID not in ChConfig.Def_CrossMapIDList:
- return
- if dataMapID not in ChConfig.Def_CrossZoneTableName:
- GameWorld.ErrLog("跨服boss没有分区表!dataMapID=%s" % dataMapID)
- return
- tableName = ChConfig.Def_CrossZoneTableName[dataMapID]
- return IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
+ if mapID not in ChConfig.Def_CrossMapIDList:
+ return 0
+ # 固定线路分配的
+ if mapID in ChConfig.Def_CrossZoneMapTableName:
+ tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
+ zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, mapID, copyMapID)
+ if not zoneIpyData:
+ return 0
+ return zoneIpyData.GetZoneID()
+
+ # 动态线路分配的
+ elif mapID in ChConfig.Def_CrossDynamicLineMap:
+ return PlayerFB.GetCrossDynamicLineZoneID(mapID, realMapID, copyMapID)
+ return 0
def __GetCrossBossRecData(zoneID, bossID):
## 获取跨服Boss Rec数据
@@ -99,39 +107,63 @@
## 获取跨服世界boss是否活着
return GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_CrossBossIsAlive % (zoneID, bossID))
-def ClientServerMsg_ServerInitOK(serverGroupID):
- ## 子服连接成功
+def Sync_CrossBossInitDataToClientServer(serverGroupID=0):
+ ''' 同步跨服Boss活动数据到子服务器
+ @param serverGroupID: 为0时同步所有子服
+ '''
- bossInfoList = []
+ crossMapBossIDListDict = {}
ipyDataMgr = IpyGameDataPY.IPY_Data()
for i in xrange(ipyDataMgr.GetBOSSInfoCount()):
ipyData = ipyDataMgr.GetBOSSInfoByIndex(i)
mapID = ipyData.GetMapID()
- zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(mapID, serverGroupID)
- if not zoneIpyData:
- continue
- zoneID = zoneIpyData.GetZoneID()
bossID = ipyData.GetNPCID()
- bossRecData = __GetCrossBossRecData(zoneID, bossID)
- killedTime = GetRecKilledTime(bossRecData)
- refreshTime = GetRecRefreshTime(bossRecData)
- killedRecord = GetRecKilledRecord(bossRecData)
- isAlive = __GetCrossBossIsAlive(zoneID, bossID)
- killerExInfo = [] # 重连成功的信息同步不发送击杀者信息
- bossInfoList.append([zoneID, bossID, killedTime, refreshTime, killedRecord, isAlive, killerExInfo])
-
- if bossInfoList:
- bossInfoDict = {"BossInfoType":"InitOK", "BossInfoList":bossInfoList}
- CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, [serverGroupID])
-
+ if mapID not in ChConfig.Def_CrossZoneTypeName:
+ continue
+ if mapID not in crossMapBossIDListDict:
+ crossMapBossIDListDict[mapID] = []
+ bossIDList = crossMapBossIDListDict[mapID]
+ bossIDList.append(bossID)
+
+ crossZoneName = GameWorld.GetCrossZoneName()
+ GameWorld.Log("同步给子服跨服boss信息: crossZoneName=%s,syncServerGroupID=%s" % (crossZoneName, serverGroupID))
+
+ # 由于不同功能的跨服boss分区可能不一样,同步子服就需要按分区分步同步,所以需先发送一条初始化的信息类型先清空子服保存的跨服boss数据,再根据功能所属分区推送
+ serverGroupIDList = [serverGroupID] if serverGroupID else []
+ bossInfoDict = {"BossInfoType":"InitOK"}
+ CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList)
+
+ for mapID, bossIDList in crossMapBossIDListDict.items():
+ GameWorld.Log(" mapID=%s, bossIDList=%s" % (mapID, bossIDList))
+ zoneIpyDataList = CrossRealmPlayer.GetCrossZoneIpyDataListByServerGroupID(mapID, serverGroupID)
+ if not zoneIpyDataList:
+ continue
+ for zoneIpyData in zoneIpyDataList:
+ zoneID = zoneIpyData.GetZoneID()
+ serverGroupIDList = [serverGroupID] if serverGroupID else zoneIpyData.GetServerGroupIDList()
+ bossInfoList = []
+ for bossID in bossIDList:
+ bossRecData = __GetCrossBossRecData(zoneID, bossID)
+ killedTime = GetRecKilledTime(bossRecData)
+ refreshTime = GetRecRefreshTime(bossRecData)
+ killedRecord = GetRecKilledRecord(bossRecData)
+ isAlive = __GetCrossBossIsAlive(zoneID, bossID)
+ killerExInfo = [] # 重连成功的信息同步不发送击杀者信息
+ bossInfoList.append([zoneID, bossID, killedTime, refreshTime, killedRecord, isAlive, killerExInfo])
+
+ if bossInfoList:
+ bossInfoDict = {"BossInfoList":bossInfoList}
+ CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList)
+ else:
+ GameWorld.Log("没有跨服boss信息! mapID=%s,zoneID=%s" % (mapID, zoneID))
+
return
-def DoCrossBossOnKilled(bossID, killPlayerName, realMapID, dataMapID, copyMapID, killerIDList):
+def DoCrossBossOnKilled(bossID, killPlayerName, mapID, realMapID, copyMapID, killerIDList):
## 跨服boss被杀
- zoneIpyData = GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID)
- zoneID = 0 if not zoneIpyData else zoneIpyData.GetZoneID()
- GameWorld.Log("击杀跨服boss: zoneID=%s,bossID=%s,realMapID=%s,dataMapID=%s,copyMapID=%s,killerIDList=%s"
- % (zoneID, bossID, realMapID, dataMapID, copyMapID, killerIDList))
+ zoneID = GetCrossBossZoneID(mapID, realMapID, copyMapID)
+ GameWorld.Log("击杀跨服boss: zoneID=%s,bossID=%s,mapID=%s,realMapID=%s,copyMapID=%s,killerIDList=%s"
+ % (zoneID, bossID, mapID, realMapID, copyMapID, killerIDList))
if not zoneID:
return
@@ -146,20 +178,22 @@
refreshTime = SetBossRefreshTime(zoneID, bossID, killedTime, bossRecData)
# 广播子服跨服boss被击杀
+ zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
+ if zoneIpyData == None:
+ return
serverGroupIDList = zoneIpyData.GetServerGroupIDList()
killedRecord = GetRecKilledRecord(bossRecData)
- killerExInfo = [killerIDList, dataMapID]
+ killerExInfo = [killerIDList, mapID]
bossInfoList = [[zoneID, bossID, killedTime, refreshTime, killedRecord, isAlive, killerExInfo]]
bossInfoDict = {"BossInfoType":"OnKilled", "BossInfoList":bossInfoList}
CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList)
return
-def DoCrossBossStateChange(bossID, isAlive, dataMapID, realMapID, copyMapID):
+def DoCrossBossStateChange(bossID, isAlive, mapID, realMapID, copyMapID):
## 跨服boss状态变更
- zoneIpyData = GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID)
- zoneID = 0 if not zoneIpyData else zoneIpyData.GetZoneID()
- GameWorld.Log("跨服boss状态变更: zoneID=%s,bossID=%s,isAlive=%s,realMapID=%s,dataMapID=%s,copyMapID=%s"
- % (zoneID, bossID, isAlive, realMapID, dataMapID, copyMapID))
+ zoneID = GetCrossBossZoneID(mapID, realMapID, copyMapID)
+ GameWorld.Log("跨服boss状态变更: zoneID=%s,bossID=%s,isAlive=%s,mapID=%s,realMapID=%s,copyMapID=%s"
+ % (zoneID, bossID, isAlive, mapID, realMapID, copyMapID))
if not zoneID:
return
@@ -167,10 +201,12 @@
if isAlive:
# 广播子服跨服boss复活
- serverGroupIDList = zoneIpyData.GetServerGroupIDList()
- stateInfo = [zoneID, bossID, isAlive]
- CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
-
+ zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
+ if zoneIpyData != None:
+ serverGroupIDList = zoneIpyData.GetServerGroupIDList()
+ stateInfo = [zoneID, bossID, isAlive]
+ CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList)
+
return
def __SetKilledRecord(bossRecData, killedTime, playerName):
@@ -217,18 +253,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_CrossZoneTableName:
+ if mapID not in ChConfig.Def_CrossZoneTypeName:
continue
- tableName = ChConfig.Def_CrossZoneTableName[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)
@@ -258,24 +297,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_CrossZoneTableName:
+ if mapID not in ChConfig.Def_CrossZoneTypeName:
continue
- tableName = ChConfig.Def_CrossZoneTableName[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:
@@ -294,8 +347,8 @@
## 收到跨服服务器同步的跨服boss信息 {"BossInfoType":"InitOK", "BossInfoList":bossInfoList}
global g_bossRecDataDict
- bossInfoType = bossInfoDict["BossInfoType"]
- bossInfoList = bossInfoDict["BossInfoList"]
+ bossInfoType = bossInfoDict.get("BossInfoType", "")
+ bossInfoList = bossInfoDict.get("BossInfoList", [])
GameWorld.DebugLog("收到跨服同步的跨服boss信息: bossInfoType=%s" % (bossInfoType))
@@ -304,7 +357,8 @@
recTypeListData = GameWorld.GetUniversalRecMgr().GetTypeList(ShareDefine.Def_UniversalGameRecType_CrossBossInfo)
recTypeListData.Clear()
g_bossRecDataDict = {}
-
+ return
+
syncBOSSIDList = []
for bossInfo in bossInfoList:
zoneID, bossID, killedTime, refreshTime, killedRecord, isAlive, killerExInfo = bossInfo
@@ -318,14 +372,14 @@
if not killerExInfo:
continue
- killerIDList, dataMapID = killerExInfo
+ killerIDList, mapID = killerExInfo
for playerID in killerIDList:
killer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
if not killer:
- GameWorld.ErrLog("击杀跨服boss时主服玩家不在线, playerID=%s,dataMapID=%s,bossID=%s" % (playerID, dataMapID, bossID))
+ GameWorld.ErrLog("击杀跨服boss时主服玩家不在线, playerID=%s,mapID=%s,bossID=%s" % (playerID, mapID, bossID))
DataRecordPack.SendEventPack("CrossBoss_Error", {"PlayerID":playerID, "Error":"MainServerOffline"})
continue
- msgInfo = str([dataMapID, bossID])
+ msgInfo = str([mapID, bossID])
killer.MapServer_QueryPlayerResult(0, 0, "CrossKillBoss", msgInfo, len(msgInfo))
Sync_CrossBossInfo(None, syncBOSSIDList)
--
Gitblit v1.8.0