From 8b82df47bf4ea3100410c1a88aeca505081d3a3a Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 06 六月 2024 11:18:02 +0800 Subject: [PATCH] 10130 【后端】福地争夺资源功能(修复驱赶获取目标玩家信息报错) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py | 243 ++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 200 insertions(+), 43 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py index 3e6f773..43abd50 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py @@ -61,6 +61,7 @@ value3:guessPlayerID 竞猜玩家ID value4:tagPlayerID 目标玩家ID value5:moneyTotal 投注总货币值 +StrValue1:isClose 是否已结算 ''' Def_RecType_CrossChampionshipOfficial = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial @@ -180,6 +181,7 @@ self.tagPlayerID = 0 # 目标玩家ID self.moneyTotal = 0 # 投注总货币值 self.guessRank = 0 # 竞猜名次,没有名次的竞猜默认0;1-代表第一名 + self.isClose = 0 # 是否已结算 return def GetString(self): @@ -361,12 +363,15 @@ return def GetChampPKZoneIDList(self): return self._pkZoneInfo.keys() - def GetChampPKZoneMgr(self, zoneID): + def GetChampPKZoneMgr(self, zoneID, addNew=False): + pkZoneMgr = None if zoneID in self._pkZoneInfo: pkZoneMgr = self._pkZoneInfo[zoneID] - else: + elif addNew: pkZoneMgr = ChampionshipPKZoneMgr(zoneID) self._pkZoneInfo[zoneID] = pkZoneMgr + if not pkZoneMgr: + GameWorld.ErrLog("找不到跨服排位赛分区管理! zoneID=%s" % zoneID) return pkZoneMgr def GetPlayerPKZoneID(self, playerID): @@ -374,6 +379,8 @@ # @return: 如果在排位中则返回所在排位分区,否则返回当前服务器所在跨服匹配PK分区 for zoneID in self._pkZoneInfo.keys(): pkZoneMgr = self.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue if playerID in pkZoneMgr.GetBatPlayerIDList(): return zoneID return GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_CrossPKZoneID) @@ -436,7 +443,7 @@ groupMark = groupInfo / 100 battleNum = groupInfo % 100 - pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) if groupMark in groupMarkList and battleNum: battle = ChampionshipBattle() @@ -471,8 +478,11 @@ guessPlayerID = recData.GetValue3() tagPlayerID = recData.GetValue4() moneyTotal = recData.GetValue5() + isClose = GameWorld.ToIntDef(recData.GetStrValue1(), 0) pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType) guessObj = ChampionshipGuess() guessObj.zoneID = zoneID @@ -481,6 +491,7 @@ guessObj.guessPlayerID = guessPlayerID guessObj.tagPlayerID = tagPlayerID guessObj.moneyTotal = moneyTotal + guessObj.isClose = isClose playerGuessList.append(guessObj) if guessType not in pkZoneMgr.supportCountInfo: @@ -547,7 +558,10 @@ return def OnServerClose(): - + SaveChampionshipData() + return + +def SaveChampionshipData(): if not GameWorld.IsCrossServer(): return @@ -560,7 +574,8 @@ groupRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGroup) for zoneID in pkZoneIDList: pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) - + if not pkZoneMgr: + continue # 保存参赛玩家名单 batPlayerIDList = pkZoneMgr.GetBatPlayerIDList() GameWorld.Log(" zoneID=%s,batPlayerIDCount=%s, %s" % (zoneID, len(batPlayerIDList), batPlayerIDList)) @@ -589,6 +604,8 @@ guessRecDataList = universalRecMgr.GetTypeList(Def_RecType_CrossChampionshipGuess) for zoneID in pkZoneIDList: pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue for guessType, playerGuessDict in pkZoneMgr.guessInfo.items(): for guessPlayerID, guessObjList in playerGuessDict.items(): #GameWorld.Log(" zoneID=%s,guessType=%s,guessPlayerID=%s,guessCount=%s" % (zoneID, guessType, guessPlayerID, len(guessObjList))) @@ -599,6 +616,7 @@ recData.SetValue3(guessPlayerID) recData.SetValue4(guessObj.tagPlayerID) recData.SetValue5(guessObj.moneyTotal) + recData.SetStrValue1("%s" % guessObj.isClose) offZoneIDList = champMgr.GetChampOfficialZoneIDList() GameWorld.Log("保存跨服排位玩家官职信息! offZoneIDList=%s" % offZoneIDList) @@ -705,6 +723,8 @@ champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue if playerID in pkZoneMgr.GetBatPlayerIDList(): # 是参赛玩家 return True @@ -738,11 +758,22 @@ return +def DoChampionshipOpen(curPlayer): + NotifyPlayerChampionshipInfo(curPlayer, GameWorld.GetGameWorld().GetTick()) + return + def OnPlayerLogin(curPlayer, tick): if GameWorld.IsCrossServer(): return + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): + return + + NotifyPlayerChampionshipInfo(curPlayer, tick) + return + +def NotifyPlayerChampionshipInfo(curPlayer, tick): playerID = curPlayer.GetPlayerID() champMgr = GetChampionshipMgr() pkZoneIDList = champMgr.GetChampPKZoneIDList() @@ -754,6 +785,8 @@ if pkZoneIDList: playerZoneID = champMgr.GetPlayerPKZoneID(playerID) pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID) + if not pkZoneMgr: + return if playerID not in pkZoneMgr.syncGuessPlayerIDInfo: sendMsg = {"zoneID":playerZoneID, "playerID":playerID, "exDataType":"ChampionshipGuessQuery"} CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_ChampionshipGuess, sendMsg) @@ -763,11 +796,60 @@ return -def OnMinuteProcess(): +def ChampionshipErrorDo(): + ## 状态异常后处理 + + stateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) + if not stateError: + return "state is not error." + + if PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo): + return "already done." + + champMgr = GetChampionshipMgr() + + # 返还未结算的竞猜消耗 + moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1) + moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType) + for zoneID in champMgr.GetChampPKZoneIDList(): + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue + + backGuessTypeList = [] + playerGuessMoneyInfo = {} + for guessType, playerGuessDict in pkZoneMgr.guessInfo.items(): + for guessPlayerID, guessObjList in playerGuessDict.items(): + for guessObj in guessObjList: + if guessObj.isClose: + # 已经结算的不处理 + continue + guessObj.isClose = 1 + if guessType not in backGuessTypeList: + backGuessTypeList.append(guessType) + playerGuessMoneyInfo[guessPlayerID] = playerGuessMoneyInfo.get(guessPlayerID, 0) + guessObj.moneyTotal + + GameWorld.Log("竞猜需要返还玩家信息: moneyItemID=%s,zoneID=%s,backGuessTypeList=%s, %s" % (moneyItemID, zoneID, backGuessTypeList, playerGuessMoneyInfo)) + if not moneyItemID or not playerGuessMoneyInfo: + continue + + for guessPlayerID, totalMoney in playerGuessMoneyInfo.items(): + paramList = [] + addItemList = [[moneyItemID, totalMoney, 0]] + PlayerCompensation.SendMailByKey("CrossChampionshipGuessBack", [guessPlayerID], addItemList, paramList, crossMail=True) + + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 1) + return "OK" + +def OnMinuteProcess(curMinute): if not GameWorld.IsCrossServer(): return Dispose_CrossChampionshipState() + + # 每半小时存档一次 + if curMinute % 30 == 0: + SaveChampionshipData() return def __GetChampionshipStartDate(): @@ -985,6 +1067,7 @@ PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID, crossChampionshipID) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipState, updState) PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError, 0) + PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipErrorDo, 0) champMgr = GetChampionshipMgr() champMgr.ClearPKZone() # 仅清理PK分区信息,仙官信息不变 @@ -998,7 +1081,7 @@ if not billboardList: # 没有玩家上榜的不处理 continue - pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) battlePlayerList = billboardList[:Def_CrossChampionshipPlayerMax] for num, billboardData in enumerate(battlePlayerList, 1): playerID = billboardData.PlayerID @@ -1034,6 +1117,8 @@ champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue # 首轮取所有参赛玩家 if preGroupMark == 0: batPlayerIDList = pkZoneMgr.GetBatPlayerIDList() @@ -1134,7 +1219,8 @@ champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) - + if not pkZoneMgr: + continue winPlayerIDList, losePlayerIDList = [], [] # 胜者组、败者组 battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys() battleNumList.sort() # 对战编号按之前的分组顺序排序,确保分组顺序一致 @@ -1221,7 +1307,8 @@ champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) - + if not pkZoneMgr: + continue battleNumList = pkZoneMgr.battleInfo.get(preGroupMark, {}).keys() battleNumList.sort() # 对战编号按之前的分组顺序排序,确保分组顺序一致 for battleNum in battleNumList: @@ -1240,7 +1327,7 @@ # 处理8强竞猜发奖励 guessType = 8 - moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1) + moneyType = ShareDefine.TYPE_Price_GongdePoint multiPrice = IpyGameDataPY.GetFuncCfg("CrossChamGuess", 3) # 猜中奖励倍值 moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType) GameWorld.Log("竞猜返利货币类型: moneyType=%s,moneyItemID=%s,multiPrice=%s" % (moneyType, moneyItemID, multiPrice), zoneID) @@ -1251,6 +1338,7 @@ for guessObj in guessList: if guessObj.guessType != guessType or guessObj.guessPlayerID != guessPlayerID: continue + guessObj.isClose = 1 tagPlayerID = guessObj.tagPlayerID moneyTotal = guessObj.moneyTotal if not tagPlayerID or tagPlayerID not in top8PlayerIDList: @@ -1273,19 +1361,23 @@ if state not in ShareDefine.CrossChampionshipEnterStateInfo: return groupMark = ShareDefine.CrossChampionshipEnterStateInfo[state] + mapIndex = 0 mapIDList = IpyGameDataPY.GetFuncEvalCfg("CrossChamFB", 3) GameWorld.Log("跨服排位争霸赛开启进场副本: groupMark=%s,mapIDList=%s" % (groupMark, mapIDList)) champMgr = GetChampionshipMgr() pkZoneIDList = champMgr.GetChampPKZoneIDList() - for index, zoneID in enumerate(pkZoneIDList): - if index >= len(mapIDList): - GameWorld.ErrLog("该跨服排位争霸赛分区没有分配对战地图! zoneID=%s,index=%s" % (zoneID, index), zoneID) - continue - mapID = mapIDList[index] + for zoneID in pkZoneIDList: pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue if groupMark not in pkZoneMgr.battleInfo: GameWorld.Log("该跨服排位争霸赛分区没有对战组! zoneID=%s,groupMark=%s" % (zoneID, groupMark), zoneID) continue + if mapIndex >= len(mapIDList): + GameWorld.ErrLog("该跨服排位争霸赛分区没有分配对战地图! zoneID=%s,mapIndex=%s" % (zoneID, mapIndex), zoneID) + continue + mapID = mapIDList[mapIndex] + mapIndex += 1 copyMapID = 0 copyPropertyList = [] battleDict = pkZoneMgr.battleInfo[groupMark] @@ -1339,7 +1431,7 @@ CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipState, dataMsg, serverGroupIDList) return -def Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList=None, serverGroupID=0, isSync=False): +def Send_CrossServerMsg_ChampionshipPlayer(syncPlayerIDList=None, serverGroupID=0, isSync=False, clearPlayer=False): # 通知参赛玩家 zoneBatPlayerInfo = {} @@ -1347,16 +1439,17 @@ for zoneID in champMgr.GetChampPKZoneIDList(): batPlayerList = [] pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) - if syncPlayerIDList == None: - syncPlayerIDList = pkZoneMgr.GetBatPlayerIDList() - for playerID in syncPlayerIDList: + if not pkZoneMgr: + continue + playerIDList = pkZoneMgr.GetBatPlayerIDList() if syncPlayerIDList == None else syncPlayerIDList + for playerID in playerIDList: batPlayer = pkZoneMgr.GetBatPlayer(playerID) if not batPlayer: continue batPlayerList.append(batPlayer.GetString()) zoneBatPlayerInfo[zoneID] = batPlayerList - dataMsg = {"isSync":isSync, "zoneBatPlayerInfo":zoneBatPlayerInfo} + dataMsg = {"isSync":isSync, "zoneBatPlayerInfo":zoneBatPlayerInfo, "clearPlayer":clearPlayer} serverGroupIDList = [serverGroupID] if serverGroupID else [] CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_ChampionshipPlayer, dataMsg, serverGroupIDList) return @@ -1371,6 +1464,8 @@ champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue for gMark in syncGroupMarkList: battleDict = pkZoneMgr.battleInfo.get(gMark, {}) if not battleDict: @@ -1395,12 +1490,13 @@ guessList.append(guessObj.GetString()) else: pkZoneMgr = champMgr.GetChampPKZoneMgr(syncZoneID) - for playerGuessDict in pkZoneMgr.guessInfo.values(): - if playerID not in playerGuessDict: - continue - playerGuessList = playerGuessDict[playerID] - for guess in playerGuessList: - guessList.append(guess.GetString()) + if pkZoneMgr: + for playerGuessDict in pkZoneMgr.guessInfo.values(): + if playerID not in playerGuessDict: + continue + playerGuessList = playerGuessDict[playerID] + for guess in playerGuessList: + guessList.append(guess.GetString()) dataMsg = {"exData":exData if exData else {}, "guessList":guessList} if syncPub: @@ -1408,6 +1504,8 @@ syncZoneIDList = [syncZoneID] if syncZoneID else champMgr.GetChampPKZoneIDList() for zoneID in syncZoneIDList: pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue zoneSupportCountInfo[zoneID] = pkZoneMgr.supportCountInfo dataMsg["pubInfo"] = {"zoneSupportCountInfo":zoneSupportCountInfo} @@ -1446,14 +1544,16 @@ ## 收到跨服服务器同步的信息 - 参赛玩家信息 isSync = msgData["isSync"] + clearPlayer = msgData["clearPlayer"] zoneBatPlayerInfo = msgData["zoneBatPlayerInfo"] champMgr = GetChampionshipMgr() for zoneID, batPlayerList in zoneBatPlayerInfo.items(): - pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) if not batPlayerList: - pkZoneMgr.playerDict = {} + if clearPlayer: + pkZoneMgr.playerDict = {} else: for attrDict in batPlayerList: zoneID = attrDict["zoneID"] @@ -1479,7 +1579,7 @@ groupMark = attrDict["groupMark"] battleNum = attrDict["battleNum"] - pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) battle = pkZoneMgr.GetBattle(groupMark, battleNum) if not battle: battle = ChampionshipBattle() @@ -1534,7 +1634,7 @@ # 非本服玩家 continue - pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) guessObj = None playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType) @@ -1552,7 +1652,7 @@ if pubInfo != None: zoneSupportCountInfo = pubInfo["zoneSupportCountInfo"] for zoneID, supportCountInfo in zoneSupportCountInfo.items(): - pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) pkZoneMgr.supportCountInfo = supportCountInfo pubZoneIDList.append(zoneID) @@ -1564,7 +1664,7 @@ # 非本服玩家 return zoneID = exData.get("zoneID", 0) - pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) pkZoneMgr.syncGuessPlayerIDInfo[playerID] = tick curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID) if curPlayer == None: @@ -1616,6 +1716,8 @@ champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue if groupMark not in pkZoneMgr.battleInfo: continue battleDict = pkZoneMgr.battleInfo[groupMark] @@ -1690,6 +1792,8 @@ champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + return battleObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not battleObj: return @@ -1848,6 +1952,8 @@ GameWorld.Log("=== 结算排位分区: zoneID=%s ===" % zoneID, zoneID) finalPlayerIDList = [] pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue battleNumList = pkZoneMgr.battleInfo.get(finalGroupMark, {}).keys() for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(finalGroupMark, battleNum) @@ -1891,7 +1997,7 @@ # 处理4强竞猜发奖励 guessType = 4 - moneyType, _ = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 1) + moneyType = ShareDefine.TYPE_Price_GongdePoint multiPriceDict = IpyGameDataPY.GetFuncEvalCfg("CrossChamGuess", 4, {}) # 猜中奖励倍值字典 moneyItemID = ChConfig.MoneyItemIDDict.get(moneyType) GameWorld.Log("竞猜返利货币类型: moneyType=%s,moneyItemID=%s,multiPriceDict=%s" % (moneyType, moneyItemID, multiPriceDict), zoneID) @@ -1902,6 +2008,7 @@ for guessObj in guessList: if guessObj.guessType != guessType or guessObj.guessPlayerID != guessPlayerID: continue + guessObj.isClose = 1 tagPlayerID = guessObj.tagPlayerID guessRank = guessObj.guessRank moneyTotal = guessObj.moneyTotal @@ -1934,6 +2041,8 @@ champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + return {} # 决赛 finalGroupMark = 2 @@ -2021,9 +2130,8 @@ if syncZonID != None and zoneID != syncZonID: continue offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) - if syncOfficialIDList == None: - syncOfficialIDList = offZoneMgr.officialInfo.keys() - for officialID in syncOfficialIDList: + officialIDList = offZoneMgr.officialInfo.keys() if syncOfficialIDList == None else syncOfficialIDList + for officialID in officialIDList: offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: continue @@ -2170,6 +2278,8 @@ champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + return tagBatPlayer = pkZoneMgr.GetBatPlayer(tagPlayerID) if not tagBatPlayer: GameWorld.ErrLog("该分区不存在该参赛玩家,无法排位竞猜! zoneID=%s,tagPlayerID=%s" % (zoneID, tagPlayerID), playerID) @@ -2280,7 +2390,21 @@ playerID = msgData["playerID"] mainOfficialID = msgData["mainOfficialID"] officialID = msgData["officialID"] + cancel = msgData["cancel"] PropData = msgData["PropData"] + + if cancel: + champMgr = GetChampionshipMgr() + offZoneMgr = champMgr.GetChampOfficialZoneMgr(zoneID) + officialObj = offZoneMgr.GetOfficialObj(officialID) + if not officialObj: + return + if playerID not in officialObj.applyPlayerInfo: + GameWorld.ErrLog("不在仙官申请列表里! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID) + return + officialObj.applyPlayerInfo.pop(playerID, None) + Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID]) + return mainIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipOfficial", mainOfficialID) if not mainIpyData: @@ -2306,7 +2430,7 @@ if not mainOffObj or not officialObj: return - if mainOffObj.playerID: + if not mainOffObj.playerID: GameWorld.Log("仙官所属界主无玩家,无法申请! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID) return @@ -2491,7 +2615,7 @@ if not mainOffObj or not officialObj: return - if mainOffObj.playerID: + if not mainOffObj.playerID: GameWorld.Log("仙官所属界主无玩家,无法挑战! zoneID=%s,mainOfficialID=%s,officialID=%s" % (zoneID, mainOfficialID, officialID), playerID) return @@ -2520,6 +2644,7 @@ GameWorld.Log("挑战目标仙官玩家ID结果! zoneID=%s,mainOfficialID=%s,officialID=%s,fightPower=%s,tagFightPower=%s,tagPlayerID=%s,Ret=%s" % (zoneID, mainOfficialID, officialID, fightPower, tagFightPower, tagPlayerID, Ret), playerID) + syncOfficialIDList = [officialID] playerName = PropData.get("Name", str(playerID)) # 暂时只记录挑战胜利的 if Ret == 1: @@ -2538,13 +2663,22 @@ officialObj.ResetPlayer() officialObj.playerID = playerID + # 移除该玩家的其他仙官申请 + for offID in offZoneMgr.officialInfo.keys(): + offObj = offZoneMgr.GetOfficialObj(offID) + if not offObj: + continue + if playerID in offObj.applyPlayerInfo: + offObj.applyPlayerInfo.pop(playerID) + syncOfficialIDList.append(offID) + # 邮件通知对方,官职被挑战了 if offPlayerID: PlayerCompensation.SendMailByKey("CrossChampionshipOfficialBeChallenge", [offPlayerID], [], [playerName, officialID], crossMail=True) exData = {"exDataType":"OfficialChallenge", "playerID":playerID, "tagPlayerName":officialObj.playerName, "mainOfficialID":mainOfficialID, "officialID":officialID, "Ret":Ret} - Send_CrossServerMsg_ChampionshipOfficial(zoneID, [officialID], exData=exData) + Send_CrossServerMsg_ChampionshipOfficial(zoneID, syncOfficialIDList, exData=exData) return #// C0 23 跨服排位仙官挑战记录查询 #tagCGChampionshipOfficialChallengeQuery @@ -2740,14 +2874,19 @@ def Sync_ChampionshipPKZoneGroupInfo(zoneID, groupMarkDict=None, curPlayer=None): ## 同步排位分区分组信息 # @param groupMarkDict: {groupMark:[battleNum, ...], ...} - + champMgr = GetChampionshipMgr() if curPlayer: playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: return + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): + return pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + return + if groupMarkDict == None: groupMarkDict = {} for groupMark, groupDict in pkZoneMgr.battleInfo.items(): @@ -2760,9 +2899,11 @@ battleObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not battleObj: continue - playerIDList.append(battleObj.playerIDA) - playerIDList.append(battleObj.playerIDB) - + if battleObj.playerIDA not in playerIDList: + playerIDList.append(battleObj.playerIDA) + if battleObj.playerIDB not in playerIDList: + playerIDList.append(battleObj.playerIDB) + clientPack = ChPyNetSendPack.tagGCCrossChampionshipPKZoneGroupInfo() clientPack.ActID = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipID) clientPack.StateError = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_CrossChampionshipStateError) @@ -2814,6 +2955,8 @@ playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: continue + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): + continue NetPackCommon.SendFakePack(curPlayer, clientPack) return @@ -2827,8 +2970,12 @@ playerZoneID = champMgr.GetPlayerPKZoneID(playerID) if not playerZoneID: return + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): + return pkZoneMgr = champMgr.GetChampPKZoneMgr(playerZoneID) + if not pkZoneMgr: + return clientPack = ChPyNetSendPack.tagGCChampionshipGuessPriInfo() clientPack.ZoneID = playerZoneID @@ -2870,8 +3017,12 @@ playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: return + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): + return pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + return # 公共竞猜信息 clientPack = ChPyNetSendPack.tagGCChampionshipGuessPubInfo() @@ -2911,6 +3062,8 @@ playerZoneID = champMgr.GetPlayerPKZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: continue + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): + continue NetPackCommon.SendFakePack(curPlayer, clientPack) return @@ -2922,6 +3075,8 @@ if curPlayer: playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: + return + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): return clientPack = ChPyNetSendPack.tagGCChampionshipOfficialInfo() @@ -2982,6 +3137,8 @@ playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: continue + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): + continue NetPackCommon.SendFakePack(curPlayer, clientPack) return -- Gitblit v1.8.0