> For the complete documentation index, see [llms.txt](https://sbscripts.gitbook.io/sb-scripts/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sbscripts.gitbook.io/sb-scripts/sb-anticheat/configuration.md).

# Configuration

SB AntiCheat uses a centralised Lua configuration system. The main file is `shared/config.lua`.

| File                         | What it's for                                                                             |
| ---------------------------- | ----------------------------------------------------------------------------------------- |
| `shared/config.lua`          | Main settings: framework, punishments, every detection, anti-spam limits, panel, logging. |
| `shared/models.lua`          | Model lists and the object whitelist.                                                     |
| `shared/trustedresource.lua` | Resources allowed to request short detection bypasses.                                    |
| `shared/safeevents.lua`      | Server events protected from executors.                                                   |
| `server_config.lua`          | Discord webhooks, bot token and screenshot webhook.                                       |
| `locale/*.lua`               | Ban and kick screen text.                                                                 |

> ⚠️ Keep secrets out of `shared/`. Everything in `shared/` is downloaded by every player, so webhook URLs and tokens belong in `server_config.lua`.

```lua
SB = {}

SB.framework    = "qbcore"           -- "qbcore" | "esx" | "standalone"
SB.locale       = "en"             -- "en" | "es" | "de" | "fr" | "pt" | "it"
SB.serverName   = "SB AntiCheat"    -- Shown on ban/kick screens and Discord embeds
SB.debugMode    = false           -- true = detects everyone including whitelisted staff. DISABLE ON PRODUCTION SERVERS
SB.panelCommand = "sbac"          -- In game command to open the admin panel

SB.notifyType = "qb"    -- "qb" | "okok" | "sbnotify"

SB.useTxAdmin = true    -- true = only txAdmin permission holders can use the panel and bypass detections. false = use SB.staffPermissions

SB.staffPermissions = {
    -- "license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
}

SB.playerInfo = {
    showIp        = true,
    showLicense   = true,
    showSteam     = true,
    showFivem     = true,
    showDiscord   = true,
    showCitizenId = true,
}

SB.punishment = {
    action       = "ban",                           -- "log" | "kick" | "ban"  (used when a detection is set to true)
    showReason   = true,
    appealServer = "https://discord.gg/yourserver",
    banByIp      = true,
}

SB.antiResourceStop  = true
SB.antiResourceStart = true

SB.whitelistedResources = {
    "screencapture",
}

SB.screenshots = {
    -- fiveManageToken and webhook are set in server_config.lua
    onDetection     = true,
    periodic        = false,                        -- Leave off on large or slow servers
    periodicEvery   = 60000,
}

-- Discord webhooks and bot token are set in server_config.lua

SB.mustHaveIdentifier = {
    license = true,
    fivem   = true,
    discord = false,
    steam   = false,
}

SB.vpnBlock = {
    enabled  = false,
    checkUrl = "http://ip-api.com/json/%s?fields=proxy,vpn,hosting",
}

SB.heartbeat = {
    sendEvery     = 10000,
    kickAfter     = 30000,
    retries       = 5,
    randomiseName = true,
}

SB.eventFlood = {
    windowMs     = 5000,
    clientEvents = {},    -- ["eventName"] = maxCount
    serverEvents = {},
}

SB.clientChecks = {
    reportCooldown       = 50,
    bannedPeds           = true,
    bannedPedsDelete     = true,
    bannedVehicles       = true,
    bannedVehiclesDelete = true,
    bannedWeapons        = "ban",
    bannedWeaponsRemove  = true,
    bannedPlateText      = true,
    noClip               = true,
    superJump            = true,
    fastRun              = true,
    teleporting          = "log",
    teleportThreshold    = 350,
    godMode              = true,
    objectAttach         = true,
    deadAnims = {
        { "anim@heists@ornate_bank@hostages@hit", "hit_react_die_loop_ped_b" },
        -- { "dict_here", "anim_name_here" },
    },
    damageMod            = true,
    defenseMod           = true,
    explosiveBullets     = true,
    infiniteAmmo         = true,
    infiniteAmmoWhitelist = {
        GetHashKey("weapon_fireextinguisher"),
        GetHashKey("weapon_petrolcan"),
        GetHashKey("weapon_hazardcan"),
    },
    infiniteCombatRoll   = true,
    infiniteStamina      = false,
    magicBullet          = false,
    maxModifier          = 1.15,
    smallPed             = true,
    spectating           = true,
    maxArmour            = -1,
    invisible            = false,
    nightVision          = true,
    thermalVision        = true,
    modMenuNatives       = true,
    tazeCheat            = true,
    fakeWeaponInHand     = true,
    minimap              = false,
    playerBlips          = false,
    plateSwap            = false,
    physicsGun           = false,
    vehicleSpeedCheat    = false,
    vehicleNoClip        = false,
    vehicleTeleport      = true,
    citizenAiFiles       = true,
    protectGlobals       = true,
    godmodeSync          = true,
    superSpeed           = true,
    rapidFire            = false,
    entitySpam           = true,
    networkEventFlood    = true,
    spawnProtectionBypass = true,
    fallingThroughMap    = "log",
    abruptHealthIncrease = true,
    noBleed              = false,
}

SB.serverChecks = {
    bannedExplosionTypes   = true,
    modifiedExplosions     = true,
    blockUnknownExplosions = true,

    useObjectWhitelist     = true,
    nonWhitelistedObject   = "log",
    blacklistedObjects     = "ban",
    blacklistedObjectsDeleteAndPunish = true,

    useBlacklistedObjects  = true,
    blacklistedParticles   = true,

    maxReportsPerWindow    = 3,
    weaponSpawn            = true,
    weaponRemove           = true,
    trainCage              = true,

    moneySpike             = "log",
    moneySpikeAmount       = 500000,
    moneySpikeWindow       = 60,

    resourceInjection      = true,
    invalidModel           = true,
    spectatorAbuse         = true,
    infiniteRagdoll        = false,
    remoteKill             = true,
    godmodeSync            = true,
    menuOpenNative         = true,
}

SB.antiSpam = {
    vehicles             = true,
    peds                 = true,
    objects              = true,
    explosions           = true,
    interval             = 10000,
    maxVehicles          = 6,
    maxPeds              = 8,
    maxObjects           = 5,
    maxExplosions        = 5,
    checkNearbyPlayers   = true,
    nearbyPlayerDistance = 50.0,
    safeExplosionTypes = {
        [0]=true, [2]=true, [3]=true, [6]=true, [7]=true, [8]=true, [9]=true, [10]=true,
        [13]=true, [15]=true, [17]=true, [22]=true, [23]=true, [24]=true, [28]=true,
        [34]=true, [38]=true, [39]=true, [45]=true, [49]=true, [50]=true, [61]=true,
    },
}

SB.screenScan = {
    enabled        = true,
    scanEvery      = 10,
    flagWords = {
        -- Keyword list is defined in shared/config.lua. Add or remove terms there.
    },
}

SB.panel = {
    enabled       = true,
    allowHeal     = true,
    allowRevive   = true,
    allowArmour   = true,
    allowSpectate = true,
    allowKick     = true,
    allowBan      = true,
    allowUnban    = true,
}

SB.logging = {
    logJoins        = true,
    logLeaves       = true,
    logDetections   = true,
    logAdminActions = true,
    logWhitelist    = true,
}
```

> 💡 The full `shared/config.lua` file has every detection and the complete OCR keyword list. Only the main settings are shown here; open the file for the rest.

### Framework

```lua
SB.framework = "qbcore"   -- "qbcore" | "esx" | "standalone"
```

### Server name

```lua
SB.serverName = "SB Roleplay"
```

Shown on ban messages and Discord embeds.

### Language

```lua
SB.locale = "en"
```

Supported: `en`, `es`, `de`, `fr`, `pt`, `it`. Each maps to a file in `locale/`.

### Debug mode

```lua
SB.debugMode = false
```

Debug mode adds console output and detects whitelisted staff too. Turn it on while troubleshooting and leave it off on production servers.
