From a274d936d260b8c7190a6f63004b7b26d5e259b0 Mon Sep 17 00:00:00 2001 From: luying Date: Fri, 15 Jan 2021 15:46:58 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix=20=E5=88=B7=E5=AF=B9=E6=89=8B=E6=97=B6?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E6=98=BE=E7=A4=BA=E5=AF=B9=E6=89=8B=E7=9A=84?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=AD=A6=E5=B0=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/servers/battle/handler/pvpHandler.ts | 12 +++-- game-server/app/services/pvpService.ts | 47 ++++++++++--------- shared/db/PvpHistoryOpp.ts | 4 +- shared/db/generalField.ts | 14 +++++- shared/pubUtils/interface.ts | 4 +- 5 files changed, 53 insertions(+), 28 deletions(-) diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index 17a91309a..d9ffe0cb9 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -385,11 +385,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 b5119ec7a..79c24d37c 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,36 @@ 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); 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); } } + 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 +256,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/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; From 9248286efd8ee48cc6c4bcb8dc29c5b1bdf555a7 Mon Sep 17 00:00:00 2001 From: luying Date: Fri, 15 Jan 2021 16:05:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=89=80=E6=9C=89=E6=AD=A6=E5=B0=86=E9=A1=B5=E9=9D=A2=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game-server/app/services/pvpService.ts | 4 +++- shared/db/Hero.ts | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/game-server/app/services/pvpService.ts b/game-server/app/services/pvpService.ts index 79c24d37c..c477378d7 100644 --- a/game-server/app/services/pvpService.ts +++ b/game-server/app/services/pvpService.ts @@ -199,7 +199,7 @@ async function generPlayerOppHis(pvpdefense: PvpDefenseType, mapWarJson: DicWarJ 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); + let dbHeroes = await HeroModel.findByRole(role.roleId, [{field: 'ce', sortBy: -1}]); let heroes = new Array(); let otherHeroes = new Array(); // 阵容外的所有武将信息 for(let dbHero of dbHeroes) { @@ -222,6 +222,8 @@ async function generPlayerOppHis(pvpdefense: PvpDefenseType, mapWarJson: DicWarJ otherHeroes.push(heroInfo); } } + heroes.sort((a, b) => b.score - a.score); + otherHeroes.sort((a, b) => b.score - a.score); let pvpHistoryOpp = await PvpHistoryOppModel.createPvpOpp({ ...pvpdefense, ...role, pos, rankLv, heroes, otherHeroes, roleId, oppRoleId: makeRobotId(pvpdefense.roleId) 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; }