From 86af54a50da2b74510a146f6ba18e3606106bd75 Mon Sep 17 00:00:00 2001 From: luying Date: Fri, 24 Feb 2023 20:59:54 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9E=20fix(gvg):=20=E6=BF=80=E6=88=98?= =?UTF-8?q?=E6=9C=9F=E6=8A=95=E7=9F=B3=E8=BD=A6=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/services/gvg/gvgBattleMemory.ts | 6 ++-- .../app/services/gvg/gvgBattleService.ts | 30 ++++++++++--------- shared/db/GVGTeam.ts | 27 ++++++++--------- 3 files changed, 32 insertions(+), 31 deletions(-) diff --git a/game-server/app/services/gvg/gvgBattleMemory.ts b/game-server/app/services/gvg/gvgBattleMemory.ts index eacd20f5b..d82e561a5 100644 --- a/game-server/app/services/gvg/gvgBattleMemory.ts +++ b/game-server/app/services/gvg/gvgBattleMemory.ts @@ -33,15 +33,17 @@ class GVGBattleData { } public findCatapultAttackTeam(areaIds: number[], leagueCode: string) { - let teams: string[] = []; + let teamsByArea = new Map(); for(let areaId of areaIds) { + let teams: string[] = []; let teamCodes = this.areaToTeams.get(areaId)||new Set(); for(let teamCode of teamCodes) { let team = this.teams.get(teamCode); if(team && team.leagueCode != leagueCode && !team.isRobot) teams.push(teamCode); } + teamsByArea.set(areaId, teams); } - return teams; + return teamsByArea; } public leaveCity(roleId: string) { diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index 94d9829b9..6ea497a6a 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -318,21 +318,23 @@ export async function catapultHurt() { if(catapult.isBroken) continue; let dicArea = gameData.gvgArea.get(catapult.areaId); let relateArea = dicArea?.relateArea||[]; - let teamCodes = teamObj.findCatapultAttackTeam(relateArea, catapult.leagueCode); + let teamCodeByArea = teamObj.findCatapultAttackTeam(relateArea, catapult.leagueCode); let dicGVGCity = gameData.gvgCity.get(catapult.cityId); - let teams = await GVGTeamModel.attackByCatapult(teamCodes, catapult.captapultAtk, dicGVGCity.attackBirth); - teamObj.battleEnd(teams); - if(teams.length > 0) { - await sendMessageToGVGAreaByTeamWithSuc(teamObj.groupKey, catapult.areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, { - cityId: catapult.cityId, areaId: catapult.areaId, attackType: 1, teams: teams.map(team => new GVGTeamInList(team)) - }); - await sendMessageToGVGAreaWithSuc(teamObj.groupKey, catapult.areaId, PUSH_ROUTE.GVG_SPINE_ATTACKED, { - cityId: catapult.cityId, areaId: catapult.areaId, attackType: 1, teams: teams.map(team => new GVGAttackSpine(team, catapult.captapultAtk)) - }); - for(let team of teams) { - await pushTeamBeHurtMessage(team); - if(team.curTeamBreak && team.originPointId > 0) { - await GVGCityAreaPointModel.leavePoint(configId, teamObj.groupKey, team.originPointId); + for(let [ areaId, teamCodes ] of teamCodeByArea) { + let teams = await GVGTeamModel.attackByCatapult(teamCodes, catapult.captapultAtk, dicGVGCity.attackBirth); + teamObj.battleEnd(teams); + if(teams.length > 0) { + await sendMessageToGVGAreaByTeamWithSuc(teamObj.groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, { + cityId: catapult.cityId, areaId, attackType: 1, teams: teams.map(team => new GVGTeamInList(team)) + }); + await sendMessageToGVGCityWithSuc(teamObj.groupKey, catapult.cityId, PUSH_ROUTE.GVG_SPINE_ATTACKED, { + cityId: catapult.cityId, areaId, attackType: 1, teams: teams.map(team => new GVGAttackSpine(team, catapult.captapultAtk)) + }); + for(let team of teams) { + await pushTeamBeHurtMessage(team); + if(team.curTeamBreak && team.originPointId > 0) { + await GVGCityAreaPointModel.leavePoint(configId, teamObj.groupKey, team.originPointId); + } } } } diff --git a/shared/db/GVGTeam.ts b/shared/db/GVGTeam.ts index e1551a7ca..7de8c2525 100644 --- a/shared/db/GVGTeam.ts +++ b/shared/db/GVGTeam.ts @@ -317,22 +317,19 @@ export default class GVGTeam extends BaseModel { // 投石车伤害 public static async attackByCatapult(teamCodes: string[], inc: number, rebirthAreaId: number) { - await GVGTeamModel.updateMany({ teamCode: { $in: teamCodes } }, { $inc: { durability: -inc } }); - let brokenTeams: GVGTeamType[] = await GVGTeamModel.find({ teamCode: { $in: teamCodes }, durability: { $lte: 0 } }).lean(); - if(brokenTeams.length > 0) { - await GVGTeamModel.bulkWrite(brokenTeams.map(({ teamCode, maxDurability }) => { - return { updateOne: { filter: { teamCode }, update: { $set: { areaId: rebirthAreaId, pointId: 0, durability: maxDurability } }}} - })); - } - let teams: GVGTeamType[] = await GVGTeamModel.find({ teamCode: { $in: teamCodes } }).lean(); - return teams.map(team => { - let originTeam = brokenTeams.find(origin => origin.teamCode == team.teamCode); - if(originTeam) { - team.originPointId = originTeam.originPointId; - team.curTeamBreak = originTeam.curTeamBreak; + let teams: GVGTeamType[] = []; + for(let teamCode of teamCodes) { + let team: GVGTeamType = await GVGTeamModel.findOneAndUpdate({ teamCode }, { $inc: { durability: -inc } }, { new: true }).lean(); + let originPointId = team.pointId; + if(team.durability <= 0) { + team = await GVGTeamModel.findOneAndUpdate({ teamCode }, { $set: { areaId: rebirthAreaId, pointId: 0, durability: team.maxDurability } }, { new: true }).lean(); + team.originPointId = originPointId; + team.curTeamBreak = true; } - return team - }) + teams.push(team); + } + return teams + } // 加积分