diff --git a/game-server/app/servers/guild/handler/gvgHandler.ts b/game-server/app/servers/guild/handler/gvgHandler.ts index cab9e24e3..76a027f2d 100644 --- a/game-server/app/servers/guild/handler/gvgHandler.ts +++ b/game-server/app/servers/guild/handler/gvgHandler.ts @@ -12,7 +12,7 @@ import { GVGUserItemModel } from "../../../db/GVGUserItem"; import { GVGUserTaskModel } from "../../../db/GVGUserTask"; import { GVG } from "../../../pubUtils/dicParam"; import { RoleModel } from "../../../db/Role"; -import { addGVGTechActive, calFighterContribute, calProducerContribute, checkPreTech, checkTechIsIng, getDailyLoginReward, getMyContribute, pushTechChange, sendUngotBoxReward } from "../../../services/gvg/gvgPrepareService"; +import { addGVGTechActive, calFighterContribute, calProducerContribute, checkPreTech, checkTechIsIng, checkTechProgress, getDailyLoginReward, getMyContribute, pushTechChange, pushTechRollback, sendUngotBoxReward } from "../../../services/gvg/gvgPrepareService"; import { GVGUserDailyDataModel } from "../../../db/GVGUserDailyData"; import { gameData } from "../../../pubUtils/data"; import { lockLeagueData } from "../../../services/redLockService"; @@ -400,6 +400,53 @@ export class GVGHandler { }); } + // 千机阁解锁 + async rollbackTech(msg: { techId: number }, session: BackendSession) { + const roleId = session.get('roleId'); + const roleName = session.get('roleName'); + const guildCode = session.get('guildCode'); + const { techId } = msg; + + 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); + + // 权限 + const checkAuth = await checkLeagueAuth(roleId, myLeague, LEAGUE_MANAGE_TYPE.UNLOCK_TECH); + if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH); + + // 并发锁 + 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); + } + + leaguePrepare = await GVGLeaguePrepareModel.rollbackTech(configId, myLeague.leagueCode, techId); + if(!leaguePrepare) { + res.releaseCallback(); + return resResult(STATUS.GVG_TECH_QUEUECNT_MAX); + } + + res.releaseCallback(); + + // 推送千机阁解锁消息 + await pushTechRollback(myLeague.guildCodes, techId); + + return resResult(STATUS.SUCCESS, { + queue: leaguePrepare?.techQueue||[] + }); + } + // 千机阁激活 async activate(msg: { techId: number, battleFeats: number }, session: BackendSession) { const serverId = session.get('serverId'); diff --git a/game-server/app/services/gvg/gvgPrepareService.ts b/game-server/app/services/gvg/gvgPrepareService.ts index e1e09d899..2d333b69f 100644 --- a/game-server/app/services/gvg/gvgPrepareService.ts +++ b/game-server/app/services/gvg/gvgPrepareService.ts @@ -40,6 +40,11 @@ export function checkTechIsIng(techId: number, activeQueue: number[], techQueue: return techQueue.findIndex(cur => cur.id == techId) != -1 || activeQueue.indexOf(techId) != -1 } +export function checkTechProgress(techId: number, techQueue: Tech[]) { + let queue = techQueue.find(cur => cur.id == techId); + return queue && queue.progress == 0; +} + export function calProducerContribute(obj: { food: number, mineral: number, wood: number }) { let { food = 0, mineral = 0, wood = 0 } = obj||{}; let ratio = decodeIdCntArrayStr(GVG.GVG_PRODUCE_GAME_RATIO, 1); @@ -479,6 +484,14 @@ export async function pushTechChange(guildCodes: string[], isActive: boolean, id } } +export async function pushTechRollback(guildCodes: string[], id: number) { + for(let guildCode of guildCodes) { + await sendMessageToGuildWithSuc(guildCode, PUSH_ROUTE.LEAGUE_TECH_ROLLBACK, { + id + }); + } +} + export async function sendUngotBoxReward(configId: number, leagueCode: string, roleId: string, sid: string) { let { period } = getGVGPeriodData(); if(period != GVG_PERIOD.BATTLE) return; diff --git a/shared/consts/constModules/chatConst.ts b/shared/consts/constModules/chatConst.ts index ad596cf0d..8d7ec8de8 100644 --- a/shared/consts/constModules/chatConst.ts +++ b/shared/consts/constModules/chatConst.ts @@ -195,6 +195,7 @@ export const PUSH_ROUTE = { LEAGUE_TECH_CHANGE : 'onGVGTechChange', // 千机阁科技变更 LEAGUE_TECH_UNLOCK: 'onGVGTechUnlock', // 千机阁科技解锁 LEAGUE_TECH_ACITVE: 'onGVGTechActive', // 千机阁科技激活 + LEAGUE_TECH_ROLLBACK: 'onGVGTechRollback', // 千机阁科技回退 GVG_TASK_UPDATE: 'onGVGTaskUpdate', // GVG任务更新 GVG_TEAM_ATTACKED: 'onTeamAttacked', // 当队伍受到攻击 GVG_MY_TEAM_ATTACKED: 'onMyTeamAttacked', // 当队伍受到攻击 diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 927e32087..72b41d62a 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -348,6 +348,7 @@ export const STATUS = { GVG_NOT_JOIN_LEAGUE: { code: 21341, simStr: '您未加入联军' }, GVG_NOT_ENTER_CITY_TIME: { code: 21342, simStr: '您此时不可进入城池' }, GVG_NOT_BATTLE_TIME: { code: 21343, simStr: '您此时只能进驻据点不可挑战' }, + GVG_TECH_HAS_PROGRESS: { code: 21344, simStr: '该科技进度不为0' }, // GVG征战中原 GVG_VESTIGE_ERR: { code: 21350, simStr: '今日未开放该遗迹' }, diff --git a/shared/db/GVGLeaguePrepare.ts b/shared/db/GVGLeaguePrepare.ts index 20ba7b813..d04211285 100644 --- a/shared/db/GVGLeaguePrepare.ts +++ b/shared/db/GVGLeaguePrepare.ts @@ -124,6 +124,11 @@ 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(); + return result; + } + public static async addProgress(configId: number, leagueCode: string, techId: number, addProgress: number) { const result: GVGLeaguePrepareType = await GVGLeaguePrepareModel.findOneAndUpdate({ configId, leagueCode, 'techQueue.id': techId