diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index 81ed9e3ea..dabd8b012 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -389,11 +389,17 @@ export class PvpHandler { return resResult(STATUS.PVP_ROLE_NOT_FOUND); } - let heroes = pvpHistoryOpp.heroes.map(hero => { + let heroes = new Array(); + for(let hero of pvpHistoryOpp.heroes) { let newHero = new PlayerDetailHero(); newHero.setPvpHeroInfo(hero); - return newHero; - }) + heroes.push(newHero); + } + for(let hero of pvpHistoryOpp.otherHeroes) { + let newHero = new PlayerDetailHero(); + newHero.setPvpHeroInfo(hero); + heroes.push(newHero); + } result = new PlayerDetail({...pvpHistoryOpp, roleId: pvpHistoryOpp.oppRoleId, heroes, rank: pvpHistoryOpp.rankLv}); } else { // 查询对方pvpDefense let pvpDefense = await PvpDefenseModel.findByRoleId(oppoRoleId); diff --git a/game-server/app/services/pvpService.ts b/game-server/app/services/pvpService.ts index d0be08ac8..108c690b4 100644 --- a/game-server/app/services/pvpService.ts +++ b/game-server/app/services/pvpService.ts @@ -13,7 +13,7 @@ import { setRank, getMyRank, getFieldByRank } from './redisService'; import { nowSeconds, checkTodayTime } from '../pubUtils/timeUtil'; import { HeroesRecord } from '../db/PvpRecord'; import { HeroModel, HeroType } from '../db/Hero'; -import { CeAttrNumber, CeAttr, CeAttrRole, PvpEnemies, PvpHeroInfo } from '../db/generalField'; +import { CeAttrNumber, CeAttr, CeAttrRole, PvpEnemies, PvpHeroInfo, PvpOtherHeroes } from '../db/generalField'; import { DicWarJson } from '../pubUtils/dictionary/DicWarJson'; import { findWhere, findIndex } from 'underscore'; import { pinus } from 'pinus'; @@ -195,28 +195,38 @@ async function matchPlayer(oppPlayers: OppPlayers[], mapWarJson: DicWarJson[], r * @param roleId 自己的玩家id * @param pos 刷新这个对手的位置 */ -async function generPlayerOppHis(result: PvpDefenseType, mapWarJson: DicWarJson[], roleId: string, pos: number) { - let heroScores = result.heroScores; - let role = result.role; +async function generPlayerOppHis(pvpdefense: PvpDefenseType, mapWarJson: DicWarJson[], roleId: string, pos: number) { + let { heroScores, heroes: defenseHeroes } = pvpdefense; + let role = pvpdefense.role; let rankLv = await getMyRank(REDIS_KEY.PVP_RANK, 0, role.roleId); + let dbHeroes = await HeroModel.findByRole(role.roleId, [{field: 'ce', sortBy: -1}]); let heroes = new Array(); - for(let warJson of mapWarJson) { - if(warJson.relation == 1) continue; - let h = result.heroes.find(cur => cur.dataId == warJson.dataId); - if(h && h.hero) { - let hs = heroScores.find(cur => cur.hid == h.actorId); // 这个武将的军功 - let hero = h.hero; - let heroInfo = new PvpHeroInfo(); - heroInfo.setHeroInfo(hero); - heroInfo.setOutIndex(h.order); - let attribute = getPlayerAttribute(hero.ceAttr, role.globalCeAttr); - heroInfo.setAttribute(attribute); - let enemy = new PvpEnemies(warJson, heroInfo, hs?hs.score: 0); - heroes.push(enemy); + let otherHeroes = new Array(); // 阵容外的所有武将信息 + for(let dbHero of dbHeroes) { + let h = defenseHeroes.find(cur => cur.actorId == dbHero.hid); // 阵容里是否有这个武将 + let hs = heroScores.find(cur => cur.hid == dbHero.hid); // 这个武将是否有这个得分 + if(!!h) { + let warJson = mapWarJson.find(cur => cur.dataId == h.dataId); + if(warJson && warJson.relation == 2) { + let heroInfo = new PvpHeroInfo(); + heroInfo.setHeroInfo(dbHero); + heroInfo.setOutIndex(h.order); + let attribute = getPlayerAttribute(dbHero.ceAttr, role.globalCeAttr); + heroInfo.setAttribute(attribute); + let enemy = new PvpEnemies(warJson, heroInfo, hs?hs.score: 0); + heroes.push(enemy); + } + } else { + let heroInfo = new PvpOtherHeroes(hs?hs.score: 0); + heroInfo.setHeroInfo(dbHero); + otherHeroes.push(heroInfo); } } + heroes.sort((a, b) => b.score - a.score); + otherHeroes.sort((a, b) => b.score - a.score); + let pvpHistoryOpp = await PvpHistoryOppModel.createPvpOpp({ - ...result, ...role, pos, rankLv, heroes, roleId, oppRoleId: makeRobotId(result.roleId) + ...pvpdefense, ...role, pos, rankLv, heroes, otherHeroes, roleId, oppRoleId: makeRobotId(pvpdefense.roleId) }); return pvpHistoryOpp; } @@ -248,9 +258,6 @@ async function matchRobot(oppPlayers: OppPlayers[], mapWarJson: DicWarJson[], ro heroInfo.setAttribute(attribute); let enemy = new PvpEnemies(warJson, heroInfo, 0); heroes.push(enemy); - } else { - let enemy = new PvpEnemies(warJson, new PvpHeroInfo(), 0); - heroes.push(enemy); } } diff --git a/shared/db/Hero.ts b/shared/db/Hero.ts index 13deccb4a..8f1fff7a3 100644 --- a/shared/db/Hero.ts +++ b/shared/db/Hero.ts @@ -144,8 +144,12 @@ export default class Hero extends BaseModel { @prop({ required: true, type: EPlace, default: getInitialEplace(), _id: false }) ePlace: EPlace[]; // 武将装备引用数组 - public static async findByRole(roleId: string, lean = true) { - const heros: HeroType[] = await HeroModel.find({ roleId }).lean(lean); + public static async findByRole(roleId: string, sort: { field: string, sortBy: number }[] = []) { + let sortParam = {}; + for(let {field, sortBy} of sort) { + sortParam[field] = sortBy; + } + const heros: HeroType[] = await HeroModel.find({ roleId }).sort(sortParam).lean(); return heros; } diff --git a/shared/db/PvpHistoryOpp.ts b/shared/db/PvpHistoryOpp.ts index 3b4b9c7cb..e3afb4712 100644 --- a/shared/db/PvpHistoryOpp.ts +++ b/shared/db/PvpHistoryOpp.ts @@ -1,7 +1,7 @@ import BaseModel from './BaseModel'; import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; -import { PvpEnemies } from './generalField'; +import { PvpEnemies, PvpHeroInfo, PvpOtherHeroes } from './generalField'; export class HeroScores { @prop({ required: true }) @@ -38,6 +38,8 @@ export default class PvpHistoryOpp extends BaseModel { rankLv: number; // 对手排名 @prop({ required: true, type: PvpEnemies, default: [] }) heroes: PvpEnemies[]; // 对手阵容 + @prop({ required: true, type: PvpOtherHeroes, default: [] }) + otherHeroes: PvpOtherHeroes[]; // 阵容以外所有武将信息 @prop({ required: true, default: 0 }) status: number; // 状态 0-仅刷出 1-挑战过 diff --git a/shared/db/generalField.ts b/shared/db/generalField.ts index cec5f67b5..29326bbcd 100644 --- a/shared/db/generalField.ts +++ b/shared/db/generalField.ts @@ -145,7 +145,7 @@ export class PvpHeroInfo { @prop({ required: false }) quality?: number = 0; // 品质 - @prop({ required: true, _id: false, default: new CeAttrNumber() }) + @prop({ required: true, _id: false }) attribute?: CeAttrNumber; // 属性 setHeroInfo(hero: HeroType) { @@ -243,4 +243,16 @@ export class PvpEnemies extends Enemies { this.lv = heroInfo.lv; this.score = score; } +} + +// 未显示在阵容中的其他武将 +export class PvpOtherHeroes extends PvpHeroInfo { + @prop({ required: true }) + score: number; + + // score: 这个武将的军功 + constructor(score: number) { + super(); + this.score = score; + } } \ No newline at end of file diff --git a/shared/pubUtils/interface.ts b/shared/pubUtils/interface.ts index a38a86c6e..3952042eb 100644 --- a/shared/pubUtils/interface.ts +++ b/shared/pubUtils/interface.ts @@ -1,7 +1,7 @@ // 一些通用的interface定义 import { reduceCe } from "./util"; -import { PvpEnemies } from "../db/generalField"; +import { PvpEnemies, PvpHeroInfo, PvpOtherHeroes } from "../db/generalField"; export interface RewardInter { id: number; @@ -128,7 +128,7 @@ export class PlayerDetailHero { quality: number; score: number; - setPvpHeroInfo?(hero: PvpEnemies) { + setPvpHeroInfo?(hero: PvpEnemies|PvpOtherHeroes) { this.actorId = hero.actorId; this.lv = hero.lv; this.star = hero.star;