🐞 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 }

View File

@@ -1,6 +1,6 @@
// 动态
import { CHANNEL_PREFIX, GVG_REC_ID, GVG_REC_TYPE, GVG_RESOURCE_TYPE, MSG_SOURCE, MSG_TYPE } from "../../consts";
import { CHANNEL_PREFIX, GVG_REC_ID, GVG_REC_TYPE, GVG_RESOURCE_TYPE, MSG_SOURCE, MSG_TYPE, PUSH_ROUTE } from "../../consts";
import { GVGBattleRecType } from "../../db/GVGBattleRec";
import { GVGLeagueModel, GVGLeagueType } from "../../db/GVGLeague";
import { GVGRecModel, GVGRecUpdate } from "../../db/GVGRec";
@@ -8,6 +8,7 @@ import { GVGVestigeRecType } from "../../db/GVGVestigeRec";
import { gameData } from "../../pubUtils/data";
import { nowSeconds } from "../../pubUtils/timeUtil";
import { createGroupMsg, pushGroupMsgToRoom } from "../chatService";
import { sendMessageToUserWithSuc } from "../pushService";
import { getGVGConfig } from "./gvgService";
// 加入军团
@@ -96,6 +97,10 @@ export async function addBattleEndRec(rec: GVGBattleRecType) {
}
await GVGRecModel.addRecs(params.getUpdateParam());
let mapByRoleId = params.getMapByRoleId();
for(let [roleId, recs] of mapByRoleId) {
if(recs.length > 0) sendMessageToUserWithSuc(roleId, PUSH_ROUTE.GVG_REC_ADD, { recs });
}
}
class GVGRecUpArr {
@@ -122,6 +127,15 @@ class GVGRecUpArr {
public getUpdateParam() {
return this.arr;
}
public getMapByRoleId() {
let map = new Map<string, { recId: number, params: string[] }[]>();
for(let { roleId, recId, params } of this.arr) {
if(!map.has(roleId)) map.set(roleId, []);
map.get(roleId).push({ recId, params });
}
return map
}
}
function getPointName(pointId: number) {

View File

@@ -126,6 +126,7 @@ export async function guild(session: Session, msg: any, app: Application, cb: (e
'guild.gvgBattleHandler.checkMyTeam',
'guild.gvgBattleHandler.enterCity',
'guild.gvgBattleHandler.leaveCity',
'guild.gvgBattleHandler.getRankByCity',
'guild.gvgBattleHandler.getAreaOfMyTeam',
'guild.gvgBattleHandler.debugAddRobots',
'guild.gvgBattleHandler.debugMoveRobots',

View File

@@ -210,4 +210,5 @@ export const PUSH_ROUTE = {
GVG_TARGET_CITY_UPDATE: 'onGVGTargetCitiesUpdate', // 目标城池更新
GVG_NOTICE_UPDATE: 'onGVGNoticeUpdate', // 管理信息更新
PUBLIC_ACCOUNT_GIFT: 'onPublicAccountGift', // 公众号发送
GVG_REC_ADD: 'onGVGRecAdd', // 动态更新
}

View File

@@ -166,7 +166,8 @@ export const GVG_ROBOT = 'robot';
export enum GVG_BATTLE_RANK_TYPE {
PLAYER = 1,
GUILD = 2, // 废弃
LEAGUE = 3
LEAGUE = 3,
PLAYER_SETTLE = 4, // 玩家占领积分
}
// 据点上的守卫类型

View File

@@ -74,6 +74,7 @@ export enum MAIL_TYPE {
GVG_BOX_REWARD = 44, // 云台补发
MONTHLY_FUND = 45, // 补发月基金奖励
ARTIFACT_OVER = 46, // 宝物数量超过
GVG_BATTLE_PLAYER_SETTLE_RANK_REWARD = 47, // 激战期个人占领排行榜奖励
};
export const SEND_NAME = '系统';

View File

@@ -263,8 +263,11 @@ export enum REDIS_KEY {
GVG_VESTIGE_LEAGUE = 'vestigeLeague', // 联军所有遗迹积分
LEAGUE_INFO ="leagueInfo", // 联军信息
GVG_BATTLE_RANK ="gvgBattleUsr", // 激战期个人排行榜
GVG_BATTLE_USER_RANK_BY_CITY ="gvgBattleUsrByCity", // 激战期个人排行榜
GVG_BATTLE_LEAGUE_RANK = "gvgBattleLeague", // 激战期联军排行榜
GVG_BATTLE_LEAGUE_RANK_BY_CITY = "gvgBattleLeagueByCity", // 激战期联军排行榜
GVG_BATTLE_USR_SETTLE_RANK ="gvgBattleUsrSettle", // 激战期个人积分占领排行榜
GVG_BATTLE_USR_SETTLE_RANK_BY_CITY ="gvgBattleUsrSettleByCity", // 激战期个人积分占领排行榜按城池分
GVG_HISTORY_AREA ='gvgHisArea', // gvg激战期玩家加入的区域
GVG_HISTORY_AREA_TEAM ='gvgHisAreaTeam', // gvg激战期玩家加入的区域
GVG_HISTORY_CITY ='gvgHisCity', // gvg激战期玩家进入的城池
@@ -332,10 +335,16 @@ export function getInfoKeyByRedisKey(redisKey: REDIS_KEY) {
return { infoKey: REDIS_KEY.LEAGUE_INFO, extraKey: [] };
case REDIS_KEY.GVG_BATTLE_RANK: // 激战期玩家排行榜
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
case REDIS_KEY.GVG_BATTLE_USER_RANK_BY_CITY: // 激战期按城池分的玩家排行榜
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
case REDIS_KEY.GVG_BATTLE_LEAGUE_RANK: // 激战期联军排行榜
return { infoKey: REDIS_KEY.LEAGUE_INFO, extraKey: [] };
case REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY: // 激战期联军排行榜
return { infoKey: REDIS_KEY.LEAGUE_INFO, extraKey: [] };
case REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK: // 激战期玩家进驻排行榜
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
case REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK_BY_CITY: // 激战期按城池分的玩家进驻排行榜
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
case REDIS_KEY.ACTIVITY_MINI_GAME:
return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] };
default:
@@ -438,8 +447,11 @@ export const KEY_TO_COMPOSE_FIELD = new Map([
[REDIS_KEY.GVG_VESTIGE_LEAGUE, COMPOSE_FIELD_TYPE.LEAGUE],
[REDIS_KEY.LEAGUE_INFO, COMPOSE_FIELD_TYPE.LEAGUE],
[REDIS_KEY.GVG_BATTLE_RANK, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.GVG_BATTLE_USER_RANK_BY_CITY, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, COMPOSE_FIELD_TYPE.LEAGUE],
[REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, COMPOSE_FIELD_TYPE.LEAGUE],
[REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK_BY_CITY, COMPOSE_FIELD_TYPE.ROLE],
[REDIS_KEY.ACTIVITY_MINI_GAME, COMPOSE_FIELD_TYPE.ROLE]
]);

View File

@@ -63,8 +63,8 @@ export default class GVGRec extends BaseModel {
return result;
}
public static async findBattleRecByRole(configId: number, roleId: string, leagueCode: string) {
const result: GVGRecType[] = await GVGRecModel.find({ configId, roleId, leagueCode, type: GVG_REC_TYPE.BATTLE_BY_ROLE }, { _id: 0, recId: 1, params: 1, createTime: 1 }).sort({ createTime: -1 }).limit(50).lean();
public static async findBattleRecByRole(configId: number, roleId: string, leagueCode: string, limit = 50) {
const result: GVGRecType[] = await GVGRecModel.find({ configId, roleId, leagueCode, type: GVG_REC_TYPE.BATTLE_BY_ROLE }, { _id: 0, recId: 1, params: 1, createTime: 1 }).sort({ createTime: -1 }).limit(limit).lean();
return result;
}
}

View File

@@ -423,10 +423,13 @@ export class KeyName {
case REDIS_KEY.GVG_VESTIGE_LEAGUE:
return `${this.key}:${this.day}:${this.groupKey}`;
case REDIS_KEY.GVG_BATTLE_RANK:
case REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK:
return `${this.key}:${this.configId}:${this.groupKey}`;
case REDIS_KEY.GVG_BATTLE_LEAGUE_RANK:
return `${this.key}:${this.configId}:${this.groupKey}`;
case REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY:
case REDIS_KEY.GVG_BATTLE_USR_SETTLE_RANK_BY_CITY:
case REDIS_KEY.GVG_BATTLE_USER_RANK_BY_CITY:
return `${this.key}:${this.configId}:${this.groupKey}:${this.cityId}`;
case REDIS_KEY.ACTIVITY_MINI_GAME:
return `${this.key}:${this.activityId}:${this.roundIndex}`;