| | |
| | |
|
| | | 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数据
|
| | |
| | | ## 获取跨服世界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:
|
| | |
| | | refreshTime = SetBossRefreshTime(zoneID, bossID, killedTime, bossRecData)
|
| | |
|
| | | # 广播子服跨服boss被击杀
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID)
|
| | | if zoneIpyData == None:
|
| | | return
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | | killedRecord = GetRecKilledRecord(bossRecData)
|
| | | killerExInfo = [killerIDList, dataMapID]
|
| | |
| | |
|
| | | 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:
|
| | |
| | |
|
| | | 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):
|
| | |
| | | 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)()):
|
| | |
| | | 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)()):
|