diff --git a/game-server/app.ts b/game-server/app.ts index 4d506c8f9..e10273c2f 100644 --- a/game-server/app.ts +++ b/game-server/app.ts @@ -122,7 +122,9 @@ app.configure(ALL_ENVS, 'guild', function () { }) app.configure(ALL_ENVS, 'systimer', function () { - timeTaskService.init(); + app.afterStart(() => { + timeTaskService.init(); + }); }); diff --git a/game-server/app/servers/battle/handler/pvpHandler.ts b/game-server/app/servers/battle/handler/pvpHandler.ts index d7973f1e8..f9ac8a413 100644 --- a/game-server/app/servers/battle/handler/pvpHandler.ts +++ b/game-server/app/servers/battle/handler/pvpHandler.ts @@ -85,7 +85,7 @@ export class PvpHandler { let pvpSeasonResult = await PvpSeasonResultModel.getPvpSeasonResult(roleId); if (!!pvpSeasonResult && !!pvpSeasonResult.show) { result.setPvpSeasonResult(pvpSeasonResult); - await PvpSeasonResultModel.updatePvpSeasonResult(roleId, pvpSeasonResult.seasonNum, { show: false }); + await PvpSeasonResultModel.setShow(roleId); } // 拍卖 let r = new Rank(REDIS_KEY.PVP_RANK, { seasonNum }); @@ -340,7 +340,7 @@ export class PvpHandler { // 次数 let refOppObj = refreshRefOppCnt(pvpDefense); - if(refOppObj.setAttackCnt >= PVP.PVP_BUY_SET_ATTACK_CNT + refOppObj.buyAttackCnt) { + if(refOppObj.setAttackCnt >= PVP.PVP_SET_ATTACK_FREE_CNT + refOppObj.buyAttackCnt) { return resResult(STATUS.PVP_SET_ATTACK_CNT_NOT_ENOUGH); } refOppObj.setAttackCnt ++; diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index a266fd4a9..96de27e83 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -1,7 +1,7 @@ import { scheduleJob, Job, } from 'node-schedule'; import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig'; -import { nowSeconds, getTimeFun } from '../pubUtils/timeUtil'; +import { nowSeconds, getTimeFun, getSeconds } from '../pubUtils/timeUtil'; import { getTodayGuildActivity, gameData } from '../pubUtils/data'; import { pvpSeasonEnd } from './pvpService'; import { getAllOnlineRoles, getAllServers, delGuildActivityRank } from './redisService'; @@ -23,6 +23,7 @@ import { initMarquee, initMaintenance } from './gmService'; import moment = require('moment'); import { CounterModel } from '../db/Counter'; import { reportOneOnline } from './authenticateService'; +import { PVP } from '../pubUtils/dicParam'; const PER_SECOND = 1 * 1000; const PER_DAY = 24 * 60 * 60; @@ -71,7 +72,13 @@ export async function init() { } function getSeasonContinueDay(seasonNum: number) { - const pvpSeasonDuring = [{seasonNum: 1, day: 7},{seasonNum: 2, day: 15},{seasonNum: 3, day: 30},]; + const pvpSeasonDuring = PVP.PVP_SEASON_DAYS.split('|').map(cur => { + let arr = cur.split('&'); + let seasonNum = parseInt(arr[0]); + let day = parseInt(arr[1]); + if(isNaN(seasonNum) || isNaN(day)) return null; + return { seasonNum, day } + }).filter(cur => !!cur); let maxDay = 0; for(let {seasonNum: dicSeasonNum, day } of pvpSeasonDuring) { @@ -86,9 +93,12 @@ async function setPvpSeasonJob() { } async function setPvpSeason(isForce?: boolean, hour?: number) { - let during = hour? hour * PER_HOUR: null; + console.log(`******** setPvpSeason1: isForce-${isForce}, hour-${hour}`) + + let during = hour? hour * PER_HOUR: null; // 下一次重置赛季天数 let oldPvpConfig = await PVPConfigModel.findCurPVPConfig(); let pvpConfig = oldPvpConfig; + console.log(`******** setPvpSeason2: during-${during}, seasonEndTime-${pvpConfig?.seasonEndTime}, now-${nowSeconds()}`) if(!pvpConfig || pvpConfig.seasonEndTime <= nowSeconds() || isForce) { if(pvpConfig && !pvpConfig.hasSettleReward) { await pvpSeasonEnd(pvpConfig); @@ -96,13 +106,28 @@ async function setPvpSeason(isForce?: boolean, hour?: number) { let lastSeasonNum = pvpConfig? pvpConfig.seasonNum: 0; let lastSeasonEndTime = pvpConfig? pvpConfig.seasonEndTime: 0; + console.log(`******** setPvpSeason3: lastSeasonNum-${lastSeasonNum}, lastSeasonEndTime-${lastSeasonEndTime}`) - let newSeasonStartTime = lastSeasonEndTime; + let newSeasonStartTime = lastSeasonEndTime + PER_MINUTE; if(!during) during = getSeasonContinueDay(lastSeasonNum + 1) * PER_DAY; let rewardTime = SETTLE_DIFF_SECONDS; - if(nowSeconds() - lastSeasonEndTime > during) { + if(nowSeconds() - newSeasonStartTime > during) { newSeasonStartTime = getTimeFun().getDayZeroPoint(0); } + console.log(`******** setPvpSeason4: newSeasonStartTime-${newSeasonStartTime}, during-${during}`) + + if(isForce) { // debug使用,如果seasonEndTime是未来的,强行结束掉,新赛季从现在开始 + if(newSeasonStartTime > nowSeconds()) { + newSeasonStartTime = nowSeconds(); + } + } else { // 不是用debug的情况,如果(因为debug)newSeasonStartTime不是每天0点结算,那么改成lastSeasonEndTime之后的0点开始 + let d = new Date(newSeasonStartTime * 1000); + if(d.getHours() != 0) { + d.setHours(0, 0, 0, 0); + newSeasonStartTime = getSeconds(d); + } + } + console.log(`******** setPvpSeason5: isForce-${isForce}, newSeasonStartTime-${newSeasonStartTime}`) let newSeasonNum = await CounterModel.getNewCounter(COUNTER.PVP_SEASON_NUM); pvpConfig = await PVPConfigModel.createPVPConfig(newSeasonNum, newSeasonStartTime, newSeasonStartTime + during - rewardTime, newSeasonStartTime + during - PER_MINUTE); } @@ -125,6 +150,7 @@ async function setPvpSeasonMakeRewardJob(pvpConfig: PVPConfigType) { if (!!seasonMakeRewardTimJobId) { seasonMakeRewardTimJobId.cancel(); } + if(!pvpConfig) return; if(pvpConfig.seasonRewardTime < nowSeconds() && !pvpConfig.hasSettleReward) { // 未发奖励 await pvpSeasonEnd(pvpConfig); } else { @@ -147,7 +173,7 @@ async function setNextSeasonJob(pvpConfig: PVPConfigType) { * @param hour */ export async function resetPvpSeasonTime(hour: number) { - return await setPvpSeason(true); + return await setPvpSeason(true, hour); } export async function reportOnlineSchedule() { diff --git a/shared/db/PvpSeasonResult.ts b/shared/db/PvpSeasonResult.ts index 080b4dfec..d594371de 100644 --- a/shared/db/PvpSeasonResult.ts +++ b/shared/db/PvpSeasonResult.ts @@ -43,6 +43,12 @@ export default class PvpSeasonResult extends BaseModel { let result: PvpSeasonResultType = await PvpSeasonResultModel.findOneAndUpdate({roleId, seasonNum}, {$set: update}, {upsert: true, new: true}).lean(lean); return result; } + + public static async setShow(roleId: string) { + let result = await PvpSeasonResultModel.updateMany({ roleId, show: true }, { show: false }).lean(); + return result; + } + public static async getPvpSeasonResult(roleId: string) { let result: PvpSeasonResultType = await PvpSeasonResultModel.findOne({ roleId, show: true }).lean(); return result;