🐞 fix(gvg): 千机阁回退解锁
This commit is contained in:
@@ -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');
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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', // 当队伍受到攻击
|
||||
|
||||
@@ -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: '今日未开放该遗迹' },
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user