装备:装备逻辑变化

This commit is contained in:
luying
2021-08-26 17:23:43 +08:00
parent 2b0da9508a
commit 45bc9ef6a2
3 changed files with 110 additions and 138 deletions

View File

@@ -5,18 +5,19 @@ import { ItemInter } from "../../../pubUtils/interface";
import { resResult, parseGoodStr } from "../../../pubUtils/util";
import { addItems, handleCost, decreaseItems, combineItems } from "../../../services/rewardService";
import { EquipModel, EquipType } from "../../../db/Equip";
import { HeroModel, EPlace } from "../../../db/Hero";
import { HeroModel, EPlace, HeroType } from "../../../db/Hero";
import Role from "../../../db/Role";
import { calPlayerCeAndSave } from "../../../services/playerCeService";
import { getGoodById, gameData } from "../../../pubUtils/data";
import { BAG, EQUIP } from "../../../pubUtils/dicParam";
import { ITID, QUALITY_TYPE, equipTypeToSortAttr, IT_TYPE, QUENCH_TYPE, REFINE_TYPE } from "../../../consts";
import { changeEquip, dressEquip, checkMaterialEnough, takeOffEquipAndCalPlayerCe, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult, refineOnce, checkRefineReachNextLv, calEquipCe } from "../../../services/equipService";
import { checkMaterialEnough, checkEquipCanPut, quenchOnce, checkQuenchMaxByQualityAndGrade, getRandSeResult, refineOnce, checkRefineReachNextLv, calEquipCe } from "../../../services/equipService";
import { findIndex, pick } from 'underscore';
import { pushEquipRefineSucMsg, pushNormalEquipMsg, pushNormalItemMsg } from "../../../services/chatService";
import { checkTaskWithHero, checkTaskWithEquip, checkTask, checkTaskWithArgs, checkTaskConditionEquipSuitJewelStage, checkActivityTask } from "../../../services/taskService";
import { QuenchLogParam } from "../../../domain/roleField/equip";
import { calEquipSeids } from "../../../pubUtils/playerCe";
export default function (app: Application) {
new HandlerService(app, {});
@@ -593,47 +594,107 @@ export class EquipHandler {
public async putOnOrOff(msg: { eid: number, hid: number, type: number }, session: BackendSession) {
let { eid, hid, type } = msg;
let roleId: string = session.get('roleId');
const serverId = session.get('serverId');
let equip = await EquipModel.getEquip(eid);
let serverId: number = session.get('serverId');
let sid: string = session.get('sid');
let funcs: number[] = session.get('funcs');
// 原武将heroA原武将穿戴着的装备a将要穿戴的装备b装备b被装备着的武将B
let heroA = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
if (!heroA) return resResult(STATUS.HERO_NOT_FIND);
let equip = await EquipModel.getEquip(eid); // 装备1-equipB 2-equipA
if(!equip) return resResult(STATUS.EQUIP_NOT_FIND);
let argsA = calEquipSeids(heroA);
let heroB: HeroType, equipA: EquipType, equipB: EquipType, argsB: number[] = [];
let heroAPutNum = 0, heroBPutTNum = 0; // 1多一件 0没变化 -1少一件
let goodInfo = getGoodById(equip.id);
let obj = ITID.get(goodInfo.itid);
let id = obj.type;
let curEquips: Array<{ seqId: number, hid: number }> = [];
let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
if (!hero)
return resResult(STATUS.HERO_NOT_FIND);
if (type == 1) {
if (equip.hid == hid)
return resResult(STATUS.WRONG_PARMS);
if (goodInfo.lvLimited > hero.lv)
return resResult(STATUS.EQUIP_LEVEL_LIMIT);
if(!checkEquipCanPut(hid, equip.id))
return resResult(STATUS.EQUIP_NOT_EQUIPED_HERO);
let index = findIndex(hero.ePlace, { id });
if (index < 0)
return resResult(STATUS.WRONG_PARMS);
let equipOffInfo = <EquipType>hero.ePlace[index].equip;
console.log('**********equipOffInfo', equipOffInfo&&equipOffInfo.seqId)
let curEquip = await changeEquip(serverId, roleId, sid, equipOffInfo, equip.hid, id, equip, funcs);
if (!!curEquip)
curEquips.push(...curEquip);
curEquip = await dressEquip(serverId, roleId, sid, hero, equip, funcs);
if (!!curEquip)
curEquips.push(...curEquip);
let eplaceId = obj.type; // 位置
//任务
//英雄满装备且都镶嵌相同阶数的宝石
let { isTask, jewelLevel } = await checkTaskConditionEquipSuitJewelStage(hero)
if (type == 1) {
equipB = equip; // 要穿上的装备
if (equipB.hid == hid) return resResult(STATUS.WRONG_PARMS);
if(!checkEquipCanPut(heroA, equipB.id)) return resResult(STATUS.EQUIP_NOT_EQUIPED_HERO);
let index = heroA.ePlace.findIndex(cur => cur.id == eplaceId);
if (index == -1) return resResult(STATUS.WRONG_PARMS);
equipA = <EquipType>heroA.ePlace[index].equip; // 要脱下的装备
if(equipB.hid > 0) {
heroB = await HeroModel.findByHidAndRoleWithEquip(equipB.hid, roleId);
argsB = calEquipSeids(heroB);
}
if(equipA) {
if(equipB.hid > 0) {
if(checkEquipCanPut(heroB, equipA.id)) { // A=>b & B=>a
equipA = await EquipModel.putOnOrOff(equipA._id, equipB.hid);
heroB = await HeroModel.addEquip(roleId, heroB.hid, eplaceId, equipA._id);
} else { // A=>b & B=>0 & 0=>a
equipA = await EquipModel.putOnOrOff(equipA._id, 0);
heroB = await HeroModel.removeEquip(roleId, equipB.hid, eplaceId);
heroBPutTNum = -1;
}
} else { // A=>b & 0=>a
equipA = await EquipModel.putOnOrOff(equipA._id, 0);
}
} else {
if(equipB.hid > 0) { // A=>b & B=>0
heroB = await HeroModel.removeEquip(roleId, equipB.hid, eplaceId);
heroBPutTNum = -1;
}
// A=>b
heroAPutNum = 1;
}
heroA = await HeroModel.addEquip(roleId, heroA.hid, eplaceId, equipB._id);
equipB = await EquipModel.putOnOrOff(equipB._id, heroA.hid);
} else if (type == 2) { // A=>0 & 0=>a
if (!equip.hid) return resResult(STATUS.EQUIP_NOT_EQUIPED);
equipA = await EquipModel.putOnOrOff(equip._id, 0);
heroA = await HeroModel.removeEquip(roleId, heroA.hid, eplaceId);
heroAPutNum = -1;
}
if(heroA) {
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP, sid, roleId, heroA, {}, argsA);
if(heroAPutNum != 0) {
await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.EQUIP_BY_HERO, heroA, [heroAPutNum]);
}
}
if(heroB) {
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP, sid, roleId, heroB, {}, argsB);
if(heroBPutTNum != 0) await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.EQUIP_BY_HERO, heroA, [heroBPutTNum]);
}
if(heroAPutNum + heroBPutTNum != 0) {
await checkTask(roleId, sid, funcs, TASK_TYPE.EQUIP_SUM, heroAPutNum + heroBPutTNum, true, {});
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_SUM, heroAPutNum + heroBPutTNum)
}
let curEquips: Array<{ seqId: number, hid: number }> = [];
if(equipA) {
curEquips.push(pick(equipA, ['seqId', 'hid']));
if(equipA.hid == 0) {
await checkTaskWithEquip(roleId, sid, funcs, TASK_TYPE.EQUIP_QUALITY, equipA, [-1]); // equipA必然是脱如果hid不为0说明从一个人穿到另一个人不算任务
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_QUALITY, 1, { quality: equipA.quality });
}
}
if(equipB) {
curEquips.push(pick(equipB, ['seqId', 'hid']));
if(equipB.hid != 0) {
await checkTaskWithEquip(roleId, sid, funcs, TASK_TYPE.EQUIP_QUALITY, equipB, [1]); // equipB必然是穿如果hid为0说明没有变化不算任务
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_QUALITY, 1, { quality: equipB.quality });
}
}
if(type == 1) {
let { isTask, jewelLevel } = await checkTaskConditionEquipSuitJewelStage(heroA)//英雄满装备且都镶嵌相同阶数的宝石
if (isTask) {
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_SUIT_JEWEL_STAGE, 1, { stage: jewelLevel })
}
} else if (type == 2) {
if (!equip.hid)
return resResult(STATUS.EQUIP_NOT_EQUIPED);
let curEquip = await takeOffEquipAndCalPlayerCe(roleId, sid, hero, equip, id, funcs);
curEquips.push(...curEquip);
}
return resResult(STATUS.SUCCESS, { curEquips: curEquips });
@@ -648,6 +709,8 @@ export class EquipHandler {
let funcs: number[] = session.get('funcs');
let hero = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);
if (!hero) return resResult(STATUS.HERO_NOT_FIND);
let args = calEquipSeids(hero);
let dicHero = gameData.hero.get(hid);
if (!dicHero) return resResult(STATUS.DIC_DATA_NOT_FOUND);
let dicJob = gameData.job.get(dicHero.jobid);
@@ -668,8 +731,8 @@ export class EquipHandler {
let sortAttrId = equipTypeToSortAttr.get(curEPlace.id);
let sortedAndSuitEquips = sortEquips.filter(equipInfos => { // 筛选可穿的
let { id, lvLimited, ePlaceId } = equipInfos;
return lv >= lvLimited && checkEquipCanPut(hid, id) && curEPlace.id == ePlaceId;
})
return lv >= lvLimited && checkEquipCanPut(hero, id) && curEPlace.id == ePlaceId;
});
console.log('sortedAndSuitEquips', JSON.stringify(sortedAndSuitEquips, null, 4))
sortedAndSuitEquips = sortedAndSuitEquips.sort((a, b) => { // 排序按:战力 => 根据位置看个别属性 => 品质
if (b.ce - a.ce != 0) return b.ce - a.ce;
@@ -681,8 +744,9 @@ export class EquipHandler {
if (sortedAndSuitEquips.length > 0) {
let { equip } = sortedAndSuitEquips.shift();
let curEquip = await dressEquip(serverId, roleId, sid, hero, equip, funcs);
if (!!curEquip) curEquips.push(...curEquip);
hero = await HeroModel.addEquip(roleId, hero.hid, equip.ePlaceId, equip._id);
equip = await EquipModel.putOnOrOff(equip._id, hero.hid);
if (!!equip) curEquips.push(pick(equip, ['seqId', 'hid']));
}
}
@@ -694,6 +758,8 @@ export class EquipHandler {
if (isTask) {
await checkActivityTask(serverId, sid, funcs, roleId, TASK_TYPE.EQUIP_SUIT_JEWEL_STAGE, 1, { stage: jewelLevel })
}
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP, sid, roleId, hero, {}, args);
}
return resResult(STATUS.SUCCESS, { curEquips });

View File

@@ -66,99 +66,11 @@ export function checkMaterialEnough(consumes: Array<{ id: number, count: number
let isEnough = checkCurMeterial(jewel, jewelCount);
return isEnough? needConsumes: false;
}
/**
* 将装备卸载下来,并检查是否有替换装备的武将,若有则替换
* 武将A装备A&武将B装备B ==> 武将A装备B&武将B装备A
* 武将A装备A& 装备B ==> 武将A装备B& 装备A
* @param roleId 玩家id
* @param sid
* @param equip 目标武将要卸下的装备装备A
* @param hid 要装上的装备备原来装备着的武将id 武将B
* @param id 装备类型
* @param seqId 要装上的装备的唯一id 装备B
*/
export async function changeEquip(serverId: number, roleId: string, sid: string, equipA: EquipType, hid: number, id: number, equipB: EquipType, funcs: number[]) {
let heroB: HeroType;
if (!!hid) //需要卸下或者替换的武将
heroB = await HeroModel.findByHidAndRoleWithEquip(hid, roleId);//需要替换的武将
if (!!equipA) {//需要卸下的装备
if (!!heroB) {
let goodInfo = getGoodById(equipA.id);
if (goodInfo.lvLimited > heroB.lv || !checkEquipCanPut(hid, equipA.id)) { // 不能穿,就只卸载
let res = await takeOffEquipAndCalPlayerCe(roleId, sid, heroB, equipB, id, funcs);//卸下装备并重算战力
return res;
} else {
let res = await dressEquip(serverId, roleId, sid, heroB, equipA, funcs);//替换给武将,并计算战力
return res;
}
} else {
let res = await takeOffEquipAndCalPlayerCe(roleId, sid, null, equipA, id, funcs);//卸下装备并重算战力
return res;
}
} else if (!!heroB) {//从穿戴装备的武将上卸下装备
let res = await takeOffEquipAndCalPlayerCe(roleId, sid, heroB, equipB, id, funcs);//卸下装备并重算战力
return res
}
}
/**
* 从穿戴装备的武将上卸下装备,并重算战力
* @param roleId
* @param sid
* @param seqId
* @param hero
* @param id
*/
export async function takeOffEquipAndCalPlayerCe(roleId: string, sid: string, hero: HeroType, equip: EquipType, id: number, funcs: number[]) {
console.log('***takeOffEquipAndCalPlayerCe', roleId, sid, hero&&hero.hid, equip.seqId, id)
if (hero) {
let args = calEquipSeids(hero);
hero = await HeroModel.removeEquip(roleId, hero.hid, id, equip._id);
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP, sid, roleId, hero, {}, args);
await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.EQUIP_BY_HERO, hero, [-1]);
} else {
await EquipModel.putOnOrOff(equip._id, 0);
}
// 任务
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, id: equip.id, ePlaceId: equip.ePlaceId }];
}
/**
* 穿戴装备并重算战力
* @param roleId
* @param sid
* @param hero
* @param equip
*/
export async function dressEquip(serverId: number, roleId: string, sid: string, hero: HeroType, equip: EquipType, funcs: number[]) {
console.log('***dressEquip', roleId, sid, hero&&hero.hid, equip.seqId)
let args = calEquipSeids(hero);
let index = hero.ePlace.findIndex(cur => cur.id == equip.ePlaceId);
let equipOffInfo = <EquipType>hero.ePlace[index].equip;
hero = await HeroModel.addEquip(roleId, hero.hid, equip.ePlaceId, equip._id, equipOffInfo?._id);
await calPlayerCeAndSave(HERO_SYSTEM_TYPE.EQUIP, sid, roleId, hero, {}, args);
// 任务
await checkTask(roleId, sid, funcs, TASK_TYPE.EQUIP_SUM, 1, true, {});
await checkTaskWithHero(roleId, sid, funcs, TASK_TYPE.EQUIP_BY_HERO, hero, [1]);
await checkTaskWithEquip(roleId, sid, funcs, TASK_TYPE.EQUIP_QUALITY, equip, [1]);
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)
let res = [
{ seqId: equip.seqId, hid: hero.hid, id: equip.id, ePlaceId: equip.ePlaceId }
];
if(equipOffInfo) {
res.push({ seqId: equipOffInfo.seqId, hid: 0, id: equipOffInfo.id, ePlaceId: equipOffInfo.ePlaceId })
}
return res
}
export function checkEquipCanPut(hid: number, id: number) {
export function checkEquipCanPut(hero: HeroType, id: number) {
let hid = hero.hid;
let dicGood = gameData.goods.get(id);
if(dicGood.lvLimited > hero.lv) return false;
let dicHero = gameData.hero.get(hid);
let dicJob = gameData.job.get(dicHero.jobid);
if(dicGood.jobLimited.indexOf(0) == -1 && dicGood.jobLimited.indexOf(dicJob.job_class) == -1) return false;

View File

@@ -182,25 +182,19 @@ export default class Hero extends BaseModel {
return hero;
}
public static async addEquip(roleId: string, hid: number, ePlaceId: number, equipId: string, equipOffId: string) {
public static async addEquip(roleId: string, hid: number, ePlaceId: number, equipId: string) {
const hero: HeroType = await HeroModel.findOneAndUpdate(
{ roleId, hid, 'ePlace.id': ePlaceId },
{ $set: { 'ePlace.$.equip': equipId } },
{ new: true }).populate('ePlace.equip').lean();
await Equip.putOnOrOff(equipId, hero.hid);
if(equipOffId) await Equip.putOnOrOff(equipOffId, 0);
return hero;
}
public static async removeEquip(roleId: string, hid: number, ePlaceId: number, equipId: string, lean = true) {
public static async removeEquip(roleId: string, hid: number, ePlaceId: number, lean = true) {
const hero: HeroType = await HeroModel.findOneAndUpdate(
{ roleId, hid, 'ePlace.id': ePlaceId },
{ $set: { 'ePlace.$.equip': null } },
{ new: true }).populate('ePlace.equip').lean(lean);
if (hero) {
await Equip.putOnOrOff(equipId, 0);
}
return hero;
}