✨ feat(gvg): 征战中原锁定对手
This commit is contained in:
59
shared/db/GVGVestigeLock.ts
Normal file
59
shared/db/GVGVestigeLock.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
// 征战中原对手锁
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { getZeroPoint, nowSeconds } from '../pubUtils/timeUtil';
|
||||
import { GVG } from '../pubUtils/dicParam';
|
||||
|
||||
@index({ day: 1, groupId: 1, vestigeId: 1, rank: 1 })
|
||||
export default class GVGVestigeLock extends BaseModel {
|
||||
|
||||
@prop({ required: true })
|
||||
configId: number; // 赛期
|
||||
|
||||
@prop({ required: true })
|
||||
day: number; // 每天5点
|
||||
|
||||
@prop({ required: true })
|
||||
groupId: number; // 战区id
|
||||
|
||||
@prop({ required: true })
|
||||
vestigeId: number; // 遗迹id
|
||||
|
||||
@prop({ required: true })
|
||||
rank: number; // 排名
|
||||
|
||||
@prop({ required: true })
|
||||
unlockTime: number; // 锁定到什么时候
|
||||
|
||||
@prop({ required: true })
|
||||
attackRoleId: string; // 锁定到什么时候
|
||||
|
||||
@prop({ required: true })
|
||||
defenseRoleId: string; // 锁定到什么时候
|
||||
|
||||
public static async chooseOppLock(groupId: number, vestigeId: number, rank: number, configId: number, attackRoleId: string, defenseRoleId: string ) {
|
||||
return await this.lock(groupId, vestigeId, rank, configId, attackRoleId, defenseRoleId, nowSeconds() + GVG.GVG_VESTIGE_PREPARE_COUNTDOWN);
|
||||
}
|
||||
|
||||
private static async lock(groupId: number, vestigeId: number, rank: number, configId: number, attackRoleId: string, defenseRoleId: string, unlockTime: number) {
|
||||
let day = getZeroPoint();
|
||||
await GVGVestigeLockModel.findOneAndUpdate({ day, groupId, vestigeId, rank }, { $setOnInsert: { configId, unlockTime: 0 } }, { upsert: true });
|
||||
let result: GVGVestigeLockType = await GVGVestigeLockModel.findOneAndUpdate({
|
||||
day, groupId, vestigeId, rank, unlockTime: { $lt: nowSeconds() }
|
||||
}, { $set: { unlockTime, attackRoleId, defenseRoleId } }, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async releaseLock(groupId: number, vestigeId: number, rank: number) {
|
||||
let day = getZeroPoint();
|
||||
let result: GVGVestigeLockType = await GVGVestigeLockModel.findOneAndUpdate({ day, groupId, vestigeId, rank }, { $set: { unlockTime: 0 } }, { new: true }).lean();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export const GVGVestigeLockModel = getModelForClass(GVGVestigeLock);
|
||||
|
||||
export interface GVGVestigeLockType extends Pick<DocumentType<GVGVestigeLock>, keyof GVGVestigeLock> {
|
||||
id: number;
|
||||
};
|
||||
export type GVGVestigeLockUpdate = Partial<GVGVestigeLockType>; // 将所有字段变成可选项
|
||||
@@ -3,7 +3,7 @@ import { index, getModelForClass, prop, DocumentType, mongoose, Ref } from '@typ
|
||||
import Role, { RoleType } from './Role';
|
||||
import { getZeroPoint } from '../pubUtils/timeUtil';
|
||||
|
||||
class Lineup {
|
||||
export class Lineup {
|
||||
@prop({ required: true })
|
||||
actorId: number; // 武将
|
||||
@prop({ required: true })
|
||||
@@ -60,12 +60,24 @@ export default class GVGVestigeRank extends BaseModel {
|
||||
@prop({ required: true, default: 0 })
|
||||
refreshCnt: number; // 刷新次数
|
||||
|
||||
public static async findRankByRole(vestigeId: number, roleId: string) {
|
||||
public static async findAllByRole(roleId: string) {
|
||||
let today = getZeroPoint();
|
||||
let result: GVGVestigeRankType[] = await GVGVestigeRankModel.find({ day: today, roleId }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findByRole(vestigeId: number, roleId: string) {
|
||||
let today = getZeroPoint();
|
||||
let result: GVGVestigeRankType = await GVGVestigeRankModel.findOne({ day: today, vestigeId, roleId }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async findByRank(vestigeId: number, rank: number) {
|
||||
let today = getZeroPoint();
|
||||
let result: GVGVestigeRankType = await GVGVestigeRankModel.findOne({ day: today, vestigeId, rank }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async initRank(configId: number, vestigeId: number, groupId: number, role: RoleType, oppRanks: number[]) {
|
||||
let today = getZeroPoint();
|
||||
let doc = new GVGVestigeRankModel();
|
||||
|
||||
76
shared/db/GVGVestigeRec.ts
Normal file
76
shared/db/GVGVestigeRec.ts
Normal file
@@ -0,0 +1,76 @@
|
||||
// 征战中原对手锁
|
||||
import BaseModel from './BaseModel';
|
||||
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
|
||||
import { OppPlayerInfo } from '../domain/gvgField/gvgDb';
|
||||
import { genCode } from '../pubUtils/util';
|
||||
import { VESTIGE_STATUS } from '../consts';
|
||||
|
||||
class LeagueGood {
|
||||
@prop({ required: true })
|
||||
itemType: number;
|
||||
|
||||
@prop({ required: true })
|
||||
id: number;
|
||||
|
||||
@prop({ required: true })
|
||||
count: number
|
||||
}
|
||||
|
||||
@index({ day: 1, groupId: 1, vestigeId: 1, rank: 1 })
|
||||
export default class GVGVestigeRec extends BaseModel {
|
||||
|
||||
@prop({ required: true })
|
||||
battleCode: string; // 唯一code
|
||||
|
||||
@prop({ required: true })
|
||||
attackRoleId: string; // 攻方玩家id
|
||||
|
||||
@prop({ required: true })
|
||||
defenseRoleId: string; // 守方玩家id
|
||||
|
||||
@prop({ required: true })
|
||||
groupId: number; // 战区id
|
||||
|
||||
@prop({ required: true })
|
||||
vestigeId: number; // 遗迹id
|
||||
|
||||
@prop({ required: true })
|
||||
status: number; // 1-出兵中 2-挑战中 3-挑战完毕 4-取消
|
||||
|
||||
@prop({ required: true })
|
||||
checkTime: number; // 开始出兵的时间,13位时间戳
|
||||
|
||||
@prop({ required: true })
|
||||
battleTime: number; // 开始挑战的时间,13位时间
|
||||
|
||||
@prop({ required: true })
|
||||
endTime: number; // 结束时间,13位时间戳
|
||||
|
||||
@prop({ required: true, type: () => OppPlayerInfo, default: {}, _id: false })
|
||||
attackInfo: OppPlayerInfo; // 攻方信息
|
||||
|
||||
@prop({ required: true, type: () => OppPlayerInfo, default: {}, _id: false })
|
||||
defenseInfo: OppPlayerInfo; // 守方信息
|
||||
|
||||
@prop({ required: true, type: () => LeagueGood, default: [], _id: false })
|
||||
leagueGoods: LeagueGood[]; // 奖励
|
||||
|
||||
@prop({ required: true, default: false })
|
||||
hasRpl: boolean; // 是否存在对应录像
|
||||
|
||||
public static async createRec(configId: number, vestigeId: number, groupId: number, attackInfo: OppPlayerInfo, defenseInfo: OppPlayerInfo, leagueGoods: LeagueGood[]) {
|
||||
const battleCode = genCode(10);
|
||||
const result: GVGVestigeRecType = await GVGVestigeRecModel.findOneAndUpdate({ battleCode }, {
|
||||
$set: { configId, vestigeId, groupId, attackRoleId: attackInfo.roleId, defenseRoleId: defenseInfo.roleId, status: VESTIGE_STATUS.CHECK, checkTime: Date.now(), attackInfo, defenseInfo, leagueGoods }
|
||||
}, { new: true, upsert: true }).lean();
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export const GVGVestigeRecModel = getModelForClass(GVGVestigeRec);
|
||||
|
||||
export interface GVGVestigeRecType extends Pick<DocumentType<GVGVestigeRec>, keyof GVGVestigeRec> {
|
||||
id: number;
|
||||
};
|
||||
export type GVGVestigeRecUpdate = Partial<GVGVestigeRecType>; // 将所有字段变成可选项
|
||||
Reference in New Issue
Block a user