✨ feat(防破解): 防加速和防跳过
This commit is contained in:
@@ -591,4 +591,63 @@ export class NormalBattleHandler {
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// 是否可以跳过
|
||||
async checkSkip(msg: { battleCode: string }, session: BackendSession) {
|
||||
const { battleCode } = msg;
|
||||
let roleId = session.get('roleId');
|
||||
|
||||
let role = await RoleModel.findByRoleId(roleId, 'warStar vipStartTime');
|
||||
if(!role) return resResult(STATUS.ROLE_NOT_FOUND);
|
||||
let { warStar, vipStartTime } = role;
|
||||
|
||||
if(!vipStartTime || vipStartTime == 0) {
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
battleCode,
|
||||
canSkip: false
|
||||
});
|
||||
}
|
||||
|
||||
let battleRecord = await BattleRecordModel.getBattleRecordByCode(battleCode);
|
||||
if(!battleRecord || battleRecord.roleId != roleId) return resResult(STATUS.BATTLE_NOT_FOUND);
|
||||
let battleId = battleRecord.battleId;
|
||||
let dicWar = gameData.war.get(battleId);
|
||||
if(!dicWar) return resResult(STATUS.DIC_DATA_NOT_FOUND);
|
||||
|
||||
let hasPass = warStar.findIndex(cur => cur.id == battleId) != -1; // 是否首通过
|
||||
let canSkip = false;
|
||||
switch (dicWar.warType) {
|
||||
case WAR_TYPE.VESTIGE:
|
||||
case WAR_TYPE.BRANCH_ELITE:
|
||||
case WAR_TYPE.ACT_DAILY_GK:
|
||||
case WAR_TYPE.ACT_NEW_HERO_GK:
|
||||
canSkip = false;
|
||||
break;
|
||||
case WAR_TYPE.NORMAL:
|
||||
canSkip = dicWar.chapter != 0 && hasPass;
|
||||
break;
|
||||
case WAR_TYPE.MAIN_ELITE:
|
||||
case WAR_TYPE.MYSTERY:
|
||||
canSkip = hasPass;
|
||||
break;
|
||||
case WAR_TYPE.ACT_TREASURE_HUNT:
|
||||
case WAR_TYPE.ACT_SELF_SHOP:
|
||||
case WAR_TYPE.TOWER:
|
||||
case WAR_TYPE.LADDER:
|
||||
case WAR_TYPE.GUILD_TRAIN:
|
||||
case WAR_TYPE.PVP:
|
||||
case WAR_TYPE.DAILY:
|
||||
case WAR_TYPE.EVENT:
|
||||
case WAR_TYPE.EXPEDITION:
|
||||
case WAR_TYPE.GVG_VESTIGE:
|
||||
case WAR_TYPE.GVG_BATTLE:
|
||||
canSkip = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
battleCode, canSkip
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -449,10 +449,10 @@ export class ComBattleHandler {
|
||||
* @returns
|
||||
* @memberof ComBattleHandler
|
||||
*/
|
||||
async action(msg: {teamCode: string, bossHurts: Array<{hid: number, dataId: number, hurtHp: number}>, killed: number[], curRnd: number}, session: BackendSession) {
|
||||
async action(msg: {teamCode: string, bossHurts: Array<{hid: number, dataId: number, hurtHp: number}>, killed: number[], curRnd: number, timegap: number }, session: BackendSession) {
|
||||
let roleId = session.get('roleId');
|
||||
let sid = session.get('sid');
|
||||
let { teamCode, killed, bossHurts, curRnd } = msg;
|
||||
let { teamCode, killed, bossHurts, curRnd, timegap = 0 } = msg;
|
||||
let teamStatus = getComTeamByCode(teamCode);
|
||||
if (!teamStatus || !teamStatus.roleIds || teamStatus.roleIds.indexOf(roleId) === -1) {
|
||||
checkTeamStatusAndSend(teamCode, roleId, sid);
|
||||
@@ -469,6 +469,17 @@ export class ComBattleHandler {
|
||||
}
|
||||
// 重置总血量,计算真实伤害
|
||||
const roleSt = teamStatus.findMemberByRoleId(roleId);
|
||||
if(!roleSt) return resResult(STATUS.SUCCESS);
|
||||
if(!roleSt.startActionTime || roleSt.startActionTime == 0) { // 第一次调用设置初始
|
||||
roleSt.startActionTime = nowSeconds();
|
||||
}
|
||||
if(Math.abs(nowSeconds() - roleSt.startActionTime - timegap) > 5) { // 前后端误差超过5秒拦截
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
isError: true,
|
||||
timegap: nowSeconds() - roleSt.startActionTime
|
||||
});
|
||||
}
|
||||
|
||||
let actBossHurts: {dataId: number, hurtHp: number}[] = [];
|
||||
let totalHurtHp = 0;
|
||||
teamStatus.bossHpArr.forEach(boss => {
|
||||
@@ -504,7 +515,10 @@ export class ComBattleHandler {
|
||||
sendMessageToTeam(teamCode, PUSH_ROUTE.TEAMMATE_ACT, { teamCode, bossCurHp: teamStatus.bossCurHp, bossHpArr: teamStatus.bossHpArr, roleStatus, actRoleId: roleId, actBossHurts });
|
||||
const result = await handleComBtlProgress(teamStatus);
|
||||
if (result && result.code !== 0) return result;
|
||||
return resResult(STATUS.SUCCESS);
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
isError: false,
|
||||
timegap: nowSeconds() - roleSt.startActionTime
|
||||
});
|
||||
}
|
||||
|
||||
// /**
|
||||
|
||||
@@ -245,18 +245,31 @@ export class CityActivityHandler {
|
||||
|
||||
|
||||
// 上报城门受到伤害
|
||||
async hitGate(msg: { cityId: number, code: string, damage: number, hid: number, round: number }, session: BackendSession) {
|
||||
async hitGate(msg: { cityId: number, code: string, damage: number, hid: number, round: number, timegap: number }, session: BackendSession) {
|
||||
const roleId = session.get('roleId');
|
||||
const roleName = session.get('roleName');
|
||||
const serverId = session.get('serverId');
|
||||
const guildCode = session.get('guildCode');
|
||||
const sid = session.get('sid');
|
||||
|
||||
let { cityId, code, damage, hid, round } = msg;
|
||||
let { cityId, code, damage, hid, round, timegap = 0 } = msg;
|
||||
let obj = getCityActivityObj();
|
||||
let { gateHp, maxHp } = await obj.getGateHpAndInc(serverId, cityId);
|
||||
if (gateHp <= 0) return resResult(STATUS.GATE_HP_IS_ZERO);
|
||||
|
||||
let member = obj.getMember(guildCode, roleId);
|
||||
if(!member) return resResult(STATUS.NOT_CHECK_BATTLE);
|
||||
if(!member.startActionTime || member.startActionTime == 0) {
|
||||
member.startActionTime = nowSeconds();
|
||||
}
|
||||
if(Math.abs(nowSeconds() - member.startActionTime - timegap) > 5) { // 前后端误差超过5秒拦截
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
isError: true,
|
||||
timegap: nowSeconds() - member.startActionTime
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
let hero = await HeroModel.findBySeqIdAndRole(hid, roleId);
|
||||
if(!hero && (damage/maxHp > 0.01)) damage = 0;
|
||||
|
||||
@@ -266,7 +279,9 @@ export class CityActivityHandler {
|
||||
if(statusResult.status != GUILD_ACTIVITY_STATUS.START) {
|
||||
return resResult(STATUS.SUCCESS, {
|
||||
code,
|
||||
...statusResult
|
||||
...statusResult,
|
||||
isError: false,
|
||||
timegap: nowSeconds() - member.startActionTime,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -306,7 +321,9 @@ export class CityActivityHandler {
|
||||
...statusResult,
|
||||
guildScore,
|
||||
myScore,
|
||||
gateHp
|
||||
gateHp,
|
||||
isError: false,
|
||||
timegap: nowSeconds() - member.startActionTime,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user