diff --git a/game-server/app/services/pvpService.ts b/game-server/app/services/pvpService.ts index a99979fdd..f8f5e48f3 100644 --- a/game-server/app/services/pvpService.ts +++ b/game-server/app/services/pvpService.ts @@ -6,7 +6,7 @@ import { PVP_HERO_POS, REDIS_KEY, PVP_CONST, COUNTER, TASK_TYPE, MAIL_TYPE, TA_E import { dicPvpOpponent, DicPvpOpponent } from "../pubUtils/dictionary/DicPvpOpponent"; import { getRandSingleIndex, genCode, shouldRefresh, getChineseName, makeRobotId, robotIdComBack, getRandSingleEelm } from '../pubUtils/util'; import { pvpEndParamInter, RewardInter } from '../pubUtils/interface'; -import { gameData, getPLvByScore, getPvpHeroRewardsByScore, getPvpRankRewardsByRank, getPvpDifficultByScore, getPlvAndScore, getPvpBoxsBySeasonNum } from "../pubUtils/data"; +import { gameData, getPLvByScore, getPvpHeroRewardsByScore, getPvpRankRewardsByRank, getPvpDifficultByScore, getPlvAndScore, getPvpBoxsBySeasonNum, getPvpRankMaxRewardsBySeasonNum } from "../pubUtils/data"; import { PVP } from '../pubUtils/dicParam'; import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig' import { nowSeconds, getTimeFun } from '../pubUtils/timeUtil'; @@ -523,11 +523,13 @@ export async function generPVPOppRecInfo(isSuccess: boolean, curOpp: OppPlayer, let pvpConfig = await PVPConfigModel.findPVPConfig(seasonNum); if(pvpConfig.hasSettleReward) return; - console.log('exce pvpSeasonEnd' + pvpConfig.seasonNum); - let resultMaxRank = gameData.pvpRankMax.max;//根据排行榜的奖励表,获得最大排名挡位的最小值,其余不在结算中结算的玩家按照最大排名挡位在登录或进入pvp时结算 + console.log('exce pvpSeasonEnd ' + pvpConfig.seasonNum); + let resultMaxRank = getPvpRankMaxRewardsBySeasonNum(pvpConfig.seasonNum);//根据排行榜的奖励表,获得最大排名挡位的最小值,其余不在结算中结算的玩家按照最大排名挡位在登录或进入pvp时结算 + if(!resultMaxRank) return; + let r = new Rank(REDIS_KEY.PVP_RANK, { seasonNum: pvpConfig.seasonNum }, false, resultMaxRank.min - 1); let allRank = (await r.getRankByRange()); - // console.log('******** allRank', 0, resultMaxRank.min - 2, allRank) + console.log('******** allRank', 0, resultMaxRank.min - 2, allRank) for(let { rank, roleId } of allRank) { console.log('******** pvpSeasonEnd: ', rank, roleId); let pvpDefense = await PvpDefenseModel.findByRoleId(roleId); @@ -611,7 +613,7 @@ export async function savePvpSeasonResult(pvpDefense: PvpDefenseType, seasonNum: let r = new Rank(REDIS_KEY.PVP_RANK, { seasonNum }); rankLv = await r.getMyRank({ roleId: pvpDefense.roleId });// 获得排行榜排名 } - let pvpRankReward: DicRankRewads = getPvpRankRewardsByRank(rankLv); + let pvpRankReward: DicRankRewads = getPvpRankRewardsByRank(seasonNum, rankLv); let rankGoods: RewardInter[] = []; if (pvpRankReward) { rankGoods = pvpRankReward.reward;//排名奖励 diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index 2e317ca0c..7d5be5fbb 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -30,7 +30,7 @@ import { dicPvpOpponent, loadPvpOpponent } from './dictionary/DicPvpOpponent'; import { dicPvpTeamLevel, loadPvpTeamLevel } from './dictionary/DicPvpTeamLevel'; import { dicPvpRefreshConsume, maxPvpRefreshCnt, loadPvpRefreshConsume } from './dictionary/DicPvpRefreshConsume'; import { dicHeroRewads, loadPvpHeroReward } from './dictionary/DicPvpHeroReward'; -import { dicRankRewads, dicRankMax, loadPvpRankReward } from './dictionary/DicPvpRankReward'; +import { dicRankRewads, dicRankMax, loadPvpRankReward, DicRankRewads } from './dictionary/DicPvpRankReward'; import { DicPvpBox, dicPvpBoxesBySeasonNum, dicPvpBoxs, loadPvpBox } from './dictionary/DicPvpBox'; import { dicGuildAuth, loadGuildAuth } from './dictionary/DicGuildAuth'; import { dicCenterBase, dicEquipPriduceBase, dicBossBase, dicTrainBase, dicDonateBase, dicWishPoolBase, dicStoreBase, dicStructureConsume, dicBossBaseByBossLv, loadStructure } from "./dictionary/DicStructure"; @@ -468,14 +468,44 @@ function getMaxPvpHeroRewards() { }, gameData.pvpHeroRewards[0]) } -export function getPvpRankRewardsByRank(rankLv: number) { + +function getPvpRankRewardsBySeasonNum(seasonNum: number) { + if(gameData.pvpRankRewards.has(seasonNum)) { + return gameData.pvpRankRewards.get(seasonNum); + } else { + let result: DicRankRewads[] = []; + for(let [_seasonNum, ranks] of gameData.pvpRankRewards) { + result = ranks; + if(_seasonNum >= seasonNum) break; + } + return result + } +} + + +export function getPvpRankMaxRewardsBySeasonNum(seasonNum: number) { + if(gameData.pvpRankMax.has(seasonNum)) { + return gameData.pvpRankMax.get(seasonNum); + } else { + let result: DicRankRewads = undefined; + for(let [_seasonNum, max] of gameData.pvpRankMax) { + result = max; + if(_seasonNum >= seasonNum) break; + } + return result + } +} + +export function getPvpRankRewardsByRank(seasonNum: number, rankLv: number) { if(rankLv == 0) return null - for (let item of gameData.pvpRankRewards) { + let ranks = getPvpRankRewardsBySeasonNum(seasonNum)??[]; + + for (let item of ranks) { if ((item.max >= rankLv || item.max == -1) && rankLv >= item.min) { return item; } } - return gameData.pvpRankMax.max; + return getPvpRankMaxRewardsBySeasonNum(seasonNum); } function getPvpBoxKeysBySeasonNum(seasonNum: number) { @@ -507,10 +537,6 @@ export function getPvpBoxsBySeasonNum(seasonNum: number) { return result; } -export function getResultMaxRank() { - return gameData.pvpRankMax.max; -} - export function getStructureConsume(structureId: number, level: number) { return gameData.structureConsume.get(structureId).get(level); } @@ -659,7 +685,6 @@ export function getAuctionRewardByPoolId(poolId: number) { * @param rank 成员在军团内部排名 */ export function getCityActivityRewards(type: number, guildRank: number, rank: number) { - console.log('######## getCityActivityRewards', type, guildRank, rank); let ranksReward = gameData.cityActivityReward.get(type) || []; let dic = ranksReward.find(cur => { return cur.guildRank == guildRank && (rank >= cur.min && (rank <= cur.max || cur.max == 0)); diff --git a/shared/pubUtils/dictionary/DicPvpRankReward.ts b/shared/pubUtils/dictionary/DicPvpRankReward.ts index 4b79f2998..7f3f2efe3 100644 --- a/shared/pubUtils/dictionary/DicPvpRankReward.ts +++ b/shared/pubUtils/dictionary/DicPvpRankReward.ts @@ -4,6 +4,7 @@ import { RewardInter } from '../interface'; export interface DicRankRewads { readonly id: number; + readonly seasonNum: number; readonly min: number; readonly max: number; readonly reward: Array; @@ -11,20 +12,24 @@ export interface DicRankRewads { } -export const dicRankRewads = new Array(); -export const dicRankMax: { max: DicRankRewads } = { max: undefined }; +export const dicRankRewads = new Map(); +export const dicRankMax = new Map(); export function loadPvpRankReward() { - dicRankRewads.splice(0, dicRankRewads.length); - dicRankMax.max = undefined; + dicRankRewads.clear(); + dicRankMax.clear(); let arr = readFileAndParse(FILENAME.DIC_PVP_RANK_REWARD); arr.forEach(o => { o.reward = parseGoodStr(o.reward); - if (!dicRankMax.max || o.min > dicRankMax.max.min) { - dicRankMax.max = o; + if(!dicRankRewads.has(o.seasonNum)) { + dicRankRewads.set(o.seasonNum, []); + } + dicRankRewads.get(o.seasonNum).push(o); + + if (!dicRankMax.has(o.seasonNum) || o.min > dicRankMax.get(o.seasonNum).min) { + dicRankMax.set(o.seasonNum, o); } - dicRankRewads.push(o); }); arr = undefined; } \ No newline at end of file