diff --git a/game-server/app/servers/battle/handler/comBattleHandler.ts b/game-server/app/servers/battle/handler/comBattleHandler.ts index 72460a26e..26f772592 100644 --- a/game-server/app/servers/battle/handler/comBattleHandler.ts +++ b/game-server/app/servers/battle/handler/comBattleHandler.ts @@ -17,7 +17,7 @@ import { ItemModel } from '../../../db/Item'; import { handleFixedReward, addItems, handleCost } from '../../../services/rewardService'; import { checkRoleInQueue, getTeamSearchByQuality, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService'; import { transBossHpArr } from '../../../services/battleService'; -import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd, updateRobotHurt, updateRobotHurtByTime, comBtlLvInvalid } from '../../../services/comBattleService'; +import { getRandBlueprtId, getRandComBtlRobots, checkComBattleResult, clearComBtlTimer, getRealReward, getAssistTimesByQuality, getFrd, updateRobotHurt, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer } from '../../../services/comBattleService'; import { setAp } from '../../../services/actionPointService'; import { roleLevelup } from '../../../services/normalBattleService'; @@ -538,6 +538,7 @@ export class ComBattleHandler { setTimeout(async () => { let teamStatus = thiz.teamMap.get(teamCode); if (teamStatus && teamStatus.status === COM_TEAM_STATUS.FIGHTING) { + clearRobotHurtTimer(teamStatus, this.robotHurtTimer); let channelService = thiz.app.get('channelService'); let channel = channelService.getChannel(teamCode, false); let team = await ComBattleTeamModel.syncTeamData({teamCode, status: COM_TEAM_STATUS.LOOSE, roleStatus: teamStatus.roleStatus, bossHpArr: teamStatus.bossHpArr}); @@ -548,7 +549,7 @@ export class ComBattleHandler { }, COM_BTL_CONST.BTL_TIME_LMT); teamStatus.roleStatus.forEach((st, idx) => { if (st.isRobot === true) { - updateRobotHurtByTime(teamStatus, st, COM_BTL_CONST.ROBOT_BASE_TIME_INTERVAL + idx, channel); + updateRobotHurtByTime(teamStatus, st, COM_BTL_CONST.ROBOT_BASE_TIME_INTERVAL + idx, channel, this.robotHurtTimer); } }); return resResult(STATUS.SUCCESS); @@ -682,6 +683,7 @@ export class ComBattleHandler { let { teamCode } = msg; let team = await ComBattleTeamModel.getTeamByCode(teamCode); if (!team || team.status !== COM_TEAM_STATUS.WIN) return resResult(STATUS.COM_BATTLE_REWARD_ERR); + clearRobotHurtTimer(team, this.robotHurtTimer); let { roleStatus, blueprtId, status, bossHpArr } = team; let roleSt: RoleStatus = null; roleStatus.forEach(st => { diff --git a/game-server/app/services/comBattleService.ts b/game-server/app/services/comBattleService.ts index 487a58e30..4690632e9 100644 --- a/game-server/app/services/comBattleService.ts +++ b/game-server/app/services/comBattleService.ts @@ -241,7 +241,6 @@ export function updateRobotHurt(teamStatus, roleSt: RoleStatus, channel: Channel roleSt.totalDmg += robotTotalHurt; updateRobotKilled(teamStatus.bossHp, roleSt); channel.pushMessage('onTeammateAct', resResult(STATUS.SUCCESS, { teamCode: teamStatus.teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus: teamStatus.roleStatus, actRoleId: roleSt.roleId, actBossHurts })); - } /** @@ -253,7 +252,8 @@ export function updateRobotHurt(teamStatus, roleSt: RoleStatus, channel: Channel * @param {Channel} channel * @param {Map} robotHurtTimer */ -export function updateRobotHurtByTime(teamStatus, roleSt: RoleStatus, interval: number, channel: Channel) { +export function updateRobotHurtByTime(teamStatus, roleSt: RoleStatus, interval: number, channel: Channel, robotHurtTimer: Map) { + const timerKey = `${teamStatus.teamCode}_${roleSt.roleId}`; const robotTimer = setInterval(() => { const robotTotalHurt = teamStatus.bossHp * COM_BTL_CONST.ROBOT_HURT_RATIO; if (roleSt.totalDmg < robotTotalHurt) { @@ -262,8 +262,33 @@ export function updateRobotHurtByTime(teamStatus, roleSt: RoleStatus, interval: clearInterval(robotTimer); } }, interval * 1000); + if (!robotHurtTimer.has(timerKey)) { + robotHurtTimer.set(timerKey, robotTimer); + } } +/** + * @description 清理机器人伤害的 timer + * @export + * @param {*} teamStatus 寻宝队伍状态 + * @param {Map} robotHurtTimer + */ +export function clearRobotHurtTimer(teamStatus, robotHurtTimer: Map) { + teamStatus.roleStatus.forEach(st => { + const timerKey = `${teamStatus.teamCode}_${st.roleId}`; + if (st.isRobot === true && robotHurtTimer.has(timerKey)) { + clearInterval(robotHurtTimer.get(timerKey)); + } + }); +} + +/** + * @description 检查寻宝等级是否合法 + * @export + * @param {number} lv 玩家等级 + * @param {number} lvRange 藏宝图等级范围 + * @returns + */ export function comBtlLvInvalid(lv: number, lvRange: number) { const lvs = comBtlRangeInfo(lvRange); if (!lvs) return true;