diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index 2e2d96a3e..07eb68b5b 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -1,7 +1,7 @@ import {Application, BackendSession} from 'pinus'; const _ = require('underscore'); import { gameData } from '../../../pubUtils/data'; -import { checkPvp, initPvpInfo, refreshEnemies, getEnemies, getPlusScore, getLvByScore, } from '../../../services/pvpService'; +import { checkPvp, initPvpInfo, refreshEnemies, getEnemies, getPlusScore, getLvByScore, defaultHeroes} from '../../../services/pvpService'; import { RoleModel, RoleType } from '../../../db/Role'; import { STATUS } from '../../../consts/statusCode'; import { resResult, reduceCe, genCode } from '../../../pubUtils/util'; @@ -9,10 +9,12 @@ import { SystemConfigModel } from '../../../db/SystemConfig' import { PvpDefenseModel, PvpDefenseType, OppPlayers } from '../../../db/PvpDefense'; import { oppHeroesDefenseInter, pvpEndParamInter } from '../../../pubUtils/interface'; -import { HeroType } from '../../../db/Hero'; import { CeAttrNumber } from '../../../db/generalField'; import { checkBattleHeroesByHid } from '../../../services/normalBattleService'; import { BattleRecordModel } from '../../../db/BattleRecord'; +import { HeroModel, HeroType } from '../../../db/Hero'; +import { PVP_HERO_POS, ROBOT_NAME } from '../../../consts'; + export default function(app: Application) { return new PvpHandler(app); } @@ -242,4 +244,50 @@ export class PvpHandler { oppPlayers: result }); } + + async saveDefense(msg: { heroes: Array<{actorId: number, dataId: number, order: number}>, isDefaultHero:boolean }, session: BackendSession) { + let {heroes, isDefaultHero} = msg; + let roleId = session.get('roleId'); + if (heroes.length > 5) { + return resResult(STATUS.WRONG_PARMS); + } + heroes = _.uniq(heroes, function(item) { + return item.order; + }); + let { heroes: defHeros } = await PvpDefenseModel.findByRoleId(roleId); + let defCe = 0; + if (!!isDefaultHero) { + let role = await RoleModel.findByRoleId(roleId); + let { resHeroes } = await defaultHeroes(role); + return resResult(STATUS.SUCCESS, { data: { heroes: resHeroes } }); + } else { + for (let dataId = PVP_HERO_POS.START; dataId <= PVP_HERO_POS.END; dataId++) { + let index = _.findIndex(heroes, {dataId}); + let defIndex = _.findIndex(defHeros, {dataId}); + if (defIndex == -1) { + defIndex = defHeros.length; + defHeros.push({actorId:0, order:0,ce:0, hero:null,dataId}); + } + if (index == -1) { + defHeros[defIndex].actorId = 0; + defHeros[defIndex].order = 0; + defHeros[defIndex].ce = 0; + defHeros[defIndex].hero = null; + defHeros[defIndex].dataId = dataId; + continue; + } + let hero = await HeroModel.findByHidAndRole(heroes[index].actorId, roleId); + if (!hero) { + continue; + } + defHeros[defIndex].actorId = heroes[index].actorId; + defHeros[defIndex].order = heroes[index].order; + defHeros[defIndex].ce = hero.ce; + defHeros[defIndex].hero = hero._id; + defCe += hero.ce; + } + let { heroes: resHeroes } = await PvpDefenseModel.updateInfo(roleId, {defCe, heroes: defHeros}); + return resResult(STATUS.SUCCESS, { data: { heroes: resHeroes } }); + } + } } diff --git a/game-server/app/services/playerCeService.ts b/game-server/app/services/playerCeService.ts index 741378fad..ae56c3aa1 100644 --- a/game-server/app/services/playerCeService.ts +++ b/game-server/app/services/playerCeService.ts @@ -9,7 +9,7 @@ import { resResult, reduceCe } from '../pubUtils/util'; import { calPlayerCeAndSave as pubCalPlayerCeAndSave, reCalAllHeroCe } from '../pubUtils/playerCe'; import { HeroType } from '../db/Hero'; const _ = require('underscore'); - +import { defaultHeroes } from './pvpService'; //修改并下发战力 export async function calPlayerCeAndSave(sid: string, roleId: string, heros: Array, type?: number, args?: Array) { @@ -17,6 +17,7 @@ export async function calPlayerCeAndSave(sid: string, roleId: string, heros: Arr //下发战力 let uids = [{ uid: roleId, sid }]; pinus.app.get('channelService').pushMessageByUids('onPlayerCeUpdate', resResult(STATUS.SUCCESS, { ce: reduceCe(role.ce) , heros: pushHeros, topFiveCe: reduceCe(topFiveCe) }), uids); + defaultHeroes(role); return heros; } diff --git a/game-server/app/services/pvpService.ts b/game-server/app/services/pvpService.ts index d15383bc2..63e3e760a 100644 --- a/game-server/app/services/pvpService.ts +++ b/game-server/app/services/pvpService.ts @@ -10,21 +10,22 @@ import { getRandomIndexByLen, genCode, getRandomByLen } from '../pubUtils/util'; import { oppPlayersInter } from '../pubUtils/interface'; import { gameData, getPLvByScore } from "../pubUtils/data"; import { PVP } from '../pubUtils/dicParam'; +const _ = require('underscore'); + export async function initPvpInfo(role: RoleType) { let heroes: Array = []; //初始化最强5人阵容 - for (let i = 0; i < role.topFive.length; i++) { - let item = role.topFive[i]; - if (item.hid) { - heroes.push({ - actorId: item.hid, - hero: item.hero, - ce: item.ce, - dataId: PVP_HERO_POS.START + i, - order: i + 1, - }); - } + for (let i = PVP_HERO_POS.START; i <= PVP_HERO_POS.END; i++) { + let index = i - PVP_HERO_POS.START; + let item = role.topFive[index]; + heroes.push({ + actorId: item?.hid||0, + hero: item?.hero||null, + ce: item?.ce||0, + dataId: i, + order: index + 1, + }); } //初始化对手人阵容 let oppPlayers: Array = await refreshEnemies(role, 0, 1); @@ -170,4 +171,37 @@ export function getLvByScore(heroScores: HeroScores[]) { score += heroScores[i].score; } return getPLvByScore(score); +} + +export async function defaultHeroes ( role:RoleType) { + let { heroes } = await PvpDefenseModel.findByRoleId(role.roleId); + heroes.sort(function(a, b) { + return a.ce + a.dataId - b.ce + b.dataId; + }); + role.topFive.sort(function(a, b) { + return a.ce - b.ce; + }); + let defCe = 0; + for (let i = 1; i < role.topFive.length; i++) { + let item = role.topFive[i]; + if (!_.findWhere(heroes, {actorId: item.hid})) { + for (let j = 0; j < heroes.length; j++) { + let hero = heroes[j]; + if (heroes.length >= 5 && !hero.actorId) { + continue; + } + let index = _.findIndex(role.topFive,{hid: hero.actorId}); + if (index == -1) { + hero.actorId = item.hid; + hero.hero = item.hero||''; + hero.ce = item.ce||0; + } else { + heroes[index].ce = item.ce||0; + } + } + } + defCe += item.ce; + } + let { heroes: resHeroes} = await PvpDefenseModel.updateInfo(role.roleId, {defCe, heroes}); + return { resHeroes}; } \ No newline at end of file diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index adbfad60a..80905c2ac 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -2,7 +2,7 @@ * 体力系统 */ -import { scheduleJob } from 'pinus-scheduler'; +import { scheduleJob } from 'node-schedule'; import { SystemConfigModel } from '../db/SystemConfig'; import PvpDefenseType,{ PvpDefenseModel } from '../db/PvpDefense'; import { PVP } from '../pubUtils/dicParam'; @@ -21,23 +21,23 @@ export async function init() { let warIds = getPvpGkWarIds(); let warId = warIds[0];//TODO随机地图 seasonEndTime = PVP.PVP_SEASON_DAYS * PER_DAY + getTodayZeroPoint(); - await SystemConfigModel.createSystemConfig( seasonEndTime, warId ); + systemConfig = await SystemConfigModel.createSystemConfig( seasonEndTime, warId ); } else { seasonEndTime = systemConfig.seasonEndTime; if (systemConfig.seasonEndTime - SETTLE_DIFF <= nowSeconds()) { - await setPvpSeasonResult(); + await setPvpSeasonResult({name: 'simpleJobExample' + systemConfig.seasonNum}); seasonEndTime = PVP.PVP_SEASON_DAYS * PER_DAY + getTodayZeroPoint(); systemConfig.seasonNum++; await SystemConfigModel.updateSystemConfig({ seasonEndTime, seasonNum: systemConfig.seasonNum}); } } - let settleTime = seasonEndTime - SETTLE_DIFF - nowSeconds(); - // setTimeout(setPvpSeasonResult, settleTime * PER_SECOND); + let settleTime = (seasonEndTime - SETTLE_DIFF)* PER_SECOND; + scheduleJob(settleTime, setPvpSeasonResult) scheduleJob("0 0 0 * * 1", resetPvpWarId) } -export async function setPvpSeasonResult() { - console.log('setPvpSeasonResult'); +export async function setPvpSeasonResult(obj:{ name:string }) { + console.log('exce setPvpSeasonResult'+ obj.name); let pvpDefenses = await PvpDefenseModel.getPvpDef(LIMIT_NUM); for (let pvpDefense of pvpDefenses) { await setPvpDefResult(pvpDefense); @@ -47,7 +47,6 @@ export async function setPvpSeasonResult() { async function setPvpDefResult(pvpDefense: PvpDefenseType) { await PvpDefenseModel.updateInfo(pvpDefense.roleId, {score:100, pLv: 1}); - } export async function resetPvpWarId() { @@ -65,7 +64,7 @@ export async function resetPvpWarId() { async function setNextPvpTime() { let seasonEndTime = PVP.PVP_SEASON_DAYS * PER_DAY + getTodayZeroPoint(); - await SystemConfigModel.updateSeason(seasonEndTime); - let settleTime = seasonEndTime - SETTLE_DIFF - nowSeconds(); - setTimeout(setPvpSeasonResult, settleTime * PER_SECOND); + let systemConfig = await SystemConfigModel.updateSeason(seasonEndTime); + let settleTime = (seasonEndTime - SETTLE_DIFF)* PER_SECOND; + scheduleJob(settleTime, setPvpSeasonResult); } diff --git a/shared/db/PvpDefense.ts b/shared/db/PvpDefense.ts index f0b7e618d..4adf1617f 100644 --- a/shared/db/PvpDefense.ts +++ b/shared/db/PvpDefense.ts @@ -12,6 +12,8 @@ interface pvpUpdateInter { pLv?:number; heroScores?: HeroScores[]; winStreakNum?: number; + defCe?:number; + heroes?: Array; } export class Heroes { @@ -167,7 +169,7 @@ export default class PvpDefense extends BaseModel { } - public static async updateCe(roleId: string, hid: number, defCe: number, lean = true) { + public static async updateCe(roleId: string, hid: number, defCe: number, lean = true) { const rec: PvpDefenseType = await PvpDefenseModel.findOneAndUpdate({ roleId, 'heroes.actorId': hid }, { $set: { defCe } }).lean(lean); return rec } diff --git a/shared/db/SystemConfig.ts b/shared/db/SystemConfig.ts index dc2cd33ff..2ea777111 100644 --- a/shared/db/SystemConfig.ts +++ b/shared/db/SystemConfig.ts @@ -17,7 +17,7 @@ export default class SystemConfig extends BaseModel { } public static async createSystemConfig(seasonEndTime: number, warId: number, lean = true) { - const result: SystemConfigType = await SystemConfigModel.findOneAndUpdate({ id: 1}, { seasonEndTime, warId }, { upsert: true, new: true }).lean(lean); + const result: SystemConfigType = await SystemConfigModel.findOneAndUpdate({ id: 1}, { seasonEndTime, warId, seasonNum: 1 }, { upsert: true, new: true }).lean(lean); return result; } @@ -27,7 +27,7 @@ export default class SystemConfig extends BaseModel { } public static async updateSeason( seasonEndTime: number, lean = true) { - const result: SystemConfigType = await SystemConfigModel.findOneAndUpdate({ id: 1}, { $seasonEndTime: seasonEndTime, $inc: { seasonNum:1 } }, { upsert: true, new: true }).lean(lean); + const result: SystemConfigType = await SystemConfigModel.findOneAndUpdate({ id: 1}, { seasonEndTime, $inc: { seasonNum: 1 } }, { upsert: true, new: true }).lean(lean); return result; } } diff --git a/shared/pubUtils/playerCe.ts b/shared/pubUtils/playerCe.ts index c168e7229..a2ca8ebde 100644 --- a/shared/pubUtils/playerCe.ts +++ b/shared/pubUtils/playerCe.ts @@ -16,7 +16,7 @@ import { DicRandomEffectPool } from './dictionary/DicRandomEffectPool'; import { getGoodById } from './gamedata'; import { SchoolModel } from '../db/School'; import { getTeraphAttr, HEROTARIN } from '../consts/constModules/abilityConst' -import { PvpDefenseModel } from '../db/PvpDefense'; +// import { PvpDefenseModel } from '../db/PvpDefense'; const HERO_CE_RATIO = 100; const _ = require('underscore'); //战力计算TODO @@ -108,7 +108,7 @@ export async function calPlayerCeAndSave(roleId: string, heros: Array, incPlayerCe += incHeroCe; await calculateTopFive(role, hero.hid, hero.ce, hero._id); // 计算更新最强五人战力 await HeroModel.updateHeroInfo(roleId, hero.hid, hero); - await PvpDefenseModel.updateCe(roleId, hero.hid, hero.ce); // 更新pvp防守阵最强五人战力 + //await PvpDefenseModel.updateCe(roleId, hero.hid, hero.ce); // 更新pvp防守阵最强五人战力 pushHeros.push({ hid: hero.hid, ce: reduceCe(hero.ce), @@ -152,7 +152,6 @@ async function calculateTopFive(role: RoleType, hid: number, ce: number, heroId: role.topFive = topFive; role.topFiveCe = topFiveCe; - return role; } diff --git a/shared/pubUtils/util.ts b/shared/pubUtils/util.ts index 4d5033430..89df11473 100644 --- a/shared/pubUtils/util.ts +++ b/shared/pubUtils/util.ts @@ -496,7 +496,7 @@ export function reduceCe(ce: number = 0) { } export function getRandNum(min, max) { - let randNum = min + Math.floor(Math.random()*(max - min + 1)); + let randNum = min + Math.floor(Math.random() * (max - min + 1)); return randNum; } @@ -516,10 +516,10 @@ export function getRandomArr(allarr, ranNum) { // 获取全部属性 -export function getAllAttrStage () { +export function getAllAttrStage() { let attrs = new Array(); // 有升级的属性 1-hp 2-atk 3-def 4-mdef 5-agi 6-luk - for(let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) { - attrs.push(stage) + for (let stage = ABI_STAGE.START + 1; stage <= ABI_STAGE.END; stage++) { + attrs.push(stage) }; return attrs; -} \ No newline at end of file +}