HJ_Server/src/public/equip.ts

60 lines
2.3 KiB
TypeScript

import {ObjectId} from 'mongodb';
import {ApiCall} from 'tsrpc';
import {CollectionEquip} from '../module/collection_equip';
import {HeroFun} from './hero';
import {call} from './player';
type equipChange = Partial<Omit<{
[k in keyof CollectionEquip]: CollectionEquip[k]
}, '_id'>>;
export class EquipFun {
/**
* 修改装备属性
*/
static async changeEquipAttr(call: call, equip: Pick<CollectionEquip, '_id'> & Partial<Omit<CollectionEquip, '_id'>>, change: equipChange, changeHero = true) {
if (Object.keys(change).length < 1) return;
//穿戴装备时该装备穿戴在另一个英雄身上
if (change.wearaId != undefined && equip.wearaId && equip.wearaId != change.wearaId && changeHero) {
let takeHero = await HeroFun.getHero(call, equip.wearaId);
if (takeHero) {
let _equip = Object.assign({}, takeHero.equip);
_equip[G.gc.equip[equip.equipId].type] = '';
await HeroFun.changeHeroAttr(call, takeHero, {equip: _equip});
}
}
Object.assign(equip, change);
for (let k in change) {
G.redis.set('equip', call.uid, equip._id, k as keyof CollectionEquip, change[k]);
}
G.mongodb.collection('equip').updateOne({uid: call.uid, _id: new ObjectId(equip._id)}, {$set: {...change}});
call.addEventMsg('msg_s2c/EquipChange', equip._id, change);
}
/**
* 获取装备
*/
static async getEquip(call: ApiCall, oid: string): Promise<CollectionEquip>;
static async getEquip(call: ApiCall, oid: string[]): Promise<CollectionEquip[]>;
static async getEquip(call: ApiCall, oid: string | string[]) {
if (typeof oid == 'string') {
let data = await G.redis.get('equip', call.uid, oid);
if (!data) {
let {_id, ...info} = await G.mongodb.collection('equip').findOne({
_id: G.mongodb.conversionId(oid)
})
data = Object.assign({_id: _id.toHexString()}, info)
}
return data
} else {
let equips = await G.mongodb.collection('equip').find({
uid: call.uid,
_id: {$in: oid.map(v => G.mongodb.conversionId(v))}
}).toArray();
return equips.map(v => G.mongodb.conversionIdObj(v));
}
}
}