6459 【后端】【2.0】缥缈仙域开发单(跨服分区逻辑优化,支持跨服妖王分区状态同步)
| | |
| | | #跨服地图
|
| | | Def_CrossMapIDList = [Def_FBMapID_CrossRealmPK, Def_FBMapID_CrossPenglai, Def_FBMapID_CrossDemonKing, Def_FBMapID_CrossGrasslandLing, Def_FBMapID_CrossGrasslandXian]
|
| | | #跨服分区类型配置, 没配置的默认 CrossZoneComm
|
| | | Def_CrossZoneTypeName = {Def_FBMapID_CrossPenglai:"CrossZoneComm",
|
| | | Def_CrossZoneTypeName = {0:"CrossZoneComm", # 特殊0,默认常规分区
|
| | | Def_FBMapID_CrossPenglai:"CrossZoneComm",
|
| | | Def_FBMapID_CrossDemonKing:"CrossZonePK",
|
| | | Def_FBMapID_CrossGrasslandLing:"CrossZonePK",
|
| | | Def_FBMapID_CrossGrasslandXian:"CrossZonePK",
|
| | |
| | |
|
| | | g_bossRecDataDict = {} # boss对应rec记录缓存 {(zoneID, bossID):recData, ...}
|
| | |
|
| | | def GetCrossBossZoneID(realMapID, dataMapID, copyMapID):
|
| | | def GetCrossBossZoneID(mapID, realMapID, copyMapID):
|
| | | ## 获取地图跨服boss所属分区
|
| | | if dataMapID not in ChConfig.Def_CrossMapIDList:
|
| | | if mapID not in ChConfig.Def_CrossMapIDList:
|
| | | return 0
|
| | | # 固定线路分配的
|
| | | if dataMapID in ChConfig.Def_CrossZoneMapTableName:
|
| | | tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
|
| | | 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 dataMapID in ChConfig.Def_CrossDynamicLineMap:
|
| | | return PlayerFB.GetCrossDynamicLineZoneID(dataMapID, realMapID, copyMapID)
|
| | | elif mapID in ChConfig.Def_CrossDynamicLineMap:
|
| | | return PlayerFB.GetCrossDynamicLineZoneID(mapID, realMapID, copyMapID)
|
| | | return 0
|
| | |
|
| | | def __GetCrossBossRecData(zoneID, bossID):
|
| | |
| | | @param serverGroupID: 为0时同步所有子服
|
| | | '''
|
| | |
|
| | | GameWorld.Log("同步给子服跨服boss信息: syncServerGroupID=%s" % (serverGroupID))
|
| | | zoneIpyDataList = CrossRealmPlayer.GetCrossCommZoneIpyDataListByServerGroupID(serverGroupID)
|
| | | if not zoneIpyDataList:
|
| | | GameWorld.Log(" 没有跨服boss分区信息!")
|
| | | return
|
| | | |
| | | crossMapBossIDListDict = {}
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for zoneIpyData in zoneIpyDataList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | 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:
|
| | | for i in xrange(ipyDataMgr.GetBOSSInfoCount()):
|
| | | ipyData = ipyDataMgr.GetBOSSInfoByIndex(i)
|
| | | mapID = ipyData.GetMapID()
|
| | | bossID = ipyData.GetNPCID()
|
| | | 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()
|
| | | bossInfoDict = {"BossInfoType":"InitOK", "BossInfoList":bossInfoList}
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossInfo, bossInfoDict, serverGroupIDList)
|
| | | else:
|
| | | GameWorld.Log("没有跨服boss信息! zoneID=%s" % zoneID)
|
| | | |
| | | 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被杀
|
| | | 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))
|
| | | 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
|
| | |
|
| | |
| | | refreshTime = SetBossRefreshTime(zoneID, bossID, killedTime, bossRecData)
|
| | |
|
| | | # 广播子服跨服boss被击杀
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID)
|
| | | 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状态变更
|
| | | 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))
|
| | | 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
|
| | |
|
| | |
| | |
|
| | | if isAlive:
|
| | | # 广播子服跨服boss复活
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByZoneID(zoneID)
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(mapID, zoneID)
|
| | | if zoneIpyData != None:
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | | stateInfo = [zoneID, bossID, isAlive]
|
| | |
| | | ## 收到跨服服务器同步的跨服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))
|
| | |
|
| | |
| | | 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
|
| | |
| | | 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)
|
| | |
| | | import PlayerGeTui
|
| | | import IPY_GameServer
|
| | | import CrossBoss
|
| | | import PlayerFB
|
| | |
|
| | | import time
|
| | |
|
| | |
| | | if bossID <= 0:
|
| | | return
|
| | |
|
| | | bossID, killPlayerName, hurtValue, isNotify, realMapID, dataMapID, copyMapID, killerIDList = msgList
|
| | | bossID, killPlayerName, hurtValue, isNotify, mapID, realMapID, copyMapID, killerIDList = msgList
|
| | | mapID = PlayerFB.GetRecordMapID(mapID)
|
| | | if GameWorld.IsCrossServer():
|
| | | CrossBoss.DoCrossBossOnKilled(bossID, killPlayerName, realMapID, dataMapID, copyMapID, killerIDList)
|
| | | CrossBoss.DoCrossBossOnKilled(bossID, killPlayerName, mapID, realMapID, copyMapID, killerIDList)
|
| | | return
|
| | |
|
| | | mapID = dataMapID
|
| | | isAddKillCnt = False
|
| | |
|
| | | isMapNeedShunt = IsMapNeedBossShunt(mapID)
|
| | |
| | | ## 世界boss状态变更
|
| | | if len(msgList) <= 0:
|
| | | return
|
| | |
|
| | | bossID, isAlive, dataMapID, realMapID, copyMapID = msgList
|
| | | |
| | | bossID, isAlive, mapID, realMapID, copyMapID = msgList
|
| | | mapID = PlayerFB.GetRecordMapID(mapID)
|
| | | if GameWorld.IsCrossServer():
|
| | | CrossBoss.DoCrossBossStateChange(bossID, isAlive, dataMapID, realMapID, copyMapID)
|
| | | CrossBoss.DoCrossBossStateChange(bossID, isAlive, mapID, realMapID, copyMapID)
|
| | | return
|
| | |
|
| | | mapID, lineID = dataMapID, copyMapID
|
| | | lineID = copyMapID
|
| | | GameWorld.Log("世界boss状态变更: mapID=%s,lineID=%s,bossID=%s,state=%s,tick=%s" % (mapID, lineID, bossID, isAlive, tick))
|
| | |
|
| | | if bossID <= 0:
|
| | |
| | | def OnQueryBossInfo(index, clientData, tick):
|
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
| | | bossIDList = clientData.BossIDList
|
| | | Sync_BossInfo(curPlayer, bossIDList)
|
| | | if not bossIDList:
|
| | | Sync_BossInfo(curPlayer)
|
| | | CrossBoss.Sync_CrossBossInfo(curPlayer)
|
| | | return
|
| | | bossID = bossIDList[0]
|
| | | ipyData = IpyGameDataPY.GetIpyGameData('BOSSInfo', bossID)
|
| | | if not ipyData:
|
| | | return
|
| | | mapID = ipyData.GetMapID()
|
| | | if mapID in ChConfig.Def_CrossMapIDList:
|
| | | CrossBoss.Sync_CrossBossInfo(curPlayer, bossIDList)
|
| | | else:
|
| | | Sync_BossInfo(curPlayer, bossIDList)
|
| | | return
|
| | |
|
| | |
|
| | |
| | | # 同步到玩家对应子服
|
| | | if not serverGroupID:
|
| | | return
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | |
| | |
|
| | | return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
|
| | |
|
| | | def GetCrossCommZoneIpyDataByZoneID(zoneID):
|
| | | ## 获取跨服常规分区 |
| | | def GetCrossZoneIpyDataByZoneID(mapID, zoneID):
|
| | | ## 获取跨服分区
|
| | | zoneTypeName = ChConfig.Def_CrossZoneTypeName.get(mapID, "CrossZoneComm")
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | ipyData = IpyGameDataPY.GetIpyGameDataNotLog("CrossZoneComm", crossZoneName, zoneID)
|
| | | return ipyData
|
| | | return IpyGameDataPY.GetIpyGameData(zoneTypeName, crossZoneName, zoneID)
|
| | |
|
| | | def GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID):
|
| | | ## 获取跨服分区
|
| | |
| | | GameWorld.ErrLog("没有找到跨服玩法对应分区! mapID=%s, serverGroupID=%s, zoneTypeName=%s" % (mapID, serverGroupID, zoneTypeName))
|
| | | return
|
| | |
|
| | | def GetCrossCommZoneIpyDataByServerGroupID(serverGroupID):
|
| | | ## 获取跨服常规分区
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
|
| | | if not ipyDataList:
|
| | | return
|
| | | for ipyData in ipyDataList:
|
| | | serverGroupIDList = ipyData.GetServerGroupIDList()
|
| | | for serverGroupIDInfo in serverGroupIDList:
|
| | | if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \
|
| | | or (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID):
|
| | | return ipyData
|
| | | return
|
| | |
|
| | | def GetCrossCommZoneIpyDataListByServerGroupID(serverGroupID):
|
| | | def GetCrossZoneIpyDataListByServerGroupID(mapID, serverGroupID):
|
| | | ## 获取跨服常规分区列表
|
| | | if serverGroupID:
|
| | | ipyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | ipyData = GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID)
|
| | | if not ipyData:
|
| | | return
|
| | | ipyDataList = [ipyData]
|
| | | else:
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
|
| | | zoneTypeName = ChConfig.Def_CrossZoneTypeName.get(mapID, "CrossZoneComm")
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition(zoneTypeName, {"CrossZoneName":crossZoneName}, True)
|
| | | return ipyDataList
|
| | |
|
| | | def GetServerCrossZoneMapIpyData(mapID, serverGroupID=0):
|
| | |
| | | if GameWorld.IsCrossServer():
|
| | | return
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | zoneIpyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | zoneIpyData = GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | commZoneID = zoneIpyData.GetZoneID()
|
| | | return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":commZoneID})
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":zoneID})
|
| | |
|
| | | def IsCrossServerOpen():
|
| | | ## 跨服服务器是否开放中
|
| | |
| | | GameWorld.GetPlayerManager().MapServer_QueryPlayer(0, 0, 0, mapID, "OpenFB", msgInfo, len(msgInfo))
|
| | | return mapID, copyMapID, openState
|
| | |
|
| | | def GetCrossDynamicLineZoneID(dataMapID, mapID, copyMapID):
|
| | | def GetCrossDynamicLineZoneID(mapID, realMapID, copyMapID):
|
| | | ## 获取跨服动态分配的虚拟线路对应分区ID
|
| | | zoneLineDict = PyGameData.g_crossDynamicLineInfo.get(dataMapID, {})
|
| | | zoneLineDict = PyGameData.g_crossDynamicLineInfo.get(mapID, {})
|
| | | for key, funcLineObjList in zoneLineDict.items():
|
| | | for funcLineObj in funcLineObjList:
|
| | | if funcLineObj.mapID == mapID and funcLineObj.copyMapID == copyMapID:
|
| | | if funcLineObj.mapID == realMapID and funcLineObj.copyMapID == copyMapID:
|
| | | zoneID = key[0]
|
| | | return zoneID
|
| | | return 0
|
| | |
| | |
|
| | | def ClientServerMsg_ChatCrossWorld(serverGroupID, msgData, tick):
|
| | | ## 收到子服跨服世界频道聊天
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(0, serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | |
| | | RegisterEnter_CrossServerMapIDList = [Def_FBMapID_CrossPenglai, Def_FBMapID_CrossDemonKing, Def_FBMapID_CrossGrasslandLing, Def_FBMapID_CrossGrasslandXian]
|
| | | #跨服地图
|
| | | Def_CrossMapIDList = [Def_FBMapID_CrossRealmPK, Def_FBMapID_CrossPenglai, Def_FBMapID_CrossDemonKing, Def_FBMapID_CrossGrasslandLing, Def_FBMapID_CrossGrasslandXian]
|
| | | #跨服分区类型配置, 没配置的默认 CrossZoneComm
|
| | | Def_CrossZoneTypeName = {0:"CrossZoneComm", # 特殊0,默认常规分区
|
| | | Def_FBMapID_CrossPenglai:"CrossZoneComm",
|
| | | Def_FBMapID_CrossDemonKing:"CrossZonePK",
|
| | | Def_FBMapID_CrossGrasslandLing:"CrossZonePK",
|
| | | Def_FBMapID_CrossGrasslandXian:"CrossZonePK",
|
| | | }
|
| | | #跨服分区对应地图配置表名
|
| | | Def_CrossZoneMapTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZoneMap",
|
| | | }
|
| | |
| | | return
|
| | |
|
| | | def GameServer_KillGameWorldBoss(bossID, killPlayerName, hurtValue, isNotify=True, killerIDList=[]):
|
| | | dataMapID = GameWorld.GetGameWorld().GetMapID()
|
| | | mapID = GameWorld.GetGameWorld().GetMapID()
|
| | | realMapID = GameWorld.GetGameWorld().GetRealMapID()
|
| | | copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
|
| | | killMsg = str([bossID, killPlayerName, hurtValue, isNotify, realMapID, dataMapID, copyMapID, killerIDList])
|
| | | killMsg = str([bossID, killPlayerName, hurtValue, isNotify, mapID, realMapID, copyMapID, killerIDList])
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'KillGameWorldBoss', killMsg, len(killMsg))
|
| | | GameWorld.DebugLog("Boss被击杀: bossID=%s,dataMapID=%s,realMapID=%s,copyMapID=%s,killerIDList=%s" % (bossID, dataMapID, realMapID, copyMapID, killerIDList))
|
| | | GameWorld.DebugLog("Boss被击杀: bossID=%s,mapID=%s,realMapID=%s,copyMapID=%s,killerIDList=%s" % (bossID, mapID, realMapID, copyMapID, killerIDList))
|
| | | return
|
| | |
|
| | | def GameServe_GameWorldBossState(bossID, isAlive):
|
| | | dataMapID = GameWorld.GetGameWorld().GetMapID()
|
| | | mapID = GameWorld.GetGameWorld().GetMapID()
|
| | | realMapID = GameWorld.GetGameWorld().GetRealMapID()
|
| | | copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
|
| | | stateMsg = str([bossID, isAlive, dataMapID, realMapID, copyMapID])
|
| | | stateMsg = str([bossID, isAlive, mapID, realMapID, copyMapID])
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'GameWorldBossState', '%s' % stateMsg, len(stateMsg))
|
| | | GameWorld.DebugLog("Boss状态变更: bossID=%s,isAlive=%s,dataMapID=%s,realMapID=%s,copyMapID=%s" |
| | | % (bossID, isAlive, dataMapID, realMapID, copyMapID))
|
| | | GameWorld.DebugLog("Boss状态变更: bossID=%s,isAlive=%s,mapID=%s,realMapID=%s,copyMapID=%s" |
| | | % (bossID, isAlive, mapID, realMapID, copyMapID))
|
| | | if not isAlive:
|
| | | if dataMapID in ChConfig.Def_CrossZoneMapTableName:
|
| | | tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
|
| | | if mapID in ChConfig.Def_CrossZoneMapTableName:
|
| | | tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
|
| | | realMapID = GameWorld.GetGameWorld().GetRealMapID()
|
| | | copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, mapID, copyMapID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | GameWorld.GetGameWorld().SetGameWorldDict(ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID), 0)
|
| | | elif dataMapID == ChConfig.Def_FBMapID_CrossDemonKing:
|
| | | elif mapID == ChConfig.Def_FBMapID_CrossDemonKing:
|
| | | zoneID = GameLogic_CrossDemonKing.GetCurFBLineZoneID()
|
| | | GameWorld.GetGameWorld().SetGameWorldDict(ShareDefine.Def_Notify_WorldKey_GameWorldBossRebornCross % (zoneID, bossID), 0)
|
| | | else:
|
| | |
| | |
|
| | | return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
|
| | |
|
| | | def GetCrossCommZoneIpyDataByServerGroupID(serverGroupID):
|
| | | ## 获取跨服常规分区
|
| | | def GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID):
|
| | | ## 获取跨服分区
|
| | | zoneTypeName = ChConfig.Def_CrossZoneTypeName.get(mapID, "CrossZoneComm")
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition(zoneTypeName, {"CrossZoneName":crossZoneName}, True)
|
| | | if not ipyDataList:
|
| | | return
|
| | | for ipyData in ipyDataList:
|
| | |
| | | if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \
|
| | | or (isinstance(serverGroupIDInfo, int) and serverGroupIDInfo == serverGroupID):
|
| | | return ipyData
|
| | | GameWorld.ErrLog("没有找到跨服玩法对应分区! mapID=%s, serverGroupID=%s, zoneTypeName=%s" % (mapID, serverGroupID, zoneTypeName))
|
| | | return
|
| | |
|
| | | def GetServerCrossZoneMapIpyData(mapID, serverGroupID=0):
|
| | |
| | | if GameWorld.IsCrossServer():
|
| | | return
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | zoneIpyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | zoneIpyData = GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | commZoneID = zoneIpyData.GetZoneID()
|
| | | return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":commZoneID})
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":zoneID})
|
| | |
|
| | | def IsCrossServerOpen():
|
| | | ## 跨服服务器是否开放中
|
| | |
| | | # @remarks 函数详细说明.
|
| | | def DoResult(curPlayer, callFunName, funResult, tick):
|
| | | killerExInfo = eval(funResult)
|
| | | dataMapID, bossID = killerExInfo
|
| | | GameWorld.Log("GY_Query_CrossKillBoss dataMapID=%s, bossID=%s" % (dataMapID, bossID), curPlayer.GetPlayerID())
|
| | | mapID, bossID = killerExInfo
|
| | | GameWorld.Log("GY_Query_CrossKillBoss mapID=%s, bossID=%s" % (mapID, bossID), curPlayer.GetPlayerID())
|
| | | if not curPlayer:
|
| | | return
|
| | | NPCCommon.OnPlayerKillBoss(curPlayer, bossID, dataMapID, False)
|
| | | NPCCommon.OnPlayerKillBoss(curPlayer, bossID, mapID, False)
|
| | | return
|
| | |
|
| | |
|