🐞 fix(gvg): 添加个人积分排行榜

This commit is contained in:
luying
2023-07-05 16:58:06 +08:00
parent 84e4f22af2
commit d4ec0ab92a
9 changed files with 103 additions and 7 deletions

View File

@@ -456,7 +456,7 @@ export async function redisAddBattleScore(gvgTeam: GVGTeamType, incScore: number
}
export async function redisAddSettleScore(gvgTeam: GVGTeamType, incScore: number) {
let { configId, groupKey, cityId, leagueCode, isRobot } = gvgTeam;
let { configId, groupKey, cityId, leagueCode, isRobot, roleId } = gvgTeam;
if(isRobot) return;
let nextWeek = <number>getTimeFun().getAfterDayWithHour(7);
@@ -467,6 +467,14 @@ export async function redisAddSettleScore(gvgTeam: GVGTeamType, incScore: number
let r2 = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupKey, cityId });
await r2.setExpire(nextWeek);
await r2.setRankWithLeagueInfo(leagueCode, incScore, Date.now(), null, true);
let r3 = new Rank(REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK, { configId, groupKey });
await r3.setExpire(nextWeek);
await r3.setRankWithRoleInfo(roleId, incScore, Date.now(), null, true)
let r4 = new Rank(REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK_BY_CITY, { configId, groupKey, cityId });
await r4.setExpire(nextWeek);
await r4.setRankWithRoleInfo(roleId, incScore, Date.now(), null, true)
}
export async function getSpineCnt() {
@@ -474,7 +482,7 @@ export async function getSpineCnt() {
return cnt? parseInt(cnt): 20;
}
// 获取排行榜
// 获取联军分城池排行榜
export async function getBattleRanksByCity(configId: number, groupKey: string, cityId: number, myLeague?: GVGLeagueType) {
let teamObj = getGVGBattleData(groupKey);
let pointByLeague = teamObj.findSettledPointMapByLeague(cityId);
@@ -496,6 +504,44 @@ export async function getBattleRanksByCity(configId: number, groupKey: string, c
return { ranks, myRank }
}
// 玩家进驻的积分排行榜
export async function getPlayerSettleRanksByCity(configId: number, groupKey: string, cityId: number, roleId?: string) {
let teamObj = getGVGBattleData(groupKey);
let r = new Rank(REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK_BY_CITY, { configId, groupKey, cityId });
r.setGenerFieldsFun((obj => {
if(obj instanceof RoleRankInfo) {
let pointIds = teamObj.rolePoints.get(obj.roleId)||[];
let incScore = 0;
for(let [pointId] of pointIds) incScore += gameData.gvgAreaPoint.get(pointId)?.score||0;
return { rank: obj.rank, roleId: obj.roleId, name: obj.roleName, score: obj.num, incScore }
}
return obj
}));
let { ranks, myRank } = await r.getRankListWithMyRank({ roleId });
if (roleId && !myRank) {
myRank = await r.generMyRankWithRole(roleId, 0, 0);
}
return { ranks, myRank }
}
// 玩家挑战的积分排行榜,按城池
export async function getPlayerRanksByCity(configId: number, groupKey: string, cityId: number, roleId?: string) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_USER_RANK_BY_CITY, { configId, groupKey, cityId });
r.setGenerFieldsFun((obj => {
if(obj instanceof RoleRankInfo) {
return { rank: obj.rank, roleId: obj.roleId, name: obj.roleName, score: obj.num }
}
return obj
}));
let { ranks, myRank } = await r.getRankListWithMyRank({ roleId });
if (roleId && !myRank) {
myRank = await r.generMyRankWithRole(roleId, 0, 0);
}
return { ranks, myRank }
}
// 每5秒一次结算
export async function gvgBattleSeconds() {
const { configId, period } = getGVGPeriodData();
@@ -538,7 +584,9 @@ export async function gvgBattleSeconds() {
// console.log('#### cityRank keys', JSON.stringify(keys), 'appid', pinus.app.getServerId())
for(let { groupKey, cityId } of keys) {
let { ranks } = await getBattleRanksByCity(configId, groupKey, cityId);
await sendMessageToGVGCityWithSuc(groupKey, cityId, PUSH_ROUTE.GVG_CITY_RANK_UPDATE, { cityId, ranks });
let { ranks: memberRanks } = await getPlayerRanksByCity(configId, groupKey, cityId);
let { ranks: memberSettleRanks } = await getPlayerSettleRanksByCity(configId, groupKey, cityId);
await sendMessageToGVGCityWithSuc(groupKey, cityId, PUSH_ROUTE.GVG_CITY_RANK_UPDATE, { cityId, ranks, memberRanks, memberSettleRanks });
}
}
@@ -579,6 +627,19 @@ export async function gvgBattleEnd() {
}
}
// 个人积分排行榜发放奖励
let playerSettleKeys = await findKeys(`${REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK}:${configId}:`);
for(let key of playerSettleKeys) {
let [,, groupKey] = key.split(':');
let r = new Rank(REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK, { configId, groupKey });
let ranks = await r.getRankByRange();
for(let _obj of ranks) {
let obj = <RoleRankInfo>_obj;
let dicRank = getGVGBattleRankReward(GVG_BATTLE_RANK_TYPE.PLAYER_SETTLE, obj.rank);
await sendMailByContent(MAIL_TYPE.GVG_BATTLE_PLAYER_SETTLE_RANK_REWARD, obj.roleId, { params: [`${obj.rank}`], goods: dicRank.reward }, dontSendReward);
}
}
}
interface SortCities { cityType: number, cityId: number, index: number, league: string, score: number };
@@ -760,6 +821,8 @@ export async function getBattleRank(redisKey: REDIS_KEY, keyParam: KeyNameParam,
myRank = await r.generMyRankWithRole(myId.roleId, 0, 0);
} else if (redisKey == REDIS_KEY.GVG_BATTLE_LEAGUE_RANK) {
myRank = await r.generMyRankWithLeague(myId.leagueCode, 0, 0);
} else if (redisKey == REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK) {
myRank = await r.generMyRankWithRole(myId.roleId, 0, 0);
}
}
return { ranks, myRank }