fix pvp刷新对手时保存数据

This commit is contained in:
luying
2021-01-14 15:57:05 +08:00
parent f3c76b8d6d
commit 5823a1b3eb
11 changed files with 372 additions and 221 deletions

View File

@@ -1,44 +1,8 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { EXPEDITION_WAR_RECORD_STATUS } from '../consts';
import { Enemies } from './generalField'
class Enemies {
@prop({ required: true })
actorId: number; // 敌人id
@prop({ required: false })
actorName: string; // 敌人名
@prop({ required: false })
dataId: number; // 战场中唯一指向武将的代码
@prop({ required: false })
relation: number; // 角色属于我方还是地方
@prop({ required: false })
outIndex: number; // 程序将信息存入数组顺序
@prop({ required: false })
x: number; // 战场x坐标
@prop({ required: false })
y: number; // 战场y坐标
@prop({ required: false })
direction: number; // 朝向
@prop({ required: false })
var: number; // 变量
@prop({ required: false })
lv: number; // 角色等级
@prop({ required: false })
hide: number; // 是否隐藏
@prop({ required: false })
initial_ai: number; // AI类型
@prop({ required: true })
attribute: {hp: number, atk: number, matk: number, def: number, mdef: number, agi: number, luk: number, speed: number, hit: number, cri: number, flee: number, antCri: number, damageIncrease: number, damageDecrease: number, defIgnore: number, bloodSuck: number, ap: number}; // 属性
@prop({ required: false })
skill: string; // 技能
@prop({ required: false })
seid: string; // 技能
@prop({ required: false })
star: number; // 角色星级
@prop({ required: false })
spine: string; // S动画
}
class EnemiesCurHPAP {
@prop({ required: true })
@@ -72,7 +36,7 @@ export default class ExpeditionWarRecord extends BaseModel {
@prop({ required: true, default: '' })
enemyId: string; // 敌军队伍id或玩家id
@prop({ required: true, type: Enemies, default: [], _id: false })
enemies: Array<Enemies>; // 敌军数据
enemies: Array<Enemies>; // 敌军数据
@prop({ required: true, type: EnemiesCurHPAP, default: [], _id: false })
enemiesCurHpAp: Array<EnemiesCurHPAP>; // 敌军数据
@prop({ required: true, default: 0 })

View File

@@ -2,8 +2,8 @@ import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType, Ref, mongoose } from '@typegoose/typegoose';
import Hero, { } from './Hero';
import Role, { } from './Role';
import PvpDef, { } from './PvpDefense';
import { PVP_PLAYER_POS, PVP_HERO_POS } from '../consts';
import PvpHistoryOpp from './PvpHistoryOpp';
export interface pvpUpdateInter {
_id?: string;
@@ -91,14 +91,12 @@ export class Robot {
export class OppPlayers {
@prop({ required: true })
roleId: string;
@prop({ ref: 'PvpDefense', type: mongoose.Schema.Types.ObjectId })
oppDef: Ref<PvpDef>;
@prop({ ref: 'PvpHistoryOpp', type: mongoose.Schema.Types.ObjectId })
oppDef: Ref<PvpHistoryOpp>;
@prop({ required: true })
pos: number;
@prop({ required: true })
isRobot: boolean;
@prop({ required: true, type: Robot, default: null, _id: false })
robot: Robot
}
export class HeroScores {
@@ -136,7 +134,7 @@ export default class PvpDefense extends BaseModel {
isDefaultHero: boolean;
@prop({ required: true, default: 0 })
refOppCnt: number; // 刷新对手总次数,消耗可根据消耗表算出
@prop({ required: true, default: 0 })
@prop({ required: true, default: new Date() })
refOppTime: Date; // 刷新对手时间
@prop({ required: true, default: 0 })
challengeCnt: number; // 可挑战次数
@@ -159,7 +157,7 @@ export default class PvpDefense extends BaseModel {
public static async findByScale(roleId: string, min: number, max: number, lean = true) {
const result: PvpDefenseType[] = await PvpDefenseModel.find({ roleId: { $ne: roleId }, defCe: { $lte: max, $gte: min } })
.populate('role', 'headHid sHid topFiveCe roleId roleName')
.populate('role', 'headHid sHid topFiveCe roleId roleName lv')
.populate('heroes.hero')
.sort({ updatedAt: -1 }).limit(100).lean(lean);
return result;
@@ -203,15 +201,9 @@ export default class PvpDefense extends BaseModel {
public static async findByRoleIdIncludeAll(roleId: string) {
const result: PvpDefenseType = await PvpDefenseModel.findOne({ roleId })
.populate('role', 'headHid sHid topFiveCe roleId roleName')
.populate('role', 'headHid sHid topFiveCe roleId roleName lv')
.populate('heroes.hero')
.populate({
path: 'oppPlayers.oppDef',
populate: {
path: 'role heroes.hero',
select: 'headHid sHid topFiveCe roleId roleName hid ceAttr globalCeAttr'
}
}).lean();
.populate('oppPlayers.oppDef', 'oppRoleId pos roleName headHid sHid rankLv pLv defCe heroes').lean();
return result;
}
@@ -223,13 +215,8 @@ export default class PvpDefense extends BaseModel {
public static async updateInfoAndInclude(roleId: string, update: pvpUpdateInter) {
delete update._id;
let result: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({roleId}, {$set:update}, {new: true})
.populate({
path: 'oppPlayers.oppDef',
populate: {
path: 'role',
select: 'headHid sHid topFiveCe roleId roleName'
}
}).lean();
.populate('role', 'headHid sHid topFiveCe roleId roleName lv')
.populate('oppPlayers.oppDef', 'oppRoleId pos roleName headHid sHid rankLv pLv defCe').lean();
return result;
}
public static async updateInfo(roleId: string, update: pvpUpdateInter, lean = true) {

View File

@@ -0,0 +1,67 @@
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { PvpEnemies } from './generalField';
export class HeroScores {
@prop({ required: true })
hid: number;
@prop({ required: true })
score: number;
}
@index({ roleId: 1 })
export default class PvpHistoryOpp extends BaseModel {
@prop({ required: true })
roleId: string; // 玩家id
@prop({ required: true })
pos: number; // 对手位置
@prop({ required: true })
oppRoleId: string; // 对手角色 id
@prop({ required: true })
roleName: string; // 角色名称
@prop({ required: true, default: 19 })
headHid: number; // 对手头像
@prop({ required: true, default: 19 })
sHid: number; // 对手形象
@prop({ required: true, default: 0 })
score: number; // 对手军功
@prop({ required: true, default: 1 })
pLv: number; // 对手等级
@prop({ required: true, default: 1 })
lv: number; // 对手角色等级
@prop({ required: true, default: 1 })
title: number; // 对手等级
@prop({ required: true, default: 0 })
defCe: number; // 防守战力
@prop({ required: true, default: 0 })
rankLv: number; // 对手排名
@prop({ required: true, type: PvpEnemies, default: [] })
heroes: PvpEnemies[]; // 对手阵容
@prop({ required: true, default: 0 })
status: number; // 状态 0-仅刷出 1-挑战过
public static async createPvpOpp(params: PvpOppCreateParam, lean = true) {
const doc = new PvpHistoryOppModel();
const update = Object.assign(doc.toJSON(), params);
delete update._id;
const defense: PvpHistoryOppType = await PvpHistoryOppModel.findOneAndUpdate({ roleId: params.roleId, pos: params.pos }, update, { upsert: true, new: true }).lean(lean);
return defense;
}
public static async findByRoleIdAndOppId(roleId: string, oppRoleId: string) {
const result: PvpHistoryOppType = await PvpHistoryOppModel.findOne({ roleId, oppRoleId, status: 0 }).lean();
return result;
}
public static async setStatus(roleId: string, oppRoleId: string, status: number) {
const result: PvpHistoryOppType = await PvpHistoryOppModel.findOneAndUpdate({ roleId, oppRoleId }, {status}, {new: true}).lean();
return result;
}
}
export const PvpHistoryOppModel = getModelForClass(PvpHistoryOpp);
export interface PvpHistoryOppType extends Pick<DocumentType<PvpHistoryOpp>, keyof PvpHistoryOpp> { };
export type PvpOppCreateParam = Partial<PvpHistoryOppType>; // 将所有字段变成可选项

View File

@@ -2,6 +2,7 @@ import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { getBeforeDayDate } from '../pubUtils/timeUtil';
import { genCode } from '../pubUtils/util';
import { PvpHeroInfo } from './generalField';
export class HeroesRecord {
@prop({ required: true, default: 0 })
@@ -20,6 +21,17 @@ export class HeroesRecord {
heal: number; // 治疗
@prop({ required: true, default: 0 })
underDamage: number; // 承伤
constructor(pvpHero: PvpHeroInfo, damage: number, heal: number, underDamage: number) {
this.hid = pvpHero.actorId;
this.quality = pvpHero.quality;
this.star = pvpHero.star;
this.colorStar = pvpHero.colorStar;
this.lv = pvpHero.lv;
this.damage = damage;
this.heal = heal;
this.underDamage = underDamage;
}
}
export class PlayerInfo {

View File

@@ -1,4 +1,6 @@
import { prop } from '@typegoose/typegoose';
import { DicWarJson } from '../pubUtils/dictionary/DicWarJson';
import { HeroType } from './Hero';
export class CeAttrData {
@prop({ required: true })
@@ -120,3 +122,125 @@ export class CeAttrNumber {
bloodSuck?: number = 0;
}
// 从玩家数据中覆盖warjson的部分字段
export class PvpHeroInfo {
@prop({ required: true })
actorId?: number = 0; // 敌人id
@prop({ required: false })
actorName?: string = ""; // 敌人名
@prop({ required: false })
outIndex?: number = 0; // 程序将信息存入数组顺序
@prop({ required: false })
star?: number = 0; // 角色星级
@prop({ required: false })
lv?: number = 0; // 角色等级
@prop({ required: false })
skill?: string = "0"; // 技能
@prop({ required: false })
seid?: string = "&"; // 技能
@prop({ required: false })
spine?: string = "0"; // S动画
@prop({ required: false })
colorStar?: number = 0; // 觉醒
@prop({ required: false })
quality?: number = 0; // 品质
@prop({ required: true, _id: false, default: new CeAttrNumber() })
attribute?: CeAttrNumber; // 属性
setHeroInfo(hero: HeroType) {
this.actorId = hero.hid;
this.actorName = hero.hName;
this.star = hero.star;
this.lv = hero.lv;
this.colorStar = hero.colorStar;
this.quality = hero.quality;
}
setRobotInfo(warjson: DicWarJson, lv: number, initialStar: number, quality: number) {
this.actorId = warjson.actorId;
this.actorName = warjson.actorName;
this.star = initialStar;
this.lv = lv;
this.quality = quality;
}
setAttribute(attribute: CeAttrNumber) {
this.attribute = attribute;
}
setOutIndex(order: number) {
this.outIndex = order;
}
}
// 远征敌军
export class Enemies extends PvpHeroInfo {
@prop({ required: true })
actorId: number; // 敌人id
@prop({ required: false })
actorName: string; // 敌人名
@prop({ required: false })
dataId: number; // 战场中唯一指向武将的代码
@prop({ required: false })
relation: number; // 角色属于我方还是地方
@prop({ required: false })
x: number; // 战场x坐标
@prop({ required: false })
y: number; // 战场y坐标
@prop({ required: false })
direction: number; // 朝向
@prop({ required: false })
var: number; // 变量
@prop({ required: false })
hide: number; // 是否隐藏
@prop({ required: false })
initial_ai: number; // AI类型
// warjson 出兵表
// heroInfo 覆盖掉出兵表的相应参数
constructor(warjson: DicWarJson, heroInfo: PvpHeroInfo) {
super();
this.actorId = heroInfo.actorId != undefined? heroInfo.actorId: warjson.actorId;
this.actorName = heroInfo.actorName != undefined? heroInfo.actorName: warjson.actorName;
this.dataId = warjson.dataId;
this.relation = warjson.relation;
this.outIndex = heroInfo.outIndex != undefined? heroInfo.outIndex: warjson.outIndex;
this.x = warjson.x;
this.y = warjson.y;
this.direction = warjson.direction;
this.var = warjson.var;
this.lv = heroInfo.lv != undefined? heroInfo.lv: warjson.lv;
this.hide = warjson.hide;
this.initial_ai = warjson.initial_ai;
this.attribute = heroInfo.attribute;
this.skill = heroInfo.skill != undefined? heroInfo.skill: warjson.skill;
this.seid = heroInfo.seid != undefined? heroInfo.seid: warjson.seid;
this.star = heroInfo.star != undefined? heroInfo.star: warjson.star;
this.spine = heroInfo.spine!= undefined? heroInfo.spine: warjson.spine;
}
}
export class PvpEnemies extends Enemies {
@prop({ required: true })
star: number;
@prop({ required: true })
colorStar: number;
@prop({ required: true })
quality: number;
@prop({ required: true })
lv: number;
@prop({ required: true })
score: number;
// score: 这个武将的军功
constructor(warjson: DicWarJson, heroInfo: PvpHeroInfo, score: number) {
super(warjson, heroInfo);
this.star = heroInfo.star;
this.colorStar = heroInfo.colorStar;
this.quality = heroInfo.quality;
this.lv = heroInfo.lv;
this.score = score;
}
}

View File

@@ -3,6 +3,7 @@
import { RoleType } from "../db/Role";
import { Robot } from "../db/PvpDefense";
import { reduceCe } from "./util";
import { PvpHeroInfo, PvpEnemies } from "../db/generalField";
export interface RewardInter {
id: number;
@@ -121,13 +122,22 @@ export class RankParam {
}
}
export interface PlayerDetailHero {
export class PlayerDetailHero {
actorId: number;
lv: number;
star: number;
colorStar: number;
quality: number;
score: number;
setPvpHeroInfo?(hero: PvpEnemies) {
this.actorId = hero.actorId;
this.lv = hero.lv;
this.star = hero.star;
this.colorStar = hero.colorStar;
this.quality = hero.quality;
this.score = hero.score;
}
}
export class PlayerDetail {

View File

@@ -8,7 +8,7 @@ import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool';
import { HERO_CE_RATIO, ABI_STAGE } from '../consts';
import { findIndex } from 'underscore';
const randomName = require("chinese-random-name");
const moment = require('moment');
export function genCode(len) {
@@ -516,3 +516,7 @@ export function getAllAttrStage() {
};
return attrs;
}
export function getChineseName() {
return randomName.generate()
}