88 lines
3.3 KiB
TypeScript
88 lines
3.3 KiB
TypeScript
import BaseModel from './BaseModel';
|
|
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
|
|
|
class Heroes {
|
|
@prop({ required: true })
|
|
actorId: number; // 武将id
|
|
@prop({ required: true })
|
|
actorName: string; // 武将名
|
|
@prop({ required: true })
|
|
attribute: {hp: number, atk: number, matk: number, def: number, mdef: number, agi: number, luk: number, speed: number, hit: number, cri: number, flee: number, antCri: number, damageIncrease: number, damageDecrease: number, defIgnore: number, bloodSuck: number, ap: number}; // 属性
|
|
@prop({ required: true })
|
|
lv: number; // 角色等级
|
|
@prop({ required: true })
|
|
ce: number; // 战斗力
|
|
@prop({ required: false })
|
|
skill: string; // 技能
|
|
@prop({ required: false })
|
|
seid: string; // 技能
|
|
@prop({ required: false })
|
|
star: number; // 角色星级
|
|
}
|
|
|
|
|
|
@index({ roleId: 1 })
|
|
@index({ ce: 1 })
|
|
export default class PvpDefense extends BaseModel {
|
|
@prop({ required: true })
|
|
roleId: string; // 角色 id
|
|
@prop({ required: true })
|
|
roleName: string; // 角色名称
|
|
|
|
@prop({ required: true, type: Heroes, default: []})
|
|
heroes: Array<Heroes>;
|
|
@prop({ required: true, default: 0})
|
|
ce: number;
|
|
|
|
|
|
public static async findByRoleId(roleId: string, lean = true) {
|
|
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId }).lean(lean);
|
|
return result;
|
|
}
|
|
|
|
public static async findByScale(roleId: string, min: number, max: number, lean = true) {
|
|
const result: PvpDefenseType[] = await PvpDefenseModel.find({ roleId: {$ne: roleId}, ce: { $lte: max, $gte: min } }).sort({updatedAt: -1}).limit(100).lean(lean);
|
|
return result;
|
|
}
|
|
|
|
public static async createPvpDefense(params: {roleId: string, roleName: string, heroes: Array<any>, ce: number}, lean=true) {
|
|
const doc = new PvpDefenseModel();
|
|
const update = Object.assign(doc.toJSON(), params);
|
|
const defense: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({ roleId: params.roleId }, update, {upsert: true, new: true}).lean(lean);
|
|
return defense;
|
|
|
|
}
|
|
|
|
public static async addHeroToDefense(roleId: string, heroInfo: any, ce: number, lean=true) {
|
|
const defense: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({ roleId: roleId }, {
|
|
$inc: {ce},
|
|
$push: { heroes: heroInfo }
|
|
}, {upsert: true, new: true}).lean(lean);
|
|
return defense;
|
|
|
|
}
|
|
|
|
public static async removeHeroFromDefense(roleId: string, hid: number, ce: number, lean=true) {
|
|
const defense: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({ roleId: roleId }, {
|
|
$inc: {ce: -1 * ce},
|
|
$pull: { heroes: { actorId: hid }}
|
|
}, {upsert: true, new: true}).lean(lean);
|
|
return defense;
|
|
|
|
}
|
|
|
|
public static async updateCe(roleId: string, hid: number, ce: number, oldCe: number, lean = true) {
|
|
let distance = ce - oldCe;
|
|
const rec: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({roleId, 'heroes.actorId': hid}, {$inc: {ce: distance}}).lean(lean);
|
|
return rec
|
|
}
|
|
|
|
public static async deleteAccount(roleId: string) {
|
|
let result = await PvpDefenseModel.deleteMany({roleId});
|
|
return result;
|
|
}
|
|
}
|
|
|
|
export const PvpDefenseModel = getModelForClass(PvpDefense);
|
|
|
|
export interface PvpDefenseType extends Pick<DocumentType<PvpDefense>, keyof PvpDefense>{}; |