✨ feat(将魂出售): 修复将魂回收的问题

4cfbce94e - 2fa8c7a91 by zhangxk
This commit is contained in:
luying
2023-07-19 15:51:04 +08:00
parent 523eaad05e
commit f09ebd56b1
5 changed files with 79 additions and 59 deletions
@@ -5,7 +5,7 @@ import { STATUS, GUILD_STRUCTURE, ITID, CONSUME_TYPE, HERO_QUALITY_TYPE, HERO_GR
import { UserShopModel } from "../../../db/UserShop"; import { UserShopModel } from "../../../db/UserShop";
import { handleCost, addItems } from "../../../services/role/rewardService"; import { handleCost, addItems } from "../../../services/role/rewardService";
import { SHOP } from "../../../pubUtils/dicParam"; import { SHOP } from "../../../pubUtils/dicParam";
import { HeroModel } from "../../../db/Hero"; import { HeroModel, HeroType } from "../../../db/Hero";
import { checkShopInPurchase, getShopDicById, getShopListByType, getShopPrice } from "../../../services/shopService"; import { checkShopInPurchase, getShopDicById, getShopListByType, getShopPrice } from "../../../services/shopService";
import { RewardInter, recycleSoulFastPara } from "../../../pubUtils/interface"; import { RewardInter, recycleSoulFastPara } from "../../../pubUtils/interface";
import { UserShopTypeModel } from "../../../db/UserShopType"; import { UserShopTypeModel } from "../../../db/UserShopType";
@@ -172,35 +172,44 @@ export class ShopHandler {
let roleId = session.get('roleId'); let roleId = session.get('roleId');
let roleName = session.get('roleName'); let roleName = session.get('roleName');
let sid = session.get('sid'); let sid = session.get('sid');
let { recycleSoulFastPara } = msg;
// 检测参数,防止hid、goodsId重复 let { recycleSoulFastPara } = msg;
// 检测参数,防止hid重复
let checkHid = new Map<number, number>(); let checkHid = new Map<number, number>();
let checkGoodsId = new Map<number, number>(); for (let { hid, count } of recycleSoulFastPara) {
for (let { hid, goodsId, count } of recycleSoulFastPara) { if (checkHid.get(hid)) return resResult(STATUS.WRONG_PARMS);
if (checkHid.get(hid) || checkGoodsId.get(goodsId)) return resResult(STATUS.WRONG_PARMS);
checkHid.set(hid, 1); checkHid.set(hid, 1);
checkGoodsId.set(goodsId, count);
} }
let items = await ItemModel.find({ roleId, id: { $in: recycleSoulFastPara.map(obj => obj.goodsId) } }); // 从db获取所有武将数据
if (!items || items.length == 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); const dbHeros = await HeroModel.findByHidsAndRole(roleId, recycleSoulFastPara.map(obj => obj.hid)) as HeroType[];
let heroesMap = new Map<number, HeroType>();
let items = []
for (const val of dbHeros) {
let hid = val.hid
heroesMap.set(hid, val);
const itemsMap = arrToMap(items, obj => obj.id); let dicHero = gameData.hero.get(hid);
if (!dicHero || !dicHero.pieceId) continue;
items.push(dicHero.pieceId);
}
// 从db获取相关碎片道具数据
if (!items || items.length == 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
const dbItems = await ItemModel.findbyRoleAndIds(roleId, items);
if (!dbItems || dbItems.length == 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
const itemsMap = arrToMap(dbItems, obj => obj.id);
let allAddItem = []; let allAddItem = [];
let allCostItem = []; let allCostItem = [];
for (let { hid, goodsId, count } of recycleSoulFastPara) { for (let { hid, count } of recycleSoulFastPara) {
let dicGoods = gameData.goods.get(goodsId);
if (!dicGoods) return resResult(STATUS.WRONG_PARMS);
if (hid != dicGoods.hid) return resResult(STATUS.WRONG_PARMS);//校验一下hid和goodsId是否对应
let residueFragment = 0; let residueFragment = 0;
let goodsId = gameData.hero.get(hid)?.pieceId || 0;
const curItemCount = itemsMap.get(goodsId)?.count || 0; const curItemCount = itemsMap.get(goodsId)?.count || 0;
if (curItemCount <= 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); if (curItemCount <= 0) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
let hero = await HeroModel.findByHidAndRole(hid, roleId); let hero = heroesMap.get(hid);
if (!hero) return resResult(STATUS.HERO_IS_HIDDEN); if (!hero) return resResult(STATUS.HERO_IS_HIDDEN);
if (hero.colorStar != HERO_GROW_MAX.COLORSTAR) { if (hero.colorStar != HERO_GROW_MAX.COLORSTAR) {
residueFragment = await calUpSixColorsResidueFragment(roleId, hero, hid, curItemCount); residueFragment = await calUpSixColorsResidueFragment(roleId, hero, hid, curItemCount);
if (!residueFragment || count > residueFragment) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH); if (!residueFragment || count > residueFragment) return resResult(STATUS.ROLE_MATERIAL_NOT_ENOUGH);
@@ -208,17 +217,21 @@ export class ShopHandler {
allCostItem.push({ id: goodsId, count: count }); allCostItem.push({ id: goodsId, count: count });
let dicGoods = gameData.goods.get(goodsId);
if (!dicGoods) return resResult(STATUS.DIC_DATA_NOT_FOUND)
let reward: RewardInter[] = [];
switch (dicGoods.quality) { switch (dicGoods.quality) {
case HERO_QUALITY_TYPE.BLUE: case HERO_QUALITY_TYPE.BLUE:
allAddItem.push(...parseGoodStr(SHOP.HERO_SOUL_BULE)); break reward = parseGoodStr(SHOP.HERO_SOUL_BULE); break;
case HERO_QUALITY_TYPE.PURPLE: case HERO_QUALITY_TYPE.PURPLE:
allAddItem.push(...parseGoodStr(SHOP.HERO_SOUL_PURPLE)); break; reward = parseGoodStr(SHOP.HERO_SOUL_PURPLE); break;
case HERO_QUALITY_TYPE.GOLD: case HERO_QUALITY_TYPE.GOLD:
allAddItem.push(...parseGoodStr(SHOP.HERO_SOUL_GOLDEN)); break; reward = parseGoodStr(SHOP.HERO_SOUL_GOLDEN); break;
case HERO_QUALITY_TYPE.UR: case HERO_QUALITY_TYPE.UR:
allAddItem.push(...parseGoodStr(SHOP.HERO_SOUL_UR)); break; reward = parseGoodStr(SHOP.HERO_SOUL_UR); break;
} }
allAddItem.map(cur => { return { id: cur.id, count: cur.count * count } }) allAddItem.push(...reward.map(cur => { return { id: cur.id, count: cur.count * count } }));
} }
let costResult = await handleCost(roleId, sid, allCostItem, ITEM_CHANGE_REASON.RECYCLE_SOUL); let costResult = await handleCost(roleId, sid, allCostItem, ITEM_CHANGE_REASON.RECYCLE_SOUL);
+2 -2
View File
@@ -1983,8 +1983,8 @@ export function checkRouteParam(route: string, msg: any) {
case "role.shopHandler.recycleSoulFast": case "role.shopHandler.recycleSoulFast":
{ {
if (!checkNaturalArray(msg.recycleSoulFastPara)) return false; if (!checkNaturalArray(msg.recycleSoulFastPara)) return false;
for (let { hid, goodsId, count } of msg.recycleSoulFastPara) { for (let { hid, count } of msg.recycleSoulFastPara) {
if (!checkNaturalNumbers(hid, goodsId, count)) return false; if (!checkNaturalNumbers(hid, count)) return false;
} }
break; break;
} }
+10 -7
View File
@@ -362,8 +362,6 @@ export async function getComposeStoneCostAndAdd(curItem, itId) {
export async function calUpSixColorsResidueFragment(roleId: string, hero: HeroType, hid: number, count?: number) { export async function calUpSixColorsResidueFragment(roleId: string, hero: HeroType, hid: number, count?: number) {
let needFragment = 0; let needFragment = 0;
// if (isHeroHidden(hid)) return;
let dicHero = gameData.hero.get(hid); let dicHero = gameData.hero.get(hid);
if (!dicHero) return; if (!dicHero) return;
let { pieceId, jobid } = dicHero; let { pieceId, jobid } = dicHero;
@@ -371,9 +369,6 @@ export async function calUpSixColorsResidueFragment(roleId: string, hero: HeroTy
let dicJob = gameData.job.get(jobid); let dicJob = gameData.job.get(jobid);
if (!dicJob) return; if (!dicJob) return;
// let hero = await HeroModel.findByHidAndRole(hid, roleId);
// if (!hero) return;
let curItemCount = count; let curItemCount = count;
if (!count) { if (!count) {
let item = await ItemModel.findbyRoleAndGid(roleId, pieceId); let item = await ItemModel.findbyRoleAndGid(roleId, pieceId);
@@ -387,7 +382,11 @@ export async function calUpSixColorsResidueFragment(roleId: string, hero: HeroTy
if (oldStar < HERO_GROW_MAX.STAR) { if (oldStar < HERO_GROW_MAX.STAR) {
for (let starIndex = oldStar; starIndex < HERO_GROW_MAX.STAR; starIndex++) { for (let starIndex = oldStar; starIndex < HERO_GROW_MAX.STAR; starIndex++) {
const curDicHeroStar = getHeroStarByQuality(dicJob.job_class, oldQuality, starIndex); const curDicHeroStar = getHeroStarByQuality(dicJob.job_class, oldQuality, starIndex);
if (starIndex == oldStar) {
needFragment += (curDicHeroStar?.advanceUpFragmentNum || 0) * (ABI_STAGE.END - oldStarStage); needFragment += (curDicHeroStar?.advanceUpFragmentNum || 0) * (ABI_STAGE.END - oldStarStage);
continue;
}
needFragment += (curDicHeroStar?.advanceUpFragmentNum || 0) * ABI_STAGE.END;
} }
} }
if (curItemCount < needFragment) return; if (curItemCount < needFragment) return;
@@ -396,7 +395,7 @@ export async function calUpSixColorsResidueFragment(roleId: string, hero: HeroTy
if (oldQuality < HERO_GROW_MAX.QUALITY) { if (oldQuality < HERO_GROW_MAX.QUALITY) {
for (let qualityIndex = oldQuality; qualityIndex < HERO_GROW_MAX.QUALITY; qualityIndex++) { for (let qualityIndex = oldQuality; qualityIndex < HERO_GROW_MAX.QUALITY; qualityIndex++) {
const curDicHeroQualityUp = gameData.heroQualityUp.get(qualityIndex); const curDicHeroQualityUp = gameData.heroQualityUp.get(qualityIndex);
needFragment += curDicHeroQualityUp?.fragmentNum || 0 needFragment += curDicHeroQualityUp?.fragmentNum || 0;
} }
} }
if (curItemCount < needFragment) return; if (curItemCount < needFragment) return;
@@ -409,7 +408,11 @@ export async function calUpSixColorsResidueFragment(roleId: string, hero: HeroTy
needFragment += curDicHeroStar?.fragmentNum || 0; needFragment += curDicHeroStar?.fragmentNum || 0;
continue; continue;
} }
needFragment += (curDicHeroStar?.fragmentNum || 0) * (ABI_STAGE.END - oldColorStarStage) if (colorStarIndex == oldColorStar) {
needFragment += (curDicHeroStar?.fragmentNum || 0) * (ABI_STAGE.END - oldColorStarStage);
continue;
}
needFragment += (curDicHeroStar?.fragmentNum || 0) * ABI_STAGE.END;
} }
} }
+5
View File
@@ -221,6 +221,11 @@ export default class Hero extends BaseModel {
return hero; return hero;
} }
public static async findByHidsAndRole(roleId: string, hids: Array<number>, select?: string, getters = false) {
const heros: HeroType[] = await HeroModel.find({ roleId, hid: { $in: hids } }).select(select).lean({ getters });
return heros;
}
public static async findSubHero(roleId: string, subHid: number) { public static async findSubHero(roleId: string, subHid: number) {
const hero: HeroType = await HeroModel.findOne({ roleId, subHid }).lean(); const hero: HeroType = await HeroModel.findOne({ roleId, subHid }).lean();
return hero; return hero;
-1
View File
@@ -68,6 +68,5 @@ export interface guildInter {
export interface recycleSoulFastPara { export interface recycleSoulFastPara {
hid: number; hid: number;
goodsId: number;
count: number; count: number;
} }