From a5a3fae74222495868ae0bcd8483954cf2a4a712 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期日, 03 二月 2019 16:46:54 +0800 Subject: [PATCH] 2906 【1.5.0】【1.5.100】跨服及子服启动未完成优化 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py | 97 ++++++++++++++++++++++++++++-------------------- 1 files changed, 57 insertions(+), 40 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py index f2dec64..283cdf3 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossBoss.py @@ -51,15 +51,18 @@ g_bossRecDataDict = {} # boss对应rec记录缓存 {(zoneID, bossID):recData, ...} -def GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID): +def GetCrossBossZoneID(realMapID, dataMapID, copyMapID): ## 获取地图跨服boss所属分区 if dataMapID not in ChConfig.Def_CrossMapIDList: - return - if dataMapID not in ChConfig.Def_CrossZoneTableName: + return 0 + if dataMapID not in ChConfig.Def_CrossZoneMapTableName: GameWorld.ErrLog("跨服boss没有分区表!dataMapID=%s" % dataMapID) - return - tableName = ChConfig.Def_CrossZoneTableName[dataMapID] - return IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID) + return 0 + tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID] + zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID) + if not zoneIpyData: + return 0 + return zoneIpyData.GetZoneID() def __GetCrossBossRecData(zoneID, bossID): ## 获取跨服Boss Rec数据 @@ -99,37 +102,47 @@ ## 获取跨服世界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 = [] + GameWorld.Log("同步给子服跨服boss信息: syncServerGroupID=%s" % (serverGroupID)) + zoneIpyDataList = CrossRealmPlayer.GetCrossCommZoneIpyDataListByServerGroupID(serverGroupID) + if not zoneIpyDataList: + GameWorld.Log(" 没有跨服boss分区信息!") + return + 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 + for zoneIpyData in zoneIpyDataList: 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]) - + bossInfoList = [] + for i in xrange(ipyDataMgr.GetBOSSInfoCount()): + ipyData = ipyDataMgr.GetBOSSInfoByIndex(i) + mapID = ipyData.GetMapID() + if mapID not in ChConfig.Def_CrossMapIDList: + continue + 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: + serverGroupIDList = [serverGroupID] if serverGroupID else zoneIpyData.GetServerGroupIDList() + bossInfoDict = {"BossInfoType":"InitOK", "BossInfoList":bossInfoList} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList) + else: + GameWorld.Log("没有跨服boss信息! zoneID=%s" % zoneID) + return def DoCrossBossOnKilled(bossID, killPlayerName, realMapID, dataMapID, copyMapID, killerIDList): ## 跨服boss被杀 - zoneIpyData = GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID) - zoneID = 0 if not zoneIpyData else zoneIpyData.GetZoneID() + zoneID = GetCrossBossZoneID(realMapID, dataMapID, copyMapID) GameWorld.Log("击杀跨服boss: zoneID=%s,bossID=%s,realMapID=%s,dataMapID=%s,copyMapID=%s,killerIDList=%s" % (zoneID, bossID, realMapID, dataMapID, copyMapID, killerIDList)) if not zoneID: @@ -146,6 +159,9 @@ refreshTime = SetBossRefreshTime(zoneID, bossID, killedTime, bossRecData) # 广播子服跨服boss被击杀 + zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID) + if zoneIpyData == None: + return serverGroupIDList = zoneIpyData.GetServerGroupIDList() killedRecord = GetRecKilledRecord(bossRecData) killerExInfo = [killerIDList, dataMapID] @@ -156,8 +172,7 @@ def DoCrossBossStateChange(bossID, isAlive, dataMapID, realMapID, copyMapID): ## 跨服boss状态变更 - zoneIpyData = GetCrossBossZoneIpyData(realMapID, dataMapID, copyMapID) - zoneID = 0 if not zoneIpyData else zoneIpyData.GetZoneID() + zoneID = GetCrossBossZoneID(realMapID, dataMapID, copyMapID) GameWorld.Log("跨服boss状态变更: zoneID=%s,bossID=%s,isAlive=%s,realMapID=%s,dataMapID=%s,copyMapID=%s" % (zoneID, bossID, isAlive, realMapID, dataMapID, copyMapID)) if not zoneID: @@ -167,10 +182,12 @@ if isAlive: # 广播子服跨服boss复活 - serverGroupIDList = zoneIpyData.GetServerGroupIDList() - stateInfo = [zoneID, bossID, isAlive] - CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList) - + zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID) + if zoneIpyData != None: + serverGroupIDList = zoneIpyData.GetServerGroupIDList() + stateInfo = [zoneID, bossID, isAlive] + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossState, stateInfo, serverGroupIDList) + return def __SetKilledRecord(bossRecData, killedTime, playerName): @@ -222,9 +239,9 @@ ipyData = ipyDataMgr.GetBOSSInfoByIndex(i) bossID = ipyData.GetNPCID() mapID = ipyData.GetMapID() - if mapID not in ChConfig.Def_CrossZoneTableName: + if mapID not in ChConfig.Def_CrossZoneMapTableName: continue - tableName = ChConfig.Def_CrossZoneTableName[mapID] + tableName = ChConfig.Def_CrossZoneMapTableName[mapID] if not hasattr(ipyDataMgr, "Get%sCount" % tableName): continue for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()): @@ -269,9 +286,9 @@ 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_CrossZoneMapTableName: continue - tableName = ChConfig.Def_CrossZoneTableName[mapID] + tableName = ChConfig.Def_CrossZoneMapTableName[mapID] if not hasattr(ipyDataMgr, "Get%sCount" % tableName): continue for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()): -- Gitblit v1.8.0