🦄 refactor(热更新): 分割状态代码和功能代码

This commit is contained in:
luying
2023-05-05 15:42:00 +08:00
parent 50a24cb4b8
commit a362a397b5
39 changed files with 676 additions and 622 deletions
@@ -15,7 +15,7 @@ import { RoleStatus, ComBattleTeamModel, ComBattleTeamType, BossHp, ComRoleStatu
import { ItemModel, ItemType } from '../../../db/Item';
import { addItems, handleCost } from '../../../services/role/rewardService';
import { checkRoleInQueue, getServerName, rmCreatedTeamFromRedis, rmRoleFromQueue, setTeamSearchReq } from '../../../services/redisService';
import { getRandBlueprtId, clearComBtlTimer, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, handleComBtlProgress, getComBattleFriendAdd, teammateInBlackList, blueprtIdValid, hasEnoughBlueprt, addRoleToTeam, addRoleStToTeam, addValidSearchingRoles, validToJoin, addRobotsToTeam, addRobotsLater, teamIsFullToStart, oneTeamNotInBlack, getAllAssistCnt, checkHasMyTeam, checkTeamStatusAndSend, getComBtlLvByPlayerLv, addToSearchingTeams, getCapFrd, getCapExtraCnt } from '../../../services/comBattleService';
import { getRandBlueprtId, getFrd, updateRobotHurtByTime, comBtlLvInvalid, clearRobotHurtTimer, setDismissTimer, dismissTeam, handleComBtlProgress, getComBattleFriendAdd, teammateInBlackList, blueprtIdValid, hasEnoughBlueprt, addRoleToTeam, addRoleStToTeam, addValidSearchingRoles, validToJoin, addRobotsToTeam, addRobotsLater, teamIsFullToStart, oneTeamNotInBlack, getAllAssistCnt, checkHasMyTeam, checkTeamStatusAndSend, getComBtlLvByPlayerLv, addToSearchingTeams, getCapFrd, getCapExtraCnt, startTeam } from '../../../services/battle/comBattleService';
import { setAp } from '../../../services/actionPointService';
import { roleLevelup } from '../../../services/normalBattleService';
import { getSimpleRoleInfo } from '../../../services/roleService';
@@ -30,19 +30,14 @@ import { addUserToTeamChannel, delTeamChannel, removeFromTeamChannel, sendMessag
import { getFriendRelationType, getRecommendType } from '../../../services/friendService';
import { FriendRelationModel } from '../../../db/FriendRelation';
import { isHeroHidden } from '../../../services/dataService';
import { addComTeam, clearComBtlTimer,deleteComBattle,getComTeamByCode } from '../../../services/memoryCache/comBattleData';
export default function(app: Application) {
return new ComBattleHandler(app);
}
export class ComBattleHandler {
constructor(private app: Application) {
this.app.set('teamMap', this.teamMap);
this.app.set('teamDisTimer', this.teamDisTimer);
this.app.set('robotHurtTimer', this.robotHurtTimer);
}
private teamMap: Map<string, MemComBtlTeam> = new Map();
private teamDisTimer: Map<string, NodeJS.Timer> = new Map();
private robotHurtTimer: Map<string, NodeJS.Timer> = new Map();
/**
* @description 队长创建队伍
@@ -85,13 +80,13 @@ export class ComBattleHandler {
delTeamChannel(teamCode);
return resResult(STATUS.COM_BATTLE_CREATE_ERR);
}
this.teamMap.set(teamCode, comTeam);
addComTeam(teamCode, comTeam)
// 倒计时一定时间给队长匹配机器人
if (pub === true) {
await addRobotsLater(comTeam, roleInfo, this.teamMap, this.teamDisTimer);
await addRobotsLater(comTeam, roleInfo);
}
setDismissTimer(comTeam, this.teamMap, roleId, this.teamDisTimer);
setDismissTimer(comTeam, roleId);
return resResult(STATUS.SUCCESS, { teamCode, roleStatus: comTeam.roleStatus });
}
@@ -146,10 +141,10 @@ export class ComBattleHandler {
addUserToTeamChannel(teamCode, true, roleId, sid);
// 创建并添加机器人
await addRobotsToTeam(comTeam, roleId, topLineupCe, playerLv, thiz.teamMap, thiz.teamDisTimer, 2);
await addRobotsToTeam(comTeam, roleId, topLineupCe, playerLv, 2);
await ComBattleTeamModel.createTeam(comTeam);
thiz.teamMap.set(teamCode, comTeam);
addComTeam(teamCode, comTeam);
// 机器人队伍 3 秒直接开战
setTimeout(async () => {
thiz.startBattle({teamCode}, session);
@@ -183,7 +178,7 @@ export class ComBattleHandler {
let roleId = session.get('roleId');
let sid = session.get('sid');
let { teamCode, isFrd } = msg;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if (!teamStatus) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
if(teamStatus.status !== COM_TEAM_STATUS.DEFAULT) return resResult(STATUS.COM_BATTLE_TEAM_NOT_DEFAULT);
if (teamIsFullToStart(teamStatus)) return resResult(STATUS.COM_BATTLE_MEMBER_LIMIT);
@@ -214,7 +209,7 @@ export class ComBattleHandler {
addUserToTeamChannel(teamCode, false, roleId, sid);
sendMessageToTeam(teamCode, PUSH_ROUTE.TEAM_JOIN, { teamInfo: teamStatus });
setDismissTimer(teamStatus, this.teamMap, roleId, this.teamDisTimer);
setDismissTimer(teamStatus, roleId);
return resResult(STATUS.SUCCESS, { teamInfo: teamStatus});
}
@@ -229,7 +224,7 @@ export class ComBattleHandler {
let roleId = session.get('roleId');
let { isFrd, teamCode } = msg;
const isFrdPre = isFrd;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if (!teamStatus || teamStatus.status !== COM_TEAM_STATUS.DEFAULT) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
if (teamStatus.capId === roleId) return resResult(STATUS.COM_BATTLE_SET_FRD_ERR);
if (!isFrd) {
@@ -305,7 +300,7 @@ export class ComBattleHandler {
let { teamCode, heroes: hids, battleCode = 'default' } = msg;
if (!hids || hids.length === 0) return resResult(STATUS.COM_BATTLE_HEROES_ERR);
if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN);
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
const heroDBs = await HeroModel.findByHidRange(hids, roleId);
@@ -337,7 +332,7 @@ export class ComBattleHandler {
async rmTeammate(msg: {teamCode: string, roleIdToRm: string}, session: BackendSession) {
let roleId = session.get('roleId');
let { teamCode, roleIdToRm } = msg;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
if (roleId === teamStatus.capId && roleId === roleIdToRm) return resResult(STATUS.COM_BATTLE_RM_SELF); // 队长移除自己视为解散,提示确认
if (roleId !== teamStatus.capId && roleId !== roleIdToRm) return resResult(STATUS.COM_BATTLE_CAN_NOT_RM);
@@ -360,10 +355,10 @@ export class ComBattleHandler {
// 先推送离队消息,再将玩家从房间中移除
sendMessageToTeam(teamCode, PUSH_ROUTE.LEAVE_TEAM, {teamCode, roleId: roleIdToRm});
removeFromTeamChannel(teamCode, roleIdToRm);
clearComBtlTimer(teamCode, this.teamDisTimer); // 移除队员停止解散计时
clearComBtlTimer(teamCode); // 移除队员停止解散计时
let thiz = this;
setTimeout(async () => {
let curTeamStatus = thiz.teamMap.get(teamCode);
let curTeamStatus = getComTeamByCode(teamCode);
if (validToJoin(curTeamStatus)) {
let roleSt: RoleStatus;
for (let st of curTeamStatus.roleStatus) {
@@ -373,7 +368,7 @@ export class ComBattleHandler {
}
if (!roleSt) return;
let { roleId, topLineupCe, lv } = roleSt;
await addRobotsToTeam(curTeamStatus, roleId, topLineupCe, lv, thiz.teamMap, thiz.teamDisTimer, 3 - curTeamStatus.roleIds.length);
await addRobotsToTeam(curTeamStatus, roleId, topLineupCe, lv, 3 - curTeamStatus.roleIds.length);
}
}, COM_BTL_CONST.ASSIST_TIME);
return resResult(STATUS.SUCCESS);
@@ -389,9 +384,9 @@ export class ComBattleHandler {
async dismiss(msg: {teamCode: string}, session: BackendSession) {
let roleId = session.get('roleId');
let { teamCode } = msg;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if(!teamStatus) return resResult(STATUS.SUCCESS);
let result = await dismissTeam(teamStatus, this.teamMap, roleId, this.teamDisTimer);
let result = await dismissTeam(teamStatus, roleId);
return result;
}
@@ -407,35 +402,35 @@ export class ComBattleHandler {
let roleName = session.get('roleName');
let sid = session.get('sid');
let { teamCode } = msg;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) return resResult(STATUS.COM_BATTLE_TEAM_INVALID);
if (teamStatus.capId !== roleId && teamStatus.capId !== 'robot') return resResult(STATUS.COM_BATTLE_CAP_ONLY);
if (teamStatus.status !== COM_TEAM_STATUS.DEFAULT) return resResult(STATUS.COM_BATTLE_ALREADY_START);
teamStatus.startTeam();
startTeam(teamStatus);
let team = await ComBattleTeamModel.updateStatusByCode(teamCode, teamStatus.status, teamStatus.startTime, teamStatus.endTime, teamStatus.hasTimeExtraReward);
if (!team) return resResult(STATUS.COM_BATTLE_START_ERR);
rmCreatedTeamFromRedis(teamCode, teamStatus.lv);
clearComBtlTimer(teamCode, this.teamDisTimer); // 战斗开始停止解散计时
clearComBtlTimer(teamCode); // 战斗开始停止解散计时
await getComBattleFriendAdd(teamStatus.roleStatus);
sendMessageToTeam(teamCode, PUSH_ROUTE.COMBATTLE_START, {teamCode, roleStatus: teamStatus.roleStatus});
// 每场倒计时结算
let thiz = this;
setTimeout(async () => {
let teamStatus = thiz.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if (teamStatus && teamStatus.status === COM_TEAM_STATUS.FIGHTING) {
clearRobotHurtTimer(teamStatus, this.robotHurtTimer);
clearRobotHurtTimer(teamStatus);
let team = await ComBattleTeamModel.syncTeamData({teamCode, status: COM_TEAM_STATUS.LOOSE, roleStatus: teamStatus.roleStatus, bossHpArr: teamStatus.bossHpArr}, true);
if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR);
teamStatus.timeout = true;
sendMessageToTeam(teamCode, PUSH_ROUTE.TEAM_COMPLETE, {teamCode, result: false, timeout: true});
thiz.teamMap.delete(teamCode);
deleteComBattle(teamCode);
}
}, 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, this.robotHurtTimer, this.teamMap);
updateRobotHurtByTime(teamStatus, st, COM_BTL_CONST.ROBOT_BASE_TIME_INTERVAL + idx);
}
});
await checkTaskInComBattleStart(teamStatus.roleStatus, teamStatus.capId, teamStatus.blueprtId);
@@ -453,7 +448,7 @@ export class ComBattleHandler {
let roleId = session.get('roleId');
let sid = session.get('sid');
let { teamCode, killed, bossHurts, curRnd } = msg;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) {
checkTeamStatusAndSend(teamCode, roleId, sid);
return resResult(STATUS.SUCCESS);
@@ -502,7 +497,7 @@ export class ComBattleHandler {
// 推送本次行动情况
const roleStatus = teamStatus.roleStatus.map(st => {return {roleId: st.roleId, totalDmg: st.totalDmg, killed: st.killed}});
sendMessageToTeam(teamCode, PUSH_ROUTE.TEAMMATE_ACT, { teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus, actRoleId: roleId, actBossHurts });
const result = await handleComBtlProgress(teamStatus, this.robotHurtTimer, this.teamMap);
const result = await handleComBtlProgress(teamStatus);
if (result && result.code !== 0) return result;
return resResult(STATUS.SUCCESS);
}
@@ -550,7 +545,7 @@ export class ComBattleHandler {
let { teamCode } = msg;
let team = await ComBattleTeamModel.getTeamByCode(teamCode);
clearRobotHurtTimer(team, this.robotHurtTimer);
clearRobotHurtTimer(team);
if (!team || team.status !== COM_TEAM_STATUS.WIN) return resResult(STATUS.COM_BATTLE_REWARD_ERR);
let { roleStatus, blueprtId, status, bossHpArr } = team;
let roleSt = roleStatus.find(st => st && st.roleId === roleId);
@@ -567,7 +562,7 @@ export class ComBattleHandler {
let sid = session.get('sid');
let { teamCode } = msg;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) {
checkTeamStatusAndSend(teamCode, roleId, sid);
return resResult(STATUS.SUCCESS);
@@ -576,13 +571,13 @@ export class ComBattleHandler {
return resResult(STATUS.COM_BATTLE_RETREAT_ERR)
}
clearRobotHurtTimer(teamStatus, this.robotHurtTimer);
clearRobotHurtTimer(teamStatus);
let team = await ComBattleTeamModel.syncTeamData({ teamCode, status: COM_TEAM_STATUS.LOOSE, roleStatus: teamStatus.roleStatus, bossHpArr: teamStatus.bossHpArr, endTime: Date.now() }, false, true);
if (!team) return resResult(STATUS.COM_BATTLE_RESULT_ERR);
sendMessageToTeam(teamCode, PUSH_ROUTE.TEAM_COMPLETE, { teamCode, result: false });
this.teamMap.delete(teamCode);
deleteComBattle(teamCode);
return resResult(STATUS.SUCCESS, { teamInfo: pick(team, ['status', 'teamCode', 'roleStatus', 'bossHpArr']) });
}
@@ -590,7 +585,7 @@ export class ComBattleHandler {
async getComBtlStatus(msg: {teamCode: string}, session: BackendSession) {
let { teamCode } = msg;
let roleStatus: RoleStatus[], status: number, bossHpArr: BossHp[], timeout: boolean, endTime = 0;
let memTeam = this.teamMap.get(teamCode);
let memTeam = getComTeamByCode(teamCode);
if (memTeam) {
({ roleStatus, status, bossHpArr, timeout, endTime } = memTeam);
} else {
@@ -693,7 +688,7 @@ export class ComBattleHandler {
if (!guildCode) return resResult(STATUS.COM_BATTLE_INVITE_GUILD_ERR);
const { teamCode } = msg;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if(!teamStatus) return resResult(STATUS.WRONG_PARMS);
await pushTeamInviteMsg(roleId, roleName, guildCode, teamCode, teamStatus.blueprtId, teamStatus.lv, teamStatus.ceLimit);
await ComBattleTeamModel.invite(teamCode, guildCode);
@@ -712,7 +707,7 @@ export class ComBattleHandler {
let guildCode = session.get('guildCode');
const { teamCode, targetRoleId } = msg;
let teamStatus = this.teamMap.get(teamCode);
let teamStatus = getComTeamByCode(teamCode);
if(!teamStatus) return resResult(STATUS.WRONG_PARMS);
let role = await RoleModel.findByRoleId(targetRoleId, 'lv');