From a802eaaa36aa1467ddd4e30e208f8293412bb41b Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 27 十二月 2024 17:25:40 +0800 Subject: [PATCH] 10289 【越南】【英语】【砍树】【BT】运势-服务端(增加任务类型消耗培养丹34坐骑 35灵宠) --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py | 315 ++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 254 insertions(+), 61 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py index 3e6f773..1dc3178 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/CrossChampionship.py @@ -29,6 +29,8 @@ import PlayerControl import PyDataManager import NetPackCommon +import GameXiangong +import GameWorship import PyGameData import ChConfig import PlayerFB @@ -61,6 +63,7 @@ value3:guessPlayerID 竞猜玩家ID value4:tagPlayerID 目标玩家ID value5:moneyTotal 投注总货币值 +StrValue1:isClose 是否已结算 ''' Def_RecType_CrossChampionshipOfficial = ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial @@ -68,10 +71,11 @@ 跨服排位争霸赛最终排名官职信息 ShareDefine.Def_UniversalGameRecType_CrossChampionshipOfficial time:time 上一次辞退下级仙官时间 -value1:zoneID官职ID 官职ID*10 + 分区ID +value1:官职ID 官职ID value2:playerID 玩家ID,可能为0 value3:worshipValue 被膜拜次数*10 + 是否双倍 value4:rank 排名 +value5:zoneID 分区ID StrValue3: [申请该官职玩家ID,...] ''' @@ -79,7 +83,8 @@ ''' 跨服排位争霸赛官职挑战信息 ShareDefine.Def_UniversalGameRecType_CrossChampionshipOffChallenge -value1:zoneID官职ID 官职ID*10 + 分区ID +value1:官职ID 官职ID +value2:zoneID 分区ID StrValue3: {挑战玩家信息key:value, ...} ''' @@ -109,6 +114,8 @@ self.lv = 0 self.fightPower = 0 self.realmLV = 0 + self.face = 0 + self.facePic = 0 return def GetString(self): @@ -123,9 +130,11 @@ playerShortInfo["LV"] = cacheDict.get("LV", 1) playerShortInfo["FightPower"] = cacheDict.get("FightPower", 0) playerShortInfo["RealmLV"] = cacheDict.get("RealmLV", 0) + playerShortInfo["Face"] = cacheDict.get("Face", 0) + playerShortInfo["FacePic"] = cacheDict.get("FacePic", 0) self.applyPlayerInfo[applyPlayerID] = playerShortInfo return {"zoneID":self.zoneID, "officialID":self.officialID, "lastDismissJuniorTime":self.lastDismissJuniorTime, - "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName, + "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName, "face":self.face, "facePic":self.facePic, "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV, "rank":self.rank, "worshipCount":self.worshipCount, "applyPlayerInfo":self.applyPlayerInfo, "challengeList":self.challengeList, "worshipDouble":self.worshipDouble @@ -180,6 +189,7 @@ self.tagPlayerID = 0 # 目标玩家ID self.moneyTotal = 0 # 投注总货币值 self.guessRank = 0 # 竞猜名次,没有名次的竞猜默认0;1-代表第一名 + self.isClose = 0 # 是否已结算 return def GetString(self): @@ -204,11 +214,13 @@ self.lv = 0 self.fightPower = 0 self.realmLV = 0 + self.face = 0 + self.facePic = 0 return def GetString(self): return {"zoneID":self.zoneID, "accID":self.accID, "playerID":self.playerID, "playerName":self.playerName, - "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV} + "job":self.job, "lv":self.lv, "fightPower":self.fightPower, "realmLV":self.realmLV, "face":self.face, "facePic":self.facePic} def SetAttr(self, attrDict): for k, v in attrDict.items(): @@ -340,6 +352,8 @@ obj.lv = cacheDict.get("LV", obj.lv) obj.fightPower = cacheDict.get("FightPower", obj.fightPower) obj.realmLV = cacheDict.get("RealmLV", obj.realmLV) + obj.face = cacheDict.get("Face", obj.face) + obj.facePic = cacheDict.get("FacePic", obj.facePic) return @@ -361,12 +375,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 +391,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 +455,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 +490,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 +503,7 @@ guessObj.guessPlayerID = guessPlayerID guessObj.tagPlayerID = tagPlayerID guessObj.moneyTotal = moneyTotal + guessObj.isClose = isClose playerGuessList.append(guessObj) if guessType not in pkZoneMgr.supportCountInfo: @@ -493,9 +516,8 @@ for index in xrange(officialRecDataList.Count()): recData = officialRecDataList.At(index) lastDismissJuniorTime = recData.GetTime() - value1 = recData.GetValue1() - officialID = value1 / 10 - zoneID = value1 % 10 + officialID = recData.GetValue1() + zoneID = recData.GetValue5() playerID = recData.GetValue2() worshipValue = recData.GetValue3() worshipCount = worshipValue / 10 @@ -526,9 +548,8 @@ GameWorld.Log("加载跨服排位官职挑战记录信息! %s" % challengeRecDataList.Count()) for index in xrange(challengeRecDataList.Count()): recData = challengeRecDataList.At(index) - value1 = recData.GetValue1() - officialID = value1 / 10 - zoneID = value1 % 10 + officialID = recData.GetValue1() + zoneID = recData.GetValue2() strValue3 = recData.GetStrValue3() if not strValue3: continue @@ -547,7 +568,10 @@ return def OnServerClose(): - + SaveChampionshipData() + return + +def SaveChampionshipData(): if not GameWorld.IsCrossServer(): return @@ -560,7 +584,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 +614,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 +626,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) @@ -613,22 +641,23 @@ offObj = offZoneMgr.GetOfficialObj(officialID) if not offObj: continue - value1 = offObj.officialID * 10 + zoneID recData = officialRecDataList.AddRec() recData.SetTime(offObj.lastDismissJuniorTime) - recData.SetValue1(value1) + recData.SetValue1(officialID) recData.SetValue2(offObj.playerID) recData.SetValue3(offObj.worshipCount * 10 + offObj.worshipDouble) recData.SetValue4(offObj.rank) + recData.SetValue5(zoneID) strValue3 = "%s" % offObj.applyPlayerInfo.keys() strValue3 = strValue3.replace(" ", "") recData.SetStrValue3(strValue3) - #GameWorld.Log(" zoneID=%s,officialID=%s,playerID=%s,rank=%s,challengeCount=%s" - # % (zoneID, officialID, offObj.playerID, offObj.rank, len(offObj.challengeList))) + GameWorld.Log(" zoneID=%s,officialID=%s,playerID=%s,rank=%s,challengeCount=%s" + % (zoneID, officialID, offObj.playerID, offObj.rank, len(offObj.challengeList))) for challengeDict in offObj.challengeList: challRecData = challengeRecDataList.AddRec() - challRecData.SetValue1(value1) + challRecData.SetValue1(officialID) + challRecData.SetValue2(zoneID) strValue3 = str(challengeDict) strValue3 = strValue3.replace(" ", "") challRecData.SetStrValue3(strValue3) @@ -705,6 +734,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 +769,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 +796,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 +807,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 +1078,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 +1092,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 +1128,8 @@ champMgr = GetChampionshipMgr() for zoneID in champMgr.GetChampPKZoneIDList(): pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue # 首轮取所有参赛玩家 if preGroupMark == 0: batPlayerIDList = pkZoneMgr.GetBatPlayerIDList() @@ -1134,7 +1230,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 +1318,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 +1338,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 +1349,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 +1372,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] @@ -1301,7 +1404,7 @@ # 添加开启分线数据 realMapID = mapID - copyMapObj = PlayerFB.CrossCopyMapInfo(zoneID, 0) + copyMapObj = PlayerFB.CrossCopyMapInfo(zoneID, ChConfig.Def_FBMapID_CrossChampionship, 0) copyMapObj.realMapID = realMapID copyMapObj.copyMapID = copyMapID key = (realMapID, copyMapID) @@ -1339,7 +1442,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 +1450,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 +1475,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 +1501,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 +1515,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 +1555,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 +1590,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 +1645,7 @@ # 非本服玩家 continue - pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID, True) guessObj = None playerGuessList = pkZoneMgr.GetPlayerGuessList(guessPlayerID, guessType) @@ -1552,7 +1663,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 +1675,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 +1727,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 +1803,8 @@ champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + return battleObj = pkZoneMgr.GetBattle(groupMark, battleNum) if not battleObj: return @@ -1841,13 +1956,25 @@ champMgr = GetChampionshipMgr() champMgr.ClearOfficialZone() # 最终结算重置仙官信息,替换最新仙官 + # 膜拜重置 + worshipType = ShareDefine.Def_WorshipType_CrossChampionship + GameWorship.DelWorshipPlayer(worshipType) + pkZoneIDList = champMgr.GetChampPKZoneIDList() GameWorld.Log("pkZoneIDList=%s" % pkZoneIDList) + syncNewWorshipList = [] + syncNewXiangongDict = {} + crossZoneName = GameWorld.GetCrossZoneName() for zoneID in pkZoneIDList: GameWorld.Log("=== 结算排位分区: zoneID=%s ===" % zoneID, zoneID) + zoneIpyData = IpyGameDataPY.GetIpyGameData("CrossZonePK", crossZoneName, zoneID) + serverIDRangeList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else [] + finalPlayerIDList = [] pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + continue battleNumList = pkZoneMgr.battleInfo.get(finalGroupMark, {}).keys() for battleNum in battleNumList: batObj = pkZoneMgr.GetBattle(finalGroupMark, battleNum) @@ -1873,8 +2000,9 @@ rankIpyData = IpyGameDataPY.GetIpyGameData("ChampionshipRank", rank) officialID = rankIpyData.GetMainOfficialID() if rankIpyData else 0 rankAwardItemList = rankIpyData.GetRankAwardItemList() if rankIpyData else [] - GameWorld.Log(" 最终排名: zoneID=%s,rank=%s,playerID=%s,officialID=%s,rankAwardItemList=%s,accID=%s,fightPower=%s" - % (zoneID, rank, playerID, officialID, rankAwardItemList, accID, fightPower), zoneID) + xiangongID = rankIpyData.GetXiangongID() if rankIpyData else 0 + GameWorld.Log(" 最终排名: zoneID=%s,rank=%s,playerID=%s,officialID=%s,xiangongID=%s,rankAwardItemList=%s,accID=%s,fightPower=%s" + % (zoneID, rank, playerID, officialID, xiangongID, rankAwardItemList, accID, fightPower), zoneID) if officialID: offObj = ChampionshipOfficial() @@ -1885,13 +2013,17 @@ offZoneMgr.officialInfo[officialID] = offObj + # 名次奖励 paramList = [rank] PlayerCompensation.SendMailByKey("CrossChampionshipPKRank", [playerID], rankAwardItemList, paramList, crossMail=True) + GameXiangong.AddXiangongPlayer(xiangongID, playerID, serverIDRangeList, rank, syncNewXiangongDict) + GameWorship.AddWorshipPlayer(worshipType, rank, playerID, serverIDRangeList, syncNewWorshipList) + # 处理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 +2034,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 @@ -1926,6 +2059,10 @@ serverGroupIDList = [] # 全服统一逻辑 PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "ChampionshipOver") + + # 通知新添加的膜拜 + GameWorship.SendNewWorshipPlayer(syncNewWorshipList) + GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict) GameWorld.Log("===================================================================") return @@ -1934,6 +2071,8 @@ champMgr = GetChampionshipMgr() pkZoneMgr = champMgr.GetChampPKZoneMgr(zoneID) + if not pkZoneMgr: + return {} # 决赛 finalGroupMark = 2 @@ -2021,9 +2160,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 +2308,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 +2420,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 +2460,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 +2645,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 +2674,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 +2693,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 +2904,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 +2929,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) @@ -2800,6 +2971,8 @@ playerPack.FightPower = batPlayer.fightPower % ShareDefine.Def_PerPointValue playerPack.FightPowerEx = batPlayer.fightPower / ShareDefine.Def_PerPointValue playerPack.RealmLV = batPlayer.realmLV + playerPack.Face = batPlayer.face + playerPack.FacePic = batPlayer.facePic clientPack.PlayerList.append(playerPack) clientPack.PlayerCount = len(clientPack.PlayerList) @@ -2814,6 +2987,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 +3002,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 +3049,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 +3094,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 +3107,8 @@ if curPlayer: playerZoneID = champMgr.GetPlayerOfficialZoneID(curPlayer.GetPlayerID()) if playerZoneID != zoneID: + return + if not PlayerControl.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Championship): return clientPack = ChPyNetSendPack.tagGCChampionshipOfficialInfo() @@ -2945,6 +3132,8 @@ offPlayer.FightPower = offObj.fightPower % ShareDefine.Def_PerPointValue offPlayer.FightPowerEx = offObj.fightPower / ShareDefine.Def_PerPointValue offPlayer.RealmLV = offObj.realmLV + offPlayer.Face = offObj.face + offPlayer.FacePic = offObj.facePic offPack = ChPyNetSendPack.tagGCChampionshipOfficial() offPack.OfficialID = officialID @@ -2964,6 +3153,8 @@ applyPlayer.FightPower = fightPower % ShareDefine.Def_PerPointValue applyPlayer.FightPowerEx = fightPower / ShareDefine.Def_PerPointValue applyPlayer.RealmLV = playerInfo.get("RealmLV", 1) + applyPlayer.Face = playerInfo.get("Face", 0) + applyPlayer.FacePic = playerInfo.get("FacePic", 0) offPack.ApplyPlayerList.append(applyPlayer) offPack.ApplyPlayerCount = len(offPack.ApplyPlayerList) @@ -2982,6 +3173,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