> For the complete documentation index, see [llms.txt](https://squirrel-bracket.gitbook.io/squirrel-bracket-documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://squirrel-bracket.gitbook.io/squirrel-bracket-documentation/handling-tuning/api.md).

# API

{% hint style="warning" %}
Most export functions are called on client side, unless it has a note saying it's a server export.
{% endhint %}

## Main

### openTablet

```lua
---@param isSmall boolean
exports['sb-handlingtuning']:openTablet(isSmall)
```

### resetHandlingToDefault

```lua
---@param vehicle ?number
exports['sb-handlingtuning']:resetHandlingToDefault(vehicle)
```

### applyHandlingOnVehicle

```lua
---Apply handling data on vehicle entity (does not create new)
---@param vehicle number
---@param handlingData HandlingData
exports['sb-handlingtuning']:applyHandlingOnVehicle(vehicle, handlingData)
```

### assignHandlingToVehicle

```lua
---Assign new handling data to vehicle
---@param vehicle number
---@param handlingData HandlingData
exports['sb-handlingtuning']:assignHandlingToVehicle(vehicle, handlingData)
```

### applyHandlingValue

```lua
---Apply a single value to vehicle handling
---@param vehicle number
---@param key string
---@param value number | vector3
---@param ignoreLimit boolean
exports['sb-handlingtuning']:applyHandlingValue(vehicle, key, value, ignoreLimit)
```

## Additional handlings

With additional handlings you can feel free to express your imagination by modifying vehicle's handling values depending on various conditions or custom tuning parts.

***

### setAdditionalHandling

Allows you to set a new additional handling

{% code overflow="wrap" %}

```lua
---@param vehicle number | nil
---@param slotName string
---@param uniqueId string
---@param metadata table<string | 'enableHandlingFields', any>
---@param save boolean
exports['sb-handlingtuning']:setAdditionalHandling(vehicle, slotName, handlingData, save)
```

{% endcode %}

#### Arguments

* vehicle: `number | nil`
  * Vehicle which the additional handling will be assigned to defaults to vehicle player is sitting in.
* slotName: `string`
  * Used to identify slot. If another additional handling would be installed on the same slot, the old one would get replaced
* uniqueId: `string`
  * Unique id for the handling
* metadata: `table<string | 'enableHandlingFields', any>`
  * Data that will be assigned to the vehicle. Can have handling data `{fSteeringLock = 15.0}`, enable handling fields {`enableHandlingFields = {'fSteeringLock'}}` or any other variable you'd want to assign to the vehicle to use for other scripts `{myVariable = 7.5, myCoolVariable = false}`
* save: `boolean`
  * If you want this handling to be saved in database set this to true

#### Example

<pre class="language-lua" data-overflow="wrap"><code class="lang-lua">RegisterCommand('installmod', function(source, args)
  if args[1] == 'steeringLock' then
    local metadata = {
      <a data-footnote-ref href="#user-content-fn-1">fSteeringLock = 15.0,</a> 
      <a data-footnote-ref href="#user-content-fn-2">enableHandlingFields = {'fSteeringLock'}</a>
    }
    
    exports['sb-handlingtuning']:setAdditionalHandling(
<strong>      <a data-footnote-ref href="#user-content-fn-3">nil</a>,
</strong>      <a data-footnote-ref href="#user-content-fn-4">'steering_lock_kit'</a>,
      <a data-footnote-ref href="#user-content-fn-5">'steering_lock_kit_01'</a>,
      metadata,
      <a data-footnote-ref href="#user-content-fn-6">true</a>
    )
    return
  end
  
  if args[1] == 'engineecu' then
    local metadata = {
      <a data-footnote-ref href="#user-content-fn-7">fInitialDriveForce = {value = 0.2}</a>,
      <a data-footnote-ref href="#user-content-fn-8">enableHandlingFields = {'fInitialDriveForce', 'fInitialDriveMaxFlatVel'}</a>,
    }
    
    local vehicle = GetVehiclePedIsIn(PlayerPedId())
    exports['sb-handlingtuning']:setAdditionalHandling(
      vehicle,
      <a data-footnote-ref href="#user-content-fn-4">'engine_ecu'</a>,
      <a data-footnote-ref href="#user-content-fn-5">'engine_ecu_01'</a>,
      metadata,
      <a data-footnote-ref href="#user-content-fn-6">true</a>,
    )
  end
end
</code></pre>

***

```lua
---@param veh number | nil
---@param slotName string
---@param save boolean
exports['sb-handlingtuning']:removeAdditionalHandling(vehicle, slotName, save)
```

#### Arguments

* vehicle: `number | nil`
  * Vehicle which the additional handling will be assigned to defaults to vehicle player is sitting in.
* slotName: `string`
  * Used to identify slot from which the mod should be removed.
* save: `boolean`
  * If you want this change to be saved in database set this to true

### enableAdditionalHandlings

```lua
---@param vehicle number | nil
exports['sb-handlingtuning']:enableAdditionalHandlings(vehicle)
```

***

### disabledAdditionalHandlings

```lua
---@param vehicle number | nil
exports['sb-handlingtuning']:disabledAdditionalHandlings(vehicle)
```

***

### applyAdditionalHandlings

```lua
---@param vehicle numer | nil
---@param handlings any
exports['sb-handlingtuning']:applyAdditionalHandlings(vehicle, handlings)
```

***

### isAdditionalHandlingSlotEnabled

```lua
---@param slotName any
---@return boolean
exports['sb-handlingtuning']:isAdditionalHandlingSlotEnabled(slotName)
```

***

### isAdditionalHandlingEnabled

```lua
---@param uniqueId any
---@return boolean
exports['sb-handlingtuning']:isAdditionalHandlingEnabled(uniqueId)
```

***

## Engine Swap

Engine swaps allows you to assign handling data from another vehicle that is saved in default handlings

### setVehicleEngineSwap

```lua
---@param vehicle number | nil
---@param modelHash string
exports['sb-handlingtuning']:setVehicleEngineSwap(vehicle, modelHash)
```

***

## Drift

### setDriftMode

```lua
---@param toggle boolean
exports['sb-handlingtuning']:setDriftMode(toggle)
```

### isDriftModeEnabled

```lua
exports['sb-handlingtuning']:isDriftModeEnabled()
```

### getVehicleDifferentialMod

```lua
---Gets vehicle differential mod used for drift mode
---@param vehicle number
---@return 'lsd'|'open'|'welded'
exports['sb-handlingtuning']:getVehicleDifferentialMod(vehicle)
```

### getDriftAngle

```lua
---@param vehicle number
---@return number
exports['sb-handlingtuning']:getSlideAngle(vehicle)
```

### getDriftHeat

```lua
---@return number
exports['sb-handlingtuning']:getDriftHeat()
```

### isDrifting

```lua
---@return boolean
exports['sb-handlingtuning']:getDriftHeat()
```

### resetDataForDrift

```lua
---@param vehicle number | nil
exports['sb-handlingtuning']:resetDataForDrift(vehicle)
```

## Nitro

### setNitro

```lua
---Sets the nitro
---@param value boolean
exports['sb-handlingtuning']:setNitro(value)
```

### toggleNitro

```lua
---Toggles the nitro
---@return boolean
exports['sb-handlingtuning']:toggleNitro()
```

### getNitroTankLevel

```lua
---@param vehicle number
---@return number
exports['sb-handlingtuning']:getNitroTankLevel(vehicle)
```

### getNitroTankSize

```lua
---@param vehicle number
---@return number
exports['sb-handlingtuning']:getNitroTankSize(vehicle)
```

### setNitroTankLevel

```lua
---@param vehicle number
---@param level number
exports['sb-handlingtuning']:setNitroTankLevel(vehicle, level)
```

### saveNitroLevel

```lua
---@param vehicle number
exports['sb-handlingtuning']:saveNitroLevel(vehicle)
```

## Stance

### setFrontCamber

```lua
---@param vehicle number
---@param val number
exports['sb-handlingtuning']:setFrontCamber(vehicle, val)
```

### setRearCamber

```lua
---@param vehicle number
---@param val number
exports['sb-handlingtuning']:setRearCamber(vehicle, val)
```

### setFrontWheelOffset

```lua
---@param vehicle number
---@param val number
exports['sb-handlingtuning']:setFrontWheelOffset(vehicle, val)
```

### setRearWheelsOffset

```lua
---@param vehicle number
---@param val number
exports['sb-handlingtuning']:setRearWheelsOffset(vehicle, val)
```

## Types

### HandlingData

```lua
---@class HandlingData
---@field fSuspensionCompDamp { value: number }
---@field vecCentreOfMassOffset { value: { x: number, y: number, z: number } }
---@field fSuspensionReboundDamp { value: number }

---@type table<string, HandlingData>

local handling = {
    -- Example entry
    --[[
    "fSuspensionCompDamp": {
        "value": 1.4,
    },
    "vecCentreOfMassOffset": {
        "value": {
            "x": 0.0,
            "y": 0.0,
            "z": -0.2
        },
    },
    "fSuspensionReboundDamp": {
        "value": 2.5,
    }
    ]]
}
```

[^1]: Increases steering lock by 15 degrees.

[^2]: Makes fSteeringLock to be adjustable in tablet if it is disabled by default in `Config.DisabledFields`

[^3]: If vehicle is nil it will default to vehicle that player ped is in.

[^4]: Mod installation slot, if another mod with the same slot name is installed, this one will be replaced.

[^5]: Unique identifier

[^6]: Makes the mod to be saved in database identified by license plate

[^7]: Increases driving force by 0.2

[^8]: Enables driving force and max flat velocity to be adjustable in tablet if it is disabled by default.
