diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index aea1c3d99..25ff22b59 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -8,7 +8,7 @@ import { CURRENCY_BY_TYPE, CURRENCY_TYPE, CONSUME_TYPE, HERO_GROW_MAX, HERO_SYST import { RoleModel } from '../../../db/Role'; import { ItemModel } from '../../../db/Item'; import { gameData, getHeroExpByLv, getHeroStarByQuality, getHeroWakeByQuality, getHeroLvByExp, getMaxGradeByjobClass, getJobByGradeAndClass, getFriendShipById, getFavourLvByExp, reloadDicParam } from '../../../pubUtils/data'; -import { RewardInter } from '../../../pubUtils/interface'; +import { ItemInter, RewardInter } from '../../../pubUtils/interface'; import { getDropItems, FIGURE_UNLOCK_CONDITION } from '../../../consts/constModules/itemConst' import { pushComposeOrangeHero, pushHeroQualityUpMsg, pushHeroStarMax, pushHeroWakeUp } from '../../../services/chatService'; import { calculatetopLineup } from '../../../pubUtils/playerCe'; @@ -396,12 +396,12 @@ export class HeroHandler { } //训练 - async heroJobTrain(msg: { hid: number }, session: BackendSession) { + async heroJobTrain(msg: { hid: number, isOneClick: boolean }, session: BackendSession) { let roleId: string = session.get('roleId'); let sid: string = session.get('sid'); let funcs: number[] = session.get('funcs'); const serverId = session.get('serverId'); - let { hid } = msg; + let { hid, isOneClick } = msg; let hero = await HeroModel.findByHidAndRole(hid, roleId); if (!hero) return resResult(STATUS.HERO_NOT_FIND); @@ -413,18 +413,21 @@ export class HeroHandler { if (hero.job >= getMaxGradeByjobClass(dicJob.job_class)) return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE); - let consume = new Array(); - if (dicJob.trainingConsume[hero.jobStage]) { - consume.push(dicJob.trainingConsume[hero.jobStage]); - } - let result = await handleCost(roleId, sid, consume); - if (!result) { - return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + let newJobStage = 0; + let max = isOneClick ? dicJob.maxStage: hero.jobStage + 1; + for(let i = 0; i < max; i++) { + let singleConsume = dicJob.trainingConsume[hero.jobStage]; + if(!singleConsume) break; // 每天消耗不可训练 + + let result = await handleCost(roleId, sid, [singleConsume]); + if (!result) break; // 材料不足 + newJobStage ++; } + if (newJobStage == 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); //重算战力并下发 hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.TRAIN, sid, roleId, hero, { - jobStage: hero.jobStage + 1 + jobStage: newJobStage }); // 任务 await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.HERO_TRAIN, hero); diff --git a/shared/pubUtils/playerCe.ts b/shared/pubUtils/playerCe.ts index 1f922bfc2..6e0af0fcb 100644 --- a/shared/pubUtils/playerCe.ts +++ b/shared/pubUtils/playerCe.ts @@ -463,17 +463,18 @@ export function calHeroTrainIncAttr(originHero: HeroType, update: HeroUpdate) { let { job = oldJob, jobStage = oldJobStage } = update; let dicJob = gameData.job.get(job); - - if (dicJob.grade >= 1) { - let jobGradeAndClass = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1); - let lastJob = gameData.job.get(jobGradeAndClass.jobid); - let targetAttrId = dicJob.ceAttr.get(jobStage).id; - let inc = (dicJob.ceAttr.get(jobStage).attr - lastJob.ceAttr.get(jobStage).attr) * HERO_CE_RATIO; - updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } }); - } else { - let targetAttrId = dicJob.ceAttr.get(jobStage).id; - let inc = dicJob.ceAttr.get(jobStage).attr * HERO_CE_RATIO; - updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } }); + let lastJob = getJobByGradeAndClass(dicJob.job_class, dicJob.grade - 1); + let dicLastJob = lastJob? gameData.job.get(lastJob.jobid): null; + + for(let i = 1; i <= dicJob.maxStage; i++) { + if(oldJobStage < i && jobStage >= i) { + let lastAttr = dicLastJob? dicLastJob.ceAttr.get(i).attr: 0; + let targetAttrId = dicJob.ceAttr.get(i).id; + let targetAttrValue = dicJob.ceAttr.get(i).attr; + let inc = (targetAttrValue - lastAttr) * HERO_CE_RATIO; + console.log('*******', targetAttrId, targetAttrValue, lastAttr, inc ) + updateHeroAttr(heroAttrs, targetAttrId, { inc: { fixUp: inc } }); + } } return heroAttrs; }