# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://squirrel-bracket.gitbook.io/squirrel-bracket-documentation/handling-tuning/api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
