🐞 fix(gvg): 添加个人积分排行榜
This commit is contained in:
@@ -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 }
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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', // 动态更新
|
||||
}
|
||||
@@ -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, // 玩家占领积分
|
||||
}
|
||||
|
||||
// 据点上的守卫类型
|
||||
|
||||
@@ -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 = '系统';
|
||||
|
||||
@@ -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]
|
||||
]);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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}`;
|
||||
|
||||
Reference in New Issue
Block a user