From 8a14b5bd4815514cff0151a2d1a083dd7d8743bb Mon Sep 17 00:00:00 2001 From: luying Date: Tue, 21 Feb 2023 14:52:36 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20fix(gvg):=20=E4=BF=AE=E5=A4=8Dgv?= =?UTF-8?q?g=E6=BF=80=E6=88=98=E6=9C=9Fbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servers/guild/handler/gvgBattleHandler.ts | 4 +- .../app/services/gvg/gvgBattleService.ts | 1 + .../app/services/gvg/gvgFightService.ts | 2 +- game-server/app/services/gvg/gvgRecService.ts | 47 ++++++++++--------- game-server/app/services/gvg/gvgService.ts | 25 ++++++---- game-server/app/services/timeTaskService.ts | 13 ++++- shared/consts/constModules/gvgConst.ts | 1 + shared/consts/constModules/sysConst.ts | 3 ++ shared/consts/statusCode.ts | 1 + shared/db/GVGBattleRec.ts | 10 +++- shared/domain/gvgField/returnData.ts | 2 +- 11 files changed, 71 insertions(+), 38 deletions(-) diff --git a/game-server/app/servers/guild/handler/gvgBattleHandler.ts b/game-server/app/servers/guild/handler/gvgBattleHandler.ts index ead1a0920..97d8f5b1e 100644 --- a/game-server/app/servers/guild/handler/gvgBattleHandler.ts +++ b/game-server/app/servers/guild/handler/gvgBattleHandler.ts @@ -346,7 +346,7 @@ export class GVGBattleHandler { await addRoleToAreaTeamChannel(roleId, groupKey, areaId, sid); await pushTeamMoveMessage(team); - return resResult(STATUS.SUCCESS, { areaId, cityId, stopMoveTime: team.stopMoveTime }); + return resResult(STATUS.SUCCESS, { areaId, cityId, stopMoveTime: team.stopMoveTime, moveCdTime: team.moveCdTime }); } // 停止移动 @@ -495,7 +495,7 @@ export class GVGBattleHandler { let teamObj = getGVGBattleData(groupKey); teamObj.battleEnd([attackTeam, defenseTeam]); // 更新rec - let rec = await GVGBattleRecModel.battleEnd(battleCode, isSuccess); + let rec = await GVGBattleRecModel.battleEnd(battleCode, isSuccess, attackTeam, defenseTeam); await battleEndSendMessage(groupKey, cityId, defenseTeam, attackTeam); addBattleEndRec(rec); diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index 7b564a9d7..a0a4e88de 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -87,6 +87,7 @@ export function checkMoveStatus(team: GVGTeamType, cityId: number, areaId: numbe if(team.cityId != cityId) return STATUS.GVG_BATTLE_IS_NOT_IN_CITY; if(team.pointId > 0) return STATUS.GVG_BATTLE_TEAM_IS_SELLTED; if(team.stopMoveTime > nowSeconds()) return STATUS.GVG_BATTLE_IS_MOVING; + if(team.moveCdTime > nowSeconds()) return STATUS.GVG_BATTLE_IS_MOVING_CD; let dicArea = gameData.gvgArea.get(areaId); if(!dicArea) return STATUS.DIC_DATA_NOT_FOUND; if(dicArea.relateArea.indexOf(team.areaId) == -1) return STATUS.GVG_BATTLE_AREA_NOT_RELATE; diff --git a/game-server/app/services/gvg/gvgFightService.ts b/game-server/app/services/gvg/gvgFightService.ts index ed422796b..80f205cd0 100644 --- a/game-server/app/services/gvg/gvgFightService.ts +++ b/game-server/app/services/gvg/gvgFightService.ts @@ -397,7 +397,7 @@ export async function saveVestigeRankSchedule() { let r = new Rank(REDIS_KEY.GVG_VESTIGE_LEAGUE, { groupKey, day}); let ranks = await r.getRankByRangeRaw(); await GVGVestigeLeagueRankModel.saveRank(groupKey, ranks); - await addVestigeLeagueRankRec(config.configId, ranks); + await addVestigeLeagueRankRec(config.configId, groupKey, ranks); } let memberKeys = await findKeys(`${REDIS_KEY.GVG_VESTIGE_MEMBER_ALL}:${day}:`); diff --git a/game-server/app/services/gvg/gvgRecService.ts b/game-server/app/services/gvg/gvgRecService.ts index 231b8f412..bcdd8f908 100644 --- a/game-server/app/services/gvg/gvgRecService.ts +++ b/game-server/app/services/gvg/gvgRecService.ts @@ -42,13 +42,13 @@ function getResourceNameByType(resourceType: GVG_RESOURCE_TYPE) { export async function addVestigeBattleEndRec(rec: GVGVestigeRecType) { if(!rec) return; - let { configId, vestigeId } = rec; + let { configId, vestigeId, groupKey } = rec; let vestigeName = gameData.gvgVestigeName.get(vestigeId); if(rec.defenseInfo && rec.defenseInfo.isRobot) { // 对手是机器人,驻扎动态 let { roleId, roleName, leagueCode, newRank, isSuccess } = rec.attackInfo; if(isSuccess) { let params = [ roleName, vestigeName, `第${newRank}名`]; - await GVGRecModel.addRec({ roleId, leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.SETTLE_POINT, createTime: nowSeconds(), params }); + await GVGRecModel.addRec({ roleId, leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.SETTLE_POINT, createTime: nowSeconds(), params }); } } if(rec.defenseInfo && !rec.defenseInfo.isRobot && rec.attackInfo.leagueCode != rec.defenseInfo.leagueCode) { @@ -56,36 +56,39 @@ export async function addVestigeBattleEndRec(rec: GVGVestigeRecType) { let { roleId, leagueCode, roleName } = rec.defenseInfo; if(isSuccess) { let params = [ roleName, vestigeName, `第${newRank}名`, leagueName]; - await GVGRecModel.addRec({ roleId, leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.POINT_BE_GRAB, createTime: nowSeconds(), params }); + await GVGRecModel.addRec({ roleId, leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.POINT_BE_GRAB, createTime: nowSeconds(), params }); } } } -export async function addVestigeLeagueRankRec(configId: number, ranks: { rank: number, field: string }[]) { +export async function addVestigeLeagueRankRec(configId: number, groupKey: string, ranks: { rank: number, field: string }[]) { await GVGRecModel.addRecs(ranks.map(({ rank, field: leagueCode }) => { let params = [ `第${rank}名`]; - return { leagueCode, configId, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.VESTIGE_RANK, createTime: nowSeconds(), params }; + return { leagueCode, configId, groupKey, type: GVG_REC_TYPE.PREPARE, recId: GVG_REC_ID.VESTIGE_RANK, createTime: nowSeconds(), params }; })); } export async function addBattleEndRec(rec: GVGBattleRecType) { - let { isSuccess, attackTeam, defenseTeam, configId } = rec; + let { isSuccess, attackTeamAfter: attackTeam, defenseTeamAfter: defenseTeam, configId, groupKey } = rec; let { roleId, leagueCode, cityId, index, curTeamBreak, originPointId } = defenseTeam; - if(!defenseTeam.isRobot) { // 防守的不是机器 - if(isSuccess) { - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_BE_HIT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`] }); - if(curTeamBreak && originPointId > 0 ) { - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_LOST_POINT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`, getPointName(originPointId)] }); - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_OCCUPY_CHANGE, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `${defenseTeam.roleName}`, getPointName(originPointId)] }); - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_OCCUPY_CHANGE, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `${defenseTeam.roleName}`, getPointName(originPointId)] }); + if(isSuccess) { + if(!defenseTeam.isRobot) { + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_BE_HIT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`] }); + } + if(curTeamBreak && originPointId > 0 ) { + if(!defenseTeam.isRobot) { + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_LOST_POINT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`, getPointName(originPointId)] }); } - } else { - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_GUARD_SUCCESS, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`] }); - + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_OCCUPY_CHANGE, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `${defenseTeam.roleName}`, getPointName(originPointId)] }); + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_OCCUPY_CHANGE, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `${defenseTeam.roleName}`, getPointName(originPointId)] }); + } + } else { + if(!defenseTeam.isRobot) { + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_ROLE, recId: GVG_REC_ID.TEAM_GUARD_SUCCESS, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, `队伍${index}`] }); } } if(defenseTeam.isRobot && defenseTeam.isCatapult) { - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_CATAPULT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, getCityName(cityId)] }); + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_CATAPULT, createTime: nowSeconds(), params: [`${attackTeam.roleName}`, getCityName(cityId)] }); } } @@ -103,12 +106,12 @@ function getCityName(cityId: number) { } export async function addTeamSettleRec(team: GVGTeamType) { - let { roleId, roleName, leagueCode, configId, cityId, pointId } = team; - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] }); - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] }); + let { roleId, roleName, leagueCode, configId, cityId, pointId, groupKey } = team; + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_CITY, recId: GVG_REC_ID.CITY_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] }); + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_SETTLE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] }); } export async function addTeamLeaveRec(team: GVGTeamType, pointId: number) { - let { roleId, roleName, leagueCode, configId, cityId } = team; - await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_LEAVE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] }); + let { roleId, roleName, leagueCode, configId, cityId, groupKey } = team; + await GVGRecModel.addRec({ roleId, leagueCode, configId, cityId, groupKey, type: GVG_REC_TYPE.BATTLE_BY_LEAGUE, recId: GVG_REC_ID.LEAGUE_TEAM_LEAVE, createTime: nowSeconds(), params: [`${roleName}`, getPointName(pointId)] }); } \ No newline at end of file diff --git a/game-server/app/services/gvg/gvgService.ts b/game-server/app/services/gvg/gvgService.ts index 521181ad8..48c29572a 100644 --- a/game-server/app/services/gvg/gvgService.ts +++ b/game-server/app/services/gvg/gvgService.ts @@ -80,11 +80,14 @@ export async function setGVGConfig(config?: GVGConfigType) { if(!config) { config = await GVGConfigModel.findConfig(); } - pinus.app.set('gvgConfigId', config.configId); - pinus.app.set('gvgTeamTime', config.teamTime); - pinus.app.set('gvgPrepareTime', config.prepareTime); - pinus.app.set('gvgBattleTime', config.battleTime); - pinus.app.set('gvgScheduleTime', config.scheduleTime); + if(config.teamTime > nowSeconds()) { + config = null; + } + pinus.app.set('gvgConfigId', config?.configId||0); + pinus.app.set('gvgTeamTime', config?.teamTime||0); + pinus.app.set('gvgPrepareTime', config?.prepareTime||0); + pinus.app.set('gvgBattleTime', config?.battleTime||0); + pinus.app.set('gvgScheduleTime', config?.scheduleTime||0); } /** @@ -138,18 +141,22 @@ export function getGVGPeriodData() { countdownTime = scheduleTime; break; } } + + console.log('######## getGVGPeriodData', configId, teamTime, prepareTime, battleTime, scheduleTime) return { configId, period, countdownTime }; } export function getCurPeriod() { - let { teamTime, prepareTime, battleTime } = getGVGConfig(); + let { teamTime, prepareTime, battleTime, scheduleTime } = getGVGConfig(); let now = nowSeconds(); if(now >= teamTime && now < prepareTime) { return GVG_PERIOD.TEAM; } else if (now >= prepareTime && now < battleTime) { return GVG_PERIOD.PREPARE; - } else { + } else if (now >= battleTime && now < scheduleTime){ return GVG_PERIOD.BATTLE; + } else { + return GVG_PERIOD.NO; } } @@ -204,7 +211,7 @@ export async function getGVGInfoInGuild(roleId: string, guild: GuildType) { let { configId, period, countdownTime } = getGVGPeriodData(); let type = await getGVGServerType(serverId); - if(hasLeague) { + if(hasLeague && configId > 0) { return { hasLeague, configId, period, countdownTime, @@ -257,7 +264,7 @@ export async function getMainData(roleId: string, leagueCode: string, configId: let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, league.leagueCode); data.setLeagueParpare(leaguePrepare); - data.setTechQueue(leaguePrepare.techQueue); + data.setTechQueue(leaguePrepare?.techQueue||[]); let userData = await GVGUserDataModel.findByRole(configId, league.leagueCode, roleId); let items = await GVGUserItemModel.findByRole(configId, league.leagueCode, roleId); diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 8c8c91321..b25b50401 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -905,6 +905,9 @@ export async function initGVGConfigSchedule() { config = await createNewGVGConfig(); } + scheduleJob(`gvgTeam`, config.teamTime * 1000, async () => { + await pinus.app.rpc.guild.guildRemote.setGVGConfig.broadcast(config); + }) scheduleJob(`gvgConfig`, config.scheduleTime * 1000, createNewGVGConfig); if(nowSeconds() > config.prepareTime) { @@ -917,7 +920,11 @@ export async function initGVGConfigSchedule() { let { startFightTime, endFightTime } = getFightTimeByPeriod(GVG_PERIOD.BATTLE, config.battleTime); - scheduleJob(`gvgBattleStartSchedule`, startFightTime * 1000, gvgBattleStartSchedule); + if(nowSeconds() > startFightTime && nowSeconds() < endFightTime) { + startGvgBattleSeconds(); + } else { + scheduleJob(`gvgBattleStartSchedule`, startFightTime * 1000, gvgBattleStartSchedule); + } scheduleJob(`gvgBattleEndSchedule`, endFightTime * 1000, gvgBattleEndSchedule); } @@ -931,6 +938,10 @@ export async function gvgBattleStartSchedule() { if(guildServers.length > 0) { pinus.app.rpc.guild.guildRemote.gvgBattleStart.toServer(getRandSingleEelm(guildServers).id); } + startGvgBattleSeconds(); +} + +function startGvgBattleSeconds() { // 发放道具 if(gvgBattleSecondJob) gvgBattleSecondJob.cancel(); gvgBattleSecondJob = scheduleJob('gvgBattleSecondJob', '*/5 * * * * *', gvgBattleSecondSchedule); diff --git a/shared/consts/constModules/gvgConst.ts b/shared/consts/constModules/gvgConst.ts index bfbd11412..6c53e0dff 100644 --- a/shared/consts/constModules/gvgConst.ts +++ b/shared/consts/constModules/gvgConst.ts @@ -1,4 +1,5 @@ export enum GVG_PERIOD { + NO = 0, // 什么期都不是 TEAM = 1, // 组建期 PREPARE = 2, // 备战期 BATTLE = 3, // 战斗器 diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index ea5c38771..2e6f441bf 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -325,6 +325,9 @@ export function getInfoKeyByRedisKey(redisKey: REDIS_KEY) { 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: [] }; + default: return { infoKey: REDIS_KEY.USER_INFO, extraKey: [] }; } diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index eebedc412..f44496eba 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -380,6 +380,7 @@ export const STATUS = { GVG_POINT_HAS_SETTLED: { code: 21416, simStr: '该据点已经有其他队伍驻守' }, GVG_POINT_NOT_AREA: { code: 21417, simStr: '您不在该积分点所在区域' }, GVG_TEAM_NOT_NEED_REVIVE: { code: 21418, simStr: '此队伍不需要复活' }, + GVG_BATTLE_IS_MOVING_CD: { code: 21403, simStr: '移动冷却中' }, // 通用 30000 - 30099 DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' }, diff --git a/shared/db/GVGBattleRec.ts b/shared/db/GVGBattleRec.ts index 4506b279d..726a1e8dd 100644 --- a/shared/db/GVGBattleRec.ts +++ b/shared/db/GVGBattleRec.ts @@ -82,6 +82,12 @@ export default class GVGBattleRec extends BaseModel { @prop({ required: true, type: TeamInfo, _id: false }) defenseTeam: TeamInfo; // 防守队伍 + @prop({ required: true, type: TeamInfo, _id: false }) + attackTeamAfter: TeamInfo; // 挑战队伍 + + @prop({ required: true, type: TeamInfo, _id: false }) + defenseTeamAfter: TeamInfo; // 防守队伍 + @prop({ required: true }) isSuccess: boolean; @@ -99,8 +105,8 @@ export default class GVGBattleRec extends BaseModel { return result; } - public static async battleEnd(battleCode: string, isSuccess: boolean) { - const result: GVGBattleRecType = await GVGBattleRecModel.findOneAndUpdate({ battleCode }, { $set: { isSuccess, battleEndTime: nowSeconds() } }, { new: true }).lean(); + public static async battleEnd(battleCode: string, isSuccess: boolean, attackTeam: GVGTeamType, defenseTeam: GVGTeamType) { + const result: GVGBattleRecType = await GVGBattleRecModel.findOneAndUpdate({ battleCode }, { $set: { isSuccess, battleEndTime: nowSeconds(), attackTeamAfter: attackTeam, defenseTeamAfter: defenseTeam } }, { new: true }).lean(); return result; } } diff --git a/shared/domain/gvgField/returnData.ts b/shared/domain/gvgField/returnData.ts index 79c472e99..326b6de3c 100644 --- a/shared/domain/gvgField/returnData.ts +++ b/shared/domain/gvgField/returnData.ts @@ -758,7 +758,7 @@ export class MyTeamInfo { this.index = team.index; this.head = team.head; this.frame = team.spine; - this.lineup = team.lineup.map(({ actorId, dataId, outIndex }) => ({ actorId, dataId, order: outIndex })); + if(team.lineup) this.lineup = team.lineup.map(({ actorId, dataId, outIndex }) => ({ actorId, dataId, order: outIndex })); this.durability = team.durability; this.maxDurability = team.maxDurability; this.restartTime = team.restartTime;