From cf920c0c8024be3dc0c9d75e14e3a43dd9db3b6f Mon Sep 17 00:00:00 2001 From: luying Date: Sat, 26 Feb 2022 17:41:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A6=E5=B0=86=E9=87=8D=E7=94=9F=EF=BC=9A?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B6=88=E8=80=97=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/servers/role/handler/equipHandler.ts | 69 +++++++++++++------ .../app/servers/role/handler/heroHandler.ts | 58 +++++++++++----- game-server/app/services/roleService.ts | 19 ++++- 3 files changed, 104 insertions(+), 42 deletions(-) diff --git a/game-server/app/servers/role/handler/equipHandler.ts b/game-server/app/servers/role/handler/equipHandler.ts index 650306759..5ab4c68f2 100644 --- a/game-server/app/servers/role/handler/equipHandler.ts +++ b/game-server/app/servers/role/handler/equipHandler.ts @@ -15,6 +15,7 @@ import { JewelModel } from "../../../db/Jewel"; import { getJewelRandSe } from "../../../pubUtils/itemUtils"; import { checkTaskInEquipQualityUp, checkTaskInEquipStarUp, checkTaskInPutJewel, checkTaskInPutStone } from '../../../services/equipService'; import { pushEquipQualityMax, pushEquipStarMax } from "../../../services/sysChatService"; +import { addConsumeToHero } from "../../../services/roleService"; export default function (app: Application) { new HandlerService(app, {}); @@ -95,7 +96,11 @@ export class EquipHandler { let { newEplace, updatedEplace } = updateEplace(oldEplace, ePlaceId, { lv: newLv }); - hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, { ePlace: newEplace }, [ePlaceId]); + let update = { + ePlace: newEplace, + consumes: addConsumeToHero(hero.consumes, consumes) + } + hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, update, [ePlaceId]); await checkTaskInEquipLvUp(serverId, roleId, sid, oldEplace, newEplace, [ePlaceId]); const curHero = { @@ -142,7 +147,11 @@ export class EquipHandler { let { newEplace, updatedEplace } = updateEplaces(ePlace, eplaceIds); - await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, { ePlace: newEplace }, [...eplaceIds.keys()]); + let update = { + ePlace: newEplace, + consumes: addConsumeToHero(hero.consumes, consumes), + } + await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STRENGTH, sid, roleId, hero, update, [...eplaceIds.keys()]); await checkTaskInEquipLvUp(serverId, roleId, sid, ePlace, newEplace, [...eplaceIds.keys()]); const curHero = { @@ -172,7 +181,7 @@ export class EquipHandler { let nextEquipQuality = getNextEquipQuality(curEquip.equipId, curEquip.quality, curEquip.qualityStage); if(!nextEquipQuality) return resResult(STATUS.EQUIP_QUALITY_MAX); - let update = { + let equipUpdate = { quality: curEquip.quality, qualityStage: curEquip.qualityStage, } @@ -184,27 +193,32 @@ export class EquipHandler { 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) + equipUpdate.qualityStage++; + nextEquipQuality = getNextEquipQuality(curEquip.equipId, equipUpdate.quality, equipUpdate.qualityStage) } } else { // 往下一阶,包括满点之后的升品 let isEnough = await check.decrease(nextEquipQuality.consume); if(isEnough) { - update.quality = nextEquipQuality.quality; - update.qualityStage = nextEquipQuality.point; + equipUpdate.quality = nextEquipQuality.quality; + equipUpdate.qualityStage = nextEquipQuality.point; } } - if(update.quality == curEquip.quality && update.qualityStage == curEquip.qualityStage) { + if(equipUpdate.quality == curEquip.quality && equipUpdate.qualityStage == curEquip.qualityStage) { return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); } let consumes = check.getConsume(); let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_QUALITYUP); if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - let isUpQuality = update.quality != curEquip.quality; + let isUpQuality = equipUpdate.quality != curEquip.quality; - let { newEplace, updatedEplace, newEquip } = updateEplace(oldEplace, ePlaceId, update); - hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_QUALITY, sid, roleId, hero, { ePlace: newEplace }, [ePlaceId]); + let { newEplace, updatedEplace, newEquip } = updateEplace(oldEplace, ePlaceId, equipUpdate); + + let update = { + ePlace: newEplace, + consumes: addConsumeToHero(hero.consumes, consumes), + } + hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_QUALITY, sid, roleId, hero, update, [ePlaceId]); await checkTaskInEquipQualityUp(serverId, roleId, sid, oldEplace, newEplace, ePlaceId, hid, isUpQuality); pushEquipQualityMax(roleId, roleName, serverId, hid, newEquip, isUpQuality); @@ -232,7 +246,7 @@ export class EquipHandler { let curEquip = oldEplace.find(cur => cur.id == ePlaceId); if(!curEquip) return resResult(STATUS.EQUIP_NOT_FIND); - let update = { + let equipUpdate = { star: curEquip.star, starStage: curEquip.starStage, } @@ -254,8 +268,8 @@ export class EquipHandler { let isEnough = await check.decrease(dicEquipStar.subConsume); if(isEnough) { - update.star = nextEquipStar.star; - update.starStage = 0; + equipUpdate.star = nextEquipStar.star; + equipUpdate.starStage = 0; } } } else { // 升小点,包括一键升到满小点和升一个小点 @@ -263,19 +277,23 @@ export class EquipHandler { for(let stage = curEquip.starStage + 1; stage <= toStage; stage++) { let isEnough = await check.decrease(dicEquipStar.mainConsume); if(!isEnough) break; // 消耗不足 - update.starStage = stage; + equipUpdate.starStage = stage; } } - if(update.star == curEquip.star && update.starStage == curEquip.starStage) { + if(equipUpdate.star == curEquip.star && equipUpdate.starStage == curEquip.starStage) { return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); } let consumes = check.getConsume(); let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.EQUIP_STARUP); if (!result) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - let { newEplace, updatedEplace, newEquip } = updateEplace(oldEplace, ePlaceId, update); - hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STAR, sid, roleId, hero, { ePlace: newEplace }, [ePlaceId]); + let { newEplace, updatedEplace, newEquip } = updateEplace(oldEplace, ePlaceId, equipUpdate); + let update = { + ePlace: newEplace, + consumes: addConsumeToHero(hero.consumes, consumes) + } + hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STAR, sid, roleId, hero, update, [ePlaceId]); await checkTaskInEquipStarUp(serverId, roleId, sid, oldEplace, newEplace, ePlaceId, hid, isUpStar); pushEquipStarMax(roleId, roleName, serverId, hid, newEquip, isUpStar); @@ -395,17 +413,26 @@ export class EquipHandler { return resResult(STATUS.STONE_CANNOT_SUIT); } - let consumeResult = await handleCost(roleId, sid, [{ id: gid, count: 1 }], ITEM_CHANGE_REASON.EQUIP_FILL_HOLE); - if (!consumeResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); + let updateConsumes = hero.consumes; + if(gid > 0) { + addConsumeToHero(updateConsumes, [{ id: gid, count: 1 }]); + let consumeResult = await handleCost(roleId, sid, [{ id: gid, count: 1 }], ITEM_CHANGE_REASON.EQUIP_FILL_HOLE); + if (!consumeResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); + } if(curStone.stone > 0) { // 返回石头 + addConsumeToHero(updateConsumes, [{ id: curStone.stone, count: -1 }]); await addItems(roleId, roleName, sid, [{ id: curStone.stone, count: 1 }], ITEM_CHANGE_REASON.EQUIP_FILL_HOLE); } let newStone = updateStone(curEquip.stones, stonesId, gid); let { newEplace, updatedEplace } = updateEplace(oldEplace, ePlaceId, { stones: newStone }); let jewel = await JewelModel.findbySeqId(curEquip.jewel); - await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STONE, sid, roleId, hero, { ePlace: newEplace }, [ePlaceId], { jewel }); + let update = { + ePlace: newEplace, + consumes: updateConsumes, + } + await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP_STONE, sid, roleId, hero, update, [ePlaceId], { jewel }); await checkTaskInPutStone(serverId, roleId, sid, oldEplace, newEplace, ePlaceId, jewel); let curHero = { diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 1c39b3f0e..ee42d0f0a 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -16,6 +16,8 @@ import { PvpDefenseModel } from '../../../db/PvpDefense'; import { checkTaskWithHero, checkTask, checkActivityTask } from '../../../services/taskService'; import { pick } from 'underscore'; import { updateEplaces } from '../../../services/equipService'; +import { addConsumeToHero } from '../../../services/roleService'; +import { getCoinObject } from '../../../pubUtils/itemUtils'; export default function (app: Application) { new HandlerService(app, {}); @@ -116,7 +118,8 @@ export class HeroHandler { let update = { lv: newLv, - exp: newExp + exp: newExp, + consumes: addConsumeToHero(hero.consumes, material) } hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.LVUP, sid, roleId, hero, update); @@ -180,7 +183,8 @@ export class HeroHandler { let update = { star: isUpStar ? oldStar + 1 : oldStar, - starStage: isUpStar ? ABI_STAGE.START : newStarStage + starStage: isUpStar ? ABI_STAGE.START : newStarStage, + consumes: addConsumeToHero(hero.consumes, consumes) } hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.STAR, sid, roleId, hero, update); @@ -237,12 +241,15 @@ export class HeroHandler { if (!curDicHeroQualityUp) return resResult(STATUS.DIC_DATA_NOT_FOUND); let { fragmentNum } = curDicHeroQualityUp; - let costResult = await handleCost(roleId, sid, [{ id: pieceId, count: fragmentNum }], ITEM_CHANGE_REASON.HERO_QUALITY_UP); + let material = [{ id: pieceId, count: fragmentNum }]; + let costResult = await handleCost(roleId, sid, material, ITEM_CHANGE_REASON.HERO_QUALITY_UP); if (!costResult) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); - hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.QUALITY, sid, roleId, hero, { - quality: hero.quality + 1 - }); + let update = { + quality: hero.quality + 1, + consumes: addConsumeToHero(hero.consumes, material) + } + hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.QUALITY, sid, roleId, hero, update); await calAllHeroCe(HERO_SYSTEM_TYPE.QUALITY, sid, roleId, {}, [hid, 0]); // 升品可能影响到百家学院全局加成 // 任务 @@ -313,7 +320,8 @@ export class HeroHandler { let update = { quality: isWakeUp? quality + 1: quality, colorStar: isUpStar ? oldColorStar + 1 : oldColorStar, - colorStarStage: isUpStar ? ABI_STAGE.START : newColorStarStage + colorStarStage: isUpStar ? ABI_STAGE.START : newColorStarStage, + consumes: addConsumeToHero(hero.consumes, consumes) } hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.COLORSTAR, sid, roleId, hero, update); @@ -378,9 +386,11 @@ export class HeroHandler { return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); //重算战力并下发 - hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.TRAIN, sid, roleId, hero, { - jobStage: newJobStage - }); + let update = { + jobStage: newJobStage, + consumes: addConsumeToHero(hero.consumes, consumes) + } + hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.TRAIN, sid, roleId, hero, update); // 任务 await checkTaskWithHero(roleId, sid, TASK_TYPE.HERO_TRAIN, hero, [oldJob, oldJobStage]); await checkTask(roleId, sid, TASK_TYPE.HERO_TRAIN_SUM, newJobStage - oldJobStage, true, {}); @@ -407,7 +417,8 @@ export class HeroHandler { return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL); if (curJob >= getMaxGradeByjobClass(heroJob.job_class)) return resResult(STATUS.HERO_JOB_REACH_MAX_STAGE); - let result = await handleCost(roleId, sid, heroJob.upGradeConsume, ITEM_CHANGE_REASON.HERO_JOB_STAGEUP); + let consumes = heroJob.upGradeConsume; + let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.HERO_JOB_STAGEUP); if (!result) { return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); } @@ -417,7 +428,8 @@ export class HeroHandler { //重算战力并下发 let update = { job: nextHeroJob.jobid, - jobStage: 0 + jobStage: 0, + consumes: addConsumeToHero(hero.consumes, consumes) } hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.STAGEUP, sid, roleId, hero, update); // 任务 @@ -465,12 +477,17 @@ export class HeroHandler { if (member.star + member.colorStar < friendShip.level) return resResult(STATUS.NOT_REACH_UNLOCK_LEVEL); } - let result = await handleCost(roleId, sid, [{ id: CURRENCY_BY_TYPE.get(CURRENCY_TYPE.COIN), count: friendShip.costCoin }], ITEM_CHANGE_REASON.HERO_CONNECT_ACTIVE); + let consumes = [getCoinObject(friendShip.costCoin)]; + let result = await handleCost(roleId, sid, consumes, ITEM_CHANGE_REASON.HERO_CONNECT_ACTIVE); if (!result) { return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); } + let update = { + connections: heroConnections, + consumes: addConsumeToHero(hero.consumes, consumes) + } //重算战力并下发 - hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.CONNECT, sid, roleId, hero, { connections: heroConnections }, [shipId]); + hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.CONNECT, sid, roleId, hero, update, [shipId]); // 任务 await checkTask(roleId, sid, TASK_TYPE.HERO_CONNECT, 1, true, { connectLv: level }) @@ -540,18 +557,23 @@ export class HeroHandler { return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); } + let updateConsume = addConsumeToHero(hero.consumes, material); + let update = { + favour: newExp, + favourLv: newLv, + consumes: updateConsume + } + //重算战力并下发 if (oldLv != newLv) { await unlockFigure(sid, roleId, [{ type: FIGURE_UNLOCK_CONDITION.HERO_FAVOR, paramHid: hero.hid, paramFavourLv: hero.favourLv }]); - hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.FAVOUR, sid, roleId, hero, { - favour: newExp, favourLv: newLv - }, [oldLv]); + hero = await calPlayerCeAndSave(HERO_SYSTEM_TYPE.FAVOUR, sid, roleId, hero, update, [oldLv]); // 任务 await checkTaskWithHero(roleId, sid, TASK_TYPE.HERO_FAVOUR_LV, hero, [oldLv]); await checkActivityTask(serverId, sid, roleId, TASK_TYPE.HERO_FAVOUR_LV, 1, { lv: newLv, oldLv }); } else { - hero = await HeroModel.updateHeroInfo(roleId, hero.hid, { favour: newExp, favourLv: newLv }); + hero = await HeroModel.updateHeroInfo(roleId, hero.hid, update); } return resResult(STATUS.SUCCESS, { curHero: { hid: hero.hid, favour: hero.favour, favourLv: hero.favourLv, cost: material } }); } diff --git a/game-server/app/services/roleService.ts b/game-server/app/services/roleService.ts index abaa432ef..66d362386 100644 --- a/game-server/app/services/roleService.ts +++ b/game-server/app/services/roleService.ts @@ -7,7 +7,7 @@ import { Teraph, RoleModel, RoleType, RoleUpdate } from '../db/Role'; import { SCHOOL } from '../pubUtils/dicParam'; import { gameData } from '../pubUtils/data'; import { SchoolModel } from '../db/School'; -import { SclResultInter, SclPosInter, RewardInter } from '../pubUtils/interface'; +import { SclResultInter, SclPosInter, RewardInter, ItemInter } from '../pubUtils/interface'; import { CheckMeterial } from './rewardService'; import { HeroUpdate } from '../db/Hero'; import { SkinUpdate } from '../db/Skin'; @@ -153,9 +153,22 @@ export function getInitHeroById(hid: number) { } } -export function addConsumeToHero(oldConsume: Reward[], consumes: RewardInter[]) { +export function addConsumeToHero(oldConsume: Reward[] = [], consumes: ItemInter[] = []) { + let consumeMap = new Map(); + for(let { id, count = 1 } of consumes) { + consumeMap.set(id, count); + } let newConsume: Reward[] = []; for(let {id, count} of oldConsume) { - + if(consumeMap.has(id)) { + newConsume.push({ id, count: count + consumeMap.get(id)}); + consumeMap.delete(id); + } else { + newConsume.push({ id, count }); + } } + for(let [id, count] of consumeMap) { + newConsume.push({ id, count }); + } + return newConsume; } \ No newline at end of file