diff --git a/game-server/app/servers/connector/handler/entryHandler.ts b/game-server/app/servers/connector/handler/entryHandler.ts index ccc4dbf20..5ef1dd9c4 100644 --- a/game-server/app/servers/connector/handler/entryHandler.ts +++ b/game-server/app/servers/connector/handler/entryHandler.ts @@ -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); } diff --git a/game-server/app/servers/guild/handler/gvgBattleHandler.ts b/game-server/app/servers/guild/handler/gvgBattleHandler.ts index f056832fc..88081e3fe 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 } 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); } diff --git a/game-server/app/servers/guild/remote/guildRemote.ts b/game-server/app/servers/guild/remote/guildRemote.ts index 0cab8358c..4ae0612a6 100644 --- a/game-server/app/servers/guild/remote/guildRemote.ts +++ b/game-server/app/servers/guild/remote/guildRemote.ts @@ -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}`); + } + } } \ No newline at end of file diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index 76f1fb17e..da2b7addb 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -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); diff --git a/shared/db/GVGTeam.ts b/shared/db/GVGTeam.ts index 053b97134..45f91232b 100644 --- a/shared/db/GVGTeam.ts +++ b/shared/db/GVGTeam.ts @@ -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();