import { Application, BackendSession, HandlerService, } from 'pinus'; import { resResult } from '../../../pubUtils/util'; import { ITEM_CHANGE_REASON, STATUS } from '../../../consts'; import { addReward, stringToConsumeParam, stringToRewardParam } from '../../../services/activity/giftPackageService'; import { getMetialStr, getPlayerForgeData, getPlayerForgeDataShow } from '../../../services/activity/forgeService'; import { ActivityForgeModel } from '../../../db/ActivityForge'; import { handleCost } from '../../../services/role/rewardService'; export default function (app: Application) { new HandlerService(app, {}); return new ForgeHandler(app); } export class ForgeHandler { constructor(private app: Application) { } /** * @description 获取火神祭祀活动数据 * @param {{ activityId: number}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async getForgeActivity(msg: { activityId: number }, session: BackendSession) { const { activityId } = msg; const roleId = session.get('roleId'); const serverId = session.get('serverId'); let playerData = await getPlayerForgeDataShow(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); return resResult(STATUS.SUCCESS, playerData); } /** * @description 铸造 * @param {{ activityId: number, id: number, material: {id: number, count: number}[]}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async build(msg: { activityId: number, id: number, material: {id: number, count: number}[] }, session: BackendSession) { const { activityId, id, material } = msg; const roleId = session.get('roleId'); const roleName = session.get('roleName'); const sid = session.get('sid'); const serverId = session.get('serverId'); let playerData = await getPlayerForgeData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); let materialCnt = material.reduce((pre, cur) => pre + cur.count, 0); if(materialCnt <= 0) return resResult(STATUS.ACTIVITY_MATERIAL_COUNT_NOT_ZERO); let manual = playerData.findManual(id); if(!manual) return resResult(STATUS.ACTIVITY_MANUAL_NOT_FOUND); // 解锁日期 if(manual.dayIndex > playerData.todayIndex) return resResult(STATUS.ACTIVITY_MANUAL_DAY_LOCK); // 铸造次数 if(manual.buildCnt >= manual.freeCnt + manual.buyCnt) return resResult(STATUS.ACTIVITY_BUILD_COUNT); // 配比是否正确 let isSuccess = manual.checkMaterial(material); // 扣材料 let costResult = await handleCost(roleId, sid, material, ITEM_CHANGE_REASON.ACT_FORGE_BUILD); if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); // 保存数据 let buildResult = await ActivityForgeModel.build(serverId, activityId, roleId, playerData.roundIndex, id, { todayIndex: playerData.todayIndex, isSuccess, material: getMetialStr(material) }); // 更新数据 manual.setPlayerData(buildResult, playerData.todayIndex, playerData.hint); let activityGoods = undefined; if(isSuccess) { let { goods } = await addReward(roleId, roleName, sid, serverId, stringToRewardParam(manual.reward), ITEM_CHANGE_REASON.ACT_FORGE_BUILD); activityGoods = goods; } return resResult(STATUS.SUCCESS, { isSuccess, curManual: manual, activityGoods }); } /** * @description 购买次数 * @param {{ activityId: number, id: number, count: number}} msg * @param {BackendSession} session * @memberof ForgeHandler */ async buyCnt(msg: { activityId: number, id: number, count: number }, session: BackendSession) { const { activityId, id, count } = msg; const roleId = session.get('roleId'); const roleName = session.get('roleName'); const sid = session.get('sid'); const serverId = session.get('serverId'); let playerData = await getPlayerForgeData(activityId, serverId, roleId); if (!playerData) return resResult(STATUS.ACTIVITY_MISSING); let manual = playerData.findManual(id); if(!manual) return resResult(STATUS.ACTIVITY_MANUAL_NOT_FOUND); // 解锁日期 if(manual.buyCnt >= manual.maxBuyCnt) return resResult(STATUS.ACTIVITY_BUY_CNT_MAX); // 扣材料 let costResult = await handleCost(roleId, sid, stringToConsumeParam(playerData.consume), ITEM_CHANGE_REASON.ACT_FORGE_BUILD); if(!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); // 保存数据 let buildResult = await ActivityForgeModel.buyCnt(serverId, activityId, roleId, playerData.roundIndex, id, count); // 更新数据 manual.setPlayerData(buildResult, playerData.todayIndex); return resResult(STATUS.SUCCESS, { curManual: manual }); } }