diff --git a/game-server/app/servers/guild/handler/cityActivityHandler.ts b/game-server/app/servers/guild/handler/cityActivityHandler.ts index a876baddf..8afdc7b76 100644 --- a/game-server/app/servers/guild/handler/cityActivityHandler.ts +++ b/game-server/app/servers/guild/handler/cityActivityHandler.ts @@ -1,5 +1,5 @@ import { Application, ChannelService, BackendSession, pinus, HandlerService, } from "pinus"; -import { GUILD_ACTIVITY_TYPE, STATUS, REDIS_KEY, GUILD_POINT_WAYS, CITY_STATUS, TASK_TYPE, ITEM_CHANGE_REASON, PUSH_ROUTE } from "../../../consts"; +import { GUILD_ACTIVITY_TYPE, STATUS, REDIS_KEY, GUILD_POINT_WAYS, CITY_STATUS, TASK_TYPE, ITEM_CHANGE_REASON, PUSH_ROUTE, GUILD_ACTIVITY_STATUS } from "../../../consts"; import { resResult } from "../../../pubUtils/util"; import { getGuildActivityStatus, getCityActivityObj, getCityStatus as pubGetCityStatus, getCities, getCityActivityRank, sendSingleCityActEndMsg, getPreDayActiveData, sendGuildCityDeclare } from "../../../services/guildActivity/guildActivityService"; import { GuildActivityCityModel } from "../../../db/GuildActivityCity"; @@ -247,7 +247,6 @@ export class CityActivityHandler { let { cityId, code, damage, hid, round } = msg; if (damage == undefined || damage < 0) return resResult(STATUS.WRONG_PARMS); - const dicCity = gameData.cityActivity.get(cityId); let obj = getCityActivityObj(); let { gateHp, maxHp } = await obj.getGateHpAndInc(serverId, cityId); if (gateHp <= 0) return resResult(STATUS.GATE_HP_IS_ZERO); @@ -255,6 +254,12 @@ export class CityActivityHandler { let statusResult = getGuildActivityStatus(this.aid); if (!statusResult) return resResult(STATUS.DIC_DATA_NOT_FOUND); if(!statusResult.isOpen) return resResult(STATUS.GUILD_ACTIVITY_NOT_OPEN); + if(statusResult.status != GUILD_ACTIVITY_STATUS.START) { + return resResult(STATUS.SUCCESS, { + code, + ...statusResult + }) + } let pushResult = await UserGuildActivityRecModel.pushCityRecord(code, { round, hid, damage }); if (!pushResult) return resResult(STATUS.WRONG_PARMS); @@ -262,11 +267,11 @@ export class CityActivityHandler { let tomorrow = getTimeFun().getAfterDayWithHour(); // 更新redis数据 let myR = new Rank(REDIS_KEY.USER_CITY_ACTIVITY, { serverId, guildCode }, true); - let myScore = await myR.setRankWithRoleInfo(roleId, damage, Date.now(), null, true); + let myScore = await myR.setRankWithRoleInfo(roleId, damage, obj.getTimeGap(), null, true); await myR.setExpire(tomorrow); let r = new Rank(REDIS_KEY.CITY_ACTIVITY, { serverId, cityId }, true); - let guildScore = await r.setRankWithGuildInfo(guildCode, damage, Date.now(), null, true); + let guildScore = await r.setRankWithGuildInfo(guildCode, damage, obj.getTimeGap(), null, true); await r.setExpire(tomorrow); ({gateHp, maxHp} = await obj.getGateHpAndInc(serverId, cityId, -1 * damage)); diff --git a/game-server/app/servers/guild/handler/gateActivityHandler.ts b/game-server/app/servers/guild/handler/gateActivityHandler.ts index 7b32922fb..c4bedcd3f 100644 --- a/game-server/app/servers/guild/handler/gateActivityHandler.ts +++ b/game-server/app/servers/guild/handler/gateActivityHandler.ts @@ -131,11 +131,11 @@ export class GateActivityHandler { let tomorrow = getTimeFun().getAfterDayWithHour(); // 更新redis数据 let myR = new Rank(REDIS_KEY.USER_GATE_ACTIVITY, { serverId, guildCode }, true); - let myScore = await myR.setRankWithRoleInfo(roleId, score, Date.now(), null, true); + let myScore = await myR.setRankWithRoleInfo(roleId, score, obj.getTimeGap(), null, true); await myR.setExpire(tomorrow); let r = new Rank(REDIS_KEY.GATE_ACTIVITY, { serverId }, true); - let guildScore = await r.setRankWithGuildInfo(guildCode, score, Date.now(), null, true); + let guildScore = await r.setRankWithGuildInfo(guildCode, score, obj.getTimeGap(), null, true); await r.setExpire(tomorrow); // 更新数据库 diff --git a/game-server/app/servers/guild/remote/guildActivityRemote.ts b/game-server/app/servers/guild/remote/guildActivityRemote.ts index 7d5bee28c..12c85b9ac 100644 --- a/game-server/app/servers/guild/remote/guildActivityRemote.ts +++ b/game-server/app/servers/guild/remote/guildActivityRemote.ts @@ -1,9 +1,10 @@ import { Application, ChannelService, HandlerService, } from 'pinus'; -import { sendAllGuildRanks, calWoodenHorseAndSend, sendRaceStartMsg, setDicGuildActivity, setDicAuctionTime, settleGuildActivityReward } from '../../../services/guildActivity/guildActivityService'; +import { sendAllGuildRanks, calWoodenHorseAndSend, sendRaceStartMsg, setDicGuildActivity, setDicAuctionTime, settleGuildActivityReward, gateActivityStart, cityActivityStart } from '../../../services/guildActivity/guildActivityService'; import { gameData } from '../../../pubUtils/data'; import { setWeek } from '../../../pubUtils/timeUtil'; import { sendUngotDividend } from '../../../services/auctionService'; import { errlogger } from '../../../util/logger'; +import { GUILD_ACTIVITY_TYPE } from '../../../consts'; export default function (app: Application) { new HandlerService(app, {}); @@ -57,6 +58,21 @@ export class GuildActivityRemote { } } + /** + * 诸侯混战和蛮夷入侵开始 + */ + async gateAndCityActivityStart(aid: number) { + try { + if(aid == GUILD_ACTIVITY_TYPE.GATE_ACTIVITY) { + await gateActivityStart(); + } else if (aid == GUILD_ACTIVITY_TYPE.CITY_ACTIVITY) { + await cityActivityStart(); + } + } catch(e) { + errlogger.error(`remote ${__filename} \n ${e.stack}`); + } + } + /** * 发送粮草先行活动开始通知 */ diff --git a/game-server/app/services/guildActivity/cityActivityObj.ts b/game-server/app/services/guildActivity/cityActivityObj.ts index b71d5c6dc..8778805ea 100644 --- a/game-server/app/services/guildActivity/cityActivityObj.ts +++ b/game-server/app/services/guildActivity/cityActivityObj.ts @@ -12,6 +12,7 @@ export class CityActivityObject { private guilds: Map = new Map(); // 军团所在的城池 guildCode => cityId private historyCity: Map = new Map(); // 获取自己打开过的城池的页面 roleId => cityId private sentCity: string[] = []; + private startTime: number = 0; private getKey(serverId: number, cityId: number) { return `${serverId}_${cityId}`; @@ -36,6 +37,14 @@ export class CityActivityObject { } } + public startActivity() { + this.startTime = Date.now(); + } + + public getTimeGap() { + return Date.now() - this.startTime; + } + public hasSent(serverId: number, cityId: number) { let key = this.getKey(serverId, cityId); return this.sentCity.indexOf(key) != -1; diff --git a/game-server/app/services/guildActivity/gateActivityObj.ts b/game-server/app/services/guildActivity/gateActivityObj.ts index a4e601bce..b07d76dcc 100644 --- a/game-server/app/services/guildActivity/gateActivityObj.ts +++ b/game-server/app/services/guildActivity/gateActivityObj.ts @@ -2,9 +2,9 @@ // 军团活动蛮夷入侵城门血量等数据存储 import { Member, GateMembersRec } from "../../domain/battleField/guildActivity"; -import { GUILDACTIVITY } from "../../pubUtils/dicParam"; export class GateActivityObject { + public startTime: number; private members: Map> = new Map(); // 每个军团参与的成员 guildCode => [{roleId, job}] private membersRecord: Map = new Map(); // 每个成员的回合数和敌军数,防刷 recCode => GateMembersRec private guilds: Map = new Map(); // 参加的所有军团 server => [guildCode] @@ -18,6 +18,14 @@ export class GateActivityObject { } } + public startActivity() { + this.startTime = Date.now(); + } + + public getTimeGap() { + return Date.now() - this.startTime; + } + public getGuilds() { return this.guilds; } diff --git a/game-server/app/services/guildActivity/guildActivityService.ts b/game-server/app/services/guildActivity/guildActivityService.ts index 767a52ae7..83a56e963 100644 --- a/game-server/app/services/guildActivity/guildActivityService.ts +++ b/game-server/app/services/guildActivity/guildActivityService.ts @@ -660,6 +660,15 @@ export async function sendRaceStartMsg(serverId: number) { await calWoodenHorseAndSend(serverId); } +export async function cityActivityStart() { + let obj = getCityActivityObj(); + obj.startActivity(); +} + +export async function gateActivityStart() { + let obj = getGateActivityObj(); + obj.startActivity(); +} /** * 结算粮草先行奖励 diff --git a/game-server/app/services/rankService.ts b/game-server/app/services/rankService.ts index 6b2300dcf..c126ef928 100644 --- a/game-server/app/services/rankService.ts +++ b/game-server/app/services/rankService.ts @@ -67,6 +67,13 @@ export class Rank { new ValueConfig(false, 'durability', 3, false, false), ]; break; + case REDIS_KEY.GATE_ACTIVITY: + case REDIS_KEY.CITY_ACTIVITY: + this.valueConfig = [ + new ValueConfig(true, 'score', 0, false, false), + new ValueConfig(false, 'time', 4, true, false), + ]; + break; case REDIS_KEY.GUILD_LV_RANK: this.valueConfig = [ new ValueConfig(true, 'lv', 0, false, false), diff --git a/game-server/app/services/timeTaskService.ts b/game-server/app/services/timeTaskService.ts index 55abd304d..8ab6b95eb 100644 --- a/game-server/app/services/timeTaskService.ts +++ b/game-server/app/services/timeTaskService.ts @@ -257,10 +257,12 @@ export async function guildActivityStart(dicGuildActivity?: DicGuildActivity) { guildActEndJobId = undefined; } if (dicGuildActivity.id == GUILD_ACTIVITY_TYPE.GATE_ACTIVITY) { + await pinus.app.rpc.guild.guildActivityRemote.gateAndCityActivityStart.broadcast(dicGuildActivity.id); guildActSecondsJobId = scheduleJob('guildActivitySeconds', '*/10 * * * * *', gateActivitySeconds); // 结束时间 guildActEndJobId = scheduleJob('guildActivityEnd', Date.now() + dicGuildActivity.duringTime * 1000, gateActivityEnd); } else if (dicGuildActivity.id == GUILD_ACTIVITY_TYPE.CITY_ACTIVITY) { + await pinus.app.rpc.guild.guildActivityRemote.gateAndCityActivityStart.broadcast(dicGuildActivity.id); guildActSecondsJobId = scheduleJob('guildActivitySeconds', '*/10 * * * * *', cityActivitySeconds); // 结束时间 guildActEndJobId = scheduleJob('guildActivityEnd', Date.now() + dicGuildActivity.duringTime * 1000, cityActivityEnd);