feat(gvg): 准备期:千机阁以及获取物品

This commit is contained in:
luying
2023-01-09 17:19:47 +08:00
parent 0530f931bc
commit 098a7c85c6
28 changed files with 744 additions and 106 deletions

View File

@@ -1,20 +1,23 @@
import { Application, BackendSession, ChannelService, HandlerService, pinus } from "pinus";
import { GVG_PERIOD, GVG_SERVER_TYPE, LEAGUE_JOB, STATUS } from "../../../consts";
import { BATTLE_FEAT_ID, DATA_NAME, GVG_ACTIVE_TYPE, GVG_PERIOD, GVG_SERVER_TYPE, ITEM_CHANGE_REASON, LEAGUE_JOB, LEAGUE_MANAGE_TYPE, STATUS } from "../../../consts";
import { GVGLeagueModel } from "../../../db/GVGLeague";
import { GVGLeaguePrepareModel } from "../../../db/GVGLeaguePrepare";
import { GVGMainData, LeagueDistributeInfo, LeagueMemberDistributeInfo, LeagueMemberListInfo } from "../../../domain/gvgField/returnData";
import { resResult } from "../../../pubUtils/util";
import { getGVGConfig, getGVGPeriodData, getGVGServerType } from "../../../services/gvg/gvgService";
import { autoCreateLeague, checkCanChooseJob, checkCanPrepare, getMyAuth } from "../../../services/gvg/gvgTeamService";
import { autoCreateLeague, checkCanChooseJob, checkCanPrepare, checkLeagueAuth, getMyAuth } from "../../../services/gvg/gvgTeamService";
import { getAllServerName } from "../../../services/redisService";
import { Distribute, GVGUserDataModel } from "../../../db/GVGUserData";
import { GVGUserItemModel } from "../../../db/GVGUserItem";
import { GVGUserTaskModel } from "../../../db/GVGUserTask";
import { GVG } from "../../../pubUtils/dicParam";
import { RoleModel } from "../../../db/Role";
import { calProduce } from "../../../services/gvg/gvgPrepareService";
import { nowSeconds } from "../../../pubUtils/timeUtil";
import { GVGUserDailyDistributeModel } from "../../../db/GVGUserDailyDistribute";
import { addGVGActive, calProduce, checkPreTech, checkTechIsIng } from "../../../services/gvg/gvgPrepareService";
import { GVGUserDailyDataModel } from "../../../db/GVGUserDailyData";
import { gameData } from "../../../pubUtils/data";
import { lockLeagueData } from "../../../services/redLockService";
import { addGVGReward, handleGVGCost } from "../../../services/gvg/gvgItemService";
import { RewardInter } from "../../../pubUtils/interface";
export default function (app: Application) {
new HandlerService(app, {});
@@ -146,7 +149,7 @@ export class GVGHandler {
result.push(disObj)
}
const myDistribute = await GVGUserDailyDistributeModel.findByRole(configId, myLeague.leagueCode, roleId);
const myDistribute = await GVGUserDailyDataModel.findByRole(configId, myLeague.leagueCode, roleId);
return resResult(STATUS.SUCCESS, {
myDistribute: {
@@ -159,9 +162,150 @@ export class GVGHandler {
});
}
// 千机阁数据
async getTech(msg: {}, session: BackendSession) {
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
async test(msg: { }, session: BackendSession) {
const time = getGVGConfig();
return resResult(STATUS.SUCCESS, { time });
let { configId, period } = getGVGPeriodData();
if(period != GVG_PERIOD.PREPARE) return resResult(STATUS.GVG_NOT_PREPARE_PERIOD);
const myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
const leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
return resResult(STATUS.SUCCESS, {
activeTech: leaguePrepare?.activeTech||[],
queue: leaguePrepare?.techQueue||[]
});
}
// 千机阁解锁
async unlockTech(msg: { techId: number }, session: BackendSession) {
const roleId = session.get('roleId');
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(!leaguePrepare || leaguePrepare.lv < dicTech.levelLimit) {
res.releaseCallback();
return resResult(STATUS.GVG_TECH_LV_NOT_ENOUGH);
}
if(checkTechIsIng(techId, leaguePrepare?.activeTech||[], leaguePrepare?.techQueue||[])) {
res.releaseCallback();
return resResult(STATUS.GVG_TECH_HAS_UNLOCKED);
}
if(!checkPreTech(techId, leaguePrepare?.activeTech||[], leaguePrepare?.techQueue||[])) {
res.releaseCallback();
return resResult(STATUS.GVG_TECH_PRE_POSITION_NOT_UNLOCK);
}
leaguePrepare = await GVGLeaguePrepareModel.unlockTech(configId, myLeague.leagueCode, techId, dicTech.consume);
if(!leaguePrepare) {
res.releaseCallback();
return resResult(STATUS.GVG_TECH_QUEUECNT_MAX);
}
res.releaseCallback();
return resResult(STATUS.SUCCESS, {
queue: leaguePrepare?.techQueue||[]
});
}
// 千机阁解锁
async activate(msg: { techId: number, battleFeats: number }, session: BackendSession) {
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
const sid = session.get('sid');
const { techId, battleFeats } = 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.ACTIVATE_TECH);
if(!checkAuth) return resResult(STATUS.GVG_HAS_NO_AUTH);
let leaguePrepare = await GVGLeaguePrepareModel.findByLeague(configId, myLeague.leagueCode);
if(!checkTechIsIng(techId, [], leaguePrepare?.techQueue||[])) {
return resResult(STATUS.GVG_TECH_NOT_QUEUE);
}
// 扣战功
const costResult = await handleGVGCost(roleId, myLeague.leagueCode, sid, [{ id: BATTLE_FEAT_ID, count: battleFeats }], [], ITEM_CHANGE_REASON.GVG_ACTIVE_TECH);
if(!costResult) return resResult(STATUS.GVG_BATTLE_FEAT_NOT_ENOUGH);
leaguePrepare = await GVGLeaguePrepareModel.addProgress(configId, myLeague.leagueCode, techId, battleFeats);
if(!leaguePrepare) {
return resResult(STATUS.GVG_TECH_NOT_QUEUE);
}
let curQueue = leaguePrepare.techQueue.find(cur => cur.id == techId);
if(curQueue.progress >= curQueue.maxProgress) {
leaguePrepare = await GVGLeaguePrepareModel.activate(configId, myLeague.leagueCode, techId);
}
// 添加 活跃
let active = await addGVGActive(myLeague.leagueCode, roleId, GVG_ACTIVE_TYPE.TECH_ACTIVATE);
return resResult(STATUS.SUCCESS, {
active,
activeTech: leaguePrepare?.activeTech||[],
queue: leaguePrepare?.techQueue||[]
});
}
// 获取道具
async debugAddLeagueItem(msg: { id: number, count: number }, session: BackendSession) {
const roleId = session.get('roleId');
const roleName = session.get('roleName');
const sid = session.get('sid');
const guildCode = session.get('guildCode');
const { id, count } = msg;
let dicGVGItem = gameData.gvgItem.get(id);
if(!dicGVGItem) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
const leagueGoods = await addGVGReward(roleId, roleName, myLeague.leagueCode, sid, [{ id, count }], [], ITEM_CHANGE_REASON.DEBUG);
return resResult(STATUS.SUCCESS, { leagueGoods });
}
async debugHandleCost(msg: { items: RewardInter[], leagueItems: RewardInter[] }, session: BackendSession) {
const roleId = session.get('roleId');
const guildCode = session.get('guildCode');
const sid = session.get('sid');
const { items, leagueItems } = msg;
let myLeague = await GVGLeagueModel.findLeagueByGuild(guildCode);
if(!myLeague) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
const result = await handleGVGCost(roleId, myLeague.leagueCode, sid, leagueItems, items, ITEM_CHANGE_REASON.DEBUG);
return resResult(STATUS.SUCCESS, { result });
}
}

View File

@@ -211,8 +211,6 @@ export class GVGManageHandler {
let data = new LeagueGuildInfo(guild, serverNames);
let hasInvited = !!invitations.find(cur => cur.guildCode == guild.code);
data.setHasInvited(hasInvited);
// TODO
// data.setActive
return data
});
@@ -319,10 +317,23 @@ export class GVGManageHandler {
const league = await GVGLeagueModel.findByCode(targetLeagueCode);
if(!league) return resResult(STATUS.GVG_LEAGUE_NOT_EXIST);
let { configId } = getGVGPeriodData();
const guilds = await GuildModel.findByCodes(league.guildCodes);
const members = league.members||[];
let roleIds = members.map(member => member.roleId);
const serverNames = await getAllServerName();
const userdatas = await GVGUserDataModel.findByRoles(configId, targetLeagueCode, roleIds);
const result = guilds.map(guild => {
return new LeagueGuildInfo(guild, serverNames)
let obj = new LeagueGuildInfo(guild, serverNames);
let active = userdatas.reduce((pre, userdata) => {
let member = members.find(cur => cur.roleId == userdata.roleId);
if(member && member.guildCode == guild.code) {
return pre + userdata.active;
}
return pre;
}, 0);
obj.setActive(active);
return obj;
});
// 返回