演武场和练兵场
This commit is contained in:
@@ -6,6 +6,8 @@ export const STATUS = {
|
||||
INTERNAL_ERR: { code: 3, simStr: '内部错误' },
|
||||
CONNECTOR_ERR: { code: 4, simStr: '连接服配置错误'},
|
||||
LOGIN_ERR: { code: 5, simStr: '检测到您的账号异地登录,已被迫下线'},
|
||||
REDLOCK_ERR: { code: 6, simStr: 'redlock错误' },
|
||||
|
||||
// 账号相关状态 10000 - 19999
|
||||
SMS_IN_60S: { code: 10001, simStr: '60秒内只能发送一次' },
|
||||
SMS_CNT_LIMIT: { code: 10002, simStr: '今日短信条数已达上限' },
|
||||
@@ -208,6 +210,14 @@ export const STATUS = {
|
||||
ROLE_SCHOOL_POSITION_UNLOCK_NOT_NEED: {code: 30605, simStr: '该位置已解锁'},
|
||||
ROLE_SCROLL_REACH_MAX: {code: 30606, simStr: '已经升到可以升的最高等级'},
|
||||
|
||||
//军团30800-30899
|
||||
GUILD_SCRIPT_IS_OPENED_TODAY: {code: 30800, simStr: '今日演武场已开启'},
|
||||
GUILD_SCRIPT_NOT_OPENED: {code: 30801, simStr: '演武场未开启'},
|
||||
GUILD_SCRIPT_IS_BATTLED: {code: 30802, simStr: '今日已挑战过演武场'},
|
||||
GUILD_SCRIPT_IS_COMPLETE: {code: 30803, simStr: '演武场已挑战完成'},
|
||||
GUILD_TRAIN_SCRIPT_NOT_OPENED: {code: 30910, simStr: '试炼关卡未开启'},
|
||||
GUILD_TRAIN_BATTLE_COUNT_NOT_ENOUGH: {code: 30911, simStr: '试炼挑战次数已用完'},
|
||||
GUILD_TRAIN_IS_COMPLETE: {code: 30912, simStr: '试炼关卡已经被压制'},
|
||||
// 社交相关状态 40000 - 49999
|
||||
// 运营模块相关状态 50000 - 59999
|
||||
// GM后台相关状态 60000 - 69999
|
||||
|
||||
+53
-45
@@ -8,62 +8,70 @@ import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoos
|
||||
@index({ battleCode: 1 })
|
||||
|
||||
class Record {
|
||||
@prop({ required: true, type: Number })
|
||||
heroes: Array <number>; // 武将id
|
||||
@prop({ required: false })
|
||||
oppRoleId?: string; // pvp对手
|
||||
@prop({ required: false })
|
||||
pos?: number; // pvp位置
|
||||
@prop({ required: true, type: Number })
|
||||
heroes: Array<number>; // 武将id
|
||||
@prop({ required: false })
|
||||
oppRoleId?: string; // pvp对手
|
||||
@prop({ required: false })
|
||||
pos?: number; // pvp位置
|
||||
@prop({ required: false })
|
||||
recordNum?: number;
|
||||
@prop({ required: false })
|
||||
bossHp?: number;
|
||||
@prop({ required: false })
|
||||
trainId?:number;
|
||||
@prop({ required: false })
|
||||
hid?:number;
|
||||
}
|
||||
|
||||
export default class BattleRecord 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 })
|
||||
battleCode: string; // 关卡记录唯一标识
|
||||
@prop({ required: true })
|
||||
battleId: number; // 关卡 id
|
||||
@prop({ required: true })
|
||||
warName: string; // 关卡 名
|
||||
@prop({ required: true })
|
||||
warType: number; // 关卡 类型
|
||||
@prop({ required: true })
|
||||
battleCode: string; // 关卡记录唯一标识
|
||||
@prop({ required: true })
|
||||
battleId: number; // 关卡 id
|
||||
@prop({ required: true })
|
||||
warName: string; // 关卡 名
|
||||
@prop({ required: true })
|
||||
warType: number; // 关卡 类型
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
status: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败
|
||||
@prop({ required: true, default: 0 })
|
||||
star: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败
|
||||
@prop({ required: true, _id: false })
|
||||
record: Record; // 使用的武将等记录
|
||||
@prop({ required: true, default: 0 })
|
||||
status: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败
|
||||
@prop({ required: true, default: 0 })
|
||||
star: number; // 关卡状态 0-挑战中 1-挑战成功 2-挑战失败
|
||||
@prop({ required: true, _id: false })
|
||||
record: Record; // 使用的武将等记录
|
||||
|
||||
public static async getBattleRecordByCode(battleCode: string, lean = true) {
|
||||
const result: BattleRecordType = await BattleRecordModel.findOne({ battleCode }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
public static async getBattleRecordByCode(battleCode: string, lean = true) {
|
||||
const result: BattleRecordType = await BattleRecordModel.findOne({ battleCode }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async getBattleRecordByIdAndStatus(roleId: string, battleId: number, status: number, lean = true) {
|
||||
const result: BattleRecordType = await BattleRecordModel.findOne({ roleId, battleId, status }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
public static async getBattleRecordByIdAndStatus(roleId: string, battleId: number, status: number, lean = true) {
|
||||
const result: BattleRecordType = await BattleRecordModel.findOne({ roleId, battleId, status }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async getBattleRecordByIdAndStar(roleId: string, battleId: number, star: number, lean = true) {
|
||||
const result: BattleRecordType = await BattleRecordModel.findOne({ roleId, battleId, star: {$lte: star} }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
public static async getBattleRecordByIdAndStar(roleId: string, battleId: number, star: number, lean = true) {
|
||||
const result: BattleRecordType = await BattleRecordModel.findOne({ roleId, battleId, star: { $lte: star } }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async updateBattleRecordByCode( battleCode: string, params: object, lean = true) {
|
||||
const result: BattleRecordType = await BattleRecordModel.findOneAndUpdate({ battleCode }, params, {new: true, upsert: true}).lean(lean);
|
||||
return result;
|
||||
}
|
||||
public static async updateBattleRecordByCode(battleCode: string, params: object, lean = true) {
|
||||
const result: BattleRecordType = await BattleRecordModel.findOneAndUpdate({ battleCode }, params, { new: true, upsert: true }).lean(lean);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async deleteAccount(roleId: string) {
|
||||
let result = await BattleRecordModel.deleteMany({roleId});
|
||||
return result||{};
|
||||
}
|
||||
public static async deleteAccount(roleId: string) {
|
||||
let result = await BattleRecordModel.deleteMany({ roleId });
|
||||
return result || {};
|
||||
}
|
||||
}
|
||||
|
||||
export const BattleRecordModel = getModelForClass(BattleRecord);
|
||||
|
||||
export interface BattleRecordType extends Pick<DocumentType<BattleRecord>, keyof BattleRecord>{}
|
||||
export interface BattleRecordType extends Pick<DocumentType<BattleRecord>, keyof BattleRecord> { }
|
||||
@@ -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>; // 将所有字段变成可选项
|
||||
+1
-1
@@ -11,7 +11,7 @@ class Structure {
|
||||
lv: number;
|
||||
}
|
||||
|
||||
@index({ roleId: 1 })
|
||||
@index({ code: 1 })
|
||||
export default class Guild extends BaseModel {
|
||||
|
||||
@prop({ required: true })
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType, Ref } from '@typegoose/typegoose';
|
||||
|
||||
class TrainBox {
|
||||
|
||||
}
|
||||
|
||||
class TrainScript {
|
||||
@prop({ required: true })
|
||||
hid: number;
|
||||
@prop({ required: true })
|
||||
progress: number;
|
||||
@prop({ required: true })
|
||||
time: number;
|
||||
@prop({ required: true, default: [], type: TrainBox})
|
||||
trainBoxs: Array<TrainBox>;
|
||||
}
|
||||
|
||||
class Rank {
|
||||
@prop({ required: true })
|
||||
roleId: string;
|
||||
@prop({ required: true })
|
||||
score: number;
|
||||
}
|
||||
|
||||
class Report {
|
||||
@prop({ required: true })
|
||||
roleId: string;
|
||||
@prop({ required: true })
|
||||
trainId: number;//挑战的试炼关
|
||||
@prop({ required: true })
|
||||
hid: number;//据点
|
||||
@prop({ required: true })
|
||||
score: number;
|
||||
@prop({ required: true })
|
||||
time: number;
|
||||
@prop({ required: true })
|
||||
isSuccessed: boolean;
|
||||
@prop({ required: true })
|
||||
type: number;//1表示普通战报, 2表示系统战报即:被成功压制
|
||||
}
|
||||
@index({guildCode:1, trainId:1})
|
||||
export default class GuildTrain extends BaseModel {
|
||||
@prop({ required: true })
|
||||
guildCode: string;
|
||||
@prop({ required: true })
|
||||
trainId: number;
|
||||
@prop({ required: true })
|
||||
isComplete: boolean;
|
||||
@prop({ required: true, default: [], type: TrainScript})
|
||||
trainScripts: Array<TrainScript>;
|
||||
@prop({ required: true, default: [], type: Rank })
|
||||
ranks: Array<Rank>;
|
||||
@prop({ required: true, default: [], type: Report })
|
||||
reports: Array<Report>;
|
||||
@prop({ required: true, default: false})
|
||||
locked: boolean;
|
||||
|
||||
public static async findGuildTrain(guildCode: string, locked = false, lean = true) {
|
||||
const guildTrain: GuildTrainType[] = await GuildTrainModel.findOne({ guildCode, locked }).lean(lean);
|
||||
return guildTrain;
|
||||
}
|
||||
|
||||
public static async findTrainByTrainIdNotLock(guildCode: string, trainId: number, locked = false, lean = true) {
|
||||
const guildTrain: GuildTrainType = await GuildTrainModel.findOne({ guildCode, trainId, locked }).lean(lean);
|
||||
return guildTrain;
|
||||
}
|
||||
|
||||
public static async updateGuildTrain(guildCode: string, trainId: number, update: GuildTrainTypeParam, lean = true) {
|
||||
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId}, { $set: update }).lean(lean);
|
||||
return guildTrain;
|
||||
}
|
||||
|
||||
public static async updateGuildTrainProgress(guildCode: string, trainId: number, hid:number, progress: number, ranks:Array<Rank>, reports: Array<Report>, isComplete: boolean,lean = true) {
|
||||
const guildTrain: GuildTrainType = await GuildTrainModel.findOneAndUpdate({ guildCode, trainId, 'trainScripts.hid':hid},
|
||||
{ $set: {'trainScripts.$.progress': progress, ranks, reports, isComplete} }).lean(lean);
|
||||
return guildTrain;
|
||||
}
|
||||
|
||||
public static async openGuildTrain() {
|
||||
// const bossScript: BossScriptType = await BossScriptModel.findOneAndUpdate({ guildCode },{ranks:[], time: nowSeconds(), bossHp, warId, $inc: { recordNum: 1 }}, {new: true, upsert: true}).lean(lean);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export const GuildTrainModel = getModelForClass(GuildTrain);
|
||||
|
||||
export interface GuildTrainType extends Pick<DocumentType<GuildTrain>, keyof GuildTrain> { };
|
||||
export type GuildTrainTypeParam = Partial<GuildTrainType>; // 将所有字段变成可选项
|
||||
+1
-16
@@ -81,22 +81,7 @@ export default class Item extends BaseModel {
|
||||
return { hasError: false, result }
|
||||
}
|
||||
}
|
||||
// public static async decreaseItems(roleId: string, items: Array<{ id: number, count: number, ratio?: number}>, lean = true) {
|
||||
// const transaction = new Transaction();
|
||||
// let hasError: boolean = false, result = new Array();
|
||||
// try {
|
||||
// for (let { id, count, ratio } of items) {
|
||||
// if (!ratio) ratio = -1;
|
||||
// await transaction.update("Item", { roleId, id, count: { $gte: count } }, { $inc: { count: ratio * count } }, { new: true});
|
||||
// }
|
||||
// await transaction.run();
|
||||
// return {hasError, result};
|
||||
// } catch (error) {
|
||||
// await transaction.rollback().catch(console.error);
|
||||
// transaction.clean();
|
||||
// return {error};
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
public static async deleteAccount(roleId: string) {
|
||||
let result = await ItemModel.deleteMany({ roleId });
|
||||
|
||||
+4
-1
@@ -23,11 +23,14 @@ export default class Mail extends BaseModel {
|
||||
@prop({ required: true })
|
||||
sendName: string;
|
||||
|
||||
@prop({ required: true })
|
||||
content: string;
|
||||
|
||||
public static async addMails( mails: Array<MailType>) {
|
||||
await MailModel.insertMany(mails);
|
||||
}
|
||||
|
||||
public static async addMail(params:{roleId: string, goods: Array<RewardInter>, sendName: string, mailId: number, sendTime?: number}) {
|
||||
public static async addMail(params:{roleId: string, goods: Array<RewardInter>, sendName: string, mailId: number, sendTime?: number, content?:string}) {
|
||||
const doc = new MailModel();
|
||||
const mail = Object.assign(doc.toJSON(), params);
|
||||
await MailModel.create(mail);
|
||||
|
||||
@@ -42,6 +42,15 @@ export default class UserGuild extends BaseModel {
|
||||
@prop({ required: true, default: new Date() })
|
||||
refTimeWeekly: number;
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
trainCount: number;//每日挑战训练场的次数
|
||||
|
||||
@prop({ required: true, default: 0 })
|
||||
trainTime: number;//上次刷新挑战训练场次数的时间
|
||||
|
||||
@prop({ required: true, default: [] })
|
||||
trainRewards: Array<number>;//领取过的进阶等级
|
||||
|
||||
public static async getMyAuth(roleId: string, guildCode?: string, userGuild?: UserGuildType) {
|
||||
let myGuild: UserGuildType;
|
||||
if(!userGuild) {
|
||||
|
||||
Reference in New Issue
Block a user