diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index 8706a8230..f22838c4d 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -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 = 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 = _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 } diff --git a/game-server/app/services/gvg/gvgRecService.ts b/game-server/app/services/gvg/gvgRecService.ts index 19c02ac04..f6b48968e 100644 --- a/game-server/app/services/gvg/gvgRecService.ts +++ b/game-server/app/services/gvg/gvgRecService.ts @@ -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(); + 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) { diff --git a/game-server/app/util/routeUtil.ts b/game-server/app/util/routeUtil.ts index 6284723e4..f9a329fbb 100644 --- a/game-server/app/util/routeUtil.ts +++ b/game-server/app/util/routeUtil.ts @@ -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', diff --git a/shared/consts/constModules/chatConst.ts b/shared/consts/constModules/chatConst.ts index 75dc14511..e87bf858d 100644 --- a/shared/consts/constModules/chatConst.ts +++ b/shared/consts/constModules/chatConst.ts @@ -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', // 动态更新 } \ No newline at end of file diff --git a/shared/consts/constModules/gvgConst.ts b/shared/consts/constModules/gvgConst.ts index b4c7de384..b384778e5 100644 --- a/shared/consts/constModules/gvgConst.ts +++ b/shared/consts/constModules/gvgConst.ts @@ -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, // 玩家占领积分 } // 据点上的守卫类型 diff --git a/shared/consts/constModules/mailConst.ts b/shared/consts/constModules/mailConst.ts index 548d03fa9..7f4738abd 100644 --- a/shared/consts/constModules/mailConst.ts +++ b/shared/consts/constModules/mailConst.ts @@ -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 = '系统'; diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index 54ccd9b63..d5f04fd17 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -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] ]); diff --git a/shared/db/GVGRec.ts b/shared/db/GVGRec.ts index 43c391313..23ad43ddb 100644 --- a/shared/db/GVGRec.ts +++ b/shared/db/GVGRec.ts @@ -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; } } diff --git a/shared/domain/rank.ts b/shared/domain/rank.ts index b70c1fb31..2b2e100a1 100644 --- a/shared/domain/rank.ts +++ b/shared/domain/rank.ts @@ -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}`;