diff --git a/game-server/app/servers/guild/handler/gvgBattleHandler.ts b/game-server/app/servers/guild/handler/gvgBattleHandler.ts index 048c201a3..65106390d 100644 --- a/game-server/app/servers/guild/handler/gvgBattleHandler.ts +++ b/game-server/app/servers/guild/handler/gvgBattleHandler.ts @@ -7,7 +7,7 @@ import { Application, BackendSession, ChannelService, HandlerService, pinus } fr import { resResult, genCode } from "../../../pubUtils/util"; import { GVGLeagueModel } from '../../../db/GVGLeague'; import { getGroupKey, getGVGConfig, getGVGPeriodData, getGVGServerType } from '../../../services/gvg/gvgService'; -import { redisAddBattleScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanksByCity, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage, getGVGCitiesInfo, leaveCity, refreshTeams, checkEnterCityTime } from '../../../services/gvg/gvgBattleService'; +import { redisAddBattleScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanksByCity, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage, getGVGCitiesInfo, leaveCity, refreshTeams, checkEnterCityTime, generNewLineup } from '../../../services/gvg/gvgBattleService'; import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory'; import { GVGBattleRecModel } from '../../../db/GVGBattleRec'; import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService'; @@ -77,30 +77,11 @@ export class GVGBattleHandler { let groupKey = await getGroupKey(serverId); let updateParam: SaveTeamUpdateParam = { index, head, spine, frame, configId, groupKey } if(lineup) { - let attrByHid = await getHeroesAttributes(roleId); let { isOK, heroes } = await checkBattleHeroesByHid(roleId, lineup.map(cur => cur.actorId)); if(!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); - let newLineup: GVGHeroInfo[] = []; - for(let { actorId, dataId, order } of lineup) { - let hero = heroes.find(cur => cur.hid == actorId); - if(hero) { - let artifact = hero.artifact? await ArtifactModel.findbySeqId(roleId, hero.artifact): null; - let heroInfo = new GVGHeroInfo(); - heroInfo.setHeroInfo(hero, artifact); - heroInfo.setDataId(dataId, order); - - let attr = attrByHid.get(actorId); - if(!attr) continue; - let attribute = attr.getAttributesToString(); - heroInfo.setAttribute(attribute); - - newLineup.push(heroInfo); - } - } - - let lineupCe = heroes.reduce((pre, cur) => pre + cur.ce, 0); + let { newLineup, newLineupCe } = await generNewLineup(roleId, heroes, lineup); updateParam.lineup = newLineup; - updateParam.lineupCe = lineupCe; + updateParam.lineupCe = newLineupCe; } let originTeam = await GVGTeamModel.findByRoleAndIndex(roleId, index, 'cityId'); if(!originTeam && cityId > 0) { @@ -113,6 +94,7 @@ export class GVGBattleHandler { if (!team) { return resResult(STATUS.GVG_SAVE_TEAM_FAILED); } + if(cityId > 0) { let teamObj = getGVGBattleData(groupKey); teamObj.enterCity(team); @@ -192,7 +174,7 @@ export class GVGBattleHandler { // 初始化本城池的守擂机器人 await initRobots(configId, groupKey, city||{ cityId, guardLeague: '' }); // 每赛季初自己的几支队伍恢复耐久、城市、顺便更新一下自己的玩家名、联军 - let teams = await refreshTeams(configId, groupKey, roleId, roleName, guildCode, myLeague); + let teams = await refreshTeams(configId, groupKey, roleId, myLeague); let gvgUserData = await GVGUserDataModel.findByRole(configId, myLeague.leagueCode, roleId); let originCityId = gvgUserData?.cityId||0; diff --git a/game-server/app/services/gvg/gvgBattleMemory.ts b/game-server/app/services/gvg/gvgBattleMemory.ts index 4c63c3ced..c50d06458 100644 --- a/game-server/app/services/gvg/gvgBattleMemory.ts +++ b/game-server/app/services/gvg/gvgBattleMemory.ts @@ -63,6 +63,8 @@ class GVGBattleData { if(!this.teams.has(team.teamCode)) { this.teams.set(team.teamCode, new GVGTeamMem(team)) + } else { + this.teams.get(team.teamCode).updateTeam(team); } this.teams.get(team.teamCode).setCity(team.cityId, team.areaId, team.pointId); if(team.pointId > 0 && !team.isRobot) { diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index c1da7cd07..488d7b163 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -25,6 +25,9 @@ import { GVGUserDataModel } from "../../db/GVGUserData"; import { RoleModel } from "../../db/Role"; import { getFightTimeByPeriod } from "./gvgFightService"; import { getRandSingleEelm } from "../../pubUtils/util"; +import { HeroModel, HeroType } from "../../db/Hero"; +import { ArtifactModel } from "../../db/Artifact"; +import { getHeroesAttributes } from "../playerCeService"; /** * 获取本联军上周占领的城池 @@ -152,14 +155,16 @@ export function calBattleScoreByCe(isSuccess: boolean, lineupCe: number) { return isSuccess? winScore: 0; } -export async function refreshTeams(configId: number, groupKey: string, roleId: string, roleName: string, guildCode: string, myLeague: GVGLeagueType) { +export async function refreshTeams(configId: number, groupKey: string, roleId: string, myLeague: GVGLeagueType) { let oldTeams = await GVGTeamModel.findByRole(roleId, '-_id'); let teams: GVGTeamType[] = []; for(let team of oldTeams) { if(team.configId != configId) { - let { teamCode, maxDurability } = team; - let { lv } = await RoleModel.findByRoleId(roleId, 'lv'); - let newTeam = await GVGTeamModel.refreshByConfig(teamCode, { configId, lv, durability: maxDurability, cityId: 0, areaId: 0, pointId: 0, roleName, guildCode, leagueCode: myLeague.leagueCode, leagueName: myLeague.name, groupKey }); + let { teamCode, maxDurability, lineup } = team; + let { lv, roleName, guildCode } = await RoleModel.findByRoleId(roleId, 'lv roleName guildCode'); + let heroes = await HeroModel.findByHidRange(lineup.map(hero => hero.actorId), roleId); + let { newLineup, newLineupCe } = await generNewLineup(roleId, heroes, lineup.map(({ actorId, dataId, outIndex }) => ({ actorId, dataId, order: outIndex }))); + let newTeam = await GVGTeamModel.refreshByConfig(teamCode, { configId, lv, durability: maxDurability, cityId: 0, areaId: 0, pointId: 0, roleName, guildCode, leagueCode: myLeague.leagueCode, leagueName: myLeague.name, groupKey, lineup: newLineup, lineupCe: newLineupCe }); teams.push(newTeam); } else { teams.push(team); @@ -168,6 +173,29 @@ export async function refreshTeams(configId: number, groupKey: string, roleId: s return teams } +export async function generNewLineup(roleId: string, heroes: HeroType[], lineup: { actorId: number, dataId: number, order: number }[]) { + let attrByHid = await getHeroesAttributes(roleId); + let newLineup: GVGHeroInfo[] = [], newLineupCe = 0; + for(let { actorId, dataId, order } of lineup) { + let hero = heroes.find(cur => cur.hid == actorId); + if(hero) { + let artifact = hero.artifact? await ArtifactModel.findbySeqId(roleId, hero.artifact): null; + let heroInfo = new GVGHeroInfo(); + heroInfo.setHeroInfo(hero, artifact); + heroInfo.setDataId(dataId, order); + + let attr = attrByHid.get(actorId); + if(!attr) continue; + let attribute = attr.getAttributesToString(); + heroInfo.setAttribute(attribute); + + newLineup.push(heroInfo); + newLineupCe += hero.ce; + } + } + return { newLineup, newLineupCe }; +} + /** * 离开城池 * 当玩家占领据点的时候,可以保留据点;不占领的时候,不保留;退出游戏的时候,全不保留 @@ -194,6 +222,13 @@ export async function leaveCity(isForce: boolean, roleId: string, serverId: numb // 处理内存数据 let teamObj = getGVGBattleData(groupKey); teamObj.leaveCity(roleId); + for(let team of teams) { + if(team.cityId > 0 && team.areaId > 0) { + await sendMessageToGVGAreaByTeamWithSuc(groupKey, team.areaId, PUSH_ROUTE.GVG_PLAYER_LEAVE_AREA, { + cityId: team.cityId, areaId: team.areaId, teamCode: team.teamCode + }); + } + } } } @@ -332,7 +367,6 @@ export async function catapultHurt() { if(!catapult || catapult.isBroken || !dicGVGCity || battleAreaIds.length <= 0) continue; let areaId = getRandSingleEelm(battleAreaIds); let teamCodes = teamObj.findCatapultAttackTeam(areaId, catapult.leagueCode); - console.log('##### targetAreaId', catapult.teamCode, areaId); let teams = await GVGTeamModel.attackByCatapult(teamCodes, catapult.captapultAtk, dicGVGCity.attackBirth); teamObj.battleEnd(teams); @@ -554,7 +588,9 @@ export async function pushTeamBeHurtMessage(team: GVGTeamType, replaceTeam?: GVG }); } - await pushTeamMoveMessage(team); + if(team.curTeamBreak) { + await pushTeamMoveMessage(team); + } if(team.isRobot && team.isBroken) { await sendMessageToGVGAreaByTeamWithSuc(team.groupKey, team.fromAreaId, PUSH_ROUTE.GVG_PLAYER_LEAVE_AREA, { cityId: team.cityId, areaId: team.fromAreaId, teamCode: team.teamCode @@ -571,7 +607,7 @@ export async function pushTeamMoveMessage(team: GVGTeamType) { } if(team.areaId > 0) { await sendMessageToGVGAreaByTeamWithSuc(team.groupKey, team.areaId, PUSH_ROUTE.GVG_PLAYER_AREA_ADD, { - cityId: team.cityId, areaId: team.fromAreaId, player: new GVGTeamInList(team) + cityId: team.cityId, areaId: team.areaId, fromAreaId: team.fromAreaId, player: new GVGTeamInList(team) }); } } diff --git a/shared/domain/battleField/gvgBattle.ts b/shared/domain/battleField/gvgBattle.ts index 42efc8cf3..0b20a815c 100644 --- a/shared/domain/battleField/gvgBattle.ts +++ b/shared/domain/battleField/gvgBattle.ts @@ -31,6 +31,7 @@ export class GVGTeamMem extends GVGTeam { public updateTeam(team: GVGTeamType) { for(let key in team) { + if(key == 'lineup' || key == '_id' || key == 'createdAt' || key == 'updatedAt') continue; this[key] = team[key]; } this.isMoving = this.stopMoveTime > nowSeconds();