import BaseModel from './BaseModel'; import { index, getModelForClass, prop } 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; @prop({ required: true, default: 0}) ce: number; public static async findByRoleId(roleId: string, lean = true) { const result = await PvpDefenseModel.findOne({ roleId }).lean(lean); return result; } public static async findByScale(roleId: string, min: number, max: number, lean = true) { const result = 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, ce: number}, lean=true) { const doc = new PvpDefenseModel(); const update = Object.assign(doc.toJSON(), params); const defense = 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 = 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 = 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 = await PvpDefenseModel.findOneAndUpdate({roleId, 'heroes.actorId': hid}, {$inc: {ce: distance}}).lean(lean); return rec } public static async deleteAccount(roleId: string, lean = true) { let result = await PvpDefenseModel.deleteMany({roleId}).lean(lean); return result||{}; } } export const PvpDefenseModel = getModelForClass(PvpDefense);