Files
ZYZ/game-server/app/servers/role/handler/equipHandler.ts
2022-02-16 13:19:58 +08:00

1138 lines
53 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Application, BackendSession, HandlerService, } from "pinus";
import { STATUS, EQUIP_STRENGTHEN_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, HERO_SYSTEM_TYPE, CONSUME_TYPE, HERO_GROW_MAX, MSG_SOURCE, JEWEL_PUSH_LV, TASK_TYPE, HERO_CE_RATIO, ITEM_CHANGE_REASON } from "../../../consts";
import { ItemInter } from "../../../pubUtils/interface";
import { resResult, parseGoodStr } from "../../../pubUtils/util";
import { addItems, handleCost, combineItems, CheckMeterial } from "../../../services/rewardService";
import { EquipModel, EquipType } from "../../../db/Equip";
import { HeroModel, EPlace, HeroType } from "../../../db/Hero";
import Role from "../../../db/Role";
import { calPlayerCeAndSave } from "../../../services/playerCeService";
import { getGoodById, gameData, getEquipByJobClassAndEPlace, getNextEquipQuality, getEquipQualityIdByEquipIdAndPoint, getEquipStarIdByEquipId, getNextEquipStar } from "../../../pubUtils/data";
import { BAG, EQUIP } from "../../../pubUtils/dicParam";
import { ITID, QUALITY_TYPE, equipTypeToSortAttr, IT_TYPE, QUENCH_TYPE, REFINE_TYPE } from "../../../consts";
import { checkMaterialEnough, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult, refineOnce, checkRefineReachNextLv, calEquipCe, updateEplace, updateEplaces } from "../../../services/equipService";
import { findIndex, isNumber, pick } from 'underscore';
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkActivityTask } from "../../../services/taskService";
import { QuenchLogParam } from "../../../domain/roleField/equip";
import { calEquipSeids } from "../../../pubUtils/playerCe";
export default function (app: Application) {
new HandlerService(app, {});
return new EquipHandler(app);
}
export class EquipHandler {
constructor(private app: Application) {
}
public async composeEquip(msg: { hid: number, eplaceId: number }, session: BackendSession) {
let roleId: string = session.get('roleId');
let sid: string = session.get('sid');
let { hid, eplaceId } = msg;
if(!isNumber(eplaceId) || eplaceId > 4 || eplaceId < 1) return resResult(STATUS.WRONG_PARMS);
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if(!hero) return resResult(STATUS.HERO_NOT_FIND);
let curEquip = hero.ePlace?.find(equip => equip.id == eplaceId );
if(curEquip) return resResult(STATUS.EQUIP_HAS_COMPOSE);
let dicHero = gameData.hero.get(hid);
let dicEquip = getEquipByJobClassAndEPlace(dicHero?.jobClass, eplaceId);
if(!dicEquip) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let consumeResult = await handleCost(roleId, sid, dicEquip.composeMaterial, ITEM_CHANGE_REASON.EQUIP_COMPOSE);
if(!consumeResult) return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
let newEquip = new EPlace(eplaceId, dicEquip.id);
let newEplace = hero.ePlace? [...hero.ePlace, newEquip]: [newEquip];
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.COMPOSE_EQUIP, sid, roleId, hero, { ePlace: newEplace }, [eplaceId]);
return resResult(STATUS.SUCCESS, {
curHero: {
hid: hero.hid,
ePlace: [newEquip]
}
})
}
// 装备栏强化
public async strengthen(msg: { hid: number, eplaceId: number, isOneClick: boolean }, session: BackendSession) {
let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
const serverId = session.get('serverId');
let sid: string = session.get('sid');
let { hid, eplaceId, isOneClick } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
let curEquip = hero.ePlace?.find(cur => cur.id == eplaceId);
if(!curEquip) return resResult(STATUS.EQUIP_NOT_FIND);
if(curEquip.lv >= hero.lv) return resResult(STATUS.ROLE_EQUIP_REACH_MAX);
let fromLv = curEquip.lv;
let toLv = isOneClick? hero.lv: fromLv + 1;
let newLv = fromLv;
let check = new CheckMeterial(roleId);
for (let lv = fromLv + 1; lv <= toLv; lv++) {
let dicCost = gameData.equipStrengthenCost.get(lv);
let isEnough = await check.decrease(dicCost.consume);
if(!isEnough) break; // 消耗不足
newLv = lv;
}
if(newLv == fromLv) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let consumes = check.getConsume();
let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_STRENTHEN);
if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let { newEplace, updatedEplace } = updateEplace(hero.ePlace, eplaceId, { lv: newLv });
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, { ePlace: newEplace }, [eplaceId]);
// TODO 任务
const curHero = {
hid,
ePlace: updatedEplace
}
return resResult(STATUS.SUCCESS, { curHero });
}
// 装备栏一键强化至相应等级
public async strengthenAll(msg: { hid: number, lv: number }, session: BackendSession) {
let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
let sid: string = session.get('sid');
let { hid, lv } = msg; // lv: 升到哪一级
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
let { ePlace, lv: playerLv } = hero; // 装备栏
let fromLv = Math.min(...ePlace.map(cur => cur.lv)); // 最小的等级
let toLv = lv < playerLv? lv: playerLv;
let eplaceIds = new Map<number, { lv: number }>(); // 更新了的装备栏id
let check = new CheckMeterial(roleId);
for(let lv = fromLv + 1; lv <= toLv; lv++) {
let isBreak = false;
for(let equip of ePlace) {
if(equip.lv >= lv) continue;
let dicCost = gameData.equipStrengthenCost.get(lv);
let isEnough = await check.decrease(dicCost.consume);
if(!isEnough) { isBreak = true; break; } // 消耗不足
eplaceIds.set(equip.id, { lv });
}
if(isBreak) break;
}
if(eplaceIds.size <= 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let consumes = check.getConsume();
let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_STRENTHEN);
if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let { newEplace, updatedEplace } = updateEplaces(hero.ePlace, eplaceIds);
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, { ePlace: newEplace }, [...eplaceIds.keys()]);
// TODO 任务
const curHero = {
hid,
ePlace: updatedEplace
}
return resResult(STATUS.SUCCESS, { curHero });
}
// 装备升品
public async qualityUp(msg: { hid: number, eplaceId: number, isOneClick: boolean }, session: BackendSession) {
let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
const serverId = session.get('serverId');
let sid: string = session.get('sid');
let { hid, eplaceId, isOneClick } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
let curEquip = hero.ePlace?.find(cur => cur.id == eplaceId);
if(!curEquip) return resResult(STATUS.EQUIP_NOT_FIND);
let nextEquipQuality = getNextEquipQuality(curEquip.equipId, curEquip.quality, curEquip.qualityStage);
if(!nextEquipQuality) return resResult(STATUS.EQUIP_QUALITY_MAX);
let update = {
quality: curEquip.quality,
qualityStage: curEquip.qualityStage,
}
let check = new CheckMeterial(roleId);
if(isOneClick) { // 一键升到该品最高点
if(nextEquipQuality.quality != curEquip.quality) {
return resResult(STATUS.EQUIP_QUALITYSTAGE_IS_MAX);
}
while(nextEquipQuality && nextEquipQuality.quality == curEquip.quality) {
let isEnough = await check.decrease(nextEquipQuality.consume);
if(!isEnough) break; // 消耗不足
update.qualityStage++;
nextEquipQuality = getNextEquipQuality(curEquip.equipId, update.quality, update.qualityStage)
}
} else { // 往下一阶,包括满点之后的升品
let isEnough = await check.decrease(nextEquipQuality.consume);
if(isEnough) {
update.quality = nextEquipQuality.quality;
update.qualityStage = nextEquipQuality.point;
}
}
if(update.quality == curEquip.quality && update.qualityStage == curEquip.qualityStage) {
return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
}
let isUpQuality = update.quality != curEquip.quality;
let { newEplace, updatedEplace } = updateEplace(hero.ePlace, eplaceId, update);
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_QUALITY, sid, roleId, hero, { ePlace: newEplace }, [eplaceId]);
// TODO 任务
const curHero = {
hid,
isUpQuality,
ePlace: updatedEplace
}
return resResult(STATUS.SUCCESS, { curHero });
}
// 装备升星
public async starUp(msg: { hid: number, eplaceId: number, isOneClick: boolean }, session: BackendSession) {
let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
const serverId = session.get('serverId');
let sid: string = session.get('sid');
let { hid, eplaceId, isOneClick } = msg;
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
let curEquip = hero.ePlace?.find(cur => cur.id == eplaceId);
if(!curEquip) return resResult(STATUS.EQUIP_NOT_FIND);
let update = {
star: curEquip.star,
starStage: curEquip.starStage,
}
let check = new CheckMeterial(roleId);
let dicEquipStar = getEquipStarIdByEquipId(curEquip.equipId, curEquip.star);
if(!dicEquipStar) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let isUpStar = curEquip.starStage == dicEquipStar.count;
if(isUpStar) { // 升星
if(isOneClick) {
return resResult(STATUS.EQUIP_STARSTAGE_IS_MAX);
} else {
let nextEquipStar = getNextEquipStar(curEquip.equipId, curEquip.star);
if(!nextEquipStar) return resResult(STATUS.EQUIP_STAR_MAX);
let dicEquipQualityExtra = gameData.equipQualityExtra.get(curEquip.quality);
if(!dicEquipQualityExtra || dicEquipQualityExtra.star < nextEquipStar.star) {
return resResult(STATUS.EQUIP_QUALITY_NOT_ENOUGH);
}
let isEnough = await check.decrease(nextEquipStar.subConsume);
if(isEnough) {
update.star = nextEquipStar.star;
update.starStage = 0;
}
}
} else { // 升小点,包括一键升到满小点和升一个小点
let toStage = isOneClick? dicEquipStar.count: curEquip.starStage + 1;
for(let stage = curEquip.starStage + 1; stage <= toStage; stage++) {
let isEnough = await check.decrease(dicEquipStar.mainConsume);
if(!isEnough) break; // 消耗不足
update.starStage = stage;
}
}
if(update.star == curEquip.star && update.starStage == curEquip.starStage) {
return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
}
let { newEplace, updatedEplace } = updateEplace(hero.ePlace, eplaceId, update);
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STAR, sid, roleId, hero, { ePlace: newEplace }, [eplaceId]);
// TODO 任务
const curHero = {
hid,
isUpStar,
ePlace: updatedEplace
}
return resResult(STATUS.SUCCESS, { curHero });
}
// // 装备栏精炼
// public async refine(msg: { hid: number, ePlaceId: number, type: REFINE_TYPE }, session: BackendSession) {
// let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
// let serverId = session.get('serverId');
// let sid: string = session.get('sid');
// let { hid, ePlaceId, type } = msg;
// let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
// if (!hero) return resResult(STATUS.HERO_NOT_FIND);
// let { ePlace } = hero; // 装备栏
// let curEplace = ePlace.find(cur => cur.id == ePlaceId);
// if (!curEplace) {
// return resResult(STATUS.ROLE_EQUIP_PLACE_NOT_ENOUGH);
// }
// let { lv, refineLv: oldRefineLv, equip } = curEplace; // 强化等级,精炼等级,精炼次数
// let check = new CheckMeterial(roleId);
// let refineLv = oldRefineLv, times = 0;
// while(
// (type == REFINE_TYPE.ONCE && times == 0) ||
// (type == REFINE_TYPE.ONE_LEVEL && !checkRefineReachNextLv(oldRefineLv, refineLv) )
// ) {
// let result = await refineOnce(lv, refineLv);
// if(!result) break;
// let isEnough = await check.decrease(result.consumes);
// if(!isEnough) break; // 消耗不足
// refineLv = result.refineLv;
// times ++;
// }
// if(times == 0) {
// return resResult(STATUS.EQUIP_REFINE_ERR);
// }
// let consumes = check.getConsume();
// let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_REFINE);
// if (!result)
// return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// curEplace.refineLv = refineLv;
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_BASE, sid, roleId, hero, { ePlace });
// const curHero = {
// hid,
// ePlace: [curEplace]
// }
// let curEquip = <EquipType>equip;
// pushEquipRefineSucMsg(roleId, roleName, serverId, curEplace, curEquip ? curEquip.quality : 0);
// await checkTask(roleId, sid, TASK_TYPE.EQUIP_REFINE, times, true, {});
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_REFINE, times);
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_REFINE_LV, times, { lv: curEplace.refineLv });
// return resResult(STATUS.SUCCESS, { curHero });
// }
// // 装备洗炼锁定
// public async lockRandSe(msg: { eid: number, id: number, lock: boolean }, session: BackendSession) {
// let roleId: string = session.get('roleId');
// // let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// let { eid, id, lock } = msg;
// let equip = await EquipModel.findbySeqId(eid);
// if (!equip) return resResult(STATUS.EQUIP_NOT_FIND);
// let { randSe } = equip;
// if (!randSe || randSe.length <= 0) {
// return resResult(STATUS.ROLE_EQUIP_HAVE_NO_RANDSE);
// }
// let curSe = randSe.find(cur => cur.id == id);
// if (!curSe || lock == curSe.locked) {
// return resResult(STATUS.ROLE_EQUIP_DUPLICATE_LOCK);
// }
// if (lock) { // 仅在上锁时消耗,根据已有的锁的数量判断消耗
// let lockNum = randSe.filter(cur => cur.locked).length;
// let consumes: Array<{ id: number, count: number }> = [];
// if (lockNum == 0) {
// consumes = parseGoodStr(EQUIP.EQUIP_ONE_LOCKED);
// } else if (lockNum == 1) {
// consumes = parseGoodStr(EQUIP.EQUIP_TWO_LOCKED);
// } else if (lockNum == 2) {
// consumes = parseGoodStr(EQUIP.EQUIP_THREE_LOCKED);
// } else {
// return resResult(STATUS.ROLE_ALL_SE_LOCK);
// }
// let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_LOCK_RANDSE);
// if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
// }
// let result = await EquipModel.lock(roleId, eid, id, lock);
// if (!result) {
// return resResult(STATUS.ROLE_EQUIP_HAVE_NO_RANDSE);
// }
// return resResult(STATUS.SUCCESS, { curEquip: result });
// }
// // 装备洗炼预览
// public async previewStrengthen(msg: { eid: number }, session: BackendSession) {
// let roleId: string = session.get('roleId');
// // let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// let { eid } = msg;
// let equip = await EquipModel.findbySeqId(eid);
// if (!equip) return resResult(STATUS.EQUIP_NOT_FIND);
// let { id, randSe, previewRandSe } = equip;
// if(previewRandSe.length <= 0) {
// if (!randSe || randSe.length <= 0) {
// return resResult(STATUS.ROLE_EQUIP_HAVE_NO_RANDSE);
// }
// let previewRandSe = getRandSeResult(id, randSe);
// if(!previewRandSe) return resResult(STATUS.DIC_DATA_NOT_FOUND);
// let lockNum = randSe.reduce((pre, cur) => {
// return cur.locked? pre + 1: pre;
// }, 0);
// if (lockNum >= randSe.length) {
// return resResult(STATUS.ROLE_EQUIP_CANNOT_RESTRENGTHEN);
// }
// // 消耗
// let consumes: Array<{ id: number, count: number }> = [];
// if (lockNum == 0) {
// consumes = parseGoodStr(EQUIP.EQUIP_ONE_REFORGED);
// } else if (lockNum == 1) {
// consumes = parseGoodStr(EQUIP.EQUIP_TWO_REFORGED);
// } else if (lockNum == 2) {
// consumes = parseGoodStr(EQUIP.EQUIP_THREE_REFORGED);
// } else {
// consumes = parseGoodStr(EQUIP.EQUIP_FOUR_REFORGED);
// }
// let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_RESTRENGTHEN);
// if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
// equip = await EquipModel.updateEquipInfo(eid, { previewRandSe });
// }
// return resResult(STATUS.SUCCESS, { curEquip: pick(equip, ['seqId', 'id', 'randSe', 'previewRandSe']) });
// }
// // 装备洗炼
// public async reStrengthen(msg: { eid: number }, session: BackendSession) {
// let roleId: string = session.get('roleId');
// // let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// let { eid } = msg;
// let equip = await EquipModel.findbySeqId(eid);
// if (!equip) return resResult(STATUS.EQUIP_NOT_FIND);
// let { randSe, hid, ePlaceId, previewRandSe } = equip;
// if (!randSe || randSe.length <= 0) {
// return resResult(STATUS.ROLE_EQUIP_HAVE_NO_RANDSE);
// }
// if(!previewRandSe) { // 没预览过
// return resResult(STATUS.EQUIP_RESTRENGTHEN_NOT_PREVIEW);
// }
// let removeSeidList = randSe.reduce((pre, cur) => {
// return [...pre, cur.seid];
// }, <number[]>[]);
// let equipResult = await EquipModel.updateEquipInfo(eid, { randSe: previewRandSe, previewRandSe: [] })
// // 更新战力
// if(hid > 0) {
// const hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.RESTRENGTHEN, sid, roleId, hero, {}, [ePlaceId, ...removeSeidList]);
// }
// await checkTask(roleId, sid, TASK_TYPE.EQUIP_RESTRENGTHEN, 1, true, {});
// return resResult(STATUS.SUCCESS, { curEquip: pick(equipResult, ['seqId', 'id', 'randSe', 'previewRandSe']) });
// }
// // 放弃这条洗练
// public async giveupStrengthen(msg: { eid: number }, session: BackendSession) {
// let { eid } = msg;
// let equip = await EquipModel.findbySeqId(eid);
// if (!equip) return resResult(STATUS.EQUIP_NOT_FIND);
// let { randSe, previewRandSe } = equip;
// if (!randSe || randSe.length <= 0) {
// return resResult(STATUS.ROLE_EQUIP_HAVE_NO_RANDSE);
// }
// if(!previewRandSe) { // 没预览过
// return resResult(STATUS.EQUIP_RESTRENGTHEN_NOT_PREVIEW);
// }
// let equipResult = await EquipModel.updateEquipInfo(eid, { previewRandSe: [] })
// return resResult(STATUS.SUCCESS, { curEquip: pick(equipResult, ['seqId', 'id', 'randSe', 'previewRandSe']) });
// }
// // 淬火
// public async quench(msg: { eid: number, type: QUENCH_TYPE }, session: BackendSession) {
// let roleId: string = session.get('roleId');
// // let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// let { eid, type } = msg;
// let equip = await EquipModel.findbySeqId(eid);
// if (!equip) return resResult(STATUS.EQUIP_NOT_FIND);
// let { id, randMain, grade, hid, ePlaceId } = equip;
// let dicGoods = gameData.goods.get(id);
// if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND);
// let dicQuench = gameData.quenchByQuality.get(dicGoods.quality)?.get(grade);
// // console.log(dicQuench, dicGoods.quality, grade)
// if (!dicQuench) return resResult(STATUS.EQUIP_QUENCH_MAX);
// let check = new CheckMeterial(roleId);
// let logs: QuenchLogParam[] = [], times = 0;
// while(
// (type == QUENCH_TYPE.ONCE && times < 1 && !checkQuenchMaxByQualityAndGrade(dicGoods.quality, 0, randMain)) || // 淬火一次,保证不超出该品质上限
// (type == QUENCH_TYPE.ONE_GRADE && !checkQuenchMaxByQualityAndGrade(dicGoods.quality, grade, randMain)) // 淬火一品,在品相上限内淬火
// ) {
// let result = await quenchOnce(randMain, dicQuench, dicGoods);
// if(!result) break;
// let isEnough = await check.decrease(result.consumes);
// if(!isEnough) break; // 消耗不足
// result.log.setTimes(++times);
// logs.push(result.log);
// grade = result.grade;
// randMain = result.randMain;
// }
// if (times == 0) return resResult(STATUS.EQUIP_QUENCH_ERR);
// let consumes = check.getConsume();
// let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_QUENCH);
// if (!result)
// return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// let equipResult = await EquipModel.updateEquipInfo(eid, { randMain, grade })
// let curEquip = {
// seqId: equipResult.seqId,
// id: equipResult.id,
// randMain: equipResult.randMain,
// grade: equipResult.grade,
// }
// // 更新战力
// if(hid > 0) { // 装备中的时候
// const hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_BASE, sid, roleId, hero, { });
// }
// return resResult(STATUS.SUCCESS, { logs, curEquip });
// }
// //分解装备
// public async decomposeEquip(msg: { originalEquip: Array<number> }, session: BackendSession) {
// let { originalEquip } = msg;
// let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// if(originalEquip.length > BAG.BAG_RESOLVE_UPLIMITED) {
// return resResult(STATUS.EQUIP_DECOMPOSE_IS_UPLIMIT);
// }
// let equips = await EquipModel.getEquips(roleId, originalEquip);
// if (equips.length < originalEquip.length)
// return resResult(STATUS.EQUIP_NOT_FIND);
// let goods: Array<{ id: number, count: number }> = [];
// let cost: ItemInter[] = [];
// let jewels: ItemInter[] = []; // 宝石返还
// for (let equip of equips) {
// if (!!equip.hid)
// return resResult(STATUS.EQUIP_IS_EQUIPED_NOT_DECOMPOSE);
// let goodInfo = getGoodById(equip.id);
// if (!goodInfo)
// return resResult(STATUS.EQUIP_NOT_FIND);
// let holes = equip.holes || [];
// for (let { jewel } of holes) {
// if(jewel) {
// jewels.push({ id: jewel, count: 1 });
// }
// }
// goods = goods.concat(goodInfo.decomposeItem);
// cost.push({ seqId: equip.seqId, id: equip.id, count: 1 });
// }
// let costResult = await handleCost(roleId, sid, cost, ITEM_CHANGE_REASON.EQUIP_DECOMPOSE); // 删掉装备
// if(!costResult) return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// await addItems(roleId, roleName, sid, jewels, ITEM_CHANGE_REASON.EQUIP_DEL_RETURN_JEWEL); // 把原本镶嵌在装备上的宝石返还了
// let result = await addItems(roleId, roleName, sid, goods, ITEM_CHANGE_REASON.EQUIP_DECOMPOSE);
// return resResult(STATUS.SUCCESS, { goods: combineItems(result) });
// }
// public async decomposeEquipPiece(msg: { originalPiece: { id: number, count: number }[] }, session: BackendSession) {
// let { originalPiece } = msg;
// let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// let goods: ItemInter[] = [];
// for (let { id, count } of originalPiece) {
// let goodInfo = getGoodById(id);
// if (!goodInfo) return resResult(STATUS.DIC_DATA_NOT_FOUND);
// let dicItid = ITID.get(goodInfo.itid);
// if(!dicItid || dicItid.type != CONSUME_TYPE.PIECE) {
// return resResult(STATUS.CONSUME_TYPE_ERR);
// }
// for(let result of goodInfo.decomposeItem) {
// goods.push({ id: result.id, count: result.count * count });
// }
// }
// let costResult = await handleCost(roleId, sid, originalPiece, ITEM_CHANGE_REASON.EQUIP_PIECE_DECOMPOSE);
// if(!costResult) return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// let result = await addItems(roleId, roleName, sid, goods, ITEM_CHANGE_REASON.EQUIP_PIECE_DECOMPOSE);
// return resResult(STATUS.SUCCESS, { goods: combineItems(result) });
// }
// //穿戴或卸载装备 1-穿上装备(包括替换) 2-脱下装备
// public async putOnOrOff(msg: { eid: number, hid: number, type: number }, session: BackendSession) {
// let { eid, hid, type } = msg;
// let roleId: string = session.get('roleId');
// let serverId: number = session.get('serverId');
// let sid: string = session.get('sid');
// // 原武将heroA原武将穿戴着的装备a将要穿戴的装备b装备b被装备着的武将B
// let heroA = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
// if (!heroA) return resResult(STATUS.HERO_NOT_FIND);
// let oldCountA = heroA.ePlace.filter(cur => cur.equip).length;
// let oldCountB = 0;
// let equip = await EquipModel.getEquip(eid); // 装备1-equipB 2-equipA
// if(!equip) return resResult(STATUS.EQUIP_NOT_FIND);
// let argsA = calEquipSeids(heroA);
// let heroB: HeroType, equipA: EquipType, equipB: EquipType, argsB: number[] = [];
// let heroAPutNum = 0, heroBPutTNum = 0; // 1多一件 0没变化 -1少一件
// let goodInfo = getGoodById(equip.id);
// let obj = ITID.get(goodInfo.itid);
// let eplaceId = obj.type; // 位置
// if (type == 1) {
// equipB = equip; // 要穿上的装备
// if (equipB.hid == hid) return resResult(STATUS.WRONG_PARMS);
// if(!checkEquipCanPut(heroA, equipB.id)) return resResult(STATUS.EQUIP_NOT_EQUIPED_HERO);
// let index = heroA.ePlace.findIndex(cur => cur.id == eplaceId);
// if (index == -1) return resResult(STATUS.WRONG_PARMS);
// equipA = <EquipType>heroA.ePlace[index].equip; // 要脱下的装备
// if(equipB.hid > 0) {
// heroB = await HeroModel.findByHidAndRoleWithEquip(equipB.hid, roleId);
// argsB = calEquipSeids(heroB);
// oldCountB = heroB.ePlace.filter(cur => cur.equip).length;
// }
// if(equipA) {
// if(equipB.hid > 0) {
// if(checkEquipCanPut(heroB, equipA.id)) { // A=>b & B=>a
// equipA = await EquipModel.putOnOrOff(equipA._id, equipB.hid);
// heroB = await HeroModel.addEquip(roleId, heroB.hid, eplaceId, equipA._id);
// } else { // A=>b & B=>0 & 0=>a
// equipA = await EquipModel.putOnOrOff(equipA._id, 0);
// heroB = await HeroModel.removeEquip(roleId, equipB.hid, eplaceId);
// heroBPutTNum = -1;
// }
// } else { // A=>b & 0=>a
// equipA = await EquipModel.putOnOrOff(equipA._id, 0);
// }
// } else {
// if(equipB.hid > 0) { // A=>b & B=>0
// heroB = await HeroModel.removeEquip(roleId, equipB.hid, eplaceId);
// heroBPutTNum = -1;
// }
// // A=>b
// heroAPutNum = 1;
// }
// heroA = await HeroModel.addEquip(roleId, heroA.hid, eplaceId, equipB._id);
// equipB = await EquipModel.putOnOrOff(equipB._id, heroA.hid);
// } else if (type == 2) { // A=>0 & 0=>a
// if (!equip.hid) return resResult(STATUS.EQUIP_NOT_EQUIPED);
// equipA = await EquipModel.putOnOrOff(equip._id, 0);
// heroA = await HeroModel.removeEquip(roleId, heroA.hid, eplaceId);
// heroAPutNum = -1;
// }
// if(heroA) {
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP, sid, roleId, heroA, {}, argsA);
// if(heroAPutNum != 0) {
// await checkTaskWithHero(roleId, sid, TASK_TYPE.EQUIP_BY_HERO, heroA, [heroAPutNum, oldCountA]);
// }
// }
// if(heroB) {
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP, sid, roleId, heroB, {}, argsB);
// if(heroBPutTNum != 0) await checkTaskWithHero(roleId, sid, TASK_TYPE.EQUIP_BY_HERO, heroA, [heroBPutTNum, oldCountB]);
// }
// if(heroAPutNum + heroBPutTNum != 0) {
// await checkTask(roleId, sid, TASK_TYPE.EQUIP_SUM, heroAPutNum + heroBPutTNum, true, {});
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_SUM, heroAPutNum + heroBPutTNum)
// }
// let curEquips: Array<{ seqId: number, hid: number }> = [];
// if(equipA) {
// curEquips.push(pick(equipA, ['seqId', 'hid']));
// if(equipA.hid == 0) {
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_QUALITY, equipA, [-1]); // equipA必然是脱如果hid不为0说明从一个人穿到另一个人不算任务
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_QUALITY, 1, { quality: equipA.quality });
// }
// }
// if(equipB) {
// curEquips.push(pick(equipB, ['seqId', 'hid']));
// if(equipB.hid != 0) {
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_QUALITY, equipB, [1]); // equipB必然是穿如果hid为0说明没有变化不算任务
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_QUALITY, 1, { quality: equipB.quality });
// }
// }
// if(type == 1) {
// let { isTask, jewelLevel } = await checkTaskConditionEquipSuitJewelStage(heroA)//英雄满装备且都镶嵌相同阶数的宝石
// if (isTask) {
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_SUIT_JEWEL_STAGE, 1, { stage: jewelLevel })
// }
// }
// return resResult(STATUS.SUCCESS, { curEquips: curEquips });
// }
// // 一次性装备上
// public async putOnOnce(msg: { hid: number }, session: BackendSession) {
// let { hid } = msg;
// let roleId: string = session.get('roleId');
// const serverId = session.get('serverId');
// let sid: string = session.get('sid');
// let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
// if (!hero) return resResult(STATUS.HERO_NOT_FIND);
// let args = calEquipSeids(hero);
// let dicHero = gameData.hero.get(hid);
// if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
// let dicJob = gameData.job.get(dicHero.jobid);
// let allEquips = await EquipModel.findNotWearEquips(roleId);
// let sortEquips = allEquips.map(equip => {
// let { id, quality, ePlaceId, randMain } = equip;
// let { goodsAbility, lvLimited } = gameData.goods.get(id);
// let ce = calEquipCe(goodsAbility, randMain);
// return { id, quality, ce, equip, goodsAbility, lvLimited, ePlaceId }
// });
// let { ePlace, lv } = hero;
// let oldCount = ePlace.filter(cur => cur.equip).length;
// let curEquips: Array<{ seqId: number, hid: number }> = [];
// let equips: EquipType[] = [];
// for (let curEPlace of ePlace) {
// if (!curEPlace.equip) { // 未装备
// let sortAttrId = equipTypeToSortAttr.get(curEPlace.id);
// let sortedAndSuitEquips = sortEquips.filter(equipInfos => { // 筛选可穿的
// let { id, lvLimited, ePlaceId } = equipInfos;
// return lv >= lvLimited && checkEquipCanPut(hero, id) && curEPlace.id == ePlaceId;
// });
// // console.log('sortedAndSuitEquips', JSON.stringify(sortedAndSuitEquips, null, 4))
// sortedAndSuitEquips = sortedAndSuitEquips.sort((a, b) => { // 排序按:战力 => 根据位置看个别属性 => 品质
// if (b.ce - a.ce != 0) return b.ce - a.ce;
// let abilityA = a.goodsAbility.get(sortAttrId) || 0;
// let abilityB = b.goodsAbility.get(sortAttrId) || 0;
// if (abilityA - abilityB != 0) return abilityB - abilityA;
// return b.quality - a.quality;
// });
// if (sortedAndSuitEquips.length > 0) {
// let { equip } = sortedAndSuitEquips.shift();
// hero = await HeroModel.addEquip(roleId, hero.hid, equip.ePlaceId, equip._id);
// equip = await EquipModel.putOnOrOff(equip._id, hero.hid);
// if (!!equip) {
// curEquips.push(pick(equip, ['seqId', 'hid']));
// equips.push(equip);
// }
// }
// }
// }
// if (curEquips.length > 0) {
// //任务
// await checkTaskWithHero(roleId, sid, TASK_TYPE.EQUIP_BY_HERO, hero, [1, oldCount]);
// await checkTask(roleId, sid, TASK_TYPE.EQUIP_SUM, curEquips.length, true, {});
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_SUM, curEquips.length);
// for(let equip of equips) {
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_QUALITY, equip, [1]); // equipA必然是脱如果hid不为0说明从一个人穿到另一个人不算任务
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_QUALITY, 1, { quality: equip.quality });
// }
// //英雄满装备且都镶嵌相同阶数的宝石
// let { isTask, jewelLevel } = await checkTaskConditionEquipSuitJewelStage(hero)
// if (isTask) {
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_SUIT_JEWEL_STAGE, 1, { stage: jewelLevel })
// }
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP, sid, roleId, hero, {}, args);
// }
// return resResult(STATUS.SUCCESS, { curEquips });
// }
// //装备打孔
// public async digHole(msg: { eid: number, id: number }, session: BackendSession) {
// let { eid, id } = msg;
// let roleId: string = session.get('roleId');
// let sid: string = session.get('sid');
// let equip = await EquipModel.getEquip(eid);
// let index = findIndex(equip.holes, { id });
// if (index < 0)
// return resResult(STATUS.EQUIP_HOLE_NOT_FIND);
// if (equip.holes[index].isOpen)
// return resResult(STATUS.EQUIP_HOLE_IS_DUG);
// let consumes: Array<{ id: number, count: number }> = [];
// if (id == 1) {
// consumes = parseGoodStr(EQUIP.EQUIP_ONE_HOLE);
// } else if (id == 2) {
// consumes = parseGoodStr(EQUIP.EQUIP_TWO_HOLE);
// } else if (id == 3) {
// consumes = parseGoodStr(EQUIP.EQUIP_THREE_HOLE);
// }
// let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_DIG_HOLE);
// if (!result)
// return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// equip.holes[index].isOpen = true;
// await EquipModel.updateEquipInfo(eid, { holes: equip.holes });
// return resResult(STATUS.SUCCESS, { curEquip: { seqId: eid, holes: equip.holes } });
// }
// //宝石镶嵌
// public async fillHole(msg: { eid: number, id: number, jewel: number }, session: BackendSession) {
// let { eid, id, jewel } = msg;
// let roleId: string = session.get('roleId');
// const serverId = session.get('serverId');
// let sid: string = session.get('sid');
// let consumes: Array<{ id: number, count: number }> = [];
// let goods: Array<{ id: number, count: number }> = [];
// let equip = await EquipModel.getEquip(eid);
// let oldJewelCount = equip.holes.filter(cur => cur.jewel > 0).length;
// let { itid } = getGoodById(equip.id);
// let { equipJewel } = ITID.get(itid);
// let jewelInfo = getGoodById(jewel);
// if (jewelInfo.itid != equipJewel)
// return resResult(STATUS.EQUIP_NOT_MATCH_JEWEL);
// let index = findIndex(equip.holes, { id });
// if (index < 0)
// return resResult(STATUS.EQUIP_HOLE_NOT_FIND);
// if (!equip.holes[index].isOpen)
// return resResult(STATUS.EQUIP_HOLE_IS_NOT_DUG);
// let oldJewel = equip.holes[index].jewel;
// if (!!oldJewel)
// goods.push({ id: oldJewel, count: 1 });
// consumes.push({ id: jewel, count: 1 });
// let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_FILL_HOLE);
// if (!result)
// return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// equip.holes[index].jewel = jewel;
// await EquipModel.updateEquipInfo(eid, { holes: equip.holes });
// let roleName: string = session.get('roleName');
// if (goods.length)
// await addItems(roleId, roleName, sid, goods, ITEM_CHANGE_REASON.TAKE_OUT_JEWEL);
// if (!!equip.hid) {
// let hero = await HeroModel.findByHidAndRoleWithEquip(equip.hid, roleId);
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.JEWEL_ON, sid, roleId, hero, {}, [jewel, oldJewel]);
// //任务
// //英雄满装备且都镶嵌相同阶数的宝石
// let { isTask, jewelLevel } = await checkTaskConditionEquipSuitJewelStage(hero)
// if (isTask) {
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_SUIT_JEWEL_STAGE, 1, { stage: jewelLevel })
// }
// }
// // 任务
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_JEWEL, equip, [oldJewelCount]);
// await checkTaskWithArgs(roleId, sid, TASK_TYPE.EQUIP_JEWEL_STAGE, [jewel, oldJewel]);
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_JEWEL_SUM, equip, [oldJewelCount]);
// //成长任务
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_JEWEL_SUM, 1)
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_JEWEL_STAGE, 1, { stage: jewelInfo.lvLimited })
// return resResult(STATUS.SUCCESS, { curEquip: { seqId: eid, holes: equip.holes } });
// }
// //宝石合成(一键放入type:1, 合成type:2)
// public async composeJewel(msg: { jewel: number, count: number, consumes: Array<{ id: number, count: number }>, type: number }, session: BackendSession) {
// let { count, consumes, jewel, type } = msg;
// let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
// let serverId: number = session.get('serverId');
// let sid: string = session.get('sid');
// let goodInfo = getGoodById(jewel);
// let good = ITID.get(goodInfo.itid);
// if (good.type != CONSUME_TYPE.JEWEL)
// return resResult(STATUS.WRONG_PARMS);
// let needConsumes = checkMaterialEnough(consumes, jewel, count);//检查是否可以合成,并返回最终需要消耗的材料
// if (!needConsumes)
// return resResult(STATUS.WRONG_PARMS);
// let res = await handleCost(roleId, sid, needConsumes, ITEM_CHANGE_REASON.JEWEL_COMPOSE);
// if (!res)
// return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// let result = await addItems(roleId, roleName, sid, [{ id: jewel, count: count }], ITEM_CHANGE_REASON.JEWEL_COMPOSE);
// if (goodInfo.lvLimited >= JEWEL_PUSH_LV) {
// pushNormalItemMsg(roleId, roleName, serverId, MSG_SOURCE.JEWEL_COMPOSE, jewel, goodInfo.name);
// }
// if (type == 1)
// return resResult(STATUS.SUCCESS, { goods: result });
// return resResult(STATUS.SUCCESS);
// }
// //宝石卸下
// public async putOffHole(msg: { eid: number, id: number }, session: BackendSession) {
// let { eid, id } = msg;
// let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// let goods: Array<{ id: number, count: number }> = [];
// let equip = await EquipModel.getEquip(eid);
// let oldJewelCount = equip.holes.filter(cur => cur.jewel > 0).length;
// let index = findIndex(equip.holes, { id });
// if (index < 0)
// return resResult(STATUS.EQUIP_HOLE_NOT_FIND);
// let jewel = equip.holes[index].jewel;
// if (!jewel)
// return resResult(STATUS.EQUIP_NOT_FILL_HOLE);
// goods.push({ id: jewel, count: 1 });
// equip.holes[index].jewel = 0;
// await EquipModel.updateEquipInfo(eid, { holes: equip.holes });
// await addItems(roleId, roleName, sid, goods, ITEM_CHANGE_REASON.TAKE_OUT_JEWEL);
// if (!!equip.hid) {
// let hero = await HeroModel.findByHidAndRole(equip.hid, roleId);
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.JEWEL_OFF, sid, roleId, hero, {}, [jewel]);
// }
// // 任务
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_JEWEL, equip, [oldJewelCount]);
// await checkTaskWithArgs(roleId, sid, TASK_TYPE.EQUIP_JEWEL_STAGE, [0, jewel]);
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_JEWEL_SUM, equip, [oldJewelCount]);
// return resResult(STATUS.SUCCESS, { curEquip: { seqId: eid, holes: equip.holes } });
// }
// //宝石购买并合成
// public async composeAndPurchaseJewel(msg: { jewel: number, count: number, consumes: Array<{ id: number, count: number }>, purchaseGoods: Array<{ id: number, count: number }> }, session: BackendSession) {
// let { count, consumes, jewel, purchaseGoods } = msg;
// let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// const serverId = session.get('serverId');
// let goodInfo = getGoodById(jewel);
// let good = ITID.get(goodInfo.itid);
// if (good.type != CONSUME_TYPE.JEWEL)
// return resResult(STATUS.WRONG_PARMS);
// if (!purchaseGoods) //需要购买才可进行合成的物品
// purchaseGoods = [];
// if (!consumes)
// consumes = [];
// let needConsumes = checkMaterialEnough(consumes.concat(purchaseGoods), jewel, count);//检查是否可以合成,并返回最终需要消耗的材料
// if (!needConsumes)
// return resResult(STATUS.WRONG_PARMS);
// let items: ItemInter[] = [];
// for (let item of purchaseGoods) {
// items.push({ id: item.id, count: item.count })//加上购买的数量
// }
// items = items.concat(needConsumes);
// let costResult = await handleCost(roleId, sid, items, ITEM_CHANGE_REASON.JEWEL_COMPOSE);//合并消耗是否足够
// if (!costResult)
// return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// await addItems(roleId, roleName, sid, [{ id: jewel, count: count }], ITEM_CHANGE_REASON.JEWEL_COMPOSE);
// if (goodInfo.lvLimited >= JEWEL_PUSH_LV) {
// pushNormalItemMsg(roleId, roleName, serverId, MSG_SOURCE.JEWEL_COMPOSE, jewel, goodInfo.name);
// }
// return resResult(STATUS.SUCCESS);
// }
// /**
// * 临时使用的购买物品,后应该在商店中购买
// * @param msg
// * @param session
// */
// public async purchaseGoods(msg: { purchaseGoods: Array<{ id: number, count: number }> }, session: BackendSession) {
// let { purchaseGoods } = msg;
// let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// let result = await addItems(roleId, roleName, sid, purchaseGoods, ITEM_CHANGE_REASON.DEBUG);
// if (!result) {
// return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// }
// return resResult(STATUS.SUCCESS);
// }
// /**
// * 合成下一级宝石并穿戴(装备镶嵌界面)
// * @param msg
// * @param session
// */
// public async composeNextLevelJewel(msg: { jewel: number, count: number, eid: number, id: number }, session: BackendSession) {
// let { count, jewel, eid, id } = msg;
// let roleId: string = session.get('roleId');
// let roleName: string = session.get('roleName');
// let sid: string = session.get('sid');
// let serverId = session.get('serverId');
// let goodInfo = getGoodById(jewel);
// let good = ITID.get(goodInfo.itid);
// let needUpdate = false;
// let oldJewel: number;
// let consumes: Array<{ id: number, count: number }> = [];
// if (good.type != CONSUME_TYPE.JEWEL || !eid || eid < 0)
// return resResult(STATUS.WRONG_PARMS);
// let equip = await EquipModel.getEquip(eid);
// if (!equip) return resResult(STATUS.EQUIP_NOT_FIND);
// let oldJewelCount = equip.holes.filter(cur => cur.jewel > 0).length;
// let index = findIndex(equip.holes, { id });
// //装备上该位置有穿戴该宝石,且在合成的材料中
// if (!!equip.holes[index] && equip.holes[index].jewel == goodInfo.composeMaterial[0].id) {
// oldJewel = equip.holes[index].jewel;
// equip.holes[index].jewel = jewel;//合成后的新宝石穿戴到装备上
// needUpdate = true;
// consumes.push({ id: goodInfo.composeMaterial[0].id, count: 1 });//ratio1表示可以释放掉一颗宝石
// }
// consumes = consumes.concat(goodInfo.composeMaterial);
// if (goodInfo.specialMaterial.count) {
// consumes.push({ id: goodInfo.specialMaterial.ids[0], count: goodInfo.specialMaterial.count })
// }
// let costResult = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.JEWEL_COMPOSE);//检查是消耗是否足够
// if (!costResult)
// return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH);
// if (goodInfo.lvLimited >= JEWEL_PUSH_LV) {
// pushNormalItemMsg(roleId, roleName, serverId, MSG_SOURCE.JEWEL_COMPOSE, jewel, goodInfo.name);
// }
// let result = {};
// if (needUpdate) {
// //穿戴宝石
// equip = await EquipModel.updateEquipInfo(eid, { holes: equip.holes });
// if (!!equip.hid) {
// let hero = await HeroModel.findByHidAndRoleWithEquip(equip.hid, roleId);
// await calPlayerCeAndSave(HERO_SYSTEM_TYPE.JEWEL_ON, sid, roleId, hero, {}, [jewel, oldJewel]);
// //任务
// //英雄满装备且都镶嵌相同阶数的宝石
// let { isTask, jewelLevel } = await checkTaskConditionEquipSuitJewelStage(hero)
// if (isTask) {
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_SUIT_JEWEL_STAGE, 1, { stage: jewelLevel })
// }
// }
// // 任务
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_JEWEL, equip, [oldJewelCount]);
// await checkTaskWithArgs(roleId, sid, TASK_TYPE.EQUIP_JEWEL_STAGE, [jewel, oldJewel]);
// await checkTaskWithEquip(roleId, sid, TASK_TYPE.EQUIP_JEWEL_SUM, equip, [oldJewelCount]);
// //成长任务
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.EQUIP_JEWEL_SUM, count)
// return resResult(STATUS.SUCCESS, { curEquip: { seqId: eid, holes: equip.holes } });
// } else {
// result = await addItems(roleId, roleName, sid, [{ id: jewel, count: count }], ITEM_CHANGE_REASON.JEWEL_COMPOSE);
// return resResult(STATUS.SUCCESS, { goods: [{ id: jewel, count }] });
// }
// }
// /**
// * @description 藏宝图合成
// * @param {{target: number, original: Array<{id: number, count: number}>}} msg
// * @param {BackendSession} session
// * @returns
// * @memberof ComBattleHandler
// */
// async composeBlueprt(msg: { target: number, original: Array<{ id: number, count: number }> }, session: BackendSession) {
// const roleId = session.get('roleId');
// const roleName = session.get('roleName');
// const sid = session.get('sid');
// const serverId = session.get('serverId');
// const { target, original } = msg;
// // 原材料检查
// let originalQuality: number, originalSum: number = 0;
// for (let { id, count } of original) {
// const goodInfo = gameData.goods.get(id);
// if (!originalQuality) originalQuality = goodInfo.quality;
// if (originalQuality != goodInfo.quality) {
// return resResult(STATUS.COM_BLUEPRT_QUALITY_ERROR);
// }
// if (goodInfo.itid == IT_TYPE.BLUEPRT) {
// originalSum += count;
// }
// }
// const dicCompose = gameData.blurprtCompose.get(originalQuality);
// if (!dicCompose) {
// return resResult(STATUS.COM_BLUEPRT_QUALITY_CANNOT_COMPOSE);
// }
// if (originalSum != dicCompose.blueprtNum) {
// return resResult(STATUS.COM_BLUEPRT_COUNT_ERROR);
// }
// let dicTargetInfo = gameData.goods.get(target);
// if (!dicTargetInfo) return resResult(STATUS.WRONG_PARMS);
// if (dicTargetInfo.quality != dicCompose.targetQuality) return resResult(STATUS.COM_BLUEPRT_QUALITY_ERROR);
// // 消耗藏宝图和寻宝币
// let costResult = await handleCost(roleId, sid, [...original, ...dicCompose.coinNum], ITEM_CHANGE_REASON.BLUEPRT_COMPOSE);
// if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
// const reward = [{ id: target, count: 1 }];
// const goods = await addItems(roleId, roleName, sid, reward, ITEM_CHANGE_REASON.BLUEPRT_COMPOSE);
// if (dicCompose.targetQuality >= QUALITY_TYPE.ORANGE) {
// const { name } = gameData.goods.get(target);
// pushNormalItemMsg(roleId, roleName, serverId, MSG_SOURCE.ORANGE_BLUEPRT_COMPOSE, target, name);
// }
// await checkTask(roleId, sid, TASK_TYPE.COM_BATTLE_BLUEPRT, 1, true, { quality: dicCompose.targetQuality });
// await checkActivityTask(serverId, sid, roleId, TASK_TYPE.COM_BATTLE_BLUEPRT, 1, { quality: dicCompose.targetQuality })
// return resResult(STATUS.SUCCESS, { goods, costGold: 0 });
// }
}