2906 【1.5.0】【1.5.100】跨服及子服启动未完成优化
| | |
| | | BYTE IsDayReset; //是否每天重置
|
| | | };
|
| | |
|
| | | //跨服竞技场赛区表
|
| | | //跨服分区表通用
|
| | |
|
| | | struct tagCrossRealmPKZone
|
| | | struct tagCrossZoneComm
|
| | | {
|
| | | char _CrossZoneName; //跨服分区名
|
| | | BYTE _ZoneID; //赛区ID
|
| | | list ServerGroupIDList; //赛区服务器组ID列表
|
| | | };
|
| | |
|
| | | //跨服分区表竞技场
|
| | |
|
| | | struct tagCrossZonePK
|
| | | {
|
| | | char _CrossZoneName; //跨服分区名
|
| | | BYTE _ZoneID; //赛区ID
|
| | | char ZoneName; //赛区名字
|
| | | list ServerGroupIDList; //赛区服务器组ID列表
|
| | |
| | |
|
| | | struct tagCrossRealmPKSeason
|
| | | {
|
| | | char _CrossZoneName; //跨服分区名
|
| | | BYTE _ZoneID; //赛区ID
|
| | | BYTE SeasonID; //赛季ID
|
| | | char StartDate; //开始日期 yyyy-MM-dd
|
| | |
| | | list MatchRange; //可匹配到的玩家段位区间 [从段位A, 到段位B],配[]代表只匹配本段位的
|
| | | };
|
| | |
|
| | | //跨服Boss蓬莱仙境分区表
|
| | | //跨服Boss蓬莱仙境分区地图表
|
| | |
|
| | | struct tagCrossPenglaiZone
|
| | | struct tagCrossPenglaiZoneMap
|
| | | {
|
| | | BYTE ZoneID; //分区ID
|
| | | list ServerGroupIDList; //服务器组ID列表
|
| | | DWORD _MapID; //场景地图ID
|
| | | DWORD _DataMapID; //数据地图ID
|
| | | BYTE _CopyMapID; //虚拟线路ID
|
| | |
| | | list SeasonDanLVAwardList; //赛季段位奖励物品列表
|
| | | };
|
| | |
|
| | | //跨服Boss蓬莱仙境分区表
|
| | | //跨服分区表通用
|
| | |
|
| | | struct tagCrossPenglaiZone
|
| | | struct tagCrossZoneComm
|
| | | {
|
| | | char _CrossZoneName; //跨服分区名
|
| | | BYTE _ZoneID; //赛区ID
|
| | | list ServerGroupIDList; //赛区服务器组ID列表
|
| | | };
|
| | |
|
| | | //跨服Boss蓬莱仙境分区地图表
|
| | |
|
| | | struct tagCrossPenglaiZoneMap
|
| | | {
|
| | | BYTE ZoneID; //分区ID
|
| | | list ServerGroupIDList; //服务器组ID列表
|
| | | DWORD _MapID; //场景地图ID
|
| | | DWORD _DataMapID; //数据地图ID
|
| | | BYTE _CopyMapID; //虚拟线路ID
|
| | |
| | | Def_WorldKey_OperationActionState = "OperationActState_%s" #运营活动状态,参数为运营活动名
|
| | | Def_WorldKey_BossRebornNeedPoint = "BossRebornNeedPoint" #boss复活需要总点数
|
| | | Def_WorldKey_CrossBossIsAlive = 'CrossBossIsAlive_%s_%s' #跨服boss是否活着,参数(zoneID, bossID)
|
| | | Def_WorldKey_IsGameWorldInit = 'IsGameWorldInit' #GameWold是否初始化完成
|
| | | Def_WorldKey_GameWorldInitOK = 'GameWorldInitOK' #GameWold是否初始化完成OK
|
| | | Def_WorldKey_CrossPKZoneSeasonID = "CrossPKZoneSeasonID_%s" #跨服PK赛区对应赛季,跨服服务器控制,参数(zoneID)
|
| | | Def_WorldKey_CrossPKZoneSeasonState = "CrossPKZoneSeasonState_%s" #跨服PK赛区赛季状态,跨服服务器控制,参数(zoneID)0-未开启,1-开启中,2-已结束
|
| | | Def_WorldKey_CrossPKBillboardSyncTick = "CrossPKBillboardSyncTick_%s_%s" #跨服PK本赛季排行榜同步tick,参数(zoneID, seasonID)
|
| | |
| | | WorldBossFBMapIDList = [Def_FBMapID_SealDemon, Def_FBMapID_ZhuXianBoss]
|
| | | #跨服地图
|
| | | Def_CrossMapIDList = [Def_FBMapID_CrossRealmPK, Def_FBMapID_CrossPenglai]
|
| | | #跨服对应分区配置表名
|
| | | Def_CrossZoneTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZone",
|
| | | }
|
| | | #跨服分区对应地图配置表名
|
| | | Def_CrossZoneMapTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZoneMap",
|
| | | }
|
| | |
|
| | | #同系职业枚举
|
| | | JOB_TYPY_COUNT = 5
|
| | |
| | | ## 是否开启跨服活动
|
| | | return ReadChConfig.GetPyMongoConfig("Merge", "MergeServerIP") or IsCrossServer()
|
| | |
|
| | | def GetCrossZoneName():
|
| | | ## 跨服服务器分区名,标记一起跨服分区的名字,配置在跨服服务器,子服不用配置,由跨服服务器同步
|
| | | if IsCrossServer():
|
| | | return ReadChConfig.GetPyMongoConfig("Merge", "CrossZoneName")
|
| | | return PyGameData.g_crossZoneName
|
| | |
|
| | | ## 获取玩家的区服名,仅在跨服有效
|
| | | # @param curPlayer 玩家实例
|
| | | # @return: 区服名
|
| | |
| | |
|
| | | 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)()):
|
| | |
| | | if not dataMsg:
|
| | | return
|
| | | sendMsg = str({"MsgType":msgType, "Data":dataMsg, "ServerGroupID":GameWorld.GetServerGroupID()})
|
| | | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
|
| | | GameWorld.ErrLog("服务器未启动好,不允许向跨服服务器发送数据! %s" % (sendMsg))
|
| | | return
|
| | | GameWorld.Log("SendMsgToCrossServer => %s" % (sendMsg))
|
| | | GameWorld.GetGameWorld().SendMergerChildToCenterStringData(sendMsg, len(sendMsg))
|
| | | return
|
| | |
| | | def OnCrossServerReceiveMsg(recvMsg, tick):
|
| | | ## 跨服服务器收到信息处理
|
| | | try:
|
| | | #GameWorld.Log("OnCrossServerReceiveMsg: %s" % recvMsg)
|
| | | GameWorld.Log("OnCrossServerReceiveMsg: %s" % recvMsg)
|
| | | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
|
| | | GameWorld.Log("服务器未启动好,不处理子服信息!")
|
| | | return
|
| | | msgDict = eval(recvMsg)
|
| | |
|
| | | msgType = msgDict.get("MsgType", -1)
|
| | |
| | | GMShell.ClientServerMsg_GMCMD(msgData, tick)
|
| | |
|
| | | elif msgType == ShareDefine.ClientServerMsg_ServerInitOK:
|
| | | ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick)
|
| | | ClientServerMsg_ServerInitOK(serverGroupID, tick)
|
| | |
|
| | | elif msgType == ShareDefine.ClientServerMsg_ViewPlayerCache:
|
| | | CrossRealmPlayer.ClientServerMsg_ViewPlayerCache(serverGroupID, msgData)
|
| | |
| | | raise BaseException(str(traceback.format_exc()))
|
| | | return
|
| | |
|
| | | def ClientServerMsg_ServerInitOK(serverGroupID, msgData, tick):
|
| | | def ClientServerMsg_ServerInitOK(serverGroupID, tick):
|
| | | ''' 收到子服连接成功通知
|
| | | 当子服启动成功后,可同步一次跨服服务器活动状态及活动数据给子服
|
| | | '''
|
| | | GameWorld.Log("收到跨服子服连接成功通知!")
|
| | | CrossRealmPlayer.ClientServerMsg_ServerInitOK(serverGroupID)
|
| | | CrossRealmPK.ClientServerMsg_ServerInitOK(serverGroupID, tick)
|
| | | CrossBoss.ClientServerMsg_ServerInitOK(serverGroupID)
|
| | | GameWorld.Log("收到跨服子服连接成功通知! serverGroupID=%s" % serverGroupID)
|
| | | Sync_CrossServerInitDataToClientServer(tick, serverGroupID)
|
| | | return
|
| | |
|
| | | def Sync_CrossServerInitDataToClientServer(tick, serverGroupID=0):
|
| | | ''' 同步跨服功能数据到子服服务器
|
| | | 本函数调用时机:
|
| | | 1.跨服服务器启动成功,主动广播同步所有子服,此时设置 serverGroupID 为 0
|
| | | 2.子服启动成功,由子服主动发起请求同步最新数据,此时有指定子服 serverGroupID
|
| | | 3.子服重新连接跨服服务器成功,逻辑同2
|
| | | @param serverGroupID: 子服服务器组ID,为0时为全部子服务器组
|
| | | '''
|
| | | CrossRealmPlayer.Sync_CrossCommInitDataToClientServer(serverGroupID)
|
| | | CrossRealmPK.Sync_CrossPKInitDataToClientServer(tick, serverGroupID)
|
| | | CrossBoss.Sync_CrossBossInitDataToClientServer(serverGroupID)
|
| | | return
|
| | |
|
| | | def MapServer_CrossServerReceiveMsg(msgType, msgData, serverGroupID):
|
| | |
| | | if not dataMsg:
|
| | | return
|
| | | sendMsg = str({"MsgType":msgType, "Data":dataMsg})
|
| | | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
|
| | | GameWorld.ErrLog("跨服服务器未启动好,不允许向子服发送数据! serverGroupIDList=%s, sendMsg=%s" % (serverGroupIDList, sendMsg))
|
| | | return
|
| | | GameWorld.Log("SendMsgToClientServer => serverGroupIDList=%s, sendMsg=%s" % (serverGroupIDList, sendMsg))
|
| | | if not serverGroupIDList:
|
| | | GameWorld.GetGameWorld().SendBroadcastMergeClient(sendMsg)
|
| | |
| | | ## 子服收到跨服服务器信息
|
| | | dataPack = IPY_GameServer.IPY_MGBroadcastMergeClient()
|
| | | dataMsg = dataPack.GetData()
|
| | | #GameWorld.Log("OnClientServerReceiveMsg: %s" % dataMsg)
|
| | |
|
| | | try:
|
| | | GameWorld.Log("OnClientServerReceiveMsg: %s" % dataMsg)
|
| | | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
|
| | | GameWorld.Log("服务器未启动好,不处理跨服信息!")
|
| | | return
|
| | | |
| | | msgDict = eval(dataMsg)
|
| | | msgType = msgDict.get("MsgType", -1)
|
| | | msgData = msgDict.get("Data", "")
|
| | |
| | | GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerConnState, connState)
|
| | |
|
| | | if result != 1:
|
| | | GameWorld.Log("--OnClientServerReceiveMsg disconn")
|
| | | GameWorld.Log("===与跨服服务器断开连接!")
|
| | | CrossRealmPlayer.CrossServerMsg_CrossServerState({"isOpen":0})
|
| | | return
|
| | |
|
| | | GameWorld.Log("OnConnCorossServer conn success!!!")
|
| | | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_IsGameWorldInit):
|
| | | GameWorld.Log("===与跨服服务器连接成功!")
|
| | | if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK):
|
| | | GameWorld.Log(" 服务器还未启动好,暂不处理! 等服务器启动好后再处理!")
|
| | | return
|
| | |
|
| | |
| | | return
|
| | |
|
| | | def OnGameServerInitOK():
|
| | | ## 子服启动成功
|
| | | ## 服务器启动成功
|
| | | |
| | | tick = GameWorld.GetGameWorld().GetTick()
|
| | | |
| | | if GameWorld.IsCrossServer():
|
| | | Sync_CrossServerInitDataToClientServer(tick, serverGroupID=0) # 这里设置为0,广播所有子服务器组
|
| | | return
|
| | |
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | |
| | | matchState = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
|
| | | if not matchState and not PyGameData.g_crossPKRoomDict:
|
| | | GameWorld.Log("匹配已结束,且当前没有PK中的房间了!主动广播子服最新榜单! ")
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKZone", zoneID)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
|
| | | if zoneIpyData:
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | | SyncPKSyncBillboardToClientServer(zoneID, seasonID, serverGroupIDList)
|
| | |
| | | serverTime = GameWorld.GetServerTime()
|
| | | curSeasonID = 0
|
| | | seasonState = 0
|
| | | seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", zoneID)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
|
| | | seasonList = [] if not seasonList else seasonList
|
| | | for seasonIpyData in seasonList:
|
| | | startDateStr = seasonIpyData.GetStartDate()
|
| | |
| | |
|
| | | zoneSeasonTimeDict = {}
|
| | | serverTime = GameWorld.GetServerTime()
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return zoneSeasonTimeDict
|
| | | |
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
|
| | | # 规定每个赛区的赛季时间需按顺序配置
|
| | | seasonIpyDataList = []
|
| | | for sIndex in xrange(ipyDataMgr.GetCrossRealmPKSeasonCount()):
|
| | | seasonIpyData = ipyDataMgr.GetCrossRealmPKSeasonByIndex(sIndex)
|
| | | if zoneID == seasonIpyData.GetZoneID():
|
| | | seasonIpyDataList.append(seasonIpyData)
|
| | | |
| | | seasonIpyDataList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
|
| | | if not seasonIpyDataList:
|
| | | continue
|
| | | |
| | | for i, seasonIpyData in enumerate(seasonIpyDataList):
|
| | | seasonID = seasonIpyData.GetSeasonID()
|
| | | startDateStr = seasonIpyData.GetStartDate()
|
| | |
| | |
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | serverTime = GameWorld.GetServerTime()
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | for zoneID, seasonTimeInfo in zoneSeasonTimeDict.items():
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossRealmPKZone", zoneID)
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID)
|
| | | if not zoneIpyData:
|
| | | continue
|
| | |
|
| | |
| | | PyGameData.g_crossPKRoomDict = {}
|
| | | GameWorld.Log("跨服PK匹配状态开启,重置相关匹配数据!")
|
| | |
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return
|
| | | |
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | |
|
| | | # 广播当前赛区的所有子服跨服PK赛季状态变更
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def ClientServerMsg_ServerInitOK(serverGroupID, tick):
|
| | | ## 子服启动成功
|
| | | GameWorld.Log("子服启动成功,同步给子服对应的赛季信息: serverGroupID=%s" % (serverGroupID))
|
| | | zoneID = GetCrossPKServerGroupZoneID(serverGroupID)
|
| | | if not zoneID:
|
| | | GameWorld.Log(" 该子服没有分配赛区,不同步!")
|
| | | def Sync_CrossPKInitDataToClientServer(tick, serverGroupID=0):
|
| | | ''' 同步跨服PK活动数据到子服务器
|
| | | @param serverGroupID: 为0时同步所有子服
|
| | | '''
|
| | | |
| | | GameWorld.Log("同步给子服对应的赛季信息: syncServerGroupID=%s" % (serverGroupID))
|
| | | if serverGroupID:
|
| | | ipyData = GetCrossPKServerGroupZone(serverGroupID)
|
| | | if not ipyData:
|
| | | return
|
| | | crossZoneList = [ipyData]
|
| | | else:
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
|
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | matchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
|
| | | seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState}
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, [serverGroupID])
|
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | seasonID = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonID % zoneID)
|
| | | seasonState = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_CrossPKZoneSeasonState % zoneID)
|
| | | matchState = gameWorld.GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.DailyActionID_CrossReamPK)
|
| | | seasonInfo = {"ZoneID":zoneID, "SeasonID":seasonID, "SeasonState":seasonState, "MatchState":matchState}
|
| | | serverGroupIDList = [serverGroupID] if serverGroupID else zoneIpyData.GetServerGroupIDList()
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_PKSeasonInfo, seasonInfo, serverGroupIDList)
|
| | | |
| | | return
|
| | |
|
| | | def GetCrossPKServerGroupZoneID(serverGroupID):
|
| | | def GetCrossPKServerGroupZone(serverGroupID):
|
| | | ## 获取服务器组ID对应的跨服PK所属赛区,返回0代表该服务器没有分配赛区
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return
|
| | | |
| | | for zoneIpyData in crossZoneList:
|
| | | for groupInfo in zoneIpyData.GetServerGroupIDList():
|
| | | if (isinstance(groupInfo, int) and serverGroupID == groupInfo) \
|
| | | or (isinstance(groupInfo, tuple) and len(groupInfo) == 2 and groupInfo[0] <= serverGroupID <= groupInfo[1]):
|
| | | return zoneIpyData.GetZoneID()
|
| | | return 0
|
| | | return zoneIpyData
|
| | | return
|
| | |
|
| | | def OnPlayerLoginCrossServer(curPlayer):
|
| | | # 跨服登录处理
|
| | |
| | | return
|
| | | __OnLoginNotifyPKOverInfo(curPlayer)
|
| | |
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | if not crossZoneList:
|
| | | return
|
| | | # 同步所有赛区赛季信息
|
| | | zoneSeasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeasonInfo()
|
| | | zoneSeasonInfo.ZoneList = []
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | for zoneIpyData in crossZoneList:
|
| | | zoneID = zoneIpyData.GetZoneID()
|
| | | zoneInfo = ChPyNetSendPack.tagGCCrossRealmPKZone()
|
| | | zoneInfo.ZoneID = zoneID
|
| | | zoneInfo.ZoneName = zoneIpyData.GetZoneName().decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
|
| | | zoneInfo.ZoneNameLen = len(zoneInfo.ZoneName)
|
| | | zoneInfo.SeasonList = []
|
| | | seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", zoneID)
|
| | | seasonList = IpyGameDataPY.GetIpyGameDataList("CrossRealmPKSeason", crossZoneName, zoneID)
|
| | | seasonList = [] if not seasonList else seasonList
|
| | | for seasonIpyData in seasonList:
|
| | | seasonInfo = ChPyNetSendPack.tagGCCrossRealmPKSeason()
|
| | |
| | | # ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | # if maxDanLV == None:
|
| | | # maxDanLV = ipyDataMgr.GetCrossRealmPKDanCount() - 1
|
| | | # for index in xrange(ipyDataMgr.GetCrossRealmPKZoneCount()):
|
| | | # zoneIpyData = ipyDataMgr.GetCrossRealmPKZoneByIndex(index)
|
| | | # crossZoneName = GameWorld.GetCrossZoneName()
|
| | | # crossZoneList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZonePK", {"CrossZoneName":crossZoneName}, True)
|
| | | # if not crossZoneList:
|
| | | # return
|
| | | # for zoneIpyData in crossZoneList:
|
| | | # pkZoneID = zoneIpyData.GetZoneID()
|
| | | #
|
| | | # addPlayerList = []
|
| | |
| | | # 同步到玩家对应子服
|
| | | if not serverGroupID:
|
| | | return
|
| | | zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(mapID, serverGroupID)
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | |
| | | #记录首次开发时间(现实时间戳)
|
| | | PlayerDBGSEvent.SetInitOpenServerTime(initOpenServerTime if initOpenServerTime else int(time.time()))
|
| | |
|
| | | CrossRealmMsg.OnGameServerInitOK()
|
| | | #初始化家族数量
|
| | | GameWorld.GetFamilyManager().SetFamilyUpperLimitCount(ChConfig.Def_Family_MaxCnt)
|
| | | #排序元宝交易平台
|
| | |
| | | #世界boss被杀次数重置
|
| | | #GameWorldBoss.CheckResetBossKilledCntOnServerInit()
|
| | | #GameWorldActionTeHui.OnGameServerInitOK() # 特惠活动初始化
|
| | | |
| | | __Func_HighPrecisionProcess(tick) # 主动触发一次高精度的调用,确保服务器启动后一些功能活动等的数据会被加载
|
| | | |
| | | GameWorld.Log("=============================== 服务器启动成功 ===================================")
|
| | | isCrossServer = GameWorld.IsCrossServer()
|
| | | if isCrossServer:
|
| | | isServerClose = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossServerClose)
|
| | | isServerOpen = 0 if isServerClose else 1
|
| | | GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isServerOpen)
|
| | | GameWorld.Log("跨服服务器启动成功: isServerOpen=%s" % isServerOpen)
|
| | | GameWorld.Log("跨服服务器启动成功: isServerOpen=%s,crossZoneName=%s" % (isServerOpen, GameWorld.GetCrossZoneName()))
|
| | | else:
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | GameWorld.Log("服务器启动成功: ServerGroupID=%s" % serverGroupID)
|
| | | GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_GameWorldInitOK, 1)
|
| | | |
| | | # 注意:跨服相关信息的调用需放在最后,不然可能导致服务器未启动功能或者功能未加载成功导致跨服服务器与子服之间的数据同步可能出现异常的情况
|
| | | CrossRealmMsg.OnGameServerInitOK()
|
| | | return
|
| | |
|
| | | def DoCheckNewServerOpen(tick):
|
| | |
| | | # 跨服服务器状态
|
| | | isCrossServerOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
|
| | | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossServerOpen, isCrossServerOpen)
|
| | | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossZoneName, PyGameData.g_crossZoneName)
|
| | |
|
| | | # 跨服PK
|
| | | CrossRealmPK.OnMapServerInitOK()
|
| | |
| | | ("BYTE", "IsDayReset", 0),
|
| | | ),
|
| | |
|
| | | "CrossRealmPKZone":(
|
| | | "CrossZoneComm":(
|
| | | ("char", "CrossZoneName", 1),
|
| | | ("BYTE", "ZoneID", 1),
|
| | | ("list", "ServerGroupIDList", 0),
|
| | | ),
|
| | |
|
| | | "CrossZonePK":(
|
| | | ("char", "CrossZoneName", 1),
|
| | | ("BYTE", "ZoneID", 1),
|
| | | ("char", "ZoneName", 0),
|
| | | ("list", "ServerGroupIDList", 0),
|
| | | ),
|
| | |
|
| | | "CrossRealmPKSeason":(
|
| | | ("char", "CrossZoneName", 1),
|
| | | ("BYTE", "ZoneID", 1),
|
| | | ("BYTE", "SeasonID", 0),
|
| | | ("char", "StartDate", 0),
|
| | |
| | | ("list", "MatchRange", 0),
|
| | | ),
|
| | |
|
| | | "CrossPenglaiZone":(
|
| | | "CrossPenglaiZoneMap":(
|
| | | ("BYTE", "ZoneID", 0),
|
| | | ("list", "ServerGroupIDList", 0),
|
| | | ("DWORD", "MapID", 1),
|
| | | ("DWORD", "DataMapID", 1),
|
| | | ("BYTE", "CopyMapID", 1),
|
| | |
| | | def GetNotifyInfoLoop(self): return self.NotifyInfoLoop # 全服提示信息 - 循环广播[间隔分钟, 广播key]
|
| | | def GetIsDayReset(self): return self.IsDayReset # 是否每天重置 |
| | | |
| | | # 跨服竞技场赛区表 |
| | | class IPY_CrossRealmPKZone(): |
| | | # 跨服分区表通用 |
| | | class IPY_CrossZoneComm(): |
| | | |
| | | def __init__(self): |
| | | self.CrossZoneName = ""
|
| | | self.ZoneID = 0
|
| | | self.ServerGroupIDList = [] |
| | | return |
| | | |
| | | def GetCrossZoneName(self): return self.CrossZoneName # 跨服分区名
|
| | | def GetZoneID(self): return self.ZoneID # 赛区ID
|
| | | def GetServerGroupIDList(self): return self.ServerGroupIDList # 赛区服务器组ID列表 |
| | | |
| | | # 跨服分区表竞技场 |
| | | class IPY_CrossZonePK(): |
| | | |
| | | def __init__(self): |
| | | self.CrossZoneName = ""
|
| | | self.ZoneID = 0
|
| | | self.ZoneName = ""
|
| | | self.ServerGroupIDList = [] |
| | | return |
| | | |
| | | def GetCrossZoneName(self): return self.CrossZoneName # 跨服分区名
|
| | | def GetZoneID(self): return self.ZoneID # 赛区ID
|
| | | def GetZoneName(self): return self.ZoneName # 赛区名字
|
| | | def GetServerGroupIDList(self): return self.ServerGroupIDList # 赛区服务器组ID列表 |
| | |
| | | class IPY_CrossRealmPKSeason(): |
| | | |
| | | def __init__(self): |
| | | self.CrossZoneName = ""
|
| | | self.ZoneID = 0
|
| | | self.SeasonID = 0
|
| | | self.StartDate = ""
|
| | |
| | | self.EndTime = "" |
| | | return |
| | | |
| | | def GetCrossZoneName(self): return self.CrossZoneName # 跨服分区名
|
| | | def GetZoneID(self): return self.ZoneID # 赛区ID
|
| | | def GetSeasonID(self): return self.SeasonID # 赛季ID
|
| | | def GetStartDate(self): return self.StartDate # 开始日期 yyyy-MM-dd
|
| | |
| | | def GetLVUpScore(self): return self.LVUpScore # 升段位所需积分
|
| | | def GetMatchRange(self): return self.MatchRange # 可匹配到的玩家段位区间 [从段位A, 到段位B],配[]代表只匹配本段位的 |
| | | |
| | | # 跨服Boss蓬莱仙境分区表 |
| | | class IPY_CrossPenglaiZone(): |
| | | # 跨服Boss蓬莱仙境分区地图表 |
| | | class IPY_CrossPenglaiZoneMap(): |
| | | |
| | | def __init__(self): |
| | | self.ZoneID = 0
|
| | | self.ServerGroupIDList = []
|
| | | self.MapID = 0
|
| | | self.DataMapID = 0
|
| | | self.CopyMapID = 0 |
| | | return |
| | | |
| | | def GetZoneID(self): return self.ZoneID # 分区ID
|
| | | def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
|
| | | def GetMapID(self): return self.MapID # 场景地图ID
|
| | | def GetDataMapID(self): return self.DataMapID # 数据地图ID
|
| | | def GetCopyMapID(self): return self.CopyMapID # 虚拟线路ID |
| | |
| | | self.ipyActWishingWellLen = len(self.ipyActWishingWellCache)
|
| | | self.ipyActTotalRechargeCache = self.__LoadFileData("ActTotalRecharge", IPY_ActTotalRecharge)
|
| | | self.ipyActTotalRechargeLen = len(self.ipyActTotalRechargeCache)
|
| | | self.ipyCrossRealmPKZoneCache = self.__LoadFileData("CrossRealmPKZone", IPY_CrossRealmPKZone)
|
| | | self.ipyCrossRealmPKZoneLen = len(self.ipyCrossRealmPKZoneCache)
|
| | | self.ipyCrossZoneCommCache = self.__LoadFileData("CrossZoneComm", IPY_CrossZoneComm)
|
| | | self.ipyCrossZoneCommLen = len(self.ipyCrossZoneCommCache)
|
| | | self.ipyCrossZonePKCache = self.__LoadFileData("CrossZonePK", IPY_CrossZonePK)
|
| | | self.ipyCrossZonePKLen = len(self.ipyCrossZonePKCache)
|
| | | self.ipyCrossRealmPKSeasonCache = self.__LoadFileData("CrossRealmPKSeason", IPY_CrossRealmPKSeason)
|
| | | self.ipyCrossRealmPKSeasonLen = len(self.ipyCrossRealmPKSeasonCache)
|
| | | self.ipyCrossRealmPKDanCache = self.__LoadFileData("CrossRealmPKDan", IPY_CrossRealmPKDan)
|
| | | self.ipyCrossRealmPKDanLen = len(self.ipyCrossRealmPKDanCache)
|
| | | self.ipyCrossPenglaiZoneCache = self.__LoadFileData("CrossPenglaiZone", IPY_CrossPenglaiZone)
|
| | | self.ipyCrossPenglaiZoneLen = len(self.ipyCrossPenglaiZoneCache)
|
| | | self.ipyCrossPenglaiZoneMapCache = self.__LoadFileData("CrossPenglaiZoneMap", IPY_CrossPenglaiZoneMap)
|
| | | self.ipyCrossPenglaiZoneMapLen = len(self.ipyCrossPenglaiZoneMapCache)
|
| | | self.ipyActWeekPartyCache = self.__LoadFileData("ActWeekParty", IPY_ActWeekParty)
|
| | | self.ipyActWeekPartyLen = len(self.ipyActWeekPartyCache)
|
| | | self.ipyActLoginAwardCache = self.__LoadFileData("ActLoginAward", IPY_ActLoginAward)
|
| | |
| | | def GetActWishingWellByIndex(self, index): return self.ipyActWishingWellCache[index]
|
| | | def GetActTotalRechargeCount(self): return self.ipyActTotalRechargeLen
|
| | | def GetActTotalRechargeByIndex(self, index): return self.ipyActTotalRechargeCache[index]
|
| | | def GetCrossRealmPKZoneCount(self): return self.ipyCrossRealmPKZoneLen
|
| | | def GetCrossRealmPKZoneByIndex(self, index): return self.ipyCrossRealmPKZoneCache[index]
|
| | | def GetCrossZoneCommCount(self): return self.ipyCrossZoneCommLen
|
| | | def GetCrossZoneCommByIndex(self, index): return self.ipyCrossZoneCommCache[index]
|
| | | def GetCrossZonePKCount(self): return self.ipyCrossZonePKLen
|
| | | def GetCrossZonePKByIndex(self, index): return self.ipyCrossZonePKCache[index]
|
| | | def GetCrossRealmPKSeasonCount(self): return self.ipyCrossRealmPKSeasonLen
|
| | | def GetCrossRealmPKSeasonByIndex(self, index): return self.ipyCrossRealmPKSeasonCache[index]
|
| | | def GetCrossRealmPKDanCount(self): return self.ipyCrossRealmPKDanLen
|
| | | def GetCrossRealmPKDanByIndex(self, index): return self.ipyCrossRealmPKDanCache[index]
|
| | | def GetCrossPenglaiZoneCount(self): return self.ipyCrossPenglaiZoneLen
|
| | | def GetCrossPenglaiZoneByIndex(self, index): return self.ipyCrossPenglaiZoneCache[index]
|
| | | def GetCrossPenglaiZoneMapCount(self): return self.ipyCrossPenglaiZoneMapLen
|
| | | def GetCrossPenglaiZoneMapByIndex(self, index): return self.ipyCrossPenglaiZoneMapCache[index]
|
| | | def GetActWeekPartyCount(self): return self.ipyActWeekPartyLen
|
| | | def GetActWeekPartyByIndex(self, index): return self.ipyActWeekPartyCache[index]
|
| | | def GetActLoginAwardCount(self): return self.ipyActLoginAwardLen
|
| | |
| | |
|
| | | return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
|
| | |
|
| | | def GetServerCrossZoneIpyData(mapID, serverGroupID=0):
|
| | | ## 获取本服对应跨服玩法分区地图信息
|
| | | if mapID not in ChConfig.Def_CrossZoneTableName:
|
| | | def GetCrossCommZoneIpyDataByZoneID(zoneID):
|
| | | ## 获取跨服常规分区 |
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | ipyData = IpyGameDataPY.GetIpyGameDataNotLog("CrossZoneComm", crossZoneName, zoneID)
|
| | | return ipyData
|
| | |
|
| | | def GetCrossCommZoneIpyDataByServerGroupID(serverGroupID):
|
| | | ## 获取跨服常规分区
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
|
| | | if not ipyDataList:
|
| | | return
|
| | | if not serverGroupID:
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | |
| | | tableName = ChConfig.Def_CrossZoneTableName[mapID]
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
|
| | | return
|
| | | |
| | | for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
|
| | | ipyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i)
|
| | | for ipyData in ipyDataList:
|
| | | serverGroupIDList = ipyData.GetServerGroupIDList()
|
| | | for serverGroupIDInfo in serverGroupIDList:
|
| | | if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \
|
| | |
| | | return ipyData
|
| | | return
|
| | |
|
| | | def GetCrossCommZoneIpyDataListByServerGroupID(serverGroupID):
|
| | | ## 获取跨服常规分区列表
|
| | | if serverGroupID:
|
| | | ipyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | if not ipyData:
|
| | | return
|
| | | ipyDataList = [ipyData]
|
| | | else:
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
|
| | | return ipyDataList
|
| | |
|
| | | def GetServerCrossZoneMapIpyData(mapID, serverGroupID=0):
|
| | | ## 获取本服对应跨服玩法分区地图信息
|
| | | if mapID not in ChConfig.Def_CrossZoneMapTableName:
|
| | | return
|
| | | tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
|
| | | if not serverGroupID:
|
| | | if GameWorld.IsCrossServer():
|
| | | return
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | zoneIpyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | commZoneID = zoneIpyData.GetZoneID()
|
| | | return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":commZoneID})
|
| | |
|
| | | def IsCrossServerOpen():
|
| | | ## 跨服服务器是否开放中
|
| | | return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
|
| | |
|
| | | def ClientServerMsg_ServerInitOK(serverGroupID):
|
| | | ## 子服连接成功
|
| | | def Sync_CrossCommInitDataToClientServer(serverGroupID=0):
|
| | | ''' 同步跨服常规通用数据到子服务器
|
| | | @param serverGroupID: 为0时同步所有子服
|
| | | '''
|
| | | |
| | | isOpen = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
|
| | | GameWorld.Log("子服连接成功,通知当前跨服服务器状态: isOpen=%s" % isOpen)
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen}, [serverGroupID])
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | GameWorld.Log("通知当前跨服服务器状态: isOpen=%s,crossZoneName=%s,syncServerGroupID=%s" % (isOpen, crossZoneName, serverGroupID))
|
| | | serverGroupIDList = [serverGroupID] if serverGroupID else []
|
| | | CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossServerState, {"isOpen":isOpen, "crossZoneName":crossZoneName}, serverGroupIDList)
|
| | | return
|
| | |
|
| | | def DoChangeCrossServerState(isOpen):
|
| | |
| | |
|
| | | def CrossServerMsg_CrossServerState(msgData):
|
| | | ## 子服收到跨服服务器状态变更,子服不存DB,默认跨服维护中,连接跨服成功后由跨服同步状态直接更新到字典即可,没连上就默认维护中
|
| | | if "crossZoneName" in msgData:
|
| | | PyGameData.g_crossZoneName = msgData["crossZoneName"]
|
| | | GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_CrossZoneName, PyGameData.g_crossZoneName)
|
| | | |
| | | isOpen = msgData["isOpen"]
|
| | | isOpen = 1 if isOpen else 0
|
| | | GameWorld.Log("收到跨服服务器状态变更: 是否正常开放中=%s" % isOpen)
|
| | |
| | | ## 收到子服请求查看跨服地图NPC个数信息
|
| | |
|
| | | mapID = msgData["MapID"]
|
| | | zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(mapID, serverGroupID)
|
| | | zoneIpyData = CrossRealmPlayer.GetServerCrossZoneMapIpyData(mapID, serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | realMapID = zoneIpyData.GetMapID()
|
| | |
| | |
|
| | | def ClientServerMsg_ChatCrossWorld(serverGroupID, msgData, tick):
|
| | | ## 收到子服跨服世界频道聊天
|
| | | zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(ChConfig.Def_FBMapID_CrossPenglai, serverGroupID)
|
| | | zoneIpyData = CrossRealmPlayer.GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | serverGroupIDList = zoneIpyData.GetServerGroupIDList()
|
| | |
| | | g_autoViceleaderDict = {}#自动安排副盟主的玩家记录{familyID:[]}
|
| | | g_forbidAutoViceleaderFamily = [] #禁止自动安排副盟主的仙盟[familyID,..]
|
| | |
|
| | | g_crossZoneName = "" # 跨服分区名
|
| | |
|
| | | g_crossPlayerViewCache = {} # 查看跨服玩家信息 {playerID:[cacheInfo, updTick], ...}
|
| | |
|
| | | g_crossPKPlayerDict = {} # 跨服PK玩家字典 {playerID:PKPlayer, ...}
|
| | |
| | |
|
| | | Def_Notify_WorldKey_CrossServerConnState = "CrossServerConnState" # 跨服服务器链接状态
|
| | | Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen" # 跨服服务器是否开启中
|
| | | Def_Notify_WorldKey_CrossZoneName = "CrossZoneName" # 跨服分区名
|
| | |
|
| | | Def_Notify_WorldKey_CrossPKZoneID = "CrossPKZoneID" # 本服跨服PK所属赛区
|
| | | Def_Notify_WorldKey_CrossPKSeasonID = "CrossPKSeasonID" # 本服跨服PK当前赛季
|
| | |
| | | RegisterEnter_CrossServerMapIDList = [Def_FBMapID_CrossPenglai]
|
| | | #跨服地图
|
| | | Def_CrossMapIDList = [Def_FBMapID_CrossRealmPK, Def_FBMapID_CrossPenglai]
|
| | | #跨服对应分区配置表名
|
| | | Def_CrossZoneTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZone",
|
| | | }
|
| | | #跨服分区对应地图配置表名
|
| | | Def_CrossZoneMapTableName = {Def_FBMapID_CrossPenglai:"CrossPenglaiZoneMap",
|
| | | }
|
| | |
|
| | | #副本关闭时未拾取的物品邮件发放给玩家
|
| | | #这里只有需要的副本才配置,不做默认逻辑,防止某些副本实际不能给导致刷物品,如麒麟之府
|
| | |
| | | if not bossID:
|
| | | continue
|
| | |
|
| | | if mapID in ChConfig.Def_CrossZoneTableName:
|
| | | tableName = ChConfig.Def_CrossZoneTableName[mapID]
|
| | | if mapID in ChConfig.Def_CrossZoneMapTableName:
|
| | | tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
|
| | | realMapID = GameWorld.GetGameWorld().GetRealMapID()
|
| | | copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, mapID, copyMapID)
|
| | |
| | | import time
|
| | | import copy
|
| | | import ConfigParser
|
| | | import PyGameData
|
| | |
|
| | | import md5
|
| | | #---------------------------------------------------------------------
|
| | |
| | | ## 是否跨服服务器
|
| | | return ToIntDef(ReadChConfig.GetPyMongoConfig("Merge", "IsMergeServer"), 0)
|
| | |
|
| | | def GetCrossZoneName():
|
| | | ## 跨服服务器分区名,标记一起跨服分区的名字,配置在跨服服务器,子服不用配置,由跨服服务器同步
|
| | | if IsCrossServer():
|
| | | return ReadChConfig.GetPyMongoConfig("Merge", "CrossZoneName")
|
| | | return PyGameData.g_crossZoneName
|
| | |
|
| | | ## 时间格式转换成数值时间,可参考datetime.datetime.fromtimestamp(102645645)
|
| | | # @param timeNum
|
| | | # @return 时间数值 1970年起
|
| | |
| | | ("list", "SeasonDanLVAwardList", 0),
|
| | | ),
|
| | |
|
| | | "CrossPenglaiZone":(
|
| | | ("BYTE", "ZoneID", 0),
|
| | | "CrossZoneComm":(
|
| | | ("char", "CrossZoneName", 1),
|
| | | ("BYTE", "ZoneID", 1),
|
| | | ("list", "ServerGroupIDList", 0),
|
| | | ),
|
| | |
|
| | | "CrossPenglaiZoneMap":(
|
| | | ("BYTE", "ZoneID", 0),
|
| | | ("DWORD", "MapID", 1),
|
| | | ("DWORD", "DataMapID", 1),
|
| | | ("BYTE", "CopyMapID", 1),
|
| | |
| | | def GetDanLVAwardList(self): return self.DanLVAwardList # 段位达标奖励物品列表
|
| | | def GetSeasonDanLVAwardList(self): return self.SeasonDanLVAwardList # 赛季段位奖励物品列表 |
| | | |
| | | # 跨服Boss蓬莱仙境分区表 |
| | | class IPY_CrossPenglaiZone(): |
| | | # 跨服分区表通用 |
| | | class IPY_CrossZoneComm(): |
| | | |
| | | def __init__(self): |
| | | self.CrossZoneName = ""
|
| | | self.ZoneID = 0
|
| | | self.ServerGroupIDList = [] |
| | | return |
| | | |
| | | def GetCrossZoneName(self): return self.CrossZoneName # 跨服分区名
|
| | | def GetZoneID(self): return self.ZoneID # 赛区ID
|
| | | def GetServerGroupIDList(self): return self.ServerGroupIDList # 赛区服务器组ID列表 |
| | | |
| | | # 跨服Boss蓬莱仙境分区地图表 |
| | | class IPY_CrossPenglaiZoneMap(): |
| | | |
| | | def __init__(self): |
| | | self.ZoneID = 0
|
| | | self.ServerGroupIDList = []
|
| | | self.MapID = 0
|
| | | self.DataMapID = 0
|
| | | self.CopyMapID = 0
|
| | |
| | | return |
| | | |
| | | def GetZoneID(self): return self.ZoneID # 分区ID
|
| | | def GetServerGroupIDList(self): return self.ServerGroupIDList # 服务器组ID列表
|
| | | def GetMapID(self): return self.MapID # 场景地图ID
|
| | | def GetDataMapID(self): return self.DataMapID # 数据地图ID
|
| | | def GetCopyMapID(self): return self.CopyMapID # 虚拟线路ID
|
| | |
| | | self.ipyGodWeaponEffectLen = len(self.ipyGodWeaponEffectCache)
|
| | | self.ipyCrossRealmPKDanCache = self.__LoadFileData("CrossRealmPKDan", IPY_CrossRealmPKDan)
|
| | | self.ipyCrossRealmPKDanLen = len(self.ipyCrossRealmPKDanCache)
|
| | | self.ipyCrossPenglaiZoneCache = self.__LoadFileData("CrossPenglaiZone", IPY_CrossPenglaiZone)
|
| | | self.ipyCrossPenglaiZoneLen = len(self.ipyCrossPenglaiZoneCache)
|
| | | self.ipyCrossZoneCommCache = self.__LoadFileData("CrossZoneComm", IPY_CrossZoneComm)
|
| | | self.ipyCrossZoneCommLen = len(self.ipyCrossZoneCommCache)
|
| | | self.ipyCrossPenglaiZoneMapCache = self.__LoadFileData("CrossPenglaiZoneMap", IPY_CrossPenglaiZoneMap)
|
| | | self.ipyCrossPenglaiZoneMapLen = len(self.ipyCrossPenglaiZoneMapCache)
|
| | | self.ipyGatherSoulCache = self.__LoadFileData("GatherSoul", IPY_GatherSoul)
|
| | | self.ipyGatherSoulLen = len(self.ipyGatherSoulCache)
|
| | | self.ipyGatherSoulCompoundCache = self.__LoadFileData("GatherSoulCompound", IPY_GatherSoulCompound)
|
| | |
| | | def GetGodWeaponEffectByIndex(self, index): return self.ipyGodWeaponEffectCache[index]
|
| | | def GetCrossRealmPKDanCount(self): return self.ipyCrossRealmPKDanLen
|
| | | def GetCrossRealmPKDanByIndex(self, index): return self.ipyCrossRealmPKDanCache[index]
|
| | | def GetCrossPenglaiZoneCount(self): return self.ipyCrossPenglaiZoneLen
|
| | | def GetCrossPenglaiZoneByIndex(self, index): return self.ipyCrossPenglaiZoneCache[index]
|
| | | def GetCrossZoneCommCount(self): return self.ipyCrossZoneCommLen
|
| | | def GetCrossZoneCommByIndex(self, index): return self.ipyCrossZoneCommCache[index]
|
| | | def GetCrossPenglaiZoneMapCount(self): return self.ipyCrossPenglaiZoneMapLen
|
| | | def GetCrossPenglaiZoneMapByIndex(self, index): return self.ipyCrossPenglaiZoneMapCache[index]
|
| | | def GetGatherSoulCount(self): return self.ipyGatherSoulLen
|
| | | def GetGatherSoulByIndex(self, index): return self.ipyGatherSoulCache[index]
|
| | | def GetGatherSoulCompoundCount(self): return self.ipyGatherSoulCompoundLen
|
| | |
| | | GameWorld.DebugLog("Boss状态变更: bossID=%s,isAlive=%s,dataMapID=%s,realMapID=%s,copyMapID=%s"
|
| | | % (bossID, isAlive, dataMapID, realMapID, copyMapID))
|
| | | if not isAlive:
|
| | | if dataMapID in ChConfig.Def_CrossZoneTableName:
|
| | | tableName = ChConfig.Def_CrossZoneTableName[dataMapID]
|
| | | if dataMapID in ChConfig.Def_CrossZoneMapTableName:
|
| | | tableName = ChConfig.Def_CrossZoneMapTableName[dataMapID]
|
| | | realMapID = GameWorld.GetGameWorld().GetRealMapID()
|
| | | copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameData(tableName, realMapID, dataMapID, copyMapID)
|
| | |
| | | if not bossID and not stoneNPCID:
|
| | | return
|
| | |
|
| | | if mapID not in ChConfig.Def_CrossZoneTableName:
|
| | | if mapID not in ChConfig.Def_CrossZoneMapTableName:
|
| | | return
|
| | | tableName = ChConfig.Def_CrossZoneTableName[mapID]
|
| | | tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
|
| | | realMapID = GameWorld.GetGameWorld().GetRealMapID()
|
| | | copyMapID = GameWorld.GetGameWorld().GetCopyMapID()
|
| | | zoneIpyData = IpyGameDataPY.GetIpyGameDataNotLog(tableName, realMapID, mapID, copyMapID)
|
| | |
| | |
|
| | | return opName.decode('gbk').encode(GameWorld.GetCharacterEncoding()) + playerName
|
| | |
|
| | | def GetServerCrossZoneIpyData(mapID, serverGroupID=0):
|
| | | ## 获取本服对应跨服玩法分区地图信息
|
| | | if mapID not in ChConfig.Def_CrossZoneTableName:
|
| | | def GetCrossCommZoneIpyDataByServerGroupID(serverGroupID):
|
| | | ## 获取跨服常规分区
|
| | | crossZoneName = GameWorld.GetCrossZoneName()
|
| | | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition("CrossZoneComm", {"CrossZoneName":crossZoneName}, True)
|
| | | if not ipyDataList:
|
| | | return
|
| | | if not serverGroupID:
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | |
| | | tableName = ChConfig.Def_CrossZoneTableName[mapID]
|
| | | ipyDataMgr = IpyGameDataPY.IPY_Data()
|
| | | if not hasattr(ipyDataMgr, "Get%sCount" % tableName):
|
| | | return
|
| | | |
| | | for i in xrange(getattr(ipyDataMgr, "Get%sCount" % tableName)()):
|
| | | ipyData = getattr(ipyDataMgr, "Get%sByIndex" % tableName)(i)
|
| | | for ipyData in ipyDataList:
|
| | | serverGroupIDList = ipyData.GetServerGroupIDList()
|
| | | for serverGroupIDInfo in serverGroupIDList:
|
| | | if (isinstance(serverGroupIDInfo, tuple) and serverGroupIDInfo[0] <= serverGroupID <= serverGroupIDInfo[1]) \
|
| | |
| | | return ipyData
|
| | | return
|
| | |
|
| | | def GetServerCrossZoneMapIpyData(mapID, serverGroupID=0):
|
| | | ## 获取本服对应跨服玩法分区地图信息
|
| | | if mapID not in ChConfig.Def_CrossZoneMapTableName:
|
| | | return
|
| | | tableName = ChConfig.Def_CrossZoneMapTableName[mapID]
|
| | | if not serverGroupID:
|
| | | if GameWorld.IsCrossServer():
|
| | | return
|
| | | serverGroupID = GameWorld.GetServerGroupID()
|
| | | zoneIpyData = GetCrossCommZoneIpyDataByServerGroupID(serverGroupID)
|
| | | if not zoneIpyData:
|
| | | return
|
| | | commZoneID = zoneIpyData.GetZoneID()
|
| | | return IpyGameDataPY.GetIpyGameDataByCondition(tableName, {"ZoneID":commZoneID})
|
| | |
|
| | | def IsCrossServerOpen():
|
| | | ## 跨服服务器是否开放中
|
| | | return GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossServerOpen)
|
| | |
| | |
|
| | | return
|
| | |
|
| | | if key == ShareDefine.Def_Notify_WorldKey_CrossZoneName:
|
| | | PyGameData.g_crossZoneName = msgValue
|
| | | return
|
| | | |
| | | if msgValue.isdigit():
|
| | | value = int(msgValue)
|
| | | else:
|
| | |
| | |
|
| | | zoneID = 0
|
| | | if not mapID:
|
| | | zoneIpyData = CrossRealmPlayer.GetServerCrossZoneIpyData(registerMap)
|
| | | zoneIpyData = CrossRealmPlayer.GetServerCrossZoneMapIpyData(registerMap)
|
| | | if not zoneIpyData:
|
| | | GameWorld.ErrLog("找不到该服务器对应跨服分区: registerMap=%s" % (registerMap))
|
| | | return
|
| | |
| | |
|
| | | g_gathersoulfbAwardDict = {} #聚魂副本奖励记录{playerID:[[itemID,itemCnt]]}
|
| | |
|
| | | g_crossZoneName = "" # 跨服分区名
|
| | | g_crossRegPlayerAttrDict = {} #跨服注册时登记的会影响战力的属性值 {playerID:[value, ...], ...}
|
| | | g_crossSyncTickDict = {} #需要同步跨服数据的玩家同步tick字典 {playerID:tick, ...}
|
| | | g_crossPlayerDictChangeInfo = {} #跨服玩家字典变化信息 {playerID:{(key, dType):value, ...}, ...}
|
| | |
| | |
|
| | | Def_Notify_WorldKey_CrossServerConnState = "CrossServerConnState" # 跨服服务器链接状态
|
| | | Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen" # 跨服服务器是否开启中
|
| | | Def_Notify_WorldKey_CrossZoneName = "CrossZoneName" # 跨服分区名
|
| | |
|
| | | Def_Notify_WorldKey_CrossPKZoneID = "CrossPKZoneID" # 本服跨服PK所属赛区
|
| | | Def_Notify_WorldKey_CrossPKSeasonID = "CrossPKSeasonID" # 本服跨服PK当前赛季
|