@@ -1,5 +1,5 @@
|
||||
import { Application, BackendSession } 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 } from "../../../consts";
|
||||
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 } from "../../../consts";
|
||||
import { ItemInter } from "../../../pubUtils/interface";
|
||||
|
||||
import { resResult, parseGoodStr, getRandValueByMinMax, getRandEelm } from "../../../pubUtils/util";
|
||||
@@ -10,12 +10,13 @@ import Role from "../../../db/Role";
|
||||
import { calPlayerCeAndSave } from "../../../services/playerCeService";
|
||||
import { getHeroJob, getGoodById, gameData, getHeroEquipByClassId } from "../../../pubUtils/data";
|
||||
import { EQUIP } from "../../../pubUtils/dicParam";
|
||||
import { ITID, SPEICAL_ITEM, QUALITY_TYPE } from "../../../consts/constModules/itemConst";
|
||||
import { ITID, SPEICAL_ITEM, QUALITY_TYPE, equipTypeToSortAttr } from "../../../consts/constModules/itemConst";
|
||||
import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe } from "../../../services/equipService";
|
||||
|
||||
import { indexOf, findIndex } from 'underscore';
|
||||
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
|
||||
import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService";
|
||||
import { Attribute } from "../../../domain/roleField/attribute";
|
||||
|
||||
export default function (app: Application) {
|
||||
return new EquipHandler(app);
|
||||
@@ -528,6 +529,66 @@ export class EquipHandler {
|
||||
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 funcs: number[] = session.get('funcs');
|
||||
let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
|
||||
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, randRange, ePlaceId } = equip;
|
||||
let { goodsAbility, lvLimited, itid } = gameData.goods.get(id);
|
||||
let attrObj = new Attribute();
|
||||
attrObj.setByMap(goodsAbility, HERO_CE_RATIO + randRange);
|
||||
let ce = attrObj.calEquipCe();
|
||||
let { classId } = getHeroEquipByClassId(itid);
|
||||
|
||||
return { id, quality, ce, equip, goodsAbility, lvLimited, classId, ePlaceId }
|
||||
});
|
||||
let { ePlace, lv } = hero;
|
||||
|
||||
let curEquips: Array<{ seqId: number, hid: number }> = [];
|
||||
for(let curEPlace of ePlace) {
|
||||
if(!curEPlace.equip) { // 未装备
|
||||
let sortAttrId = equipTypeToSortAttr.get(curEPlace.id);
|
||||
let sortedAndSuitEquips = sortEquips.filter(equipInfos => { // 筛选可穿的
|
||||
let { lvLimited, classId, ePlaceId } = equipInfos;
|
||||
return lv >= lvLimited && classId.indexOf(dicJob.job_class) != -1 && curEPlace.id == ePlaceId;
|
||||
}).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();
|
||||
let curEquip = await dressEquip(serverId, roleId, sid, hero,equip, funcs);
|
||||
if(!!curEquip) curEquips.push(curEquip);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//任务
|
||||
//英雄满装备且都镶嵌相同阶数的宝石
|
||||
let { isTask, jewelLevel } = await checkTaskConditionEquipSuitJewelStage(hero)
|
||||
if (isTask) {
|
||||
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_SUIT_JEWEL_STAGE, 1, { stage: jewelLevel })
|
||||
}
|
||||
return resResult(STATUS.SUCCESS, { curEquips });
|
||||
}
|
||||
|
||||
//装备打孔
|
||||
public async digHole(msg: { eid: number, id: number }, session: BackendSession) {
|
||||
let { eid, id } = msg;
|
||||
|
||||
@@ -196,17 +196,19 @@ export class HeroHandler {
|
||||
}
|
||||
|
||||
// 武将升星
|
||||
public async starUp(msg: { hid: number, star: number, starStage: number }, session: BackendSession) {
|
||||
public async starUp(msg: { hid: number, star: number, starStage: number, isOneClick: boolean }, session: BackendSession) {
|
||||
let roleId: string = session.get('roleId');
|
||||
const serverId = session.get('serverId');
|
||||
let sid: string = session.get('sid');
|
||||
let funcs: number[] = session.get('funcs');
|
||||
|
||||
let { hid, star, starStage } = msg;
|
||||
let { hid, star, starStage, isOneClick } = msg;
|
||||
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
|
||||
let dicHero = gameData.hero.get(hid);
|
||||
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
let { pieceId } = dicHero;
|
||||
let { pieceId, jobid } = dicHero;
|
||||
let dicJob = gameData.job.get(jobid);
|
||||
if(!dicJob) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
|
||||
@@ -219,17 +221,23 @@ export class HeroHandler {
|
||||
return resResult(STATUS.ROLE_STAR_REACH_MAX);
|
||||
}
|
||||
// 根据dic_zyz_hero_star 计算需要花的碎片并检查碎片数量
|
||||
const curDicHeroStar = getHeroStarByQuality(quality, oldStar);
|
||||
const curDicHeroStar = getHeroStarByQuality(dicJob.job_class, quality, oldStar);
|
||||
if (!curDicHeroStar) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let newStarStage = 0;
|
||||
let max = isOneClick? ABI_STAGE.END: oldStarStage + 1;
|
||||
for(let i = 0; i < max; i++ ) {
|
||||
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: curDicHeroStar.advanceUpFragmentNum }]);
|
||||
if (!costResult) break;
|
||||
newStarStage++;
|
||||
}
|
||||
if(newStarStage == 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: curDicHeroStar.advanceUpFragmentNum }]);
|
||||
if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
let isUpStar = oldStarStage + 1 == ABI_STAGE.END;
|
||||
let isUpStar = newStarStage == ABI_STAGE.END;
|
||||
|
||||
let update = {
|
||||
star: isUpStar ? oldStar + 1 : oldStar,
|
||||
starStage: isUpStar ? ABI_STAGE.START : oldStarStage + 1
|
||||
starStage: isUpStar ? ABI_STAGE.START : newStarStage
|
||||
}
|
||||
|
||||
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.STAR, sid, roleId, hero, update);
|
||||
@@ -307,7 +315,7 @@ export class HeroHandler {
|
||||
}
|
||||
|
||||
// 武将觉醒
|
||||
public async wakeUp(msg: { hid: number, colorStar: number, colorStarStage: number }, session: BackendSession) {
|
||||
public async wakeUp(msg: { hid: number, colorStar: number, colorStarStage: number, isOneClick: boolean }, session: BackendSession) {
|
||||
|
||||
let roleId: string = session.get('roleId');
|
||||
let sid: string = session.get('sid');
|
||||
@@ -315,11 +323,13 @@ export class HeroHandler {
|
||||
const serverId = session.get('serverId');
|
||||
let funcs: number[] = session.get('funcs');
|
||||
|
||||
let { hid, colorStar, colorStarStage } = msg;
|
||||
let { hid, colorStar, colorStarStage, isOneClick } = msg;
|
||||
// 根据dic_hero 获得 1. 碎片id 2. 碎片数量 3. 初始武将星级 4. 初始品质
|
||||
let dicHero = gameData.hero.get(hid);
|
||||
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
let { pieceId } = dicHero;
|
||||
let { pieceId, jobid } = dicHero;
|
||||
let dicJob = gameData.job.get(jobid);
|
||||
if (!dicJob) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
|
||||
@@ -335,21 +345,27 @@ export class HeroHandler {
|
||||
return resResult(STATUS.ROLE_QUALITY_NOT_ENOUGH);
|
||||
}
|
||||
// 根据dic_zyz_hero_wake 计算需要花的碎片并检查碎片数量
|
||||
const curDicHeroStar = getHeroWakeByQuality(dicHero.quality, oldColorStar)
|
||||
const curDicHeroStar = getHeroWakeByQuality(dicJob.job_class, dicHero.quality, oldColorStar)
|
||||
if (!curDicHeroStar) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let { fragmentNum, consume } = curDicHeroStar;
|
||||
|
||||
// console.log(JSON.stringify([{id: pieceId, count: fragmentNum}, ...consumeArr]))
|
||||
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: fragmentNum }, ...consume]);
|
||||
if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
let newColorStarStage = 0;
|
||||
let max = isOneClick? ABI_STAGE.END: oldColorStarStage + 1;
|
||||
for(let i = 0; i < max; i++) {
|
||||
let { fragmentNum, consume } = curDicHeroStar;
|
||||
|
||||
// console.log(JSON.stringify([{id: pieceId, count: fragmentNum}, ...consumeArr]))
|
||||
let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: fragmentNum }, ...consume]);
|
||||
if (!costResult) break;
|
||||
newColorStarStage++;
|
||||
}
|
||||
if(newColorStarStage == 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
|
||||
|
||||
let isWakeUp = oldColorStar == 0;
|
||||
let isUpStar = isWakeUp || oldColorStarStage + 1 == ABI_STAGE.END;
|
||||
let isUpStar = isWakeUp || newColorStarStage == ABI_STAGE.END;
|
||||
|
||||
let update = {
|
||||
colorStar: isUpStar ? oldColorStar + 1 : oldColorStar,
|
||||
colorStarStage: isUpStar ? ABI_STAGE.START : oldColorStarStage + 1
|
||||
colorStarStage: isUpStar ? ABI_STAGE.START : newColorStarStage
|
||||
}
|
||||
|
||||
hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.COLORSTAR, sid, roleId, hero, update);
|
||||
@@ -388,7 +404,7 @@ export class HeroHandler {
|
||||
let dicJob = gameData.job.get(hero.job);
|
||||
if (!dicJob) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
if (hero.jobStage >= ABI_STAGE.END)
|
||||
if (hero.jobStage >= dicJob.maxStage)
|
||||
return resResult(STATUS.HERO_JOB_STAGE_REACH_MAX_STAGE);
|
||||
if (hero.job >= getMaxGradeByjobClass(dicJob.job_class))
|
||||
return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE);
|
||||
@@ -418,7 +434,6 @@ export class HeroHandler {
|
||||
|
||||
//进阶
|
||||
async heroJobStageUp(msg: { hid: number }, session: BackendSession) {
|
||||
console.log(JSON.stringify([...gameData.jobClassMaxGrades]))
|
||||
let roleId: string = session.get('roleId');
|
||||
const serverId = session.get('serverId');
|
||||
let sid: string = session.get('sid');
|
||||
@@ -522,10 +537,9 @@ export class HeroHandler {
|
||||
let hero = await HeroModel.findByHidAndRole(hid, roleId);
|
||||
if (!hero) return resResult(STATUS.ROLE_HERO_NOT_EXISTS);
|
||||
|
||||
let { favourLv: oldLv, favour: oldExp } = hero;
|
||||
let { favourLv: oldLv, favour: oldExp, lv } = hero;
|
||||
|
||||
let maxLv = gameData.maxFriendShipLv.max; // 好感度最大等级
|
||||
console.log(maxLv)
|
||||
let maxLv = lv > gameData.maxFriendShipLv.max? gameData.maxFriendShipLv.max: lv; // 好感度最大等级
|
||||
if (maxLv <= oldLv)
|
||||
return resResult(STATUS.HERO_FAVOUR_LEVEL_REACH_MAXT);
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ export async function takeOffEquipAndCalPlayerCe(roleId: string, sid: string, he
|
||||
// 任务
|
||||
await checkTask(roleId, sid, funcs, TASK_TYPE.EQUIP_SUM, -1, true, {});
|
||||
await checkTaskWithEquip(roleId, sid, funcs, TASK_TYPE.EQUIP_QUALITY, equip, [-1]);
|
||||
return { seqId: equip.seqId, hid: 0 };
|
||||
return { seqId: equip.seqId, hid: 0, id: equip.id, ePlaceId: equip.ePlaceId };
|
||||
}
|
||||
/**
|
||||
* 穿戴装备并重算战力
|
||||
@@ -131,5 +131,5 @@ export async function dressEquip(serverId: number, roleId: string, sid: string,
|
||||
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_QUALITY, 1, { quality: equip.quality })
|
||||
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_SUM, 1)
|
||||
|
||||
return { seqId: equip.seqId, hid: hero.hid };
|
||||
return { seqId: equip.seqId, hid: hero.hid, id: equip.id, ePlaceId: equip.ePlaceId };
|
||||
}
|
||||
@@ -103,16 +103,16 @@ module.exports = {
|
||||
"required uInt32 type": 2,
|
||||
"repeated Material material": 3
|
||||
},
|
||||
"role.heroHandler.starUp": {
|
||||
"required uInt32 hid": 1,
|
||||
"required uInt32 star": 2,
|
||||
"required uInt32 starStage": 3
|
||||
},
|
||||
"role.heroHandler.wakeUp": {
|
||||
"required uInt32 hid": 1,
|
||||
"required uInt32 colorStar": 2,
|
||||
"required uInt32 colorStarStage": 3
|
||||
},
|
||||
// "role.heroHandler.starUp": {
|
||||
// "required uInt32 hid": 1,
|
||||
// "required uInt32 star": 2,
|
||||
// "required uInt32 starStage": 3
|
||||
// },
|
||||
// "role.heroHandler.wakeUp": {
|
||||
// "required uInt32 hid": 1,
|
||||
// "required uInt32 colorStar": 2,
|
||||
// "required uInt32 colorStarStage": 3
|
||||
// },
|
||||
"role.heroHandler.qualityUp": {
|
||||
"required uInt32 hid": 1,
|
||||
"required uInt32 quality": 2
|
||||
|
||||
Reference in New Issue
Block a user