diff --git a/game-server/app/servers/guild/handler/gvgBattleHandler.ts b/game-server/app/servers/guild/handler/gvgBattleHandler.ts index 90c63233a..669082980 100644 --- a/game-server/app/servers/guild/handler/gvgBattleHandler.ts +++ b/game-server/app/servers/guild/handler/gvgBattleHandler.ts @@ -669,7 +669,7 @@ export class GVGBattleHandler { async debugStartSchedule() { let { countdownTime } = getGVGPeriodData(); - pinus.app.rpc.guild.guildRemote.setPeriodTime.broadcast(nowSeconds() + GVG.GVG_GUARD_START_TIME, countdownTime); + pinus.app.rpc.guild.guildRemote.setPeriodTime.broadcast(nowSeconds(), countdownTime); await pinus.app.rpc.systimer.systimerRemote.gvgBattleStartSchedule.broadcast(); return resResult(STATUS.SUCCESS); } diff --git a/game-server/app/services/gvg/gvgBattleService.ts b/game-server/app/services/gvg/gvgBattleService.ts index 5b879ee8f..86ba713a9 100644 --- a/game-server/app/services/gvg/gvgBattleService.ts +++ b/game-server/app/services/gvg/gvgBattleService.ts @@ -17,7 +17,7 @@ import { dispatch } from "../../pubUtils/dispatcher"; import { Rank } from "../rankService"; import { LeagueRankInfo, RoleRankInfo } from "../../domain/rank"; import { findKeys, getAllServerName } from "../redisService"; -import { sendMessageToGVGAreaByTeamWithSuc, sendMessageToGVGAreaWithSuc, sendMessageToGVGCityWithSuc } from "../pushService"; +import { sendMessageToGVGAreaByTeamWithSuc, sendMessageToGVGAreaWithSuc, sendMessageToGVGCityWithSuc, sendMessageToUserWithSuc } from "../pushService"; import { sendMailByContent, sendMailToLeagueByContent } from "../mailService"; import { GVGCityAreaPointModel } from "../../db/GVGCityAreaPoint"; import { addCityGuardMessage } from "./gvgRecService"; @@ -106,6 +106,7 @@ export function checkMoveStatus(team: GVGTeamType, cityId: number, areaId: numbe if(team.pointId > 0) return STATUS.GVG_BATTLE_TEAM_IS_SELLTED; if(team.stopMoveTime > nowSeconds()) return STATUS.GVG_BATTLE_IS_MOVING; if(team.moveCdTime > nowSeconds()) return STATUS.GVG_BATTLE_IS_MOVING_CD; + if(team.lockTime > nowSeconds()) return STATUS.GVG_TEAM_DEFENSEING; if(team.restartTime > nowSeconds()) return STATUS.GVG_BATTLE_TEAM_REVIVE; let dicArea = gameData.gvgArea.get(areaId); if(!dicArea) return STATUS.DIC_DATA_NOT_FOUND; @@ -310,6 +311,7 @@ export function checkGVGBattleStart(roleId: string, attackTeam: GVGTeamType, def if(attackTeam.attackTime > nowSeconds()) return STATUS.GVG_TEAM_ATTACKING; if(defenseTeam.defenseTime > nowSeconds() || defenseTeam.lockTime > nowSeconds()) return STATUS.GVG_TEAM_DEFENSEING; + if(attackTeam.lockTime > nowSeconds()) return STATUS.GVG_BATTLE_TEAM_LOCK; if(attackTeam.durability <= 0) return STATUS.GVG_ATTACK_TEAM_BROKEN; if(defenseTeam.durability <= 0) return STATUS.GVG_DEFENSE_TEAM_BROKEN; @@ -364,7 +366,9 @@ export async function initCatapult(cityId: number, groupKey: string, leagueCode: // 投石车投伤害 export async function catapultHurt() { - let { configId } = getGVGConfig(); + let { configId, period } = getGVGPeriodData(); + let { startFightTime, endFightTime } = getFightTimeByPeriod(period); + if(nowSeconds() < startFightTime || nowSeconds() > endFightTime) return; for(let [_key, teamObj] of getGVGBattleMap()) { let teams = teamObj.findCatapult(); for(let catapult of teams) { @@ -381,18 +385,28 @@ export async function catapultHurt() { } teamObj.battleEnd(teams); if(teams.length > 0) { - await sendMessageToGVGAreaByTeamWithSuc(teamObj.groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, { - cityId: catapult.cityId, areaId, attackType: GVG_ATTACK_TYPE.CATAPULT, teams: teams.map(team => new GVGTeamInList(team)) - }); - await sendMessageToGVGCityWithSuc(teamObj.groupKey, catapult.cityId, PUSH_ROUTE.GVG_SPINE_ATTACKED, { - cityId: catapult.cityId, areaId, teamCode: catapult.teamCode, attackType: GVG_ATTACK_TYPE.CATAPULT, spines: teams.map(team => new GVGAttackSpine(team, catapult.captapultAtk)) - }); + let roleToTeams = new Map(); + let areaTeams: GVGTeamInList[] = []; for(let team of teams) { await pushTeamBeHurtMessage(team); if(team.curTeamBreak && team.originPointId > 0) { await GVGCityAreaPointModel.leavePoint(configId, teamObj.groupKey, team.originPointId); } + if(!roleToTeams.has(team.roleId)) roleToTeams.set(team.roleId, []); + roleToTeams.get(team.roleId).push(new GVGTeamInList(team)); + areaTeams.push(new GVGTeamInList(team)); } + await sendMessageToGVGAreaByTeamWithSuc(teamObj.groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, { + cityId: catapult.cityId, areaId, attackType: GVG_ATTACK_TYPE.CATAPULT, teams: areaTeams + }); + for(let [roleId, myTeams] of roleToTeams) { + await sendMessageToUserWithSuc(roleId, PUSH_ROUTE.GVG_MY_TEAM_ATTACKED, { + cityId: catapult.cityId, areaId, attackType: GVG_ATTACK_TYPE.CATAPULT, teams: myTeams + }); + } + await sendMessageToGVGCityWithSuc(teamObj.groupKey, catapult.cityId, PUSH_ROUTE.GVG_SPINE_ATTACKED, { + cityId: catapult.cityId, areaId, teamCode: catapult.teamCode, attackType: GVG_ATTACK_TYPE.CATAPULT, spines: teams.map(team => new GVGAttackSpine(team, catapult.captapultAtk)) + }); } } } @@ -479,9 +493,11 @@ export async function gvgBattleSeconds() { } - for(let { groupKey, cityId } of keys) { - let { ranks } = await getBattleRanksByCity(configId, groupKey, cityId); - await sendMessageToGVGCityWithSuc(groupKey, cityId, PUSH_ROUTE.GVG_CITY_RANK_UPDATE, { cityId, ranks }); + if(startFightTime <= nowSeconds() && endFightTime >= nowSeconds()) { + for(let { groupKey, cityId } of keys) { + let { ranks } = await getBattleRanksByCity(configId, groupKey, cityId); + await sendMessageToGVGCityWithSuc(groupKey, cityId, PUSH_ROUTE.GVG_CITY_RANK_UPDATE, { cityId, ranks }); + } } } @@ -588,6 +604,11 @@ export async function battleEndSendMessage(groupKey: string, cityId: number, def await sendMessageToGVGAreaByTeamWithSuc(groupKey, areaId, PUSH_ROUTE.GVG_TEAM_ATTACKED, { cityId, areaId, attackType, teams: [new GVGTeamInList(defenseTeam), new GVGTeamInList(attackTeam)] }); + if(!defenseTeam.isRobot) { + await sendMessageToUserWithSuc(defenseTeam.roleId, PUSH_ROUTE.GVG_MY_TEAM_ATTACKED, { + cityId, areaId, attackType, teams: [new GVGTeamInList(defenseTeam)] + }); + } await pushTeamBeHurtMessage(defenseTeam, attackTeam); await pushTeamBeHurtMessage(attackTeam); } diff --git a/game-server/app/services/pushService.ts b/game-server/app/services/pushService.ts index 5a6ef7f3b..a36b50eac 100644 --- a/game-server/app/services/pushService.ts +++ b/game-server/app/services/pushService.ts @@ -252,6 +252,7 @@ function checkNotEncryptRoute(event: string) { PUSH_ROUTE.AUCTION_OVER, // onAuctionOver 拍卖价格超过 PUSH_ROUTE.GUILD_BOSS_ENCOURAGE, // onGuildBossEncourage 鼓舞 PUSH_ROUTE.GVG_TEAM_ATTACKED, // onTeamAttacked 当队伍受到攻击 + PUSH_ROUTE.GVG_MY_TEAM_ATTACKED, // onMyTeamAttacked 当队伍受到攻击 PUSH_ROUTE.GVG_AREA_SPINE_CHANGE, // onAreaSpinesChange 可见区域内spine的变动,每隔5秒会下发 PUSH_ROUTE.GVG_AREA_POINT_CHANGE, // onMyAreaPointChange 积分点上的驻守人变更 PUSH_ROUTE.GVG_PLAYER_AREA_ADD, // onPlayerAddToArea 积分点上的驻守人变更 diff --git a/shared/consts/constModules/chatConst.ts b/shared/consts/constModules/chatConst.ts index 83e658812..9b597b1fa 100644 --- a/shared/consts/constModules/chatConst.ts +++ b/shared/consts/constModules/chatConst.ts @@ -197,6 +197,7 @@ export const PUSH_ROUTE = { LEAGUE_TECH_ACITVE: 'onGVGTechActive', // 千机阁科技激活 GVG_TASK_UPDATE: 'onGVGTaskUpdate', // GVG任务更新 GVG_TEAM_ATTACKED: 'onTeamAttacked', // 当队伍受到攻击 + GVG_MY_TEAM_ATTACKED: 'onMyTeamAttacked', // 当队伍受到攻击 GVG_AREA_SPINE_CHANGE: 'onAreaSpinesChange', // 可见区域内spine的变动,每隔5秒会下发 GVG_AREA_POINT_CHANGE: 'onMyAreaPointChange', // 积分点上的驻守人变更 GVG_PLAYER_AREA_ADD: 'onPlayerAddToArea', // 积分点上的驻守人变更 diff --git a/shared/consts/statusCode.ts b/shared/consts/statusCode.ts index 1f9fb6cfe..d4452602c 100644 --- a/shared/consts/statusCode.ts +++ b/shared/consts/statusCode.ts @@ -385,6 +385,7 @@ export const STATUS = { GVG_TEAM_NOT_NEED_REVIVE: { code: 21418, simStr: '此队伍不需要复活' }, GVG_BATTLE_IS_MOVING_CD: { code: 21403, simStr: '移动冷却中' }, GVG_BATTLE_TEAM_REVIVE: { code: 21404, simStr: '队伍复活中' }, + GVG_BATTLE_TEAM_LOCK: { code: 21405, simStr: '您的队伍正在被攻击中' }, // 通用 30000 - 30099 DIC_DATA_NOT_FOUND: { code: 30000, simStr: '数据表未找到' }, diff --git a/shared/db/GVGTeam.ts b/shared/db/GVGTeam.ts index 2cc99b4d1..4507f4c06 100644 --- a/shared/db/GVGTeam.ts +++ b/shared/db/GVGTeam.ts @@ -251,7 +251,7 @@ export default class GVGTeam extends BaseModel { // 防守方锁定cd public static async battleStartLockDefense(teamCode: string, lockTeamCode: string) { - const team: GVGTeamType = await GVGTeamModel.findOneAndUpdate({ teamCode }, { $set: { lockTime: nowSeconds() + GVG.GVG_DEFAULT_ATTACK_CD, lockTeamCode } }, { new: true }).lean(); + const team: GVGTeamType = await GVGTeamModel.findOneAndUpdate({ teamCode }, { $set: { lockTime: nowSeconds() + GVG.GVG_DEFAULT_BATTLE_CD, lockTeamCode } }, { new: true }).lean(); return team; } diff --git a/shared/pubUtils/dicParam.ts b/shared/pubUtils/dicParam.ts index 988d2e7a0..96ff737ec 100644 --- a/shared/pubUtils/dicParam.ts +++ b/shared/pubUtils/dicParam.ts @@ -419,6 +419,7 @@ export const GVG = { GVG_REDPOINT_BATTLEFEAT: 0, // 千机阁战功红点大于多少可能出现红点 GVG_REVIVE_GOLD: '1&100|2&150|3&200|4&250|5&300|6&500', // GVG激战期元宝购买复活的消耗,次数&元宝数 GVG_VESTIGE_CHALLENGE_TIME: '5:00:00&22:00:00', // 征战中原遗迹可挑战时间 + GVG_DEFAULT_BATTLE_CD: 10, // 激战期战斗锁定时长,用于玩家退出时获取不到数据的情况 }; export const PLATFORM_CONFIG = { OPEN_ANIMATION: 1, // 0关,1开(开场动画视频)