diff --git a/game-server/app/servers/battle/handler/normalBattleHandler.ts b/game-server/app/servers/battle/handler/normalBattleHandler.ts index a960082e1..bcff36352 100644 --- a/game-server/app/servers/battle/handler/normalBattleHandler.ts +++ b/game-server/app/servers/battle/handler/normalBattleHandler.ts @@ -3,7 +3,7 @@ import { BattleRecordModel } from '../../../db/BattleRecord'; import { BattleSweepRecordModel } from '../../../db/BattleSweepRecord'; import { BattleCheatRecModel } from '../../../db/BattleCheatRec'; import { genCode, getReasonByWarType, getWarTypeName } from '../../../pubUtils/util'; -import { WAR_TYPE, EVENT_STATUS, REDIS_KEY, KING_EXP_RATIO_TYPE, TA_EVENT, ITEM_CHANGE_REASON } from '../../../consts'; +import { WAR_TYPE, EVENT_STATUS, REDIS_KEY, KING_EXP_RATIO_TYPE, TA_EVENT, ITEM_CHANGE_REASON, BLOCK_TYPE, CHECT_BLOCK_TYPE, CHECT_BATTLE_TYPE } from '../../../consts'; import { checkDaily, checkDailyAndIncrease } from '../../../services/dailyBattleService'; import { checkTowerWar, towerBattleEnd } from '../../../services/battleService'; import { WarReward } from '../../../services/warRewardService'; @@ -33,6 +33,7 @@ import { addItems } from '../../../services/role/rewardService'; import { treasureHuntChallengeConsume } from '../../../services/activity/treasureHuntService'; import { combineItems } from '../../../services/role/util'; import { isHeroHidden } from '../../../services/dataService'; +import { getRoleOnlineInfo, redisClient, roleLeave } from '../../../services/redisService'; export default function (app: Application) { new HandlerService(app, {}); @@ -61,7 +62,7 @@ export class NormalBattleHandler { if (ap < warInfo.cost) { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); } - if(role.lv < warInfo.lvLimited) { + if (role.lv < warInfo.lvLimited) { return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); } // 前置关卡是否挑战过 @@ -75,7 +76,7 @@ export class NormalBattleHandler { let { isOK, hids, heroes, lineup } = await checkBattleHeroes(roleId, seqIds); if (!isOK) return resResult(STATUS.BATTLE_HERO_NOT_FOUND); - if(isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN); + if (isHeroHidden(...hids)) return resResult(STATUS.HERO_IS_HIDDEN); const battleCode = genCode(8); // 关卡唯一值 let dailyNum = {}; @@ -177,7 +178,7 @@ export class NormalBattleHandler { } let role = await RoleModel.findByRoleId(roleId, 'lv vipStartTime warStar warCount refWarCount roleId'); - let apJson = await setAp(serverId, roleId, ip, role.lv, isSuccess? -1 * warInfo.cost: 0, sid, getReasonByWarType(warInfo.warType)); // 扣除体力 + let apJson = await setAp(serverId, roleId, ip, role.lv, isSuccess ? -1 * warInfo.cost : 0, sid, getReasonByWarType(warInfo.warType)); // 扣除体力 if (!apJson) { return resResult(STATUS.BATTLE_ACTION_POINT_LACK); } @@ -192,17 +193,17 @@ export class NormalBattleHandler { let dailyNum = {}; let towerStatus = null; let dungeonNum = {}; - if(warInfo.warType == WAR_TYPE.NORMAL || warInfo.warType == WAR_TYPE.MAIN_ELITE) { - if(!isFirst) { - let checkResult = await checkWarCountAndInc(battleId, isSuccess?1:0, role, false); + if (warInfo.warType == WAR_TYPE.NORMAL || warInfo.warType == WAR_TYPE.MAIN_ELITE) { + if (!isFirst) { + let checkResult = await checkWarCountAndInc(battleId, isSuccess ? 1 : 0, role, false); if (checkResult.code != 0) { return checkResult } } - } - + } + if (warInfo.warType == WAR_TYPE.DAILY) { - let checkResult = await checkDailyAndIncrease(roleId, warStar, battleId, isSuccess?1:0, false, stars, role); + let checkResult = await checkDailyAndIncrease(roleId, warStar, battleId, isSuccess ? 1 : 0, false, stars, role); if (checkResult.status == -1) { return checkResult.resResult; } @@ -224,7 +225,7 @@ export class NormalBattleHandler { warReward.setFixReward(towerEndResult.data.towerReward) } } else if (warInfo.warType == WAR_TYPE.MYSTERY) { - let checkResult = await checkDungeonAndIncrease(roleId, isSuccess?1:0, false, battleId); + let checkResult = await checkDungeonAndIncrease(roleId, isSuccess ? 1 : 0, false, battleId); let role = await RoleModel.saveDungeonHero(roleId, battleId, heroes, isSuccess); if (role) { await saveDungeonFirst(role, battleId, BattleRecord); @@ -235,7 +236,7 @@ export class NormalBattleHandler { } dungeonNum = Object.assign(dungeonNum, checkResult.data) } else if (warInfo.warType == WAR_TYPE.NORMAL) { - if(isSuccess) { + if (isSuccess) { let role = await RoleModel.updateMainWarId(roleId, battleId, nowSeconds()); if (role) { let r = new Rank(REDIS_KEY.MAIN_RANK, { serverId }); @@ -243,7 +244,7 @@ export class NormalBattleHandler { } } } else if (warInfo.warType == WAR_TYPE.MAIN_ELITE) { - if(isSuccess) { + if (isSuccess) { let role = await RoleModel.updateMainEliteWarId(roleId, battleId, nowSeconds()); if (role) { let r = new Rank(REDIS_KEY.MAIN_ELITE_RANK, { serverId }); @@ -266,7 +267,7 @@ export class NormalBattleHandler { isFirst = await challengeNewHeroGK(serverId, roleId, activityId, battleId) } } else if (warInfo.warType == WAR_TYPE.ACT_TREASURE_HUNT) { - if(isSuccess) { + if (isSuccess) { await treasureHuntChallengeConsume(serverId, roleId, sid); } } @@ -276,7 +277,7 @@ export class NormalBattleHandler { if (isFirst) { // await switchOnFunc(roleId, FUNC_OPT_TYPE.BATTLE_END, battleId, session); warReward.setCondition(0, true); - reportTAEvent(roleId, TA_EVENT.GK_FIRST_PASS, { war_id: battleId, war_type: getWarTypeName(warInfo.warType), pass_time: Date.now(), pass_duration: nowSeconds() - getSeconds(createdAt), hero_list: dbHeroes }); + reportTAEvent(roleId, TA_EVENT.GK_FIRST_PASS, { war_id: battleId, war_type: getWarTypeName(warInfo.warType), pass_time: Date.now(), pass_duration: nowSeconds() - getSeconds(createdAt), hero_list: dbHeroes }); pushMysteryFirstMsg(roleId, roleName, serverId, warInfo.warType, warInfo.war_id); pushVestigeFirstMsg(roleId, roleName, serverId, warInfo.warType, warInfo.war_id); } @@ -319,7 +320,7 @@ export class NormalBattleHandler { let sid = session.get('sid'); let serverId = session.get('serverId'); let ip = session.get('ip'); - + let warInfo = gameData.war.get(battleId); if (!warInfo) { return resResult(STATUS.BATTLE_MISS_INFO); @@ -331,13 +332,13 @@ export class NormalBattleHandler { return resResult(STATUS.BATTLE_SWEEP_CONDITION_STAR); } let role = await RoleModel.findByRoleId(roleId, 'lv warCount refWarCount roleId'); - if(role.lv < warInfo.lvLimited) { + if (role.lv < warInfo.lvLimited) { return resResult(STATUS.COM_BATTLE_LV_NOT_ENOUGH); } // 扫荡次数 let dailyNum = {}; let dungeonNum = {}; - if(warInfo.warType == WAR_TYPE.NORMAL || warInfo.warType == WAR_TYPE.MAIN_ELITE) { + if (warInfo.warType == WAR_TYPE.NORMAL || warInfo.warType == WAR_TYPE.MAIN_ELITE) { let checkResult = await checkWarCountAndInc(battleId, count, role, true); if (checkResult.code != 0) { return checkResult @@ -383,7 +384,7 @@ export class NormalBattleHandler { return resResult(STATUS.SUCCESS, { battleId, count, - battleGoods: result, + battleGoods: result, dailyNum, dungeonNum, ...actordata }); @@ -432,11 +433,11 @@ export class NormalBattleHandler { let vipStartTime: number = session.get('vipStartTime'); let battleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode); - if(!battleRecord || battleRecord.roleId != roleId || battleRecord.battleId != warId) { + if (!battleRecord || battleRecord.roleId != roleId || battleRecord.battleId != warId) { return resResult(STATUS.WRONG_PARMS); } let maxRegretCnt = getVipRegretCnt(vipStartTime); - return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt||0, maxRegretCnt }); + return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt || 0, maxRegretCnt }); } // 记录悔棋次数 @@ -447,17 +448,17 @@ export class NormalBattleHandler { let vipStartTime: number = session.get('vipStartTime'); let battleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode); - if(!battleRecord || battleRecord.roleId != roleId || battleRecord.battleId != warId) { + if (!battleRecord || battleRecord.roleId != roleId || battleRecord.battleId != warId) { return resResult(STATUS.WRONG_PARMS); } let maxRegretCnt = getVipRegretCnt(vipStartTime); - let regretCnt = battleRecord.regretCnt||0; - if(regretCnt + count > maxRegretCnt) { + let regretCnt = battleRecord.regretCnt || 0; + if (regretCnt + count > maxRegretCnt) { return resResult(STATUS.BATTLE_REGRET_MAX); } battleRecord = await BattleRecordModel.incRegretCnt(battleCode, count); - return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt||0, maxRegretCnt }); + return resResult(STATUS.SUCCESS, { regretCnt: battleRecord.regretCnt || 0, maxRegretCnt }); } async getMainStarBox(msg: {}, session: BackendSession) { @@ -471,8 +472,8 @@ export class NormalBattleHandler { // 关卡列表 async receiveChapterBox(msg: { chapter: number, id: number, warType: number }, session: BackendSession) { const { id, chapter, warType } = msg; - if(!isNumber(id)) return resResult(STATUS.WRONG_PARMS); - + if (!isNumber(id)) return resResult(STATUS.WRONG_PARMS); + let roleId = session.get('roleId'); let roleName = session.get('roleName'); let sid = session.get('sid'); @@ -482,18 +483,18 @@ export class NormalBattleHandler { let rewards: RewardInter[] = []; let star = getStarOfChapter(role.warStar, warType, chapter); - let boxIds = id == 0? gameData.mainBoxByChapter.get(`${warType}_${chapter}`): [id]; + let boxIds = id == 0 ? gameData.mainBoxByChapter.get(`${warType}_${chapter}`) : [id]; - for(let id of boxIds) { + for (let id of boxIds) { let dicBox = gameData.mainBox.get(id); - if(dicBox && dicBox.chapter == chapter && dicBox.warType == warType) { - if(star >= dicBox.star && role.receivedBox.indexOf(id) == -1) { + if (dicBox && dicBox.chapter == chapter && dicBox.warType == warType) { + if (star >= dicBox.star && role.receivedBox.indexOf(id) == -1) { rewards.push(...dicBox.reward); ids.push(id); } } } - if(ids.length <= 0) return resResult(STATUS.BATTLE_NO_BOX_CAN_RECEIVE); + if (ids.length <= 0) return resResult(STATUS.BATTLE_NO_BOX_CAN_RECEIVE); role = await RoleModel.receivedBox(roleId, ids); let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX) @@ -506,7 +507,7 @@ export class NormalBattleHandler { // 关卡列表 async receiveWarReward(msg: { chapter: number, warType: number }, session: BackendSession) { const { chapter, warType } = msg; - + let roleId = session.get('roleId'); let roleName = session.get('roleName'); let sid = session.get('sid'); @@ -515,16 +516,16 @@ export class NormalBattleHandler { let { warStar, receivedWarIds = [] } = role; let warIds: number[] = []; let rewards: RewardInter[] = []; - let mainWarRewards = gameData.mainWarReward.get(`${warType}_${chapter}`)??[]; + let mainWarRewards = gameData.mainWarReward.get(`${warType}_${chapter}`) ?? []; - for(let { warId, cityReward } of mainWarRewards) { + for (let { warId, cityReward } of mainWarRewards) { let index = warStar.findIndex(cur => cur.id == warId); - if(index != -1 && receivedWarIds.indexOf(warId) == -1) { + if (index != -1 && receivedWarIds.indexOf(warId) == -1) { rewards.push(...cityReward); warIds.push(warId); } } - if(warIds.length <= 0) return resResult(STATUS.BATTLE_NO_WAR_REWARD_CAN_RECEIVE); + if (warIds.length <= 0) return resResult(STATUS.BATTLE_NO_WAR_REWARD_CAN_RECEIVE); role = await RoleModel.receiveWarRewards(roleId, warIds); let goods = await addItems(roleId, roleName, sid, rewards, ITEM_CHANGE_REASON.RECEIVE_CHAPTER_BOX) @@ -543,6 +544,47 @@ export class NormalBattleHandler { if (!rec) { return resResult(STATUS.BATTLE_CHECK_REC_SAVE_ERR); } + + await this.blockByRecordBattleCheat(roleId, type); + return resResult(STATUS.SUCCESS); } + + + /** + * 防破解实时封号 + * @param {string} roleId + * @param {number} type 查封类型(封除类型不为200) + * @returns + */ + async blockByRecordBattleCheat(roleId: string, type: number) { + if (type && type === CHECT_BATTLE_TYPE) { + // console.log("blockByRecordBattleCheat----type=", type); + return; + } + + // 设置redis开关 + const isCheckBlock = await redisClient().getAsync(REDIS_KEY.IS_CHECT_BLOCK); + if (!isCheckBlock || isCheckBlock == undefined) { + await redisClient().setAsync(REDIS_KEY.IS_CHECT_BLOCK, `${CHECT_BLOCK_TYPE.OPEN}`);; + } + if (isCheckBlock && parseInt(isCheckBlock) != CHECT_BLOCK_TYPE.OPEN) { + console.log("blockByRecordBattleCheat-防破解查封功能已关闭!!!"); + return; + } + + const blockType: BLOCK_TYPE = BLOCK_TYPE.BLOCK; + const blockReason: string = "使用第三方软件, 封停账号, 封停时间为:" + new Date();; + let role = await RoleModel.updateRoleInfo(roleId, { blockType, blockReason }); + if (!role) return resResult(STATUS.ROLE_NOT_FOUND); + + let { isOnline, sid } = await getRoleOnlineInfo(roleId); + if (isOnline) { + await this.app.rpc.connector.connectorRemote.setOtherUserSession.toServer(sid, [{ roleId, blockType }]); + await this.app.rpc.connector.connectorRemote.remoteLogin.toServer(sid, roleId, STATUS.BLOCKED); + await roleLeave(roleId); + } + + return; + } } diff --git a/shared/consts/constModules/sysConst.ts b/shared/consts/constModules/sysConst.ts index d5f04fd17..fb2880587 100644 --- a/shared/consts/constModules/sysConst.ts +++ b/shared/consts/constModules/sysConst.ts @@ -26,6 +26,8 @@ export const PUSH_INTERVAL = 5 * 1000; // 分批时间,5秒一批 export const CLOSE_LOGIN_WHEN_ONLINE_MAX = 1; // 是否在服务器达到最大在线人数限制时关闭登录 export const MAX_ONLINE_USER_COUNT = 100000; // 最大在线人数限制 +export const CHECT_BATTLE_TYPE = 200; //非异常战斗类型 + export enum TIME_OUTPUT_TYPE { DATE = 1, STAMP_10 = 2, @@ -277,6 +279,9 @@ export enum REDIS_KEY { PUBLIC_ACCOUNT_GIFT = 'pubAccGiftChannel', // 公众号频道 SEND_GIFT_CODE = 'sendGiftCodeChannel', // 礼包码频道 MAX_ONLINE_USERS = 'maxOnlineUsers', // 最高在线人数限制 + IS_CHECT_BLOCK = 'isCheckBlock', // 防破解检测封号开关,0-开,1-关 + + } // 各排行榜对应hash的key @@ -1321,4 +1326,10 @@ export enum TEAM_TYPE { LADDER = 2, // 名将擂台 VESTIGE = 3, // 遗迹 GVG_BATTLE = 4, // 激战期 +} + +// 异常战斗封号开关 +export enum CHECT_BLOCK_TYPE{ + OPEN = 0, //开 + CLOSE = 1, //关 } \ No newline at end of file