import { mergeSameGoods } from '../pubUtils/util'; import { EquipModel } from "../db/Equip"; import { HeroModel, EPlace } from "../db/Hero"; import { ITID } from "../consts/constModules/itemConst"; import { getHeroJob, getGoodById, gameData, getJewelById, getHeroEquipByClassId } from "../pubUtils/data"; import { calPlayerCeAndSave } from "./playerCeService"; import { HERO_SYSTEM_TYPE } from "../consts"; const _ = require('underscore'); export function checkMaterialEnough(consumes:Array<{id: number, count: number}>, jewel: number, jewelCount: number) { let comJewelMap = {}; consumes = mergeSameGoods(consumes); let needConsumes: Array<{id: number, count: number}> = []; let gidJewelInfo = getGoodById(jewel); for (let { id, count } of consumes) { let jewelInfo = getJewelById(id); if (!jewelInfo || !jewelInfo.count) continue; needConsumes.push({ id, count}); comJewelMap[jewelInfo.good_id] = count + (comJewelMap[jewelInfo.good_id] || 0); for (let i = jewelInfo.lvLimited; i < gidJewelInfo.lvLimited; i++) { if (((comJewelMap[jewelInfo.good_id] || 0) % jewelInfo.count != 0)) { break; } let comcount = Math.floor(((comJewelMap[jewelInfo.good_id] || 0)) / jewelInfo.count); if (comcount < 1) { break; } comJewelMap[jewelInfo.nextJewelId] = comcount + (comJewelMap[jewelInfo.nextJewelId] || 0); delete comJewelMap[jewelInfo.good_id]; if (!!jewelInfo.specialCount) needConsumes.push({ count: jewelInfo.specialCount * comcount, id: jewelInfo.nextSpecialId}); jewelInfo = getJewelById(jewelInfo.nextJewelId); } } if (comJewelMap[jewel] != jewelCount || Object.keys(comJewelMap).length != 1) return false; return needConsumes; } export async function changeEquip(roleId: string, sid: string, objectId: string, hid: number, id: number, seqId: number) { let hero; if (!!hid) hero = await HeroModel.findByHidAndRole(hid, roleId); if (!!objectId) { let equip = await EquipModel.getEquipByObjectId(objectId); if (!!hero) { let goodInfo = getGoodById(equip.id); let obj = ITID.get(goodInfo.itid); let ePlaceId = obj.type; if (goodInfo.lvLimited > hero.lv) return takeOffEquip(objectId); let { jobid } = gameData.hero.get(hid); let { job_class } = getHeroJob(jobid); let { classId } = getHeroEquipByClassId(goodInfo.itid); if (_.indexOf(classId, job_class) < 0) return takeOffEquip(objectId); hero = await HeroModel.addEquip(roleId, hero.hid, ePlaceId, objectId); // await calPlayerCeAndSave(sid, roleId, [hero], HERO_SYSTEM_TYPE.EQUIP, []); if (!!hero) { await calPlayerCeAndSave(sid, roleId, [hero]); let ePlaces = hero.ePlace; let ePlace= _.findWhere(ePlaces,{ id: ePlaceId }); return {seqId: ePlace.equip.seqId, hid, ePlaceId}; } } else { return takeOffEquip(objectId); } } if (!!hero) { let index = _.findIndex(hero.ePlace, { id }); if (index < 0) return; hero.ePlace[index].equip = null; await EquipModel.updateEquipInfo(seqId, { hid: 0, ePlaceId: 0 }); await calPlayerCeAndSave(sid, roleId, [hero]); } } async function takeOffEquip(objectId: string) { let {seqId, ePlaceId} = await EquipModel.updateEquipInfobyObjectId(objectId, { hid: 0, ePlaceId: 0 }); return { seqId, hid: 0, ePlaceId}; }