From 82a9f8b4c10bb73b9b8f3716681379d4bafb79aa Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 29 八月 2024 15:50:19 +0800 Subject: [PATCH] 10256 【越南】【砍树】排行榜名次加入积分限制(仙匣秘境;古宝养成;boss历练) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py | 338 +++++++++++++++++++++++++++++++++----------------------- 1 files changed, 200 insertions(+), 138 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py index b9d120c..511c712 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerActBossTrial.py @@ -93,35 +93,54 @@ if not templateID: GameWorld.Log("本次活动没有个人榜奖励!") return - tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID) - if not tempIpyDataList: + billboardDataCount = billBoard.GetCount() + billBoard.Sort() + + GameWorld.Log("结算个人榜单奖励: billboardType=%s,templateID=%s,billboardDataCount=%s" % (billboardType, templateID, billboardDataCount)) + + orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", 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(" 发放boss历练个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" - % (rank, playerID, cmpValue, awardItemList, name2)) - - PlayerCompensation.SendMailByKey("BossTrialMail10", [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(" 发放boss历练个人榜单奖励: 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("BossTrialMail10", [playerID], finalAwardItemList, [playerRank]) + + orderCountTotal -= 1 + billboardIndex += 1 return @@ -132,69 +151,79 @@ if not familyTemplateID: GameWorld.Log("本次活动没有仙盟榜奖励!") return - tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", familyTemplateID) - if not tempIpyDataList: - return - - rankAwardDict = {} - for tempIpyData in tempIpyDataList: - rankAwardDict[tempIpyData.GetRank()] = [tempIpyData.GetAwardItemList(), tempIpyData.GetMemAwardItemList()] - - GameWorld.Log("结算仙盟榜单奖励: familyTemplateID=%s,rankAwardDict=%s" % (familyTemplateID, rankAwardDict)) + billboardDataCount = billBoard.GetCount() billBoard.Sort() + GameWorld.Log("结算仙盟榜单奖励: billboardType=%s,familyTemplateID=%s,billboardDataCount=%s" % (billboardType, familyTemplateID, billboardDataCount)) + + orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", familyTemplateID) + if not orderIpyDataList: + return + familyManager = GameWorld.GetFamilyManager() - for index in xrange(billBoard.GetCount()): - billBoardData = billBoard.At(index) - if not billBoardData: - continue + rankPre = 0 + billboardIndex = 0 + for ipyData in orderIpyDataList: + rank = ipyData.GetRank() + needScore = ipyData.GetNeedScore() + leaderAwardItemList = ipyData.GetAwardItemList() + memAwardItemList = ipyData.GetMemAwardItemList() + orderCountTotal = rank - rankPre # 奖励名次数量 + rankPre = rank - familyRank = index + 1 - awardInfo = GameWorld.GetOrderValueByDict(rankAwardDict, familyRank, False) - if not awardInfo: - break - leaderAwardItemList, memAwardItemList = awardInfo - - familyID = billBoardData.GetID() - cmpValue = billBoardData.GetCmpValue() - - family = familyManager.FindFamily(familyID) - if not family: - continue - - familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False) - if not familyActionData: - GameWorld.ErrLog("该仙盟没有提交凭证ActionData! familyID=%s" % familyID) - continue - awardState = GetFamilyAwardState(familyActionData) - awardIndex = 0 # 本服奖励状态索引 - if awardState&pow(2, awardIndex): - GameWorld.ErrLog("该仙盟本服榜奖励已发放! familyID=%s" % familyID) - continue - updAwardState = awardState|pow(2, awardIndex) - SetFamilyAwardState(familyActionData, updAwardState) - - memSubCountDict = GetFamilyMemSubCountDict(familyActionData) - - leaderID = family.GetLeaderID() - awardMemIDList = [] - for index in xrange(family.GetCount()): - member = family.GetAt(index) - memPlayerID = member.GetPlayerID() - if memPlayerID == leaderID: + for index in xrange(billboardIndex, billboardDataCount): + if orderCountTotal <= 0: + break + + billBoardData = billBoard.At(index) + familyID = billBoardData.GetID() + cmpValue = billBoardData.GetCmpValue() + + if cmpValue < needScore: + GameWorld.Log(" 不足该榜单所需提交数,跳过该名次: index=%s,rank=%s,familyID=%s,cmpValue=%s < %s" % (index, rank, familyID, cmpValue, needScore)) + break + + familyRank = rank - orderCountTotal + 1 + orderCountTotal -= 1 + billboardIndex += 1 + + family = familyManager.FindFamily(familyID) + if not family: continue - awardMemIDList.append(memPlayerID) - paramList = [familyRank] - if not leaderAwardItemList: - awardMemIDList.append(leaderID) - else: - PlayerCompensation.SendMailByKey("BossTrialFamilyLeader", [leaderID], leaderAwardItemList, paramList) + familyActionData = GetFamilyBossTrialSubmitActionData(familyID, False) + if not familyActionData: + GameWorld.ErrLog("该仙盟没有提交凭证ActionData! familyID=%s" % familyID) + continue + awardState = GetFamilyAwardState(familyActionData) + awardIndex = 0 # 本服奖励状态索引 + if awardState&pow(2, awardIndex): + GameWorld.ErrLog("该仙盟本服榜奖励已发放! familyID=%s" % familyID) + continue + updAwardState = awardState|pow(2, awardIndex) + SetFamilyAwardState(familyActionData, updAwardState) - PlayerCompensation.SendMailByKey("BossTrialFamilyMember", awardMemIDList, memAwardItemList, paramList) - GameWorld.Log("发放boss历练活动仙盟榜单奖励本服: familyID=%s,名次=%s,总提交个数=%s,updAwardState=%s,awardMemIDList=%s,memSubCountDict=%s" - % (familyID, familyRank, cmpValue, updAwardState, awardMemIDList, memSubCountDict)) - + memSubCountDict = GetFamilyMemSubCountDict(familyActionData) + + leaderID = family.GetLeaderID() + awardMemIDList = [] + for index in xrange(family.GetCount()): + member = family.GetAt(index) + memPlayerID = member.GetPlayerID() + if memPlayerID == leaderID: + continue + awardMemIDList.append(memPlayerID) + + paramList = [familyRank] + if not leaderAwardItemList: + awardMemIDList.append(leaderID) + else: + PlayerCompensation.SendMailByKey("BossTrialFamilyLeader", [leaderID], leaderAwardItemList, paramList) + + PlayerCompensation.SendMailByKey("BossTrialFamilyMember", awardMemIDList, memAwardItemList, paramList) + GameWorld.Log("发放boss历练活动仙盟榜单奖励本服: index=%s,rank=%s,familyID=%s,名次=%s,总提交个数=%s,updAwardState=%s,awardMemIDList=%s,memSubCountDict=%s" + % (index, rank, familyID, familyRank, cmpValue, updAwardState, awardMemIDList, memSubCountDict)) + return def MapServer_BossTrial(curPlayer, msgList): @@ -396,8 +425,20 @@ ipyData = IpyGameDataPY.GetIpyGameData("CrossActBossTrial", cfgID) if not ipyData: return - personlLimit, familyLimit = ipyData.GetRankLimitList() - + personlLimit, familyLimit = 0, 0 + + PersonalTemplateID = ipyData.GetPersonalTemplateID() + pRankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", PersonalTemplateID) if PersonalTemplateID else None + if pRankIpyDataList: + lastRankIpyData = pRankIpyDataList[-1] # 取最后一个为最低上榜积分限制 + personlLimit = lastRankIpyData.GetNeedScore() + + FamilyTemplateID = ipyData.GetFamilyTemplateID() + fRankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", FamilyTemplateID) if FamilyTemplateID else None + if fRankIpyDataList: + lastRankIpyData = fRankIpyDataList[-1] # 取最后一个为最低上榜积分限制 + familyLimit = lastRankIpyData.GetNeedScore() + playerID = playerInfo["playerID"] playerName = playerInfo["playerName"] job = playerInfo["job"] @@ -502,33 +543,48 @@ % (billboardType, zoneID, cfgID, templateID, billboardDataCount)) orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", 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 + + 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 + + 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(" 发放boss历练个人榜单奖励: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s" - % (rank, playerID, cmpValue, awardItemList, name2)) - PlayerCompensation.SendMailByKey("BossTrialCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True) - - orderCount += 1 - billboardIndex += 1 - + awardItemExList = scoreAwardEx[scoreEx] # 取最大满足条件的一档 + finalAwardItemList = awardItemList + awardItemExList + + playerRank = rank - orderCountTotal + 1 + GameWorld.Log(" 发放boss历练个人榜单奖励: 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("BossTrialCrossPlayer", [playerID], finalAwardItemList, [playerRank], crossMail=True) + + orderCountTotal -= 1 + billboardIndex += 1 + return def __GiveCrossOrderAwardFamily(cfgID, zoneID, templateID, billboardType): @@ -550,35 +606,41 @@ % (billboardType, zoneID, cfgID, templateID, billboardDataCount)) orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActBossTrialTemplate", templateID) - if orderIpyDataList: - awardFamilyList = [] - rankPre = 0 - billboardIndex = 0 - for ipyData in orderIpyDataList: - rank = ipyData.GetRank() - leaderAwardItemList = ipyData.GetAwardItemList() - memAwardItemList = ipyData.GetMemAwardItemList() - orderCountTotal = rank - rankPre # 奖励名次数量 - rankPre = rank - orderCount = 0 - - for index in xrange(billboardIndex, billboardDataCount): - if orderCount >= orderCountTotal: - break - - billboardData = billboardObj.At(index) - familyID = billboardData.ID - familySubmitTotal = billboardData.CmpValue - - familyRank = index + 1 - GameWorld.Log(" familyID=%s,名次=%s,总提交个数=%s" % (familyID, familyRank, familySubmitTotal)) - awardFamilyList.append([familyID, familyRank, familySubmitTotal, leaderAwardItemList, memAwardItemList]) - orderCount += 1 - billboardIndex += 1 - - # 广播子服发放奖励 - sendMsg = {"cfgID":cfgID, "zoneID":zoneID, "templateID":templateID, "awardFamilyList":awardFamilyList} - CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossTrialFamilyAward, sendMsg) + if not orderIpyDataList: + return + + awardFamilyList = [] + rankPre = 0 + billboardIndex = 0 + for ipyData in orderIpyDataList: + rank = ipyData.GetRank() + needScore = ipyData.GetNeedScore() + leaderAwardItemList = ipyData.GetAwardItemList() + memAwardItemList = ipyData.GetMemAwardItemList() + orderCountTotal = rank - rankPre # 奖励名次数量 + rankPre = rank + for index in xrange(billboardIndex, billboardDataCount): + if orderCountTotal <= 0: + break + + billboardData = billboardObj.At(index) + familyID = billboardData.ID + familySubmitTotal = billboardData.CmpValue + + if familySubmitTotal < needScore: + GameWorld.Log(" 不足该榜单所需提交数,跳过该名次: index=%s,rank=%s,familyID=%s,familySubmitTotal=%s < %s" % (index, rank, familyID, familySubmitTotal, needScore)) + break + + familyRank = rank - orderCountTotal + 1 + GameWorld.Log(" index=%s,rank=%s,familyID=%s,名次=%s,总提交个数=%s" % (index, rank, familyID, familyRank, familySubmitTotal)) + awardFamilyList.append([familyID, familyRank, familySubmitTotal, leaderAwardItemList, memAwardItemList]) + + orderCountTotal -= 1 + billboardIndex += 1 + + # 广播子服发放奖励 + sendMsg = {"cfgID":cfgID, "zoneID":zoneID, "templateID":templateID, "awardFamilyList":awardFamilyList} + CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_CrossBossTrialFamilyAward, sendMsg) return -- Gitblit v1.8.0