Files
ZYZ/shared/db/GVGTeam.ts
T

101 lines
3.4 KiB
TypeScript

// GVGTeam 数据库表,存储 GVG 队伍信息
import BaseModel from "./BaseModel";
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { genCode } from "../pubUtils/util";
import { LineupHero } from './../domain/roleField/hero';
@index({ roleId: 1, teamId: 1 })
@index({ teamCode: 1 })
export default class GVGTeam extends BaseModel {
@prop({ required: true })
roleId: string; // 玩家id
@prop({ required: true })
teamCode: string; // 玩家队伍唯一标识
@prop({ required: true })
teamId: number; // 队伍id,1-3,玩家的第几个队伍
@prop({ required: true })
leagueCode: string; // 联军
@prop({ required: false })
areaId: number;
@prop({ required: false })
cityId: number;
@prop({ required: false })
pointId: number;
@prop({ required: true })
head: number; // 头像
@prop({ required: true })
spine: number; // 形象
@prop({ required: true })
frame: number; // 相框
@prop({ required: true, default: 0 })
durability: number; // 耐久
@prop({ required: true, default: 0 })
restartTime: number; // 修整期倒计时
@prop({ required: true, default: 0 })
attackTime: number; // 进攻冷却时间
@prop({ required: true, default: 0 })
moveTime: number; // 移动冷却时间
@prop({ required: true, default: 0 })
defenseTime: number; // 防守保护时间
@prop({ required: true })
lineup: [LineupHero]
// 创建队伍
public static async createTeam(roleId: string, leagueCode: string, teamId: number, head: number, spine: number, frame: number, lineup: [LineupHero]) {
const doc = new GVGTeamModel();
const teamCode = genCode(8);
const update = Object.assign(doc.toJSON(), { roleId, leagueCode, teamId, teamCode, head, spine, frame, lineup });
const team: GVGTeamType | null = await GVGTeamModel.findOneAndUpdate({ teamCode }, { $setOnInsert: update }, { upsert: true, new: true }).lean();
return team;
}
// 保存队伍
public static async saveTeam(roleId: string, leagueCode: string, teamId: number, head: number, spine: number, frame: number, lineup: [LineupHero]) {
let team: GVGTeamType = await GVGTeamModel.findOne({ roleId, teamId }).lean();
if (!team) {
team = await this.createTeam(roleId, leagueCode, teamId, head, spine, frame, lineup);
return team;
}
const update = { head, spine, frame };
if (lineup && lineup.length > 0) {
update['lineup'] = lineup;
}
team = await GVGTeamModel.findOneAndUpdate({ roleId, teamId }, { update }, { new: true }).lean();
return team;
}
// 查找角色队伍数
public static async getTeamCnt(roleId: string) {
const teams: GVGTeamType[] = await GVGTeamModel.find({ roleId }).select('teamCode').lean();
return teams.length;
}
// 玩家切换城池更新队伍信息
public static async resetTeamsLoc(roleId: string, cityId: number, areaId: number) {
const res = await GVGTeamModel.updateMany({ roleId }, { cityId, areaId, pointId: 0 }).lean();
return !!res['ok'];
}
}
export const GVGTeamModel = getModelForClass(GVGTeam);
export interface GVGTeamType extends Pick<DocumentType<GVGTeam>, keyof GVGTeam> {
id: number;
};