From ee4705284b8064b4f3964dfd13c22386b7d5c20f Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 26 二月 2025 15:48:24 +0800 Subject: [PATCH] 10407 【越南】【英语】【BT】【GM】【砍树】周末BUG汇总(修复排行榜功能开启时同步开服活动榜数据异常bug;) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py | 227 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 165 insertions(+), 62 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py index 2e1255d..2c7442c 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActGubao.py @@ -26,10 +26,18 @@ import CrossBillboard import PyDataManager import CrossRealmMsg +import GameXiangong +import GameWorship import GameWorld -def OnActStart(actNum): +def OnActStart(actNum, ipyData): ## 活动开启 + if not ipyData: + return + personalTemplateID = ipyData.GetPersonalTemplateID() + if not personalTemplateID: + GameWorld.DebugLog("古宝养成活动没有榜单奖励,不处理OnActStart! actNum=%s" % (actNum)) + return PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAward % actNum, 0) PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_GubaoScore) return @@ -44,6 +52,20 @@ GameWorld.Log("=================================================================================") return +def OnActInStateRefresh(actNum, ipyData): + ## 活动中刷新,每次都需要刷新的逻辑,包含重读配置等 + if not ipyData: + return + personalTemplateID = ipyData.GetPersonalTemplateID() + if not personalTemplateID: + return + orderRuleList = GetOrderRuleList(personalTemplateID) + + billboardMgr = PlayerBillboard.GetBillboardMgr() + billboardObj = billboardMgr.GetBillboardObj(ShareDefine.Def_BT_GubaoScore) + billboardObj.SetOrderRuleList(orderRuleList) + return + def OnActJoinEnd(actNum, ipyData, dayIndex): ## 活动参与结束 __OnEndAward(actNum, ipyData, dayIndex) @@ -54,6 +76,10 @@ if not ipyData: return cfgID = ipyData.GetCfgID() + personalTemplateID = ipyData.GetPersonalTemplateID() + if not personalTemplateID: + GameWorld.DebugLog("古宝养成活动没有榜单奖励,不结算榜单奖励! actNum=%s" % (actNum)) + return awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActGubaoAward % actNum) if awardState: #已经结算过该活动 @@ -76,36 +102,55 @@ if not templateID: GameWorld.Log("本次活动没有个人榜奖励!") return - tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID) - if not tempIpyDataList: + billboardDataCount = billBoard.GetCount() + billBoard.Sort() + + GameWorld.Log("结算个人榜单奖励: billboardType=%s,templateID=%s,billboardDataCount=%s" % (billboardType, templateID, billboardDataCount)) + + orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID) + if not orderIpyDataList: return - rankAwardDict = {} - for tempIpyData in tempIpyDataList: - rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList() + rankPre = 0 + billboardIndex = 0 + for ipyData in orderIpyDataList: + rank = ipyData.GetRank() + needScore = ipyData.GetNeedScore() + scoreAwardEx = ipyData.GetScoreAwardEx() + scoreAwardExList = scoreAwardEx.keys() + scoreAwardExList.sort() + awardItemList = ipyData.GetAwardItemList() + orderCountTotal = rank - rankPre # 奖励名次数量 + rankPre = rank - GameWorld.Log("结算个人榜单奖励: templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict)) - billBoard.Sort() - for index in xrange(billBoard.GetCount()): - billBoardData = billBoard.At(index) - if not billBoardData: - continue - - rank = index + 1 - - awardItemList = GameWorld.GetOrderValueByDict(rankAwardDict, rank, False) - if not awardItemList: - break - - playerID = billBoardData.GetID() - name2 = billBoardData.GetName2() - cmpValue = billBoardData.GetCmpValue() - - GameWorld.Log(" 发放古宝养成个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" - % (rank, playerID, cmpValue, awardItemList, name2)) - - PlayerCompensation.SendMailByKey("ActGubaoPlayer", [playerID], awardItemList, [rank]) - + for index in xrange(billboardIndex, billboardDataCount): + if orderCountTotal <= 0: + break + + billBoardData = billBoard.At(index) + playerID = billBoardData.GetID() + name2 = billBoardData.GetName2() + cmpValue = billBoardData.GetCmpValue() + + if cmpValue < needScore: + GameWorld.Log(" 积分不足该榜单所需积分,跳过该名次: index=%s,rank=%s,playerID=%s,cmpValue=%s < %s" % (index, rank, playerID, cmpValue, needScore)) + break + + awardItemExList = [] + for scoreEx in scoreAwardExList: + if cmpValue < scoreEx: + break + awardItemExList = scoreAwardEx[scoreEx] # 取最大满足条件的一档 + finalAwardItemList = awardItemList + awardItemExList + + playerRank = rank - orderCountTotal + 1 + GameWorld.Log(" 发放古宝养成个人榜单奖励: index=%s,rank=%s,playerRank=%s,playerID=%s,cmpValue=%s,awardItemList=%s,scoreAwardEx=%s,finalAwardItemList=%s, %s" + % (index, rank, playerRank, playerID, cmpValue, awardItemList, scoreAwardEx, finalAwardItemList, name2)) + PlayerCompensation.SendMailByKey("ActGubaoPlayer", [playerID], finalAwardItemList, [playerRank]) + + orderCountTotal -= 1 + billboardIndex += 1 + return def MapServer_Gubao(curPlayer, msgList): @@ -131,13 +176,18 @@ accID = curPlayer.GetAccID() playerName = curPlayer.GetName() job = curPlayer.GetJob() + face = curPlayer.GetFace() + facePic = curPlayer.GetFacePic() realmLV = curPlayer.GetOfficialRank() - _, updScore = dataMsg + _, updScore, isRelationCrossAct = dataMsg - #同步跨服 - playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV, - "playerScore":updScore} - SyncGubaoToCrossServer(curPlayer, playerInfo) + # 仙盟榜... + + if isRelationCrossAct: + #同步跨服 + playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV, + "playerScore":updScore, "face":face, "facePic":facePic} + SyncGubaoToCrossServer(curPlayer, playerInfo) return def SyncGubaoToCrossServer(curPlayer, playerInfo): @@ -175,7 +225,12 @@ ipyData = IpyGameDataPY.GetIpyGameData("CrossActGubao", cfgID) if not ipyData: return - personlLimit = ipyData.GetRankLimitPersonal() + PersonalTemplateID = ipyData.GetPersonalTemplateID() + rankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", PersonalTemplateID) + if not rankIpyDataList: + return + lastRankIpyData = rankIpyDataList[-1] # 取最后一个为最低上榜积分限制 + personlLimit = lastRankIpyData.GetNeedScore() playerID = playerInfo["playerID"] playerName = playerInfo["playerName"] @@ -183,13 +238,15 @@ accID = playerInfo["accID"] realmLV = playerInfo["realmLV"] playerScore = playerInfo["playerScore"] + face = playerInfo.get("face", 0) + facePic = playerInfo.get("facePic", 0) groupValue1 = zoneID if playerScore >= personlLimit: name2, type2, value1, value2 = accID, job, realmLV, 0 CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_GubaoScore, groupValue1, playerID, playerName, - name2, type2, value1, value2, playerScore) + name2, type2, value1, value2, playerScore, autoSort=False, value3=face, value4=facePic) return def OnCrossActIDChange(cfgID, zoneID, ipyData, state): @@ -226,6 +283,28 @@ GameWorld.Log("=================================================================================") return +def OnCrossActInStateRefresh(cfgID, zoneID, ipyData): + ## 活动中刷新,每次都需要刷新的逻辑,包含重读配置等 + if not ipyData: + return + PersonalTemplateID = ipyData.GetPersonalTemplateID() + orderRuleList = GetOrderRuleList(PersonalTemplateID) + + groupValue1 = zoneID + billboardMgr = PyDataManager.GetCrossBillboardManager() + billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_GubaoScore, groupValue1) + billboardObj.SetOrderRuleList(orderRuleList) + return + +def GetOrderRuleList(templateID): + orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID) + if not orderIpyDataList: + return + orderRuleList = [] + for ipyData in orderIpyDataList: + orderRuleList.append([ipyData.GetRank(), ipyData.GetNeedScore()]) + return orderRuleList + def OnCrossActJoinEnd(cfgID, zoneID, ipyData): ## 跨服活动参与结束 __OnCrossEndAward(cfgID, zoneID, ipyData) @@ -243,12 +322,13 @@ GameWorld.Log("=== 跨服古宝养成活动发放榜单奖励! === cfgID=%s,zoneID=%s" % (cfgID, zoneID)) PersonalTemplateID = ipyData.GetPersonalTemplateID() + serverIDRangeList = ipyData.GetServerIDRangeList() - __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_GubaoScore) + __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_GubaoScore, serverIDRangeList) GameWorld.Log("=================================================================================") return -def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType): +def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType, serverIDRangeList): groupValue1 = zoneID billboardMgr = PyDataManager.GetCrossBillboardManager() @@ -266,32 +346,55 @@ % (billboardType, zoneID, cfgID, templateID, billboardDataCount)) orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActGubaoBillTemp", templateID) - if orderIpyDataList: - rankPre = 0 - billboardIndex = 0 - for ipyData in orderIpyDataList: - rank = ipyData.GetRank() - awardItemList = ipyData.GetAwardItemList() - orderCountTotal = rank - rankPre # 奖励名次数量 - rankPre = rank - orderCount = 0 + if not orderIpyDataList: + return + + worshipType = ShareDefine.Def_WorshipType_CrossGubaoTrain + syncNewWorshipList = [] + syncNewXiangongDict = {} + rankPre = 0 + billboardIndex = 0 + for ipyData in orderIpyDataList: + rank = ipyData.GetRank() + needScore = ipyData.GetNeedScore() + scoreAwardEx = ipyData.GetScoreAwardEx() + scoreAwardExList = scoreAwardEx.keys() + scoreAwardExList.sort() + awardItemList = ipyData.GetAwardItemList() + xiangongID = ipyData.GetXiangongID() + orderCountTotal = rank - rankPre # 奖励名次数量 + rankPre = rank + + for index in xrange(billboardIndex, billboardDataCount): + if orderCountTotal <= 0: + break - for index in xrange(billboardIndex, billboardDataCount): - if orderCount >= orderCountTotal: + billboardData = billboardObj.At(index) + playerID = billboardData.ID + name2 = billboardData.Name2 + cmpValue = billboardData.CmpValue + if cmpValue < needScore: + GameWorld.Log(" 积分不足该榜单所需积分,跳过该名次: index=%s,rank=%s,playerID=%s,cmpValue=%s < %s" % (index, rank, playerID, cmpValue, needScore)) + break + + awardItemExList = [] + for scoreEx in scoreAwardExList: + if cmpValue < scoreEx: break - - billboardData = billboardObj.At(index) - playerID = billboardData.ID - name2 = billboardData.Name2 - cmpValue = billboardData.CmpValue - - playerRank = index + 1 - GameWorld.Log(" 发放古宝养成个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" - % (rank, playerID, cmpValue, awardItemList, name2)) - PlayerCompensation.SendMailByKey("ActGubaoCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True) - - orderCount += 1 - billboardIndex += 1 - + awardItemExList = scoreAwardEx[scoreEx] # 取最大满足条件的一档 + finalAwardItemList = awardItemList + awardItemExList + + playerRank = rank - orderCountTotal + 1 + GameWorld.Log(" 发放古宝养成个人榜单奖励: index=%s,rank=%s,playerRank=%s,playerID=%s,cmpValue=%s,awardItemList=%s,scoreAwardEx=%s,finalAwardItemList=%s, %s" + % (index, rank, playerRank, playerID, cmpValue, awardItemList, scoreAwardEx, finalAwardItemList, name2)) + PlayerCompensation.SendMailByKey("ActGubaoCrossPlayer", [playerID], finalAwardItemList, [playerRank], crossMail=True) + + orderCountTotal -= 1 + billboardIndex += 1 + + GameXiangong.AddXiangongPlayer(xiangongID, playerID, serverIDRangeList, playerRank, syncNewXiangongDict) + GameWorship.AddWorshipPlayer(worshipType, playerRank, playerID, serverIDRangeList, syncList=syncNewWorshipList) + GameWorship.SendNewWorshipPlayer(syncNewWorshipList) + GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict) return -- Gitblit v1.8.0