✨ feat(gvg): 激战期数据补充、排行榜等

This commit is contained in:
luying
2023-02-18 14:44:48 +08:00
parent f33ec1aff8
commit 77d04cb04b
11 changed files with 151 additions and 46 deletions
@@ -7,7 +7,7 @@ import { Application, BackendSession, ChannelService, HandlerService, pinus } fr
import { resResult, genCode } from "../../../pubUtils/util";
import { GVGLeagueModel } from '../../../db/GVGLeague';
import { checkGVGPeriod, getGroupIdOfServer, getGVGConfig, getGVGPeriodData, getGVGServerType } from '../../../services/gvg/gvgService';
import { addBattleRankScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanks, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage } from '../../../services/gvg/gvgBattleService';
import { redisAddBattleScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanksByCity, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage, getGVGCitiesInfo } from '../../../services/gvg/gvgBattleService';
import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory';
import { GVGBattleRecModel } from '../../../db/GVGBattleRec';
import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService';
@@ -15,7 +15,7 @@ import { gameData, getReviveGold } from '../../../pubUtils/data';
import { getAllServerName } from '../../../services/redisService';
import { checkBattleHeroesByHid } from '../../../services/normalBattleService';
import { SaveTeamParam, SaveTeamUpdateParam } from '../../../domain/gvgField/gvgDb';
import { GVG_AREA_TYPE, GVG_ITEM, ITEM_CHANGE_REASON, STATUS } from '../../../consts';
import { GVG_AREA_TYPE, GVG_ITEM, ITEM_CHANGE_REASON, REDIS_KEY, STATUS } from '../../../consts';
import { GVGHeroInfo } from '../../../domain/dbGeneral';
import { ArtifactModel } from '../../../db/Artifact';
import { getHeroesAttributes } from '../../../services/playerCeService';
@@ -25,6 +25,8 @@ import { GVGUserItemModel } from '../../../db/GVGUserItem';
import { handleGVGCost } from '../../../services/gvg/gvgItemService';
import { getGoldObject, handleCost } from '../../../services/role/rewardService';
import { GVGCityAreaPointModel } from '../../../db/GVGCityAreaPoint';
import { Rank } from '../../../services/rankService';
import { LeagueRankInfo, RoleRankInfo } from '../../../domain/rank';
export default function (app: Application) {
new HandlerService(app, {});
@@ -108,16 +110,20 @@ export class GVGBattleHandler {
// 获取城池信息
async getCity(msg: { cityId: number }, session: BackendSession) {
const serverId = session.get('serverId');
const guildCode = session.get('guildCode');
const { cityId } = msg;
let { configId, period } = getGVGPeriodData();
let { startFightTime, endFightTime } = getFightTimeByPeriod(period);
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
const city = await GVGCityModel.findOne({ configId, cityId }).lean();
const { guardLeague: leagueCode = '', guardLeagueName: name = '', guardLeagueIcon: icon = 0, players } = city;
const city = await GVGCityModel.findByCityId(configId, groupId, serverType, cityId);
const { guardLeague: leagueCode = '', guardLeagueName: name = '', guardLeagueIcon: icon = 0, players = [] } = city||{};
let ourTeamCnt = 0, oppTeamCnt = 0;
for(let { leagueCode, teamCnt } of players) {
@@ -206,7 +212,7 @@ export class GVGBattleHandler {
const recs = await GVGRecModel.findByCity(cityId, configId);
const teamResult = teams.map(team => new MyTeamInfo(team));
const { ranks, myRank } = await getBattleRanks(configId, groupId, serverType, cityId, myLeague);
const { ranks, myRank } = await getBattleRanksByCity(configId, groupId, serverType, cityId, myLeague);
await leaveGVGCityTeamChannel(roleId, sid);
await addRoleToGVGCityChannel(roleId, groupId, serverType, cityId, sid);
@@ -492,7 +498,8 @@ export class GVGBattleHandler {
}
if(defenseTeam.curTeamBreak) {
let attackScore = calBattleScoreByCe(isSuccess, defenseTeam.lineupCe);
await addBattleRankScore(attackTeam, attackScore);
attackTeam = await GVGTeamModel.addScore(attackTeam.teamCode, attackScore, 0);
await redisAddBattleScore(attackTeam, attackScore);
}
// 更新内存
@@ -547,7 +554,7 @@ export class GVGBattleHandler {
}
if(defenseTeam.curTeamBreak) {
let attackScore = calBattleScoreByCe(true, defenseTeam.lineupCe);
await addBattleRankScore(attackTeam, attackScore);
await redisAddBattleScore(attackTeam, attackScore);
}
// 更新内存
@@ -643,6 +650,33 @@ export class GVGBattleHandler {
return resResult(STATUS.SUCCESS, { cities: result });
}
// 排行榜
async getRanks(msg: {}, session: BackendSession) {
const serverId = session.get('serverId');
let { configId } = getGVGPeriodData();
let groupId = await getGroupIdOfServer(serverId);
let serverType = await getGVGServerType(serverId);
let cities = await getGVGCitiesInfo(configId, groupId, serverType);
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType });
let leagueRanksRaw = await r.getRankByRange();
let leagueRanks = leagueRanksRaw.map(obj => {
if(obj instanceof LeagueRankInfo) return { rank: obj.rank, name: obj.name, score: obj.num }
});
let r2 = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupId, serverType });
let memberRanksRaw = await r2.getRankByRange();
let memberRanks = memberRanksRaw.map(obj => {
if(obj instanceof RoleRankInfo) return { rank: obj.rank, name: obj.roleName, score: obj.num }
})
return resResult(STATUS.SUCCESS, {
cities, leagueRanks, memberRanks
})
}
async debugStartSchedule() {
await pinus.app.rpc.systimer.systimerRemote.gvgBattleStartSchedule.broadcast();
return resResult(STATUS.SUCCESS);
@@ -23,33 +23,42 @@ import { GVGCityAreaPointModel } from "../../db/GVGCityAreaPoint";
/**
* TODO 检查上周是否有占领城池
* 检查上周是否有占领城池
* @param league
* @returns boolean 是否占领
*/
export async function checkHasCities(league: GVGLeagueType) {
return false
let { configId } = getGVGConfig();
return await GVGCityModel.checkLeagueHasGuard(configId, league.leagueCode);
}
/**
* TODO 获取本联军上周占领的城池
* 获取本联军上周占领的城池
* @param league
* @returns number[] 城池id
*/
export async function getGVGCities(league: GVGLeagueType) {
return []
let { configId } = getGVGConfig();
let cities = await GVGCityModel.findGuardCityByLeague(configId, league.leagueCode, 'cityId');
return cities.map(city => city.cityId);
}
/**
* 获取当前城池状态
* @returns [{cityId: number, guardLeagueCode: string, guardLeagueName: string, teamCnt: number }]
*/
export async function getGVGCitiesInfo(configId: number, groupId: number, serverType: number, league: GVGLeagueType): Promise<{cityId: number, guardLeagueName: string, teamCnt: number }[]> {
let cities = await GVGCityModel.findGuardCityByLeague(configId, groupId, serverType);
export async function getGVGCitiesInfo(configId: number, groupId: number, serverType: number, league?: GVGLeagueType) {
let cities = await GVGCityModel.findGuardCity(configId, groupId, serverType);
let result: GVGCityMapInfo[] = [];
for(let city of cities) {
let players = (city.players||[]).filter(cur => cur.leagueCode == league.leagueCode);
let obj = new GVGCityMapInfo(city, players.length);
let obj = new GVGCityMapInfo(city);
if(league) {
let players = (city.players||[]).filter(cur => cur.leagueCode == league.leagueCode);
obj.setTeamCnt(players.length);
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType });
let score = await r.getMyScore({ leagueCode: league.leagueCode });
obj.setScore(score||0);
}
result.push(obj);
}
return result;
@@ -262,21 +271,29 @@ export async function catapultHurt() {
}
}
// 排行榜积分更新
export async function addBattleRankScore(gvgTeam: GVGTeamType, incScore: number) {
let { configId, groupId, serverType, cityId, roleId, leagueCode, isRobot } = gvgTeam;
// 战斗积分更新
export async function redisAddBattleScore(gvgTeam: GVGTeamType, incScore: number) {
let { configId, groupId, serverType, cityId, roleId, isRobot } = gvgTeam;
if(isRobot) return;
let r1 = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupId, serverType, cityId });
r1.setRankWithRoleInfo(roleId, incScore, Date.now(), null, true);
let r = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupId, serverType, cityId });
r.setRankWithRoleInfo(roleId, incScore, Date.now(), null, true);
}
let r2 = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId });
export async function redisAddSettleScore(gvgTeam: GVGTeamType, incScore: number) {
let { configId, groupId, serverType, cityId, leagueCode, isRobot } = gvgTeam;
if(isRobot) return;
let r1 = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType });
r1.setRankWithLeagueInfo(leagueCode, incScore, Date.now(), null, true);
let r2 = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType, cityId });
r2.setRankWithLeagueInfo(leagueCode, incScore, Date.now(), null, true);
}
// 获取排行榜
export async function getBattleRanks(configId: number, groupId: number, serverType: number, cityId: number, myLeague: GVGLeagueType) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId });
export async function getBattleRanksByCity(configId: number, groupId: number, serverType: number, cityId: number, myLeague: GVGLeagueType) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType, cityId });
r.setGenerFieldsFun((obj => {
if(obj instanceof LeagueRankInfo) {
return { rank: obj.rank, leagueCode: obj.code, leagueName: obj.name, score: obj.num }
@@ -302,8 +319,8 @@ export async function gvgBattleSeconds() {
for(let teamMem of teams) {
if(teamMem.isBroken || teamMem.durability <= 0) continue;
let addScore = gameData.gvgAreaPoint.get(teamMem.pointId)?.score||0;
let team = await GVGTeamModel.addScore(teamMem.teamCode, addScore);
await addBattleRankScore(team, addScore);
let team = await GVGTeamModel.addScore(teamMem.teamCode, 0, addScore);
await redisAddSettleScore(team, addScore);
}
// 向下推送区域数据
for(let areaId of teamObj.findAreas()) {
@@ -319,7 +336,7 @@ export async function gvgBattleSeconds() {
}
for(let { groupId, serverType, cityId } of keys) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId });
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType, cityId });
let rawRanks = await r.getRankByRange();
let ranks = rawRanks.map(obj => {
if(obj instanceof LeagueRankInfo) {
@@ -338,25 +355,41 @@ export async function gvgBattleEnd() {
let guardLeagueCnt = new Map<string, number>();
// 城池占领情况
let keys = await findKeys(`${REDIS_KEY.GVG_BATTLE_LEAGUE_RANK}:${configId}:`);
let keys = await findKeys(`${REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY}:${configId}:`);
let rankKeys = keys.map(key => {
let [,, _groupId, _serverType, _cityId] = key.split(':');
return { groupId: parseInt(_groupId), serverType: parseInt(_serverType), cityId: parseInt(_cityId) };
}).sort((a, b) => b.cityId - a.cityId);
for(let { groupId, serverType, cityId } of rankKeys) {
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId });
let dicCity = gameData.gvgCity.get(cityId);
if(!dicCity) continue;
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK_BY_CITY, { configId, groupId, serverType, cityId });
let ranks = await r.getRankByRange();
// 排名最高占领城池
for(let obj of ranks) {
let rank = <LeagueRankInfo>obj;
let cnt = guardLeagueCnt.get(rank.code)||0;
let rankInfo = <LeagueRankInfo>obj;
let cnt = guardLeagueCnt.get(rankInfo.code)||0;
if(cnt < GVG.GVG_CITY_OCCUPIED_NUMBER) {
await GVGCityModel.guardCity(configId, groupId, serverType, cityId, rank);
guardLeagueCnt.set(rank.code, cnt + 1);
await GVGCityModel.guardCity(configId, groupId, serverType, cityId, rankInfo);
let dicCityAdd = gameData.gvgCityAdd.get(dicCity.cityType);
await sendMailToLeagueByContent(MAIL_TYPE.GVG_GUARD_CITY_REWARD, rankInfo.code, { params: [dicCity.cityName], goods: dicCityAdd.occupyReward });
guardLeagueCnt.set(rankInfo.code, cnt + 1);
break;
}
}
}
// 联军排行榜发放奖励
let leagueKeys = await findKeys(`${REDIS_KEY.GVG_BATTLE_LEAGUE_RANK}:${configId}:`);
for(let key of leagueKeys) {
let [,, _groupId, _serverType] = key.split(':');
let groupId = parseInt(_groupId);
let serverType = parseInt(_serverType);
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType });
let ranks = await r.getRankByRange();
// 联军排行榜发放奖励
for(let _obj of ranks) {
let obj = <LeagueRankInfo>_obj;
@@ -368,11 +401,10 @@ export async function gvgBattleEnd() {
// 个人排行榜发放奖励
let playerKeys = await findKeys(`${REDIS_KEY.GVG_BATTLE_RANK}:${configId}:`);
for(let key of playerKeys) {
let [,, _groupId, _serverType, _cityId] = key.split(':');
let [,, _groupId, _serverType] = key.split(':');
let groupId = parseInt(_groupId);
let serverType = parseInt(_serverType);
let cityId = parseInt(_cityId);
let r = new Rank(REDIS_KEY.GVG_BATTLE_LEAGUE_RANK, { configId, groupId, serverType, cityId });
let r = new Rank(REDIS_KEY.GVG_BATTLE_RANK, { configId, groupId, serverType });
let ranks = await r.getRankByRange();
for(let _obj of ranks) {