// 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, keyof GVGTeam> { id: number; };