diff --git a/game-server/app/servers/guild/handler/gvgHandler.ts b/game-server/app/servers/guild/handler/gvgHandler.ts index 76a027f2d..855ec415e 100644 --- a/game-server/app/servers/guild/handler/gvgHandler.ts +++ b/game-server/app/servers/guild/handler/gvgHandler.ts @@ -410,9 +410,6 @@ export class GVGHandler { let { configId, period } = getGVGPeriodData(); if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD); - const dicTech = gameData.gvgTech.get(techId); - if(!dicTech) return resResult(STATUS.DIC_DATA_NOT_FOUND); - const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode); if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST); @@ -420,18 +417,37 @@ export class GVGHandler { const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.UNLOCK_TECH); if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + let dicTech = gameData.gvgTech.get(techId); + if(!dicTech) return resResult(STATUS.DIC_DATA_NOT_FOUND); // 并发锁 let res: any = await lockLeagueData(DATA_NAME.LEAGUE_TECH, myLeague.leagueCode);//加锁 if (!!res.err) return resResult(STATUS.REDLOCK_ERR); let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode); - if(!checkTechProgress(techId, leaguePrepare?.techQueue||[])) { - res.releaseCallback(); - return resResult(STATUS.GVG_TECH_HAS_PROGRESS); + let techIds: number[] = [], preTechId = techId; + // 如果有后置节点,那么后置节点也需要解锁 + for(let { id, progress } of (leaguePrepare?.techQueue||[]) ) { + if(id == techId) { + if(progress > 0) { + res.releaseCallback(); + return resResult(STATUS.GVG_TECH_HAS_PROGRESS); + } + techIds.push(id) + } else { + let dicCurTech = gameData.gvgTech.get(id); + if(dicCurTech.prepositionId.find(arr => arr.indexOf(preTechId) != -1)) { + if(progress > 0) { + res.releaseCallback(); + return resResult(STATUS.GVG_TECH_HAS_PROGRESS); + } + techIds.push(id); + preTechId = id; + } + } } - leaguePrepare = await GVGLeaguePrepareModel.rollbackTech(configId, myLeague.leagueCode, techId); + leaguePrepare = await GVGLeaguePrepareModel.rollbackTech(configId, myLeague.leagueCode, techIds); if(!leaguePrepare) { res.releaseCallback(); return resResult(STATUS.GVG_TECH_QUEUECNT_MAX); @@ -440,7 +456,7 @@ export class GVGHandler { res.releaseCallback(); // 推送千机阁解锁消息 - await pushTechRollback(myLeague.guildCodes, techId); + await pushTechRollback(myLeague.guildCodes, techIds); return resResult(STATUS.SUCCESS, { queue: leaguePrepare?.techQueue||[] diff --git a/game-server/app/services/gvg/gvgPrepareService.ts b/game-server/app/services/gvg/gvgPrepareService.ts index 2d333b69f..0eb7976cb 100644 --- a/game-server/app/services/gvg/gvgPrepareService.ts +++ b/game-server/app/services/gvg/gvgPrepareService.ts @@ -484,10 +484,10 @@ export async function pushTechChange(guildCodes: string[], isActive: boolean, id } } -export async function pushTechRollback(guildCodes: string[], id: number) { +export async function pushTechRollback(guildCodes: string[], ids: number[]) { for(let guildCode of guildCodes) { await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.LEAGUE_TECH_ROLLBACK, { - id + ids }); } } diff --git a/shared/db/GVGLeaguePrepare.ts b/shared/db/GVGLeaguePrepare.ts index d04211285..c5b4d57ac 100644 --- a/shared/db/GVGLeaguePrepare.ts +++ b/shared/db/GVGLeaguePrepare.ts @@ -124,8 +124,8 @@ export default class GVGLeaguePrepare extends BaseModel { return result; } - public static async rollbackTech(configId: number, leagueCode: string, techId: number) { - const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $pull: { techQueue: { id: techId } }, $inc: { techQueueCnt: -1 } }, { new: true }).lean(); + public static async rollbackTech(configId: number, leagueCode: string, techIds: number[]) { + const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode }, { $pull: { techQueue: { id: { $in: techIds } } }, $inc: { techQueueCnt: -techIds.length } }, { new: true }).lean(); return result; }