Esempio n. 1
0
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;
};
Esempio n. 2
0
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;

}
Esempio n. 3
0
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;

}