🐞 fix(gvg): 修复激战期离开战场逻辑

This commit is contained in:
luying
2023-02-22 11:01:09 +08:00
parent e2e901dc1b
commit cfed1f1430
5 changed files with 40 additions and 16 deletions

View File

@@ -25,6 +25,7 @@ import { checkServerIsOpen, getIpLocation } from '../../../services/roleService'
import { dispatch } from '../../../pubUtils/dispatcher';
import { leaveRaceActivityToRemote } from '../../../services/guildActivity/guildActivityService';
import { getHiddenData } from '../../../services/dataService';
import { leaveCity } from '../../../services/gvg/gvgBattleService';
export default function (app: Application) {
new HandlerService(app, {});
@@ -223,7 +224,7 @@ export class EntryHandler {
await leaveGVGAreaChannel(roleId, sid);
await leaveGVGAreaTeamChannel(roleId, sid);
await leaveGVGCityTeamChannel(roleId, sid);
await pinus.app.rpc.guild?.guildRemote.leaveCity.broadcast(roleId, true);
} catch(e) {
console.error(e);
}

View File

@@ -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 } from '../../../services/gvg/gvgService';
import { redisAddBattleScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanksByCity, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage, getGVGCitiesInfo } from '../../../services/gvg/gvgBattleService';
import { redisAddBattleScore, battleEndSendMessage, calBattleScoreByCe, checkAreaIsInCity, checkGVGBattleStart, checkMoveStatus, getBattleRanksByCity, getBirthAreaOfCity, getGVGWarId, getOppHeroes, getTechKnifeHurt, getTechReviveMinus, initRobots, pushTeamMoveMessage, getGVGCitiesInfo, leaveCity } from '../../../services/gvg/gvgBattleService';
import { getGVGBattleData } from '../../../services/gvg/gvgBattleMemory';
import { GVGBattleRecModel } from '../../../db/GVGBattleRec';
import { getFightTimeByPeriod } from '../../../services/gvg/gvgFightService';
@@ -238,8 +238,6 @@ export class GVGBattleHandler {
const { cityId } = msg;
let { configId, period } = getGVGPeriodData();
let groupKey = await getGroupKey(serverId);
// 检测是否已经在城池中
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
@@ -251,22 +249,12 @@ export class GVGBattleHandler {
return resResult(STATUS.GVG_USER_NOT_IN_CITY);
}
const city = await GVGCityModel.decreasePlayer(configId, groupKey, cityId, roleId);
if (!city) {
return resResult(STATUS.GVG_CITY_NOT_FOUND);
}
// 更新玩家城池和队伍城池
gvgUserData = await GVGUserDataModel.changeCity(configId, myLeague.leagueCode, roleId, 0);
await GVGTeamModel.enterCity(roleId, 0, 0, groupKey);
// 处理内存数据
let teamObj = getGVGBattleData(groupKey);
teamObj.leaveCity(roleId);
await leaveCity(roleId, false);
await leaveGVGAreaChannel(roleId, sid);
await leaveGVGAreaTeamChannel(roleId, sid);
await leaveGVGCityTeamChannel(roleId, sid);
return resResult(STATUS.SUCCESS);
}

View File

@@ -8,7 +8,7 @@ import { setHiddenData } from '../../../services/dataService';
import { setKvToMemory } from '../../../services/pushService';
import { getGVGConfig, setGVGConfig, setGVGServerGroup } from '../../../services/gvg/gvgService';
import { GVGConfigType } from '../../../db/GVGConfig';
import { catapultHurt, gvgBattleEnd, gvgBattleSeconds, gvgBattleStart, initCatapult } from '../../../services/gvg/gvgBattleService';
import { catapultHurt, gvgBattleEnd, gvgBattleSeconds, gvgBattleStart, initCatapult, leaveCity } from '../../../services/gvg/gvgBattleService';
import { clearBattleMemory } from '../../../services/gvg/gvgBattleMemory';
export default function (app: Application) {
@@ -168,4 +168,12 @@ export class GuildRemote {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}
}
public async leaveCity(roleId: string, isForce: boolean) {
try {
return leaveCity(roleId, isForce);
} catch(e) {
errlogger.error(`remote ${__filename} \n ${e.stack}`);
}
}
}

View File

@@ -21,6 +21,7 @@ import { sendMessageToGVGAreaByTeamWithSuc, sendMessageToGVGAreaWithSuc, sendMes
import { sendMailToLeagueByContent } from "../mailService";
import { GVGCityAreaPointModel } from "../../db/GVGCityAreaPoint";
import { addCityGuardMessage } from "./gvgRecService";
import { GVGUserDataModel } from "../../db/GVGUserData";
/**
@@ -130,6 +131,26 @@ export function calBattleScoreByCe(isSuccess: boolean, lineupCe: number) {
return isSuccess? winScore: 0;
}
export async function leaveCity(roleId: string, isForce: boolean) {
let teams = await GVGTeamModel.findByRole(roleId);
let hasPoint = false, myTeam: GVGTeamType;
for(let team of teams) {
if(team.pointId > 0) hasPoint = true;
myTeam = team;
}
if(isForce || !hasPoint) {
let leaveResult = await GVGTeamModel.leaveCity(roleId);
if(leaveResult) {
await GVGCityModel.decreasePlayer(myTeam.configId, myTeam.groupKey, myTeam.cityId, roleId);
await GVGUserDataModel.changeCity(myTeam.configId, myTeam.leagueCode, roleId, 0);
// 处理内存数据
let teamObj = getGVGBattleData(myTeam.groupKey);
teamObj.leaveCity(roleId);
}
}
}
// 复活cd
export async function getTechReviveMinus(configId: number, leagueCode: string) {
let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, leagueCode);

View File

@@ -143,6 +143,12 @@ export default class GVGTeam extends BaseModel {
return result;
}
// 离开队伍
public static async leaveCity(roleId: string) {
let res = await GVGTeamModel.updateMany({ roleId }, { $set: { cityId: 0, areaId: 0, pointId: 0 } });
return !!res["ok"];
}
// 查找角色队伍数
public static async getTeamCntByRole(roleId: string) {
const teams: GVGTeamType[] = await GVGTeamModel.find({ roleId }).select('teamCode').lean();