巅峰演武:赛季优化修改
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
|
||||
import { scheduleJob, Job, scheduledJobs, } from 'node-schedule';
|
||||
import { PVPConfigModel, PVPConfigType } from '../db/SystemConfig';
|
||||
import { PVPConfigModel, PVPConfigType } from '../db/PvpConfig';
|
||||
import { nowSeconds, getTimeFun, getSeconds } from '../pubUtils/timeUtil';
|
||||
import { getTodayGuildActivity, gameData } from '../pubUtils/data';
|
||||
import { pvpSeasonEnd } from './pvpService';
|
||||
@@ -46,6 +46,7 @@ const PER_SECOND = 1 * 1000;
|
||||
const PER_DAY = 24 * 60 * 60;
|
||||
const PER_HOUR = 1 * 60 * 60;
|
||||
const PER_MINUTE = 1 * 60;
|
||||
var seasonEndJob: Job;
|
||||
var seasonMakeRewardTimJobId: Job;
|
||||
var seasonRefreshTimeJobId: Job;
|
||||
let guildWeeklyJobId: Job;
|
||||
@@ -61,7 +62,7 @@ export async function init() {
|
||||
console.log('******* init systimer *******')
|
||||
|
||||
// pvp赛季
|
||||
await setPvpSeason(true);
|
||||
await setPvpSeasonSchedule();
|
||||
|
||||
// 周功勋结算任务
|
||||
guildWeeklyJobId = scheduleJob('settleGuildWeekly', '0 0 0 * * 1', settleGuildWeekly);
|
||||
@@ -115,111 +116,115 @@ export async function everydayRefresh() {
|
||||
|
||||
|
||||
// —————————————— PVP 及赛季相关 —————————————— //
|
||||
function getSeasonContinueDay(seasonNum: number) {
|
||||
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) {
|
||||
if(seasonNum == dicSeasonNum) return day;
|
||||
if(maxDay < day) maxDay = day;
|
||||
export async function setPvpSeasonSchedule(fromBackend = false) {
|
||||
let pvpConfig = await PVPConfigModel.setCurrentPvp();
|
||||
await setSeasonEndJob(pvpConfig);
|
||||
await setPvpSeasonMakeRewardJob(pvpConfig); // 发送奖励定时器
|
||||
await setNextSeasonJob(pvpConfig); // 赛季开始定时器
|
||||
if(fromBackend) {
|
||||
setPvpSeasonNumToRemote(pvpConfig);
|
||||
setPvpSettleSeasonNumToRemote();
|
||||
} else {
|
||||
setPvpSeasonNum(pvpConfig);
|
||||
setPvpSettleSeasonNum();
|
||||
}
|
||||
return maxDay;
|
||||
}
|
||||
|
||||
async function setPvpSeasonJob() {
|
||||
await setPvpSeason(false);
|
||||
}
|
||||
|
||||
async function setPvpSeason(isFirst: boolean, isForce?: boolean, minute?: number) {
|
||||
console.log(`******** setPvpSeason1: isForce-${isForce}, minute-${minute}`)
|
||||
|
||||
let during = minute? minute * PER_MINUTE: null; // 下一次重置赛季天数
|
||||
let oldPvpConfig = await PVPConfigModel.findCurPVPConfig();
|
||||
let pvpConfig = oldPvpConfig;
|
||||
console.log(`******** setPvpSeason2: during-${during}, seasonEndTime-${pvpConfig?.seasonEndTime}, now-${nowSeconds()}`)
|
||||
if(!pvpConfig || pvpConfig.seasonEndTime - PER_MINUTE <= nowSeconds() || isForce) {
|
||||
if(pvpConfig && !pvpConfig.hasSettleReward) {
|
||||
await pvpSeasonEnd(pvpConfig.seasonNum);
|
||||
}
|
||||
|
||||
let lastSeasonNum = pvpConfig? pvpConfig.seasonNum: 0;
|
||||
let lastSeasonEndTime = pvpConfig? pvpConfig.seasonEndTime: 0;
|
||||
console.log(`******** setPvpSeason3: lastSeasonNum-${lastSeasonNum}, lastSeasonEndTime-${lastSeasonEndTime}`)
|
||||
|
||||
let newSeasonStartTime = lastSeasonEndTime;
|
||||
if(!during) during = getSeasonContinueDay(lastSeasonNum + 1) * PER_DAY;
|
||||
let rewardTime = PVP.PVP_SEASON_REWARD_TIME_BEFORE * PER_MINUTE;
|
||||
if(nowSeconds() - newSeasonStartTime > during) {
|
||||
newSeasonStartTime = <number>getTimeFun().getDayZeroPoint(0);
|
||||
}
|
||||
console.log(`******** setPvpSeason4: newSeasonStartTime-${newSeasonStartTime}, during-${during}`)
|
||||
|
||||
if(isForce) { // debug使用,如果seasonEndTime是未来的,强行结束掉,新赛季从现在开始
|
||||
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);
|
||||
async function setSeasonEndJob(pvpConfig: PVPConfigType) {
|
||||
if (!!seasonEndJob) {
|
||||
seasonEndJob.cancel();
|
||||
}
|
||||
await setPvpSeasonMakeRewardJob(pvpConfig);
|
||||
await setNextSeasonJob(pvpConfig);
|
||||
setPvpSeasonNum(pvpConfig, isFirst);
|
||||
return pvpConfig;
|
||||
}
|
||||
|
||||
function setPvpSeasonNum(pvpConfig: PVPConfigType, isFirst = false) {
|
||||
if(pvpConfig) {
|
||||
pinus.app.set('pvpSeasonNum', pvpConfig.seasonNum);
|
||||
pinus.app.set('pvpSeasonEndTime', pvpConfig.seasonEndTime);
|
||||
if(!isFirst) {
|
||||
pinus.app.rpc.battle.battleRemote.setPvpSeasonNum.broadcast(pvpConfig);
|
||||
pinus.app.rpc.role.roleRemote.setPvpSeasonNum.broadcast(pvpConfig);
|
||||
pinus.app.rpc.connector.connectorRemote.setPvpSeasonNum.broadcast(pvpConfig);
|
||||
}
|
||||
if(!pvpConfig || pvpConfig.seasonEndTime < nowSeconds()) {
|
||||
pvpConfig = await PVPConfigModel.findPVPConfig(pvpConfig? pvpConfig.seasonNum + 1: 1);
|
||||
if(!pvpConfig) return;
|
||||
}
|
||||
console.log('####### setSeasonEndJob', JSON.stringify(pvpConfig))
|
||||
|
||||
seasonEndJob = scheduleJob('seasonEndJob', pvpConfig.seasonEndTime * 1000, async () => {
|
||||
console.log('************ setSeasonEndJob *********');
|
||||
setPvpSeasonNumToRemote(pvpConfig);
|
||||
let nextPvpConfig = await PVPConfigModel.findPVPConfig(pvpConfig.seasonNum + 1);
|
||||
await setSeasonEndJob(nextPvpConfig);
|
||||
});
|
||||
}
|
||||
|
||||
async function setPvpSeasonMakeRewardJob(pvpConfig: PVPConfigType) {
|
||||
if (!!seasonMakeRewardTimJobId) {
|
||||
seasonMakeRewardTimJobId.cancel();
|
||||
}
|
||||
if(!pvpConfig) return;
|
||||
if(pvpConfig.seasonRewardTime < nowSeconds() && !pvpConfig.hasSettleReward) { // 未发奖励
|
||||
await pvpSeasonEnd(pvpConfig.seasonNum);
|
||||
} else {
|
||||
seasonMakeRewardTimJobId = scheduleJob('seasonMakeRewardTimJobId', pvpConfig.seasonRewardTime * 1000, async () => {
|
||||
console.log('************ seasonMakeRewardTimJobId *********');
|
||||
await pvpSeasonEnd(pvpConfig.seasonNum);
|
||||
});
|
||||
if(!pvpConfig || pvpConfig.seasonRewardTime - 60 < nowSeconds()) {
|
||||
pvpConfig = await PVPConfigModel.findPVPConfig(pvpConfig? pvpConfig.seasonNum + 1: 1);
|
||||
if(!pvpConfig) return;
|
||||
}
|
||||
console.log('####### setPvpSeasonMakeRewardJob', JSON.stringify(pvpConfig))
|
||||
seasonMakeRewardTimJobId = scheduleJob('seasonMakeRewardTimJobId', pvpConfig.seasonRewardTime * 1000 - 60 * 1000, async () => {
|
||||
console.log('************ seasonMakeRewardTimJobId *********');
|
||||
await pvpSeasonEnd(pvpConfig.seasonNum);
|
||||
let nextPvpConfig = await PVPConfigModel.findPVPConfig(pvpConfig.seasonNum + 1);
|
||||
await setPvpSeasonMakeRewardJob(nextPvpConfig);
|
||||
});
|
||||
}
|
||||
|
||||
async function setNextSeasonJob(pvpConfig: PVPConfigType) {
|
||||
if (!!seasonRefreshTimeJobId) {
|
||||
seasonRefreshTimeJobId.cancel();
|
||||
}
|
||||
//定时开启新赛季,比seasonEndTime多定一分钟,保证定时器时间没错
|
||||
seasonRefreshTimeJobId = scheduleJob('seasonRefreshTimeJobId', (pvpConfig.seasonEndTime) * 1000, setPvpSeasonJob);
|
||||
if(!pvpConfig || pvpConfig.seasonStartTime < nowSeconds()) {
|
||||
pvpConfig = await PVPConfigModel.findPVPConfig(pvpConfig? pvpConfig.seasonNum + 1: 1);
|
||||
if(!pvpConfig) return;
|
||||
}
|
||||
console.log('####### setNextSeasonJob', JSON.stringify(pvpConfig))
|
||||
|
||||
seasonRefreshTimeJobId = scheduleJob('seasonRefreshTimeJobId', pvpConfig.seasonStartTime * 1000, async () => {
|
||||
console.log('************ setNextSeasonJob *********');
|
||||
setPvpSeasonNumToRemote(pvpConfig);
|
||||
await PVPConfigModel.setNextPvp(pvpConfig.seasonNum);
|
||||
let nextPvpConfig = await PVPConfigModel.findPVPConfig(pvpConfig.seasonNum + 1);
|
||||
await setNextSeasonJob(nextPvpConfig);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* debug接口
|
||||
* @param hour
|
||||
*/
|
||||
export async function resetPvpSeasonTime(minute: number) {
|
||||
return await setPvpSeason(false, true, minute);
|
||||
export async function setPvpSeasonNumToRemote(pvpConfig: PVPConfigType) {
|
||||
await setPvpSeasonNum(pvpConfig);
|
||||
await pinus.app.rpc.battle.battleRemote.setPvpSeasonNum.broadcast(pvpConfig);
|
||||
await pinus.app.rpc.role.roleRemote.setPvpSeasonNum.broadcast(pvpConfig);
|
||||
await pinus.app.rpc.connector.connectorRemote.setPvpSeasonNum.broadcast(pvpConfig);
|
||||
}
|
||||
|
||||
export async function setPvpSeasonNum(pvpConfig?: PVPConfigType) {
|
||||
if(!pvpConfig) {
|
||||
pvpConfig = await PVPConfigModel.findCurPVPConfig();
|
||||
if(!pvpConfig) return;
|
||||
}
|
||||
|
||||
let now = nowSeconds();
|
||||
pinus.app.set('pvpSeasonNum', pvpConfig.seasonNum);
|
||||
pinus.app.set('pvpSeasonStartTime', pvpConfig.seasonStartTime);
|
||||
pinus.app.set('pvpSeasonEndTime', pvpConfig.seasonEndTime);
|
||||
pinus.app.set('pvpSeasonRewardTime', pvpConfig.seasonRewardTime);
|
||||
if(pvpConfig.seasonEndTime <= now) { // 赛季结束,需要显示下一赛季的倒计时
|
||||
let nextPvpConfig = await PVPConfigModel.findPVPConfig(pvpConfig.seasonNum + 1);
|
||||
if(nextPvpConfig) {
|
||||
pinus.app.set('pvpSeasonStartTime', nextPvpConfig.seasonStartTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export async function setPvpSettleSeasonNumToRemote(settledPvpConfig?: PVPConfigType) {
|
||||
setPvpSettleSeasonNum(settledPvpConfig);
|
||||
await pinus.app.rpc.battle.battleRemote.setPvpSettleSeasonNum.broadcast(settledPvpConfig);
|
||||
await pinus.app.rpc.role.roleRemote.setPvpSettleSeasonNum.broadcast(settledPvpConfig);
|
||||
await pinus.app.rpc.connector.connectorRemote.setPvpSettleSeasonNum.broadcast(settledPvpConfig);
|
||||
}
|
||||
|
||||
export async function setPvpSettleSeasonNum(settledPvpConfig?: PVPConfigType) {
|
||||
if(!settledPvpConfig) {
|
||||
settledPvpConfig = await PVPConfigModel.getSettledConfig();
|
||||
if(!settledPvpConfig) return;
|
||||
}
|
||||
pinus.app.set('pvpSettleSeasonNum', settledPvpConfig.seasonNum);
|
||||
}
|
||||
|
||||
export async function reportOnlineSchedule() {
|
||||
|
||||
Reference in New Issue
Block a user