演武场和练兵场
This commit is contained in:
97
shared/db/BossScript.ts
Normal file
97
shared/db/BossScript.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { nowSeconds } from '../pubUtils/timeUtil';
|
||||
|
||||
class Rank {
|
||||
@prop({ required: true })
|
||||
roleId: string;
|
||||
@prop({ required: true })
|
||||
score: number;
|
||||
@prop({ required: true })
|
||||
time: number;
|
||||
}
|
||||
|
||||
class LastRecord {
|
||||
@prop({ required: true, default: 0 })
|
||||
warId: number;
|
||||
@prop({ required: true})
|
||||
roleIds: Array<string>;
|
||||
}
|
||||
|
||||
@index({ guildCode: 1 })
|
||||
export default class BossScript extends BaseModel {
|
||||
@prop({ required: true })
|
||||
guildCode: string;
|
||||
|
||||
@prop({ required: true })
|
||||
warId: number;
|
||||
|
||||
@prop({ required: true })
|
||||
bossHp: number;
|
||||
|
||||
@prop({ required: true, type: Rank, default:[]})
|
||||
ranks:Array<Rank>;
|
||||
|
||||
@prop({ required: true })
|
||||
time: number;
|
||||
|
||||
@prop({ required: true, default: 0})
|
||||
num: number;
|
||||
|
||||
@prop({ required: true, default:[]})
|
||||
roleIdRecords: Array<string>; //记录提示过胜利boss关的玩家
|
||||
|
||||
@prop({ required: true })
|
||||
winWarId: number; //记录上一次通关的关卡
|
||||
|
||||
@prop({ required: true })
|
||||
winTime: number; //记录上一次通关的时间
|
||||
|
||||
@prop({ required: true, default: 0})
|
||||
winNum: number;
|
||||
|
||||
@prop({ required: true, type: Rank, default:[]})
|
||||
recordRanks:Array<Rank>;
|
||||
|
||||
@prop({ required: true, default: false })
|
||||
winSettled: boolean; //胜利是否结算过
|
||||
public static async findBossScript(guildCode: string, lean = true) {
|
||||
const bossScript: BossScriptType = await BossScriptModel.findOne({ guildCode }).lean(lean);
|
||||
return bossScript;
|
||||
}
|
||||
|
||||
public static async openBossScript(guildCode: string, bossHp: number, warId: number, lean = true) {
|
||||
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode },{ranks:[], time: nowSeconds(), bossHp, warId, $inc: { recordNum: 1 }}, {new: true, upsert: true}).lean(lean);
|
||||
return bossScript;
|
||||
}
|
||||
//记录玩家boss通关后首次查看boss关卡
|
||||
public static async recordRoleIdWhenCheck(guildCode: string, roleId: string, lean = true) {
|
||||
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ roleIdRecords: roleId } }).lean(lean);
|
||||
return bossScript;
|
||||
}
|
||||
|
||||
public static async pushRecordRanks(guildCode: string, recordRank: Rank, lean = true) {
|
||||
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ recordRanks: recordRank } }).lean(lean);
|
||||
return bossScript;
|
||||
}
|
||||
|
||||
public static async pushRanks(guildCode: string, rank: Rank, lean = true) {
|
||||
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $push:{ recordRanks: rank } }).lean(lean);
|
||||
return bossScript;
|
||||
}
|
||||
|
||||
public static async updateBossScript(guildCode: string, update:BossScriptTypeParam, lean = true) {
|
||||
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode }, { $set:update }).lean(lean);
|
||||
return bossScript;
|
||||
}
|
||||
|
||||
public static async updateBossHp(guildCode: string, hp: number, roleId: string, lean = true) {
|
||||
const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode, 'ranks.roleId': roleId, bossHp: { $gt: 0 } }, { $inc: { bossHp: - hp ,'ranks.$.score': hp}, }).lean(lean);
|
||||
return bossScript;
|
||||
}
|
||||
}
|
||||
|
||||
export const BossScriptModel = getModelForClass(BossScript);
|
||||
|
||||
export interface BossScriptType extends Pick<DocumentType<BossScript>, keyof BossScript> {};
|
||||
export type BossScriptTypeParam = Partial<BossScriptType>; // 将所有字段变成可选项
|
||||
Reference in New Issue
Block a user