bool AntiCheat::_DoAntiCheatCheck(AntiCheatCheck checktype) { m_currentConfig = _FindConfig(checktype); if (!m_currentConfig) return true; AntiCheatCheckEntry* _check = _FindCheck(checktype); if (!_check) return true; bool checkpassed = true; if (_check->active && CheckTimer(checktype) && CheckNeeded(checktype)) { if (m_counters.find(checktype) == m_counters.end()) m_counters.insert(std::make_pair(checktype, 0)); if (!(this->*(_check->Handler))() && !isImmune()) { if (m_currentConfig->disableOperation) checkpassed = false; ++m_counters[checktype]; if (m_lastalarmtime.find(checktype) == m_lastalarmtime.end()) m_lastalarmtime.insert(std::make_pair(checktype, 0)); m_lastalarmtime[checktype] = WorldTimer::getMSTime(); if (m_counters[checktype] >= m_currentConfig->alarmsCount) { m_currentCheckResult.insert(0,m_currentConfig->description.c_str()); DoAntiCheatAction(checktype, m_currentCheckResult); m_counters[checktype] = 0; m_currentCheckResult.clear(); } } else { if (WorldTimer::getMSTimeDiff(m_lastalarmtime[checktype],WorldTimer::getMSTime()) > sWorld.getConfig(CONFIG_UINT32_ANTICHEAT_ACTION_DELAY) || (m_currentConfig->checkParam[0] > 0 && m_currentConfig->alarmsCount > 1 && WorldTimer::getMSTimeDiff(m_lastalarmtime[checktype],WorldTimer::getMSTime()) > m_currentConfig->checkParam[0])) { m_counters[checktype] = 0; } } m_oldCheckTime[checktype] = WorldTimer::getMSTime(); } // Subchecks, if exist if (checktype < 100 && _check->active && CheckNeeded(checktype)) { for (int i=1; i < 99; ++i ) { uint32 subcheck = checktype * 100 + i; if (AntiCheatConfig const* config = _FindConfig(AntiCheatCheck(subcheck))) { checkpassed |= _DoAntiCheatCheck(AntiCheatCheck(subcheck)); } else break; } } // If any of checks fail, return false return checkpassed; };
bool AntiCheat::CheckNeeded(AntiCheatCheck checktype) { if (!sWorld.getConfig(CONFIG_BOOL_ANTICHEAT_ENABLE) || !GetPlayer()->IsInWorld() || GetPlayer()->IsBeingTeleported() || GetPlayer()->GetPlayerbotAI() || GetPlayer()->GetSession()->GetSecurity() > int32(sWorld.getConfig(CONFIG_UINT32_ANTICHEAT_GMLEVEL))) return false; if (GetMover()->HasAuraType(SPELL_AURA_MOD_CONFUSE)) return false; AntiCheatCheck checkMainType = (checktype >= 100) ? AntiCheatCheck(checktype / 100) : checktype; switch( checkMainType) { case CHECK_NULL: return false; break; case CHECK_MOVEMENT: if ( GetPlayer()->GetTransport() || GetPlayer()->HasMovementFlag(MOVEFLAG_ONTRANSPORT) || GetMover()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE || GetPlayer()->IsTaxiFlying()) return false; break; case CHECK_SPELL: break; case CHECK_QUEST: return false; break; case CHECK_TRANSPORT: if (!isActiveMover()) return false; break; case CHECK_DAMAGE: case CHECK_ITEM: case CHECK_WARDEN: break; default: return false; } if (checktype < 100 ) return true; switch( checktype) { case CHECK_MOVEMENT_SPEED: if (GetMover()->HasAura(56266)) return false; break; case CHECK_MOVEMENT_FLY: case CHECK_MOVEMENT_ZAXIS: if (isCanFly() || !GetMover()) return false; break; case CHECK_MOVEMENT_WATERWALKING: if (!m_currentmovementInfo->HasMovementFlag(MOVEFLAG_WATERWALKING)) return false; break; case CHECK_MOVEMENT_TP2PLANE: if (GetMover()->GetTransport()) return false; if (m_currentmovementInfo->HasMovementFlag(MovementFlags(MOVEFLAG_SWIMMING | MOVEFLAG_CAN_FLY | MOVEFLAG_FLYING))) return false; if (GetMover()->HasAura(60068) && GetMover()->GetTerrain()->IsUnderWater(m_currentmovementInfo->GetPos()->x, m_currentmovementInfo->GetPos()->y, m_currentmovementInfo->GetPos()->z-5.0f)) return false; break; case CHECK_MOVEMENT_AIRJUMP: if (isCanFly() || !isActiveMover() || GetMover()->HasAuraType(SPELL_AURA_FEATHER_FALL) || GetMover()->GetTerrain()->IsUnderWater(m_currentmovementInfo->GetPos()->x, m_currentmovementInfo->GetPos()->y, m_currentmovementInfo->GetPos()->z-5.0f)) return false; break; case CHECK_MOVEMENT_TELEPORT: if (!isActiveMover() || GetPlayer()->IsBeingTeleported()) return false; break; case CHECK_MOVEMENT_FALL: if (isCanFly() || !isActiveMover()) return false; break; case CHECK_MOVEMENT_MOUNTAIN: if (isCanFly() || !isActiveMover()) return false; break; default: break; } return true; }
bool AntiCheat::CheckNeeded(AntiCheatCheck checktype) { if (!sWorld.getConfig(CONFIG_BOOL_ANTICHEAT_ENABLE) || !GetPlayer()->IsInWorld() || !GetPlayer()->GetMap() || GetPlayer()->IsBeingTeleported() || GetPlayer()->GetPlayerbotAI() || GetPlayer()->GetSession()->GetSecurity() > int32(sWorld.getConfig(CONFIG_UINT32_ANTICHEAT_GMLEVEL))) return false; if (!m_currentConfig->disabledZones.empty()) { uint32 zone, area; GetPlayer()->GetZoneAndAreaId(zone,area); if (m_currentConfig->disabledZones.find(zone) != m_currentConfig->disabledZones.end()) return false; } AntiCheatCheck checkMainType = (checktype >= 100) ? AntiCheatCheck(checktype / 100) : checktype; switch( checkMainType) { case CHECK_NULL: return false; break; case CHECK_MOVEMENT: if ( GetPlayer()->IsOnTransport() // || GetPlayer()->HasMovementFlag(MOVEFLAG_ONTRANSPORT) || GetPlayer()->IsInUnitState(UNIT_ACTION_CONFUSED) || GetPlayer()->IsTaxiFlying()) return false; break; case CHECK_SPELL: break; case CHECK_QUEST: return false; break; case CHECK_TRANSPORT: if (!isActiveMover()) return false; break; case CHECK_WARDEN: if (!sWorld.getConfig(CONFIG_BOOL_ANTICHEAT_WARDEN)) return false; break; case CHECK_DAMAGE: case CHECK_ITEM: break; default: return false; } if (checktype < 100 ) return true; switch( checktype) { case CHECK_MOVEMENT_SPEED: if (GetMover()->HasAura(56266)) return false; break; case CHECK_MOVEMENT_FLY: case CHECK_MOVEMENT_ZAXIS: if (isCanFly() || !GetMover()) return false; break; case CHECK_MOVEMENT_WATERWALKING: if (!m_currentmovementInfo->HasMovementFlag(MOVEFLAG_WATERWALKING)) return false; break; case CHECK_MOVEMENT_TP2PLANE: if (GetMover()->IsOnTransport()) return false; if (m_currentmovementInfo->HasMovementFlag(MovementFlags(MOVEFLAG_SWIMMING | MOVEFLAG_CAN_FLY | MOVEFLAG_FLYING))) return false; if (GetMover()->HasAura(60068) && GetMover()->GetTerrain()->IsUnderWater(m_currentmovementInfo->GetPos()->x, m_currentmovementInfo->GetPos()->y, m_currentmovementInfo->GetPos()->z-5.0f)) return false; break; case CHECK_MOVEMENT_AIRJUMP: if (isCanFly() || !isActiveMover() || GetMover()->GetTerrain()->IsUnderWater(m_currentmovementInfo->GetPos()->x, m_currentmovementInfo->GetPos()->y, m_currentmovementInfo->GetPos()->z-5.0f)) return false; break; case CHECK_MOVEMENT_TELEPORT: if (!isActiveMover() || GetPlayer()->IsBeingTeleported()) return false; break; case CHECK_MOVEMENT_FALL: if (isCanFly() || !isActiveMover()) return false; break; case CHECK_MOVEMENT_MOUNTAIN: if (isCanFly() || !isActiveMover()) return false; break; default: break; } return true; }