diff --git a/game-server/app/servers/role/handler/equipHandler.ts b/game-server/app/servers/role/handler/equipHandler.ts index 51ccd25fa..4290fe4c0 100644 --- a/game-server/app/servers/role/handler/equipHandler.ts +++ b/game-server/app/servers/role/handler/equipHandler.ts @@ -1,14 +1,17 @@ import { Application, BackendSession } from "pinus"; -import { resResult } from "../../../pubUtils/util"; -import { STATUS, EQUIP_STRENGTHEN_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, HERO_SYSTEM_TYPE } from "../../../consts"; -import { addItems, handleCost } from "../../../services/rewardService"; -import { gameData } from "../../../pubUtils/data"; +import { STATUS, EQUIP_STRENGTHEN_TYPE, CURRENCY_BY_TYPE, CURRENCY_TYPE, HERO_SYSTEM_TYPE, CONSUME_TYPE, GOOD_TYPE } from "../../../consts"; import { ItemInter } from "../../../pubUtils/interface"; +import { resResult, parseReward } from "../../../pubUtils/util"; +import { addItems, handleCost } from "../../../services/rewardService"; import { EquipModel } from "../../../db/Equip"; -import { GOOD_TYPE } from "../../../consts/consts"; import { HeroModel, EPlace } from "../../../db/Hero"; import Role from "../../../db/Role"; import { calPlayerCeAndSave } from "../../../services/playerCeService"; +import { getGoodById, gameData } from "../../../pubUtils/data"; +import { EQUIP } from "../../../pubUtils/dicParam"; +import { ITID } from "../../../consts/constModules/itemConst"; +import { SSL_OP_SSLEAY_080_CLIENT_DH_BUG } from "constants"; +const _ = require('underscore'); export default function(app: Application) { return new EquipHandler(app); @@ -35,7 +38,7 @@ export class EquipHandler { cost.concat(targetGood.composeMaterial); let specialMaterial = targetGood.specialMaterial; let costCount = 0; - let equips = await EquipModel.getEquips(roleId, originalEquip); + let equips = await EquipModel.getEquips(originalEquip); for(let {id, seqId} of equips) { if(specialMaterial.ids.includes(id)) { costCount++; @@ -138,34 +141,147 @@ export class EquipHandler { public async reStrengthen(msg: { }, session: BackendSession) { } - //=================================================================== - //TODO 分解装备 - public async decomposeEquips(msg: { }, session: BackendSession) { + //分解装备 + public async decomposeEquip(msg: { originalEquip: Array }, session: BackendSession) { + let { originalEquip } = msg; + let roleId: string = session.get('roleId'); + let roleName: string = session.get('roleName'); + let sid: string = session.get('sid'); + let equips = await EquipModel.getEquips(originalEquip); + if (equips.length < originalEquip.length) + return resResult(STATUS.EQUIP_NOT_FIND); + let goods:Array<{id:number, count:number}> = []; + for (let equip of equips) { + if (!!equip.hid) + return resResult(STATUS.EQUIP_IS_EQUIPED_NOT_DECOMPOSE); + let goodInfo = getGoodById(equip.id); + if (!goodInfo) + return resResult(STATUS.EQUIP_NOT_FIND); + goods.concat(goodInfo.decomposeItem); + } + let uids = [{uid: roleId, sid}]; + await EquipModel.deleteEquips(originalEquip); + this.app.get('channelService').pushMessageByUids('onEquipDel', resResult(STATUS.SUCCESS, [originalEquip]), uids); + let result = await addItems(roleId, roleName, sid, goods); + return resResult(STATUS.SUCCESS,{goods:result}); } - //TODO 穿戴装备 - public async wearEquips(msg: { }, session: BackendSession) { - + //穿戴或卸载装备 1-穿上装备 2-脱下装备 + public async putOnOrOff(msg: {eid: number, hid: number, type: number}, session: BackendSession) { + let { eid, hid, type } = msg; + let roleId: string = session.get('roleId'); + let roleName: string = session.get('roleName'); + let sid: string = session.get('sid'); + let equip = await EquipModel.getEquip(eid); + let returnEquips:Array<{seqId:number, id:number, hid:number, ePlaceId:number}>; + let goodInfo = getGoodById(equip.id); + let obj = ITID.get(goodInfo.itid); + let ePlaceId = obj.type; + if (type == 1) { + if (!!equip.hid) + return resResult(STATUS.EQUIP_IS_EQUIPED); + let hero = await HeroModel.getHeroAndEquip(roleId, hid); + if (!hero) + return resResult(STATUS.HERO_NOT_FIND); + //修改数据库TODO + + } else if (type == 2) { + if (!equip.hid) + return resResult(STATUS.EQUIP_NOT_EQUIPED); + //修改数据库TODO + } } - //TODO 卸下装备 - public async removeEquips(msg: { }, session: BackendSession) { - + //装备打孔 + public async digHole(msg: {eid: number, id: number}, session: BackendSession) { + let { eid, id } = msg; + let roleId: string = session.get('roleId'); + let roleName: string = session.get('roleName'); + let sid: string = session.get('sid'); + let equip = await EquipModel.getEquip(eid); + let index = _.indexOf(equip.holes, {id}); + if (index > 0) + return resResult(STATUS.EQUIP_HOLE_NOT_FIND); + if (equip.holes[index].isOpen) + return resResult(STATUS.EQUIP_HOLE_IS_DUG); + let consumes:Array<{id: number, count: number}> = []; + if (id == 1) { + consumes = parseReward(EQUIP.EQUIP_ONE_HOLE); + } else if (id == 2) { + consumes = parseReward(EQUIP.EQUIP_TWO_HOLE); + } else if (id == 3) { + consumes = parseReward(EQUIP.EQUIP_THREE_HOLE); + } + let result = await handleCost(roleId, sid, consumes); + if (!result) + return resResult(STATUS.JEWEL_IS_NOT_FIND); + equip.holes[index].isOpen = true; + await EquipModel.updateEquipInfo(eid, {holes: equip.holes}); + return resResult(STATUS.SUCCESS,{curEquip:{seqId: eid, holes: equip.holes}}); } - //TODO 装备打孔 - public async unlockEquipHole(msg: { }, session: BackendSession) { - + //宝石镶嵌 + public async fillHole(msg: {eid: number, id: number, jewel: number}, session: BackendSession) { + let { eid, id, jewel} = msg; + let roleId: string = session.get('roleId'); + let sid: string = session.get('sid'); + let consumes:Array<{id: number, count: number}> = []; + let equip = await EquipModel.getEquip(eid); + let index = _.indexOf(equip.holes, {id}); + if (index > 0) + return resResult(STATUS.EQUIP_HOLE_NOT_FIND); + if (equip.holes[index].isOpen) + return resResult(STATUS.EQUIP_HOLE_IS_DUG); + consumes.push({id: jewel, count: 1}); + let result = await handleCost(roleId, sid, consumes); + if (!result) + return resResult(STATUS.JEWEL_IS_NOT_FIND); + equip.holes[index].jewel = jewel; + await EquipModel.updateEquipInfo(eid, {holes: equip.holes}); + return resResult(STATUS.SUCCESS,{curEquip:{seqId: eid, holes: equip.holes}}); } - //TODO 宝石镶嵌 - public async setEquipGemstone(msg: { }, session: BackendSession) { - + //宝石合成 + public async composeJewel(msg: {jewel: number, count: number, consumes: Array<{id:number, count:number}>}, session: BackendSession) { + let { count, consumes, jewel} = msg; + let roleId: string = session.get('roleId'); + let roleName: string = session.get('roleName'); + let sid: string = session.get('sid'); + let goodInfo = getGoodById(jewel); + let {type} = ITID.get(goodInfo.itid); + if (type != CONSUME_TYPE.JEWEL) + return resResult(STATUS.WRONG_PARMS); + if (!goodInfo.composeMaterial) + return resResult(STATUS.WRONG_PARMS); + //检查宝石消耗是否合法TODO + for (let {id, count} of goodInfo.composeMaterial) { + + } + let res = await handleCost(roleId, sid, consumes); + if (!res) + return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); + let result = await addItems(roleId, roleName, sid, [{id: jewel, count: count}]); + return resResult(STATUS.SUCCESS,{goods:result}); } - //TODO 宝石合成 - public async composeGemstone(msg: { }, session: BackendSession) { - + //宝石卸下 + public async putOffHole(msg: {eid: number, id: number}, session: BackendSession) { + let { eid, id} = msg; + let roleId: string = session.get('roleId'); + let roleName: string = session.get('roleName'); + let sid: string = session.get('sid'); + let goods:Array<{id: number, count: number}> = []; + let equip = await EquipModel.getEquip(eid); + let index = _.indexOf(equip.holes, {id}); + if (index > 0) + return resResult(STATUS.EQUIP_HOLE_NOT_FIND); + if (equip.holes[index].isOpen) + return resResult(STATUS.EQUIP_HOLE_IS_DUG); + goods.push({id: equip.holes[index].jewel, count: 1}); + equip.holes[index].jewel = 0; + await EquipModel.updateEquipInfo(eid, {holes: equip.holes}); + let result = await addItems(roleId, roleName, sid, goods); + return resResult(STATUS.SUCCESS,{curEquip:{seqId: eid, holes: equip.holes, goods: result}}); } } \ No newline at end of file diff --git a/game-server/app/servers/role/handler/heroHandler.ts b/game-server/app/servers/role/handler/heroHandler.ts index 75c45e9a8..ae0e088af 100644 --- a/game-server/app/servers/role/handler/heroHandler.ts +++ b/game-server/app/servers/role/handler/heroHandler.ts @@ -21,14 +21,14 @@ export class HeroHandler { private channelService: ChannelService = this.app.get('channelService'); - public async test(msg: { id: number, count: number, seqId:number}, session: BackendSession) { + public async test(msg: { id: number, count: number, seqId:number, type:number}, session: BackendSession) { let roleId: string = session.get('roleId'); let roleName: string = session.get('roleName'); let sid: string = session.get('sid'); - let {id, count, seqId} = msg; + let {id, count, seqId, type} = msg; - let result = await handleCost(roleId, sid, [{id, count, seqId}] ); + let result = await handleCost(roleId, sid, [{id, count, seqId, type}] ); //let result = await addItems(roleId, roleName, sid, [{id, count}] ); if(!result) { return resResult(STATUS.BATTLE_CONSUMES_NOT_ENOUGH); diff --git a/game-server/app/services/rewardService.ts b/game-server/app/services/rewardService.ts index 65887f7ed..95cc02399 100644 --- a/game-server/app/services/rewardService.ts +++ b/game-server/app/services/rewardService.ts @@ -145,7 +145,7 @@ export async function handleCost(roleId: string, sid: string, goods: Array(); diff --git a/shared/consts/consts.ts b/shared/consts/consts.ts index 3b60f0b00..7bd9b3501 100644 --- a/shared/consts/consts.ts +++ b/shared/consts/consts.ts @@ -59,8 +59,8 @@ export const CONSUME_TYPE = { EXP: 5, // 经验书 FAVOUR: 6, // 好感度道具 SKIN: 7, // 好感度道具 - PIECE: 8 // 装备碎片 - + PIECE: 8, // 装备碎片 + JEWEL: 9,//宝石 }; const itid_array = [ @@ -100,7 +100,7 @@ const itid_array = [ { id: 33, name: '神兵', goodType: GOOD_TYPE.EQUIP }, { id: 34, name: '代币', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.POINT }, { id: 39, name: '时装', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.SKIN }, - { id: 40, name: '装备碎片', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.PIECE } + { id: 41, name: '装备碎片', goodType: GOOD_TYPE.CONSUMES, type: CONSUME_TYPE.PIECE } ]; export const ITID = new Map(); diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index e68b2822a..a49d07e18 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -147,6 +147,14 @@ export const STATUS = { // 装备养成 30400-30499 ROLE_EQUIP_PLACE_NOT_ENOUGH: {code: 30400, simStr: '装备栏未装备或无可强化'}, ROLE_COIN_NOT_ENOUGH: {code: 30401, simStr: '铜币不足'}, + + EQUIP_NOT_FIND: {code: 30500, simStr: '装备不存在'}, + EQUIP_IS_EQUIPED: {code: 30501, simStr: '装备已经穿戴'}, + EQUIP_NOT_EQUIPED: {code: 30502, simStr: '装备未穿戴'}, + EQUIP_IS_EQUIPED_NOT_DECOMPOSE: {code: 30503, simStr: '装备已穿戴,不能分解'}, + EQUIP_HOLE_NOT_FIND: {code: 30504, simStr: '装备孔不存在' }, + EQUIP_HOLE_IS_DUG: {code: 30505, simStr: '装备已经打过孔' }, + JEWEL_IS_NOT_FIND: {code: 30506, simStr: '宝石不存在' }, // 社交相关状态 40000 - 49999 // 运营模块相关状态 50000 - 59999 diff --git a/shared/db/Equip.ts b/shared/db/Equip.ts index 345fd5ab4..790f5aa60 100644 --- a/shared/db/Equip.ts +++ b/shared/db/Equip.ts @@ -3,96 +3,115 @@ import { index, getModelForClass, prop, DocumentType, modelOptions } from '@type import { COUNTER } from '../consts'; import { CounterModel } from './Counter'; -export class RandSe { - @prop({ required: true }) - id: number; // 随机属性位置id - @prop({ required: true }) - seid: number; // 随机属性池id - @prop({ required: true }) - rand: number; // 随机属性内需要随机的值 - @prop({ required: true }) - locked: boolean; // 洗炼是否锁定 +class RandSe { + @prop({ required: true }) + id: number; // 随机属性位置id + @prop({ required: true }) + seid: number; // 随机属性池id + @prop({ required: true }) + rand: number; // 随机属性内需要随机的值 + @prop({ required: true }) + locked: boolean; // 洗炼是否锁定 } -export class Holes { - @prop({ required: true }) - id: number; // 孔的id - @prop({ required: true }) - isOpen: boolean; // 是否开孔 - @prop({ required: true }) - jewel: number; // 装备的宝石id +class Holes { + @prop({ required: true }) + id: number; // 孔的id + @prop({ required: true }) + isOpen: boolean; // 是否开孔 + @prop({ required: true }) + jewel: number; // 装备的宝石id +} + +interface equipUpdate { + hid?: number; + quality?: number; + wearLv?: number; + _id?:number; + holes?:Array } @index({ roleId: 1, hid: 1, id: 1 }) @index({ seqId: 1 }) -@modelOptions({schemaOptions: {id: false}}) +@modelOptions({ schemaOptions: { id: false } }) export default class Equip extends BaseModel { - @prop({ required: true }) - roleId: string; // 角色 id - @prop({ required: true }) - roleName: string; // 角色名称 + @prop({ required: true }) + roleId: string; // 角色 id + @prop({ required: true }) + roleName: string; // 角色名称 - @prop({ required: true }) - seqId: number; // 装备表自增 id - @prop({ required: true }) - id: number; // 装备 id - @prop({ required: true }) - name: string; // 装备名称 - @prop({ required: false, default: 0 }) - hid: number; // 装备此装备的武将 id - @prop({ required: false, default: 0 }) - ePlaceId: number; // 武将装备的部位 - @prop({ required: false, default: 1 }) - count: number; // 装备数量 + @prop({ required: true }) + seqId: number; // 装备表自增 id + @prop({ required: true }) + id: number; // 装备 id + @prop({ required: true }) + name: string; // 装备名称 + @prop({ required: false }) + hid: number; // 装备此装备的武将 id + @prop({ required: false, default: 1 }) + count: number; // 装备数量 - @prop({ required: true, default: 1 }) - quality: number; // 品质 - @prop({ required: true, default: 0 }) - suitId: number; // 套装id + @prop({ required: true, default: 1 }) + quality: number; // 品质 + @prop({ required: true, default: 0 }) + type: number; // 装备类型 + @prop({ required: true, default: 1 }) + wearLv: number; // 穿戴等级 + @prop({ required: true, default: 0 }) + suitId: number; // 套装id - @prop({ required: true, default: 0 }) - randRange: number; // 固定属性随机值 - @prop({ required: false, type: RandSe, default: [] }) - randSe: RandSe[]; // 强化随机属性 - @prop({ required: true, type: Holes, default: [] }) - holes: Holes[]; + @prop({ required: true, default: 0 }) + randRange: number; // 固定属性随机值 + @prop({ required: false, type: RandSe, default: [] }) + randSe: RandSe[]; // 强化随机属性 + @prop({ required: true, type: Holes, default: [] }) + holes: Holes[]; - public static async findbyRole(roleId: string, lean = true) { - const equips: EquipType[] = await EquipModel.find({ roleId }).lean(lean); - return equips; - } - - public static async createEquip(equipInfo: {roleId: string, roleName: string, id: number, name: string, quality: number, suitId: number, ePlaceId: number, randSe: RandSe[], randRange: number, holes: Holes[]}, lean = true) { - const seqId = await CounterModel.getNewCounter(COUNTER.EID); + public static async findbyRole(roleId: string, lean = true) { + const equips: EquipType[] = await EquipModel.find({ roleId }).lean(lean); + return equips; + } - const doc = new EquipModel(); - const update = Object.assign(doc.toJSON(), seqId, equipInfo); - const equip: EquipType = await EquipModel.findOneAndUpdate({ seqId }, update, {upsert: true, new: true}).lean(lean); - return equip; - } + public static async createEquip(equipInfo: { roleId: string, roleName: string, id: number, seqId: number, type: number, name: string, lv?: number }, lean = true) { + const doc = new EquipModel(); + const update = Object.assign(doc.toJSON(), equipInfo); + const equip: EquipType = await EquipModel.findOneAndUpdate({ seqId: equipInfo.seqId }, update, { upsert: true, new: true }).lean(lean); + return equip; + } - public static async putOn(hid: number, equipId: string, lean = true) { - const equip: EquipType = await EquipModel.findOneAndUpdate({ _id: equipId }, {hid}, {new: true}).lean(lean); - return equip; - } + public static async putOn(hid: number, equipId: string, lean = true) { + const equip: EquipType = await EquipModel.findOneAndUpdate({ _id: equipId }, { hid }, { new: true }).lean(lean); + return equip; + } - public static async deleteAccount(roleId: string) { - let result = await EquipModel.deleteMany({roleId}); - return result; - } - public static async deleteEquips(roleId: string, ids:Array) { - let result = await EquipModel.deleteMany({roleId, seqId:{$in: ids}}); + public static async deleteAccount(roleId: string) { + let result = await EquipModel.deleteMany({ roleId }); + return result; + } + public static async deleteEquips(ids: Array) { + let result = await EquipModel.deleteMany({ seqId: { $in: ids } }); return result; } - public static async getEquips(roleId: string, ids:Array) { - let result = await EquipModel.find({roleId, seqId:{$in: ids}}); + public static async getEquips(ids: Array) { + let result = await EquipModel.find({ seqId: { $in: ids } }); + return result; + } + + public static async getEquip(seqId: number) { + let equip: EquipType = await EquipModel.findOne({ seqId }); + return equip; + } + + public static async updateEquipInfo(seqId:number, equipUpdate: equipUpdate, lean = true) { + delete equipUpdate._id; + let result: EquipType = await EquipModel.findOneAndUpdate({seqId}, {$set: equipUpdate}).lean(lean); return result; } } export const EquipModel = getModelForClass(Equip); -export interface EquipType extends Pick, keyof Equip>{ - id: number; +export interface EquipType extends Pick, keyof Equip> { + id: number; }; \ No newline at end of file diff --git a/shared/db/Hero.ts b/shared/db/Hero.ts index 1d2120167..4c26b46d4 100644 --- a/shared/db/Hero.ts +++ b/shared/db/Hero.ts @@ -207,6 +207,10 @@ export default class Hero extends BaseModel { return result; } + public static async getHeroAndEquip(roleId: string, hid:number, lean = true) { + let result: HeroType = await HeroModel.findOne({roleId, hid}).select('ePlact').lean(lean); + return result; + } } export const HeroModel = getModelForClass(Hero); diff --git a/shared/pubUtils/data.ts b/shared/pubUtils/data.ts index ce055cf14..cb5604c90 100644 --- a/shared/pubUtils/data.ts +++ b/shared/pubUtils/data.ts @@ -173,4 +173,9 @@ export function getJobByGradeAndClass(jobClass: number, grade: number) { export function getFriendShipById(shipId: number, level: number) { return gameData.friendShips.get(shipId +'_' + level); -} \ No newline at end of file +} + +export function getGoodById(gid:number) { + return gameData.goods.get(gid); +} + diff --git a/shared/pubUtils/dicParam.ts b/shared/pubUtils/dicParam.ts new file mode 100644 index 000000000..e888449f2 --- /dev/null +++ b/shared/pubUtils/dicParam.ts @@ -0,0 +1,5 @@ +export const EQUIP = { + EQUIP_ONE_HOLE: '1&1', // 装备孔1号位消耗 + EQUIP_TWO_HOLE: '1&2', // 装备孔2号位消耗 + EQUIP_THREE_HOLE: '1&4', // 装备孔3号位消耗 +}; diff --git a/shared/pubUtils/dictionary/DicGoods.ts b/shared/pubUtils/dictionary/DicGoods.ts index 0d60eece9..9592120e3 100644 --- a/shared/pubUtils/dictionary/DicGoods.ts +++ b/shared/pubUtils/dictionary/DicGoods.ts @@ -91,12 +91,11 @@ arr.forEach(o => { o.randomEffect = parseNumberList(o.randomEffect); dicGoods.set(o.good_id, _.pick(o, Object.keys(DicGoodsKeys))); - if(o.itid == IT_TYPE.BLUEPRT) { + if (o.itid == IT_TYPE.BLUEPRT) { let arr = blueprt.get(o.quality)||new Array(); arr.push(o.good_id); blueprt.set(o.quality, arr); } - }); function parseSpecialAttr(str: string) {