# Introduction

The Official Mosoto Scripts Documentation

***

## About Us

We have four years of programming experience who learn and get better every day. We love FiveM and we are here to improve the quality of user experience on your servers.

Our carefully crafted scripts are intended to provide high quality, uncompromising optimization and true realism. Up to this point, we have invested considerable effort, time and money into each script to make it different and better than similar scripts on the FiveM market.

In just one year, our community has grown significantly. If you're interested in our work, we highly recommend you join our [**Discord**](https://discord.mosotoscripts.com), as it's where you'll find the most up-to-date information about our scripts, as well as new ideas for interesting future products that you're unlikely to find anywhere else.

## Support Service

We offer daily operational support in relation to all questions and problems of our customers. Support is provided to users who have purchased our scripts from our official site [**mosotoscripts.com**](https://www.mosotoscripts.com) and who have the role "**Customer**" in our [**Discord**](https://discord.mosotoscripts.com). (In case you don't have this role, claim it in #role-claim channel)

**Note:** Support is limited to our products and assumes basic Lua knowledge. Please review the documentation, installation steps, common issues, and error codes before opening a ticket. We do not provide coding lessons, remote installations, repeated installations on new servers, customization support, or assistance with third-party or leaked content. Most issues are caused by installation or configuration mistakes rather than bugs, so please remain patient and respectful when contacting support.

*\*We reserve the right to **DENY** support to every customer and non-customer in case they are not following our guidelines and are not being well-mannered.*

## Refund Policy

After careful consideration, we no longer offer refunds after a purchase has been made.\
This change has been introduced to ensure stability and deliver the highest quality of service to all our customers.

For those who would like to try the product first, we offer **subscription plans**, which allow you to test it without a long-term obligation.

Our team will do **everything in our power** to ensure your script runs smoothly and without issues. If you encounter any problems, please open a ticket in our [**Discord**](https://discord.mosotoscripts.com) - we will respond **promptly** and assist you **until everything is resolved**.


# FiveM Escrow

The FiveM asset escrow system protects assets by encrypting essential files, ensuring exclusive Mosoto Scripts content remains safe from unauthorized access or changes.

***

## Common Errors

<details>

<summary>Error parsing script... syntax error near &#x3C;\1></summary>

**Example:**

{% code fullWidth="false" %}

```
[script:mst_example] Error parsing script @mst_example/server/sv-impound.lua in resource mst_example: @mst_example/server/sv-impound.lua:1: syntax error near '<\1>'
[c-scripting-core] Failed to load script server/sv-impound.lua.
```

{% endcode %}

**Solutions:**

* Your server artifacts are too old, the minimum version is **5181** ([**Windows**](https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/) - [**Linux**](https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/))
* You are using **FileZilla** and files have been corrupted during transfer - try using an alternative FTP client such as [**WinSCP**](https://winscp.net/)

</details>

<details>

<summary>Failed to verify protected resource</summary>

**Example:**

```
[svadhesive] Failed to verify protected resource mst_example
```

**Solutions:**

* You don't have `.fxap` file in the script folder - try installing the script again
* You are using **FileZilla** and files have been corrupted during transfer - try using an alternative FTP client such as [WinSCP](https://winscp.net/)

</details>

<details>

<summary>You lack the required entitlement</summary>

**Example:**

```
You lack the required entitlement to use mst_example
```

**How it works?**\
\
In order to work, the script must be run in a server which is using a server key created by the **same** FiveM account you used when purchasing the script.\
\
So, you have to create a server key here -> [**Portal**](https://portal.cfx.re/servers/registration-keys)

The generated server key will look similar to this one:

```
sv_licenseKey "cfxk_xxxxxxxxxxxxxxxxxxxx_xxxxxx"
```

</details>


# Discord Roles

A quick step-by-step guide on how to get your Discord roles after purchase/

***

{% hint style="warning" %}
Only the original buyer of the resource(s) is allowed to claim the Discord roles. Developers, co-owners, or any third parties must not claim roles for purchases they did not personally make.
{% endhint %}

{% stepper %}
{% step %}

### Join our [Discord](https://discord.gg/mosotoscripts)

Need help, updates, or direct support from our team?

Join our community to stay ahead with the latest Mosoto Scripts news, exclusive releases, and important announcements.

You’ll also get access to giveaways, private customer discussions, and extra resources available only to members.
{% endstep %}

{% step %}

### Claim your customer roles

After verifying in our Discord, please go to the **#role-claim** channel where you can claim the roles assigned to your purchase.

With these roles, you will gain access to our support services, receive updates on every release, and get exclusive perks such as private giveaways and more.

To claim your customer role, click the **“Get Customer Role”** button. A modal will appear where you need to enter your **tbx-id** to complete the process.

If you don’t know your **transaction ID**, you can find it [**here**](https://checkout.tebex.io/payment-history)**.**

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2F8MVEvcWBiqPdjyUj8sO1%2Fclaimroles.jpg?alt=media&amp;token=3ec1e435-2575-4ebb-a6db-5824b0423b5e" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2F9Ov2EeqSJBVCY8k8qYDm%2Ftbxid.jpg?alt=media&amp;token=8b4a1478-d615-4c8b-878d-77e36d14eee7" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}


# Register Key Mapping

A step-by-step guide on how to properly configure and register your key mapping through our instructions.

***

## What is Key Mapping?

We have chosen to use the FiveM native **RegisterKeyMapping**, as it removes the need for constant while-loop checks for keypresses every frame. This results in a more optimized and performance-friendly resource.

This native works by triggering a registered chat command whenever the assigned keybind is pressed. It also allows each player to customize their own key bindings directly in-game.

To adjust your keybinds, go to **GTA V Settings > Key Bindings > FiveM**.

## How to Unbind Keys?

* `unbind keyboard` [input](https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/) in F8 console.
* Search for **%appdata%** in your Windows search bar and open it.
  * Go to CitizenFX -> fivem.cfg
    * Remove the lines you want
      * Restart FiveM

**Note:** There is no way to mass unbind keys for all of your server's players.


# Bridge

The Bridge is the core system behind all Mosoto Scripts, designed to simplify access to our resources and streamline configuration. It includes essential modules for easier script integrations.

***

Mosoto Bridge is the core system behind all Mosoto Scripts, built to provide a unified and optimized foundation for our entire ecosystem. It handles essential backend logic such as framework detection, shared configurations, and resource management, ensuring that all scripts work together seamlessly without unnecessary setup or duplication.

The bridge is designed to simplify both installation and customization, giving server owners a clean and structured way to manage all Mosoto's resources in one place. It automatically supports compatible scripts and ensures consistent behavior across different frameworks and server setups.

### Integrations

Take a look of them [**here**](/scripts/mst_bridge/integrations)**.**


# Installation

If you aren't familiar with programming or just you don't know how to set up the script, we present our installation guide which is as comprehensive as possible so you don't have any difficulties.

***

{% stepper %}
{% step %}

### Download

Download **mst\_bridge** from [**Portal**](https://portal.cfx.re/assets/granted-assets).
{% endstep %}

{% step %}

### Dependencies

[**ox\_lib**](https://github.com/overextended/ox_lib/releases/)

[**oxmysql**](https://github.com/overextended/oxmysql/releases/)
{% endstep %}

{% step %}

### Resources Order

{% hint style="warning" %}
mst\_bridge must be at the bottom of your server.cfg, so it can auto-detects all modules! Take a look of the example.
{% endhint %}

<pre class="language-markdown" data-title="SERVER.CFG"><code class="lang-markdown">ensure es_extended/qb-core/qbx_core
ensure oxmysql
ensure ox_lib

ensure inventory
ensure phone
ensure clothing
ensure banking
ensure fuel
ensure target

<strong>ensure mst_bridge
</strong></code></pre>

{% endstep %}

{% step %}

### Configuration

Go to **mst\_bridge/config.lua** and review all available configurable options.&#x20;

There you can find **Config.Language** which controls the language of all of our scripts, so you should change it only once.

We provide a configuration for **VersionCheck**, so you can be informed always when there is something new. We recommend you to leave it **true**.

Take a look of all modules that are integrated and choose yours. If it doesn't exist, you can ask us in our [**Discord**](https://discord.gg/mosotoscripts) to add it or you can do it through **mst\_bridge/modules** if you have basic programming knowledge.
{% endstep %}
{% endstepper %}


# Configurations

All Mosoto scripts are fully editable and customizable to match your server’s style, rules, and balance.

***

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FXhMLC1geTQgXRZH0leBs%2Fbridgeconfig.png?alt=media&amp;token=8fb33c26-c2e1-4101-ba19-9e0ca8881cf7" alt=""><figcaption><p>config.lua</p></figcaption></figure>


# Integrations

Explore integrations that connect your resources with our bridge.

***

## Framework

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>ESX</td><td>true</td></tr><tr><td>QBCore</td><td>true</td></tr><tr><td>Qbox</td><td>true</td></tr><tr><td>ND</td><td>true</td></tr><tr><td>OX</td><td>true</td></tr></tbody></table>

***

## Inventory

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>ak47_inventory</td><td>true</td></tr><tr><td>chezza-inventory</td><td>true</td></tr><tr><td>codem-inventory</td><td>true</td></tr><tr><td>core_inventory</td><td>true</td></tr><tr><td>jaksam_inventory</td><td>true</td></tr><tr><td>jpr-inventory</td><td>true</td></tr><tr><td>one_inventory</td><td>true</td></tr><tr><td>origen_inventory</td><td>true</td></tr><tr><td>ox_inventory</td><td>true</td></tr><tr><td>ps-inventory</td><td>true</td></tr><tr><td>qb-inventory</td><td>true</td></tr><tr><td>qs-inventory</td><td>true</td></tr><tr><td>tgiann-inventory</td><td>true</td></tr></tbody></table>

***

## Phone

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>17mov_Phone</td><td>true</td></tr><tr><td>codem-phone</td><td>true</td></tr><tr><td>gksphone</td><td>true</td></tr><tr><td>lb-phone</td><td>true</td></tr><tr><td>okokPhone</td><td>true</td></tr><tr><td>qb-phone</td><td>true</td></tr><tr><td>qs-smartphone-pro</td><td>true</td></tr><tr><td>roadphone</td><td>true</td></tr><tr><td>yseries</td><td>true</td></tr></tbody></table>

***

## Target

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>ContextMenu</td><td>true</td></tr><tr><td>core_focus</td><td>true</td></tr><tr><td>ox_target</td><td>true</td></tr><tr><td>qb-target</td><td>true</td></tr><tr><td>sleepless_interact</td><td>true</td></tr></tbody></table>

***

## Notifications

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>es_extended</td><td>true</td></tr><tr><td>qb-core</td><td>true</td></tr><tr><td>ox_lib</td><td>true</td></tr><tr><td>17mov_Hud</td><td>true</td></tr><tr><td>cd_notifications</td><td>true</td></tr><tr><td>brutal_notify</td><td>true</td></tr><tr><td>g-notifications</td><td>true</td></tr><tr><td>is_ui</td><td>true</td></tr><tr><td>lation_ui</td><td>true</td></tr><tr><td>mNotification</td><td>true</td></tr><tr><td>mythic_notify</td><td>true</td></tr><tr><td>okokNotify</td><td>true</td></tr><tr><td>origen_notify</td><td>true</td></tr><tr><td>pNotify</td><td>true</td></tr><tr><td>ps-ui</td><td>true</td></tr><tr><td>rtx_notify</td><td>true</td></tr><tr><td>tgiann-lumihud</td><td>true</td></tr><tr><td>vms_notifyv2</td><td>true</td></tr><tr><td>wasabi_notify</td><td>true</td></tr><tr><td>ZSX_UIV2</td><td>true</td></tr></tbody></table>

***

## Clothing

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>esx_skin</td><td>true</td></tr><tr><td>qb-clothing</td><td>true</td></tr><tr><td>crm-appearance</td><td>true</td></tr><tr><td>fivem-appearance</td><td>true</td></tr><tr><td>illenium-appearance</td><td>true</td></tr><tr><td>p_appearance</td><td>true</td></tr><tr><td>rcore_clothing</td><td>true</td></tr><tr><td>st_clothing</td><td>true</td></tr><tr><td>tgiann-clothing</td><td>true</td></tr><tr><td>qs-appearance</td><td>true</td></tr></tbody></table>

## Vehicle Keys

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>mst_vehiclekeys <strong>(Recommended)</strong></td><td>true</td></tr><tr><td>qb-vehiclekeys</td><td>true</td></tr><tr><td>qbx_vehiclekeys</td><td>true</td></tr><tr><td>0r-vehiclekeys</td><td>true</td></tr><tr><td>ak47_vehiclekeys</td><td>true</td></tr><tr><td>brutal_carkeys</td><td>true</td></tr><tr><td>cd_garage</td><td>true</td></tr><tr><td>F_RealCarKeysSystem</td><td>true</td></tr><tr><td>ic3d_vehiclekeys</td><td>true</td></tr><tr><td>is_carkeys</td><td>true</td></tr><tr><td>jaksams_VehicleKeys</td><td>true</td></tr><tr><td>jc_vehiclekeys</td><td>true</td></tr><tr><td>LifeSaver_KeySystem</td><td>true</td></tr><tr><td>mani-keys</td><td>true</td></tr><tr><td>mk_vehiclekeys</td><td>true</td></tr><tr><td>mm_carkeys</td><td>true</td></tr><tr><td>MrNewbVehicleKeys</td><td>true</td></tr><tr><td>mVehicle</td><td>true</td></tr><tr><td>okokGarage</td><td>true</td></tr><tr><td>p_vehiclekeys</td><td>true</td></tr><tr><td>rd_vehiclekeys</td><td>true</td></tr><tr><td>Renewed-Vehiclekeys</td><td>true</td></tr><tr><td>sna-vehiclekeys</td><td>true</td></tr><tr><td>t1ger_keys</td><td>true</td></tr><tr><td>tgiann-hotwire</td><td>true</td></tr><tr><td>wasabi_carlock</td><td>true</td></tr><tr><td>qs-vehiclekeys</td><td>true</td></tr></tbody></table>

***

## Dispatch

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>0r-dispatch</td><td>true</td></tr><tr><td>cd_dispatch</td><td>true</td></tr><tr><td>cd_dispatch3d</td><td>true</td></tr><tr><td>core_dispatch</td><td>true</td></tr><tr><td>kartik-mdt</td><td>true</td></tr><tr><td>lb-tablet</td><td>true</td></tr><tr><td>op-dispatch</td><td>true</td></tr><tr><td>origen_police</td><td>true</td></tr><tr><td>ps-dispatch</td><td>true</td></tr><tr><td>rcore_dispatch</td><td>true</td></tr><tr><td>tgiann-policealert</td><td>true</td></tr><tr><td>tk_dispatch</td><td>true</td></tr><tr><td>wasabi_mdt</td><td>true</td></tr><tr><td>qf_mdt</td><td>true</td></tr><tr><td>qs-dispatch</td><td>true</td></tr></tbody></table>

***

## Progressbar

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>esx_progressbar</td><td>true</td></tr><tr><td>progressbar</td><td>true</td></tr><tr><td>ox_lib</td><td>true</td></tr><tr><td>ks-progressbar</td><td>true</td></tr><tr><td>lation_ui</td><td>true</td></tr><tr><td>wasabi_uikit</td><td>true</td></tr><tr><td>qs-interface</td><td>true</td></tr></tbody></table>

***

## Banking

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>esx_addonaccount</td><td>true</td></tr><tr><td>qb-banking</td><td>true</td></tr><tr><td>crm-banking</td><td>true</td></tr><tr><td>fd_banking</td><td>true</td></tr><tr><td>kartik-banking</td><td>true</td></tr><tr><td>nfs-banking</td><td>true</td></tr><tr><td>okokBanking</td><td>true</td></tr><tr><td>p_banking</td><td>true</td></tr><tr><td>prism_banking</td><td>true</td></tr><tr><td>Renewed-Banking</td><td>true</td></tr><tr><td>RxBanking</td><td>true</td></tr><tr><td>snipe-banking</td><td>true</td></tr><tr><td>tgg-banking</td><td>true</td></tr><tr><td>tgiann-bank</td><td>true</td></tr><tr><td>wasabi_banking</td><td>true</td></tr><tr><td>qs-banking</td><td>true</td></tr></tbody></table>

***

## Boss Menu

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>esx_society</td><td>true</td></tr><tr><td>qb-management</td><td>true</td></tr><tr><td>qbx_management</td><td>true</td></tr><tr><td>codem-bossmenu</td><td>true</td></tr><tr><td>g-bossmenu</td><td>true</td></tr><tr><td>neon-bossmenu</td><td>true</td></tr><tr><td>tk_bosstablet</td><td>true</td></tr><tr><td>okokBossMenu</td><td>true</td></tr><tr><td>vms_bossmenu</td><td>true</td></tr><tr><td>xnr-bossmenu</td><td>true</td></tr></tbody></table>

***

## Fuel

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>LegacyFuel</td><td>true</td></tr><tr><td>ox_fuel</td><td>true</td></tr><tr><td>qb-fuel</td><td>true</td></tr><tr><td>BigDaddy-Fuel</td><td>true</td></tr><tr><td>cdn-fuel</td><td>true</td></tr><tr><td>esx-sna-fuel</td><td>true</td></tr><tr><td>lc_fuel</td><td>true</td></tr><tr><td>lyre_fuel</td><td>true</td></tr><tr><td>mnr_fuel</td><td>true</td></tr><tr><td>myFuel</td><td>true</td></tr><tr><td>ND_Fuel</td><td>true</td></tr><tr><td>okokGasStation</td><td>true</td></tr><tr><td>ps-fuel</td><td>true</td></tr><tr><td>rcore_fuel</td><td>true</td></tr><tr><td>Renewed-Fuel</td><td>true</td></tr><tr><td>ti_fuel</td><td>true</td></tr><tr><td>x-fuel</td><td>true</td></tr><tr><td>qs-fuelstations</td><td>true</td></tr></tbody></table>

***

## TextUI

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>esx_textui</td><td>true</td></tr><tr><td>qb-core</td><td>true</td></tr><tr><td>ox_lib</td><td>true</td></tr><tr><td>cd_drawtextui</td><td>true</td></tr><tr><td>jg-textui</td><td>true</td></tr><tr><td>lation_ui</td><td>true</td></tr><tr><td>okokTextUI</td><td>true</td></tr><tr><td>ps-ui</td><td>true</td></tr><tr><td>tgiann-core</td><td>true</td></tr></tbody></table>

***

## Doorlock

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>ox_doorlock</td><td>true</td></tr><tr><td>qb-doorlock</td><td>true</td></tr><tr><td>rcore_doorlock</td><td>true</td></tr></tbody></table>

***

## Weather

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>qb-weathersync</td><td>true</td></tr><tr><td>cd_easytime</td><td>true</td></tr><tr><td>Renewed-Weathersync</td><td>true</td></tr><tr><td>vSync</td><td>true</td></tr></tbody></table>

***

## Input & Menu

<table><thead><tr><th width="522">Script Name</th><th data-type="checkbox">Compatibility</th></tr></thead><tbody><tr><td>qb-input</td><td>true</td></tr><tr><td>ox_lib</td><td>true</td></tr><tr><td>lation_ui</td><td>true</td></tr></tbody></table>


# Common Issues

Here you’ll find the most common problems users run into - along with simple solutions, so you can get back on track fast.

***


# Taxi Job

Take your taxi roleplay to the next level with the Mosoto Taxi Job, from purchasing a company, to taking orders, building progression, and managing employees.

***

### Features

**Core**

* **Dual Job Modes -** Choose between **business mode** with company ownership, employees, and management tools, or **freelance mode** where any player can drive a taxi.
* **In-Game Company Purchase -** A taxi business can be purchased directly through an NPC at the MLO. Players choose their **company name**, pay the price in cash or bank, and instantly become the boss.
* **Wardrobe & Job Outfits -** Per-company male and female job outfits with **full clothing** component support (jacket, shirt, arms, legs, shoes, mask, glasses, watches, bracelets, helmet, decals).
* **Personal Locker & Company Stash** - Each driver gets a **private locker** and the company has a **shared stash**.

**Driver Tablet & Orders**

* **Driver Tablet** - A tablet with tabs for **Summary**, **Dispatch**, **Vehicles**, **Statistics**, **History**, **Leaderboard**, **Challenges**, **Management**, and **Settings**.
* **Vehicle Rentals** - Drivers rent taxis from the tablet with **1-day**, **3-day**, **1-week**, and **2-week** rental plans.
* **Persistent Fuel & Damage** - Vehicles **consistently** track **fuel level**, **body damage**, **deformation**, encouraging **careful** driving.
* **Region-Based Dispatch** - Orders are spawned based on **17 configurable polygon-defined regions** (Los Santos Airport, Vinewood, Sandy Shores, Paleto Bay, and more), each with level requirements.
* **Hybrid Order System** - Dispatch combines generated **NPC** passenger orders and real player ride requests into one **unified feed**.
* **Phone App Integration** - Optional mobile app integration compatible with **the most widely used FiveM phones** (lb-phone, lb-tablet, yseries, 17mov-phone, okokPhone, codem-phone, gksphone, qs-phone), letting players request rides **directly** from their **in-game** phone.
* **Detailed Order Info** - Every order includes **pickup location**, **destination**, **distance**, **ETA** and **passenger notes**, making the dispatch feel like a **real transport network**.
* **Passenger Luggage** - Passengers can carry **physical luggage props** (boxes, airport bags) that are visibly placed into the trunk.
* **Forgotten Items** - Passengers can leave items behind on the seat after a ride - cash, joints, phones, food, lockpicks with full prop attachment, animations, and configurable chance/quantity per item.

**Taximeter**

* **Physical Taximeter Item** - Drivers can use a configurable taximeter item that they can mount on any rented taxi.
* **Taximeter Pricing** - The meter calculates fares using **initial fee**, **per-distance** and **per-minute**, automatically switches between **day** and **night tariffs** based on in-game time, with **separate pricing** for each.
* **Printed Receipts** - The taximeter can print a **receipt item with metadata** after each ride, consuming a **receipt-roll** item as printing material.
* **Ride History** - It stores a complete history.

**Rating System**

* **Multi-Factor Passenger Rating** - Drivers can receive **1–5 ratings** based on real driving behaviour like **late arrival**, **crashes**, **speeding**, **vehicle dirt**, **vehicle damage**, **air conditioning discomfort**, and **receipt refusal** - every factor is independently **toggleable** and **tunable**.

**Progression**

* **Level & XP System** - Driver progression with a configurable **XP curve**, **per-distance** XP rewards, and **rating-based** XP multipliers.
* **Daily Login Rewards** - Taxi drivers can claim **daily rewards** with streak bonuses up to **6+ prizes**.
* **Challenges** - The challenge system ships **with 30+** pre-configured challenges across types: **ride count**, **region rides**, **vehicle-class rides**, **distance driven**, **ride duration**, **profit, rating**, **day/night shifts**, **etc**.
* **XP & Money Boosts** - **Time-limited percentage boosts** that stack from **challenges**, **daily rewards**, and **rentals** - drivers can chase active boosts to **maximize earnings**.

**Business Management**

* **Boss Tablet Management Tab** - Boss grades get a dedicated **Management** tab to **hire**, **fire**, and **grade employees**, **oversee finances**, and **communicate with staff**.
* **Configurable Grade System** - Grade structure with **custom salaries**, **boss permission flag**, and live grade **reordering**.
* **Salary System** - Optional configuration for **salary payouts** from the **company's own balance**.
* **Company Vehicle Lease** - **Periodic lease** deductions from the company balance for the fleet, creating ongoing business **overhead**.
* **Employee Bonuses** - Bosses **can directly send bonuses** to **specific employees** from the **company balance**.
* **Company Balance Transfers** - Bosses can **deposit** and **withdraw** from the **company balance** through the **Overview** tab.
* **Built-In Messaging** - Internal company **news** and **messaging system** to communicate with staff **directly through the tablet**.

**Customizations**

* **Color Palettes** - **15 ready-made** tablet color themes **fully configurable**.
* **Mosoto Seatbelt Integration** - Optional integration that makes passengers automatically **buckle** on entry and **unbuckle** on payment.
* **Interaction Method** - Choose between **target**, **textui**, or **helptext**. It is recommended to use a **target** for even **more realism**.
* **And more in the configuration files!**

### Preview

{% embed url="<https://www.youtube.com/watch?v=N_VFgm44PIQ>" %}


# Installation

If you aren't familiar with programming or just you don't know how to set up the script, we present our installation guide which is as comprehensive as possible so you don't have any difficulties.

***

## STEP 1 - Download

* Download **mst\_taxijob** and **mst\_bridge** from [Portal](https://portal.cfx.re/assets/granted-assets).

## STEP 2 - Dependencies

{% hint style="info" %}
The script requires dependencies to function properly.
{% endhint %}

**Required:**

* [es\_extended](https://github.com/esx-framework/esx_core/tree/main/%5Bcore%5D/es_extended) or [qb-core](https://github.com/qbcore-framework/qb-core) or [qbx\_core](https://github.com/Qbox-project/qbx_core)
* [mst\_bridge](https://portal.cfx.re/assets/granted-assets)
* [oxmysql](https://github.com/overextended/oxmysql)
* [ox\_lib](https://github.com/communityox/ox_lib/releases)

**Optional:**

* mst\_seatbelt
* mst\_taxivehicles
* [VehicleDeformation](https://github.com/Kiminaze/VehicleDeformation)
* Phone (lb-phone, lb-tablet, yseries, gks-phone, 17Mov\_Phone, codem-phone, okokPhone, qs-smartphone)<br>

## STEP 3 - Resources order

{% hint style="warning" %}
It is recommended that the resources be at the end of the server.cfg
{% endhint %}

<pre class="language-markdown" data-title="SERVER.CFG"><code class="lang-markdown">ensure es_extended/qb-core/qbx_core
ensure oxmysql
ensure ox_lib

ensure inventory
ensure phone
ensure clothing
ensure banking
ensure fuel
ensure target

ensure VehicleDeformation
ensure mst_seatbelt

<strong>ensure mst_bridge
</strong><strong>ensure mst_taxijob
</strong><strong>ensure mst_taxijob_yourPhoneApp
</strong><strong>ensure mst_taxivehicles
</strong></code></pre>

## STEP 4 - Setting up items

{% hint style="danger" %}
Without adding these items to the database, the script will not work!
{% endhint %}

{% tabs %}
{% tab title="MySQL" %}

```sql
DELETE FROM items WHERE name = 'taxitablet';
DELETE FROM items WHERE name = 'taximeter';
DELETE FROM items WHERE name = 'receiptroll';
DELETE FROM items WHERE name = 'receipt';

INSERT INTO `items` (`name`, `label`, `weight`) VALUES
	('taxitablet', 'Taxi Tablet', 1),
	('taximeter', 'Taxi Meter', 1),
	('receiptroll', 'Receipt Roll', 1),
	('receipt', 'Receipt', 1)
;
```

{% endtab %}

{% tab title="QB" %}

```lua
taxitablet     = { name = 'taxitablet',     label = 'Taxi Tablet',  weight = 500, type = 'item', image = 'taxitablet.png',  unique = true,  useable = true,  shouldClose = true, description = 'A driver tablet for managing your taxi job - dispatch, vehicles, stats, rewards and more' },
taximeter      = { name = 'taximeter',      label = 'Taximeter',    weight = 800, type = 'item', image = 'taximeter.png',   unique = false, useable = true,  shouldClose = true, description = 'A physical taximeter device that mounts on your dashboard to calculate fares' },
receiptroll    = { name = 'receiptroll',    label = 'Receipt Roll', weight = 50,  type = 'item', image = 'receiptroll.png', unique = false, useable = true,  shouldClose = true, description = 'A paper roll used to refill the taximeter receipt printer' },
receipt        = { name = 'receipt',        label = 'Receipt',      weight = 1,   type = 'item', image = 'receipt.png',     unique = true,  useable = false, shouldClose = true, description = 'A printed receipt with ride details and fare information' },
```

{% endtab %}

{% tab title="OX" %}

```lua
['taxitablet'] = {
    label = 'Taxi Tablet',
    weight = 500,
    stack = false,
    close = true,
    description = 'A driver tablet for managing your taxi job - dispatch, vehicles, stats, rewards and more',
    client = {
        image = 'taxitablet.png'
    }
},

['taximeter'] = {
    label = 'Taximeter',
    weight = 800,
    stack = true,
    close = true,
    description = 'A physical taximeter device that mounts on your dashboard to calculate fares',
    client = {
        image = 'taximeter.png'
    }
},

['receiptroll'] = {
    label = 'Receipt Roll',
    weight = 50,
    stack = true,
    close = true,
    description = 'A paper roll used to refill the taximeter receipt printer',
    client = {
        image = 'receiptroll.png'
    }
},

['receipt'] = {
    label = 'Receipt',
    weight = 1,
    stack = false,
    close = true,
    description = 'A printed receipt with ride details and fare information',
    client = {
        image = 'receipt.png'
    }
},
```

{% endtab %}

{% tab title="TGIANN" %}
{% code fullWidth="false" %}

```lua
taxitablet = { label = "Taxi Tablet", weight = 500, type = "item", image = "taxitablet.png", unique = true, useable = true, shouldClose = true, description = "A driver tablet for managing your taxi job - dispatch, vehicles, stats, rewards and more" },
taximeter = { label = "Taximeter", weight = 800, type = "item", image = "taximeter.png", unique = false, useable = true, shouldClose = true, description = "A physical taximeter device that mounts on your dashboard to calculate fares" },
receiptroll = { label = "Receipt Roll", weight = 50, type = "item", image = "receiptroll.png", unique = false, useable = true, shouldClose = true, description = "A paper roll used to refill the taximeter receipt printer" },
receipt = { label = "Receipt", weight = 1, type = "item", image = "receipt.png", unique = true, useable = false, shouldClose = true, description = "A printed receipt with ride details and fare information" },
```

{% endcode %}
{% endtab %}
{% endtabs %}

## STEP 5 - Remove Other Taxi Jobs

{% hint style="info" %}
For the script to run without any problems, there should be no other resources connected to the taxi job.
{% endhint %}

{% tabs %}
{% tab title="ESX" %}
Remove **esx\_taxijob** resource.
{% endtab %}

{% tab title="QBCore" %}
Remove **qb\_taxijob** resource.
{% endtab %}

{% tab title="Qbox" %}
Remove **qbx\_taxijob** resource.
{% endtab %}
{% endtabs %}

## STEP 6 - Not working?

We hope you won’t need this step, but if you do, feel free to join our [**Discord**](https://discord.mosotoscripts.com) and open a support ticket. :)


# Configurations

All Mosoto scripts are fully editable and customizable to match your server’s style, rules, and balance.

***

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FrnDDMOx8wV0GweSKLnwo%2Fconfig.png?alt=media&amp;token=6b089af7-18b6-4b6e-bad7-f0707ade53e2" alt=""><figcaption><p>config.lua</p></figcaption></figure>

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FrWF9Y9IWaKyTN2wWPvxo%2Fconfigvehicles.png?alt=media&amp;token=f4a4a157-0550-4bd6-8510-b58591bb0af8" alt=""><figcaption><p>config_vehicles.lua</p></figcaption></figure>

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2Ft6hL87piqWEVnKy7CZ7o%2Fconfigtaximeter.png?alt=media&amp;token=3a9e7256-9ed4-4991-a661-0a1248551656" alt=""><figcaption><p>config_taximeter.lua</p></figcaption></figure>

COMING SOON MORE!


# Exports & Events

This section contains all the exports provided by the script. For best results, make changes with someone knowledgeable in Lua to prevent errors.

***


# Integrations

Explore integrations that connect your resources with ours.

***


# Common Issues

Here you’ll find the most common problems users run into - along with simple solutions, so you can get back on track fast.

***


# Crypto

Mosoto Crypto transforms crypto mining into a complete gameplay experience - where players build, manage, and grow their own mining empire.

***

Create modular PCs and mining rigs from the ground up, with fully visual components, interactive assembly, and upgrades that make every step of your progression feel rewarding.

Designed around K4MB1's Hideouts and Operations, Mosoto Crypto brings mining setups into immersive environments built specifically for this experience. Players can build inside K4MB1 locations, supported housing systems, or custom server-defined zones.

### Features

**Core**

* **Crypto Mining Empire -** Build, manage, and expand your **own cryptocurrency mining operation** from the ground up.
* **K4MB1 Collaboration -** Developed in **collaboration with K4MB1**, combining Mosoto's systems with **high-quality props, interiors, Hideouts, and Operations** designed specifically for the mining experience.
* **Modular Mining Rigs -** Create fully modular **PCs and mining rigs** by installing individual components and upgrading your hardware as your operation grows.
* **Interactive Assembly -** Build machines through **interactive installation minigames** with fully visual components and immersive assembly mechanics.
* **Custom Locations -** Build your mining operation inside **K4MB1 locations**, supported housing systems, or **custom server-defined zones**.
* **Persistent Mining Operation -** Your mining network continues operating **24/7**, generating progress and earnings even while you are away.

**Cryptora**

* **Cryptora Management Software -** Manage your entire mining empire through **Cryptora**, including machines, earnings, portfolio, market data, hashrate, power usage, and expenses.
* **Account System -** Create your own **Cryptora account** and securely protect your mining progress.
* **Password Recovery -** Forgotten your password? Recover your account using a **verification code sent directly to your phone**.
* **Dashboard -** Get a complete overview of your operation with **profits**, **portfolio value**, **market prices**, **hashrate**, **power consumption**, and **operating expenses**.
* **Machine Management -** Monitor every connected machine with detailed information about **performance**, **hashrate**, **power usage**, **temperatures**, **hardware**, and **running costs**.

**Cryptocurrency Economy**

* **Multiple Cryptocurrencies -** Mine and manage **multiple cryptocurrencies**, each with its own **difficulty** and **market value**.
* **Hashrate Distribution -** Freely distribute your available **hashrate across different cryptocurrencies** and adjust your strategy as market conditions change.
* **Dynamic Market -** Follow **live cryptocurrency prices** and adapt your mining strategy around constantly changing market conditions.
* **Crypto Trading -** Buy and sell cryptocurrencies directly through **Cryptora**.
* **Limit Orders -** Create **automatic limit orders** that execute when your chosen target price is reached.
* **Wallet & Portfolio -** Track your **crypto wallet**, holdings, portfolio value, transactions, and overall performance.
* **Transaction History -** Review your complete **trading and transaction history** directly from Cryptora.

**Hardware & Progression**

* **Fully Modular Hardware -** Build machines using individual **GPUs, CPUs, motherboards, RAM, power supplies, cooling components, and more**.
* **Hardware Upgrades -** Upgrade individual components to improve **hashrate, efficiency, stability, and overall profitability**.
* **Hardware Catalogue -** Compare available hardware through the **Catalogue** and plan your next upgrade based on performance and costs.
* **Component Management -** Every component affects your operation, making **hardware selection and configuration** an important part of progression.
* **Thermal Management -** Monitor **component temperatures** and manage cooling to keep your machines running efficiently.

**Power & Risk**

* **Power Consumption -** Every machine consumes power based on its hardware configuration and workload.
* **Power Costs -** Keep track of your **electricity expenses** and make sure your operation remains profitable.
* **Component Failures -** Pushing your hardware too far can result in **burned components**, creating additional risk and costs.
* **Power Supply Overload -** Poorly configured machines can **overload power supplies**, potentially causing complete power loss.
* **Unpaid Bills -** If your electricity bills remain unpaid, your **entire mining operation can lose power** and stop generating earnings.
* **Risk vs Reward -** Build aggressively for maximum performance or prioritize **stability and efficiency** to protect your investment.

**Crime Roleplay**

* **Cryptora Session Hacking -** Machines that remain logged into an active **Cryptora session** can become targets for other players.
* **Interactive Hacking Minigame -** Skilled players can attempt to **hack into connected Cryptora sessions** through an interactive minigame.
* **Account Theft -** Successful hacks can provide access to the victim's **Cryptora account**, creating opportunities for high-risk theft.
* **Rival Operations -** Turn crypto mining into another layer of **crime, competition, and player-driven conflict** for serious roleplay servers.

**Mobile Integration**

* **FiveM Phone Integration -** Access your mining operation through a **mobile app** integrated with the most popular FiveM phone systems.
* **Mobile Mining Management -** Check your **mining machines**, **crypto wallet**, **market updates**, and **transactions** directly from your phone.
* **On-the-Go Trading -** Monitor the market and manage your **crypto investments from anywhere**, without needing to return to your physical mining setup.

**Customization**

* **Fully Configurable Economy -** Server owners have complete control over **progression**, **balance**, **hardware**, **cryptocurrency values**, **difficulty**, **power costs**, and other economy-defining systems.
* **Custom Mining Zones -** Define your own **allowed mining locations** and integrate the system into your server's existing housing and property ecosystem.
* **Configurable Risk Systems -** Adjust important gameplay factors such as **component failures**, **power management**, **operating costs**, and other balancing mechanics.
* **Server-Friendly Integration -** Designed to integrate into existing **FiveM roleplay economies**, allowing server owners to create their own unique crypto ecosystem.
* **And more in the configuration files!**

### Preview

{% embed url="<https://youtu.be/O7EOr9OGq-w>" %}


# Installation

If you aren't familiar with programming or just you don't know how to set up the script, we present our installation guide which is as comprehensive as possible so you don't have any difficulties.

***

{% stepper %}
{% step %}

### Download

Download **mst\_crypto** from [**Portal**](https://portal.cfx.re/assets/granted-assets).
{% endstep %}

{% step %}

### Dependencies

**Required:**

* [k4mb1\_hardware](https://k4mb1maps.com/category)
* [es\_extended](https://github.com/esx-framework/esx_core/tree/main/%5Bcore%5D/es_extended) or [qb-core](https://github.com/qbcore-framework/qb-core) or [qbx\_core](https://github.com/Qbox-project/qbx_core)
* [mst\_bridge](https://portal.cfx.re/assets/granted-assets) (It comes with the script)
* [mst\_placement](https://github.com/mosotoscripts/mst_placement) (Free in our GitHub)
* [ox\_lib](https://github.com/communityox/ox_lib/releases)
* [qb-target](https://github.com/qbcore-framework/qb-target) or [ox\_target](https://github.com/communityox/ox_target/releases)

**Optional:**

* [k4mb1-operations](https://k4mb1maps.com/product/7621591)
* [k4mb1-hideout](https://k4mb1maps.com/product/7569216)
* [mhacking](https://github.com/Qbox-project/mhacking)
  {% endstep %}

{% step %}

### Resources Order

{% hint style="warning" %}
mst\_crypto must be under mst\_bridge
{% endhint %}

<pre class="language-markdown" data-title="SERVER.CFG"><code class="lang-markdown">ensure es_extended/qb-core/qbx_core
ensure oxmysql
ensure ox_lib

ensure inventory
ensure phone
ensure clothing
ensure banking
ensure fuel
ensure target

ensure k4mb1_hardware
ensure k4mb1-operations
ensure k4mb1-hideout

<strong>ensure mst_bridge
</strong><strong>ensure mst_placement
</strong><strong>ensure mst_crypto
</strong></code></pre>

{% endstep %}

{% step %}

## Database

* Add the images from the `inventory_images` folder inside `mst_crypto` to your inventory system’s image directory.

{% tabs %}
{% tab title="MySQL" %}

```sql
INSERT INTO `items` (`name`, `label`, `weight`) VALUES
	('k4mb1_pc_case1', 'PC Case - Compact', 5),
	('k4mb1_pc_case2', 'PC Case - Standard', 5),
	('k4mb1_pc_case3', 'PC Case - Full Tower', 6),
	('k4mb1_pc_mthrbrd1', 'Basic Motherboard', 1),
	('k4mb1_pc_mthrbrd2', 'Pro Motherboard', 1),
	('k4mb1_pc_cpu1', 'Entry CPU', 1),
	('k4mb1_pc_cpu2', 'Performance CPU', 1),
	('k4mb1_pc_gpu1', 'Mining GPU G1', 1),
	('k4mb1_pc_gpu2', 'Mining GPU G2', 1),
	('k4mb1_pc_gpu3', 'Mining GPU G3', 2),
	('k4mb1_pc_gpu4', 'Mining GPU G4', 2),
	('k4mb1_pc_ram1_8gb', 'RAM 8GB Kit', 1),
	('k4mb1_pc_ram1_16gb', 'RAM 16GB Kit (Basic)', 1),
	('k4mb1_pc_ram1_32gb', 'RAM 32GB Kit (Basic)', 1),
	('k4mb1_pc_ram2_16gb', 'RAM 16GB Kit (Pro)', 1),
	('k4mb1_pc_ram2_32gb', 'RAM 32GB Kit (Pro)', 1),
	('k4mb1_pc_ram2_64gb', 'RAM 64GB Kit (Pro)', 1),
	('k4mb1_pc_ram3_32gb', 'RAM 32GB Kit (Elite)', 1),
	('k4mb1_pc_ram3_64gb', 'RAM 64GB Kit (Elite)', 1),
	('k4mb1_pc_ram3_128gb', 'RAM 128GB Kit (Elite)', 1),
	('k4mb1_pc_psu1', 'PSU 550W', 2),
	('k4mb1_pc_psu2', 'PSU 850W', 2),
	('k4mb1_pc_psu3', 'PSU 1200W', 2),
	('k4mb1_pc_psu2-3', 'PSU 1200W', 2),
	('k4mb1_pc_cpu_fan1', 'Air CPU Cooler', 1),
	('k4mb1_pc_cpu_fan2', 'AIO CPU Cooler', 1),
	('k4mb1_pc_w_cooler', 'Custom Water Cooler', 1),
	('k4mb1_pc_ssd', '2.5" SSD', 1),
	('k4mb1_pc_ssd_m2', 'M.2 SSD', 1),
	('k4mb1_pc_hdd', '3.5" HDD', 1),
	('k4mb1_pc_front_fans', 'Front Fan Kit', 1),
	('k4mb1_pc_top_fans', 'Top Fan Kit', 1),
	('k4mb1_pc_back_fan', 'Rear Exhaust Fan', 1),
	('k4mb1-miningrig-tier1', 'Mining Rig T1', 15),
	('k4mb1-miningrig-tier2', 'Mining Rig T2', 18),
	('k4mb1-miningrig-tier3', 'Mining Rig T3', 22),
	('k4mb1_pc_keyboard1_mini', 'Keyboard 1 Mini', 1),
	('k4mb1_pc_keyboard1_half', 'Keyboard 1 Half', 1),
	('k4mb1_pc_keyboard1_full', 'Keyboard 1 Full', 1),
	('k4mb1_pc_keyboard2', 'Keyboard 2', 1),
	('k4mb1_pc_keyboard3', 'Keyboard 3', 1),
	('k4mb1_pc_keyboard4', 'Keyboard 4', 1),
	('k4mb1_pc_keyboard5', 'Keyboard 5', 1),
	('k4mb1_pc_keyboard6', 'Keyboard 6', 1),
	('k4mb1_pc_keyboard7', 'Keyboard 7', 1),
	('k4mb1_pc_monitor1', 'Monitor 1', 3),
	('k4mb1_pc_monitor1_curved1', 'Monitor 1 Curved', 3),
	('k4mb1_pc_monitor1_curved2', 'Monitor 1 Curved Pro', 3),
	('k4mb1_pc_monitor2_ultra_wide', 'Monitor 2 Ultrawide', 3),
	('k4mb1_pc_monitor3', 'Monitor 3', 3),
	('k4mb1_pc_monitor4', 'Monitor 4', 3),
	('k4mb1_pc_monitor5', 'Monitor 5', 3),
	('k4mb1_pc_monitor6', 'Monitor 6', 3),
	('k4mb1_pc_monitor7', 'Monitor 7', 3),
	('k4mb1_pc_monitor8', 'Monitor 8', 3),
	('k4mb1_pc_mouse1', 'Mouse 1', 1),
	('k4mb1_pc_mouse2', 'Mouse 2', 1),
	('k4mb1_pc_mouse3', 'Mouse 3', 1),
	('k4mb1_pc_mouse4', 'Mouse 4', 1),
	('k4mb1_pc_mouse5', 'Mouse 5', 1),
	('k4mb1_pc_mouse6', 'Mouse 6', 1)
;

```

{% endtab %}

{% tab title="QB" %}

```lua
k4mb1_pc_case1 = {
    name = 'k4mb1_pc_case1',
    label = 'PC Case - Compact',
    weight = 5,
    type = 'item',
    image = 'k4mb1_pc_case1.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Empty K4MB1 compact case. Place in a hideout, then install components.',
},

k4mb1_pc_case2 = {
    name = 'k4mb1_pc_case2',
    label = 'PC Case - Standard',
    weight = 5,
    type = 'item',
    image = 'k4mb1_pc_case2.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Empty K4MB1 standard case. Place in a hideout, then install components.',
},

k4mb1_pc_case3 = {
    name = 'k4mb1_pc_case3',
    label = 'PC Case - Full Tower',
    weight = 6,
    type = 'item',
    image = 'k4mb1_pc_case3.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Empty K4MB1 full tower case. Place in a hideout, then install components.',
},

k4mb1_pc_mthrbrd1 = {
    name = 'k4mb1_pc_mthrbrd1',
    label = 'Basic Motherboard',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_mthrbrd1.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Budget mining motherboard.',
},

k4mb1_pc_mthrbrd2 = {
    name = 'k4mb1_pc_mthrbrd2',
    label = 'Pro Motherboard',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_mthrbrd2.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Mid-range mining motherboard.',
},

k4mb1_pc_cpu1 = {
    name = 'k4mb1_pc_cpu1',
    label = 'Entry CPU',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_cpu1.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Entry-level processor.',
},

k4mb1_pc_cpu2 = {
    name = 'k4mb1_pc_cpu2',
    label = 'Performance CPU',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_cpu2.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Performance processor.',
},

k4mb1_pc_gpu1 = {
    name = 'k4mb1_pc_gpu1',
    label = 'Mining GPU G1',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_gpu1.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Entry mining GPU.',
},

k4mb1_pc_gpu2 = {
    name = 'k4mb1_pc_gpu2',
    label = 'Mining GPU G2',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_gpu2.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Mid-tier mining GPU.',
},

k4mb1_pc_gpu3 = {
    name = 'k4mb1_pc_gpu3',
    label = 'Mining GPU G3',
    weight = 2,
    type = 'item',
    image = 'k4mb1_pc_gpu3.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'High-end mining GPU.',
},

k4mb1_pc_gpu4 = {
    name = 'k4mb1_pc_gpu4',
    label = 'Mining GPU G4',
    weight = 2,
    type = 'item',
    image = 'k4mb1_pc_gpu4.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Flagship mining GPU.',
},

k4mb1_pc_ram1_8gb = {
    name = 'k4mb1_pc_ram1_8gb',
    label = 'RAM 8GB Kit',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram1_8gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '8GB RAM kit.',
},

k4mb1_pc_ram1_16gb = {
    name = 'k4mb1_pc_ram1_16gb',
    label = 'RAM 16GB Kit (Basic)',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram1_16gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '16GB basic RAM kit.',
},

k4mb1_pc_ram1_32gb = {
    name = 'k4mb1_pc_ram1_32gb',
    label = 'RAM 32GB Kit (Basic)',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram1_32gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '32GB basic RAM kit.',
},

k4mb1_pc_ram2_16gb = {
    name = 'k4mb1_pc_ram2_16gb',
    label = 'RAM 16GB Kit (Pro)',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram2_16gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '16GB pro RAM kit.',
},

k4mb1_pc_ram2_32gb = {
    name = 'k4mb1_pc_ram2_32gb',
    label = 'RAM 32GB Kit (Pro)',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram2_32gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '32GB pro RAM kit.',
},

k4mb1_pc_ram2_64gb = {
    name = 'k4mb1_pc_ram2_64gb',
    label = 'RAM 64GB Kit (Pro)',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram2_64gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '64GB pro RAM kit.',
},

k4mb1_pc_ram3_32gb = {
    name = 'k4mb1_pc_ram3_32gb',
    label = 'RAM 32GB Kit (Elite)',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram3_32gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '32GB elite RAM kit.',
},

k4mb1_pc_ram3_64gb = {
    name = 'k4mb1_pc_ram3_64gb',
    label = 'RAM 64GB Kit (Elite)',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram3_64gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '64GB elite RAM kit.',
},

k4mb1_pc_ram3_128gb = {
    name = 'k4mb1_pc_ram3_128gb',
    label = 'RAM 128GB Kit (Elite)',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ram3_128gb.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '128GB elite RAM kit.',
},

k4mb1_pc_psu1 = {
    name = 'k4mb1_pc_psu1',
    label = 'PSU 550W',
    weight = 2,
    type = 'item',
    image = 'k4mb1_pc_psu1.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '550W power supply.',
},

k4mb1_pc_psu2 = {
    name = 'k4mb1_pc_psu2',
    label = 'PSU 850W',
    weight = 2,
    type = 'item',
    image = 'k4mb1_pc_psu2-3.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '850W power supply (uses k4mb1_pc_psu2-3 mesh).',
},

k4mb1_pc_psu3 = {
    name = 'k4mb1_pc_psu3',
    label = 'PSU 1200W',
    weight = 2,
    type = 'item',
    image = 'k4mb1_pc_psu2-3.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '1200W power supply (uses k4mb1_pc_psu2-3 mesh).',
},

k4mb1_pc_psu2-3 = {
    name = 'k4mb1_pc_psu2-3',
    label = 'PSU 1200W',
    weight = 2,
    type = 'item',
    image = 'k4mb1_pc_psu2-3.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '1200W power supply (legacy id; prefer k4mb1_pc_psu3).',
},

k4mb1_pc_cpu_fan1 = {
    name = 'k4mb1_pc_cpu_fan1',
    label = 'Air CPU Cooler',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_cpu_fan1.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Air CPU cooler.',
},

k4mb1_pc_cpu_fan2 = {
    name = 'k4mb1_pc_cpu_fan2',
    label = 'AIO CPU Cooler',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_cpu_fan2.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'AIO CPU cooler.',
},

k4mb1_pc_w_cooler = {
    name = 'k4mb1_pc_w_cooler',
    label = 'Custom Water Cooler',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_w_cooler.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Custom loop CPU cooler.',
},

k4mb1_pc_ssd = {
    name = 'k4mb1_pc_ssd',
    label = '2.5" SSD',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ssd.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '2.5" SATA SSD.',
},

k4mb1_pc_ssd_m2 = {
    name = 'k4mb1_pc_ssd_m2',
    label = 'M.2 SSD',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_ssd_m2.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'M.2 SSD.',
},

k4mb1_pc_hdd = {
    name = 'k4mb1_pc_hdd',
    label = '3.5" HDD',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_hdd.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = '3.5" hard drive.',
},

k4mb1_pc_front_fans = {
    name = 'k4mb1_pc_front_fans',
    label = 'Front Fan Kit',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_front_fans.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Front case fan kit.',
},

k4mb1_pc_top_fans = {
    name = 'k4mb1_pc_top_fans',
    label = 'Top Fan Kit',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_top_fans.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Top case fan kit.',
},

k4mb1_pc_back_fan = {
    name = 'k4mb1_pc_back_fan',
    label = 'Rear Exhaust Fan',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_back_fan.png',
    unique = true,
    useable = false,
    shouldClose = true,
    description = 'Rear case exhaust fan.',
},

k4mb1-miningrig-tier1 = {
    name = 'k4mb1-miningrig-tier1',
    label = 'Mining Rig T1',
    weight = 15,
    type = 'item',
    image = 'k4mb1-miningrig-tier1.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Tier 1 open-frame mining rig - 0.40 MH/s / 1100 W. Place and power on to mine.',
},

k4mb1-miningrig-tier2 = {
    name = 'k4mb1-miningrig-tier2',
    label = 'Mining Rig T2',
    weight = 18,
    type = 'item',
    image = 'k4mb1-miningrig-tier2.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Tier 2 mining frame - 0.65 MH/s / 1500 W. Place and power on to mine.',
},

k4mb1-miningrig-tier3 = {
    name = 'k4mb1-miningrig-tier3',
    label = 'Mining Rig T3',
    weight = 22,
    type = 'item',
    image = 'k4mb1-miningrig-tier3.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Tier 3 industrial mining frame - 0.90 MH/s / 1850 W. Place and power on to mine.',
},

k4mb1_pc_keyboard1_mini = {
    name = 'k4mb1_pc_keyboard1_mini',
    label = 'Keyboard 1 Mini',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard1_mini.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_keyboard1_half = {
    name = 'k4mb1_pc_keyboard1_half',
    label = 'Keyboard 1 Half',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard1_half.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_keyboard1_full = {
    name = 'k4mb1_pc_keyboard1_full',
    label = 'Keyboard 1 Full',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard1_full.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_keyboard2 = {
    name = 'k4mb1_pc_keyboard2',
    label = 'Keyboard 2',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard2.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_keyboard3 = {
    name = 'k4mb1_pc_keyboard3',
    label = 'Keyboard 3',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard3.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_keyboard4 = {
    name = 'k4mb1_pc_keyboard4',
    label = 'Keyboard 4',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard4.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_keyboard5 = {
    name = 'k4mb1_pc_keyboard5',
    label = 'Keyboard 5',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard5.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_keyboard6 = {
    name = 'k4mb1_pc_keyboard6',
    label = 'Keyboard 6',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard6.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_keyboard7 = {
    name = 'k4mb1_pc_keyboard7',
    label = 'Keyboard 7',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_keyboard7.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor1 = {
    name = 'k4mb1_pc_monitor1',
    label = 'Monitor 1',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor1.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor1_curved1 = {
    name = 'k4mb1_pc_monitor1_curved1',
    label = 'Monitor 1 Curved',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor1_curved1.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor1_curved2 = {
    name = 'k4mb1_pc_monitor1_curved2',
    label = 'Monitor 1 Curved Pro',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor1_curved2.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor2_ultra_wide = {
    name = 'k4mb1_pc_monitor2_ultra_wide',
    label = 'Monitor 2 Ultrawide',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor2_ultra_wide.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor3 = {
    name = 'k4mb1_pc_monitor3',
    label = 'Monitor 3',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor3.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor4 = {
    name = 'k4mb1_pc_monitor4',
    label = 'Monitor 4',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor4.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor5 = {
    name = 'k4mb1_pc_monitor5',
    label = 'Monitor 5',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor5.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor6 = {
    name = 'k4mb1_pc_monitor6',
    label = 'Monitor 6',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor6.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor7 = {
    name = 'k4mb1_pc_monitor7',
    label = 'Monitor 7',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor7.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_monitor8 = {
    name = 'k4mb1_pc_monitor8',
    label = 'Monitor 8',
    weight = 3,
    type = 'item',
    image = 'k4mb1_pc_monitor8.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_mouse1 = {
    name = 'k4mb1_pc_mouse1',
    label = 'Mouse 1',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_mouse1.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_mouse2 = {
    name = 'k4mb1_pc_mouse2',
    label = 'Mouse 2',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_mouse2.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_mouse3 = {
    name = 'k4mb1_pc_mouse3',
    label = 'Mouse 3',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_mouse3.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_mouse4 = {
    name = 'k4mb1_pc_mouse4',
    label = 'Mouse 4',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_mouse4.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_mouse5 = {
    name = 'k4mb1_pc_mouse5',
    label = 'Mouse 5',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_mouse5.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},

k4mb1_pc_mouse6 = {
    name = 'k4mb1_pc_mouse6',
    label = 'Mouse 6',
    weight = 1,
    type = 'item',
    image = 'k4mb1_pc_mouse6.png',
    unique = true,
    useable = true,
    shouldClose = true,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
},
```

{% endtab %}

{% tab title="OX" %}

```lua
['k4mb1_pc_case1'] = {
    label = 'PC Case - Compact',
    weight = 5000,
    stack = false,
    close = true,
    consume = 0,
    description = 'Empty K4MB1 compact case. Place in a hideout, then install components.',
    client = { image = 'k4mb1_pc_case1.png' },
},

['k4mb1_pc_case2'] = {
    label = 'PC Case - Standard',
    weight = 5000,
    stack = false,
    close = true,
    consume = 0,
    description = 'Empty K4MB1 standard case. Place in a hideout, then install components.',
    client = { image = 'k4mb1_pc_case2.png' },
},

['k4mb1_pc_case3'] = {
    label = 'PC Case - Full Tower',
    weight = 5500,
    stack = false,
    close = true,
    consume = 0,
    description = 'Empty K4MB1 full tower case. Place in a hideout, then install components.',
    client = { image = 'k4mb1_pc_case3.png' },
},

['k4mb1_pc_mthrbrd1'] = {
    label = 'Basic Motherboard',
    weight = 500,
    stack = false,
    close = true,
    description = 'Budget mining motherboard.',
    client = { image = 'k4mb1_pc_mthrbrd1.png' },
},

['k4mb1_pc_mthrbrd2'] = {
    label = 'Pro Motherboard',
    weight = 600,
    stack = false,
    close = true,
    description = 'Mid-range mining motherboard.',
    client = { image = 'k4mb1_pc_mthrbrd2.png' },
},

['k4mb1_pc_cpu1'] = {
    label = 'Entry CPU',
    weight = 200,
    stack = false,
    close = true,
    description = 'Entry-level processor.',
    client = { image = 'k4mb1_pc_cpu1.png' },
},

['k4mb1_pc_cpu2'] = {
    label = 'Performance CPU',
    weight = 200,
    stack = false,
    close = true,
    description = 'Performance processor.',
    client = { image = 'k4mb1_pc_cpu2.png' },
},

['k4mb1_pc_gpu1'] = {
    label = 'Mining GPU G1',
    weight = 1200,
    stack = false,
    close = true,
    description = 'Entry mining GPU.',
    client = { image = 'k4mb1_pc_gpu1.png' },
},

['k4mb1_pc_gpu2'] = {
    label = 'Mining GPU G2',
    weight = 1400,
    stack = false,
    close = true,
    description = 'Mid-tier mining GPU.',
    client = { image = 'k4mb1_pc_gpu2.png' },
},

['k4mb1_pc_gpu3'] = {
    label = 'Mining GPU G3',
    weight = 1800,
    stack = false,
    close = true,
    description = 'High-end mining GPU.',
    client = { image = 'k4mb1_pc_gpu3.png' },
},

['k4mb1_pc_gpu4'] = {
    label = 'Mining GPU G4',
    weight = 1900,
    stack = false,
    close = true,
    description = 'Flagship mining GPU.',
    client = { image = 'k4mb1_pc_gpu4.png' },
},

['k4mb1_pc_ram1_8gb'] = {
    label = 'RAM 8GB Kit',
    weight = 100,
    stack = false,
    close = true,
    description = '8GB RAM kit.',
    client = { image = 'k4mb1_pc_ram1_8gb.png' },
},

['k4mb1_pc_ram1_16gb'] = {
    label = 'RAM 16GB Kit (Basic)',
    weight = 100,
    stack = false,
    close = true,
    description = '16GB basic RAM kit.',
    client = { image = 'k4mb1_pc_ram1_16gb.png' },
},

['k4mb1_pc_ram1_32gb'] = {
    label = 'RAM 32GB Kit (Basic)',
    weight = 100,
    stack = false,
    close = true,
    description = '32GB basic RAM kit.',
    client = { image = 'k4mb1_pc_ram1_32gb.png' },
},

['k4mb1_pc_ram2_16gb'] = {
    label = 'RAM 16GB Kit (Pro)',
    weight = 100,
    stack = false,
    close = true,
    description = '16GB pro RAM kit.',
    client = { image = 'k4mb1_pc_ram2_16gb.png' },
},

['k4mb1_pc_ram2_32gb'] = {
    label = 'RAM 32GB Kit (Pro)',
    weight = 100,
    stack = false,
    close = true,
    description = '32GB pro RAM kit.',
    client = { image = 'k4mb1_pc_ram2_32gb.png' },
},

['k4mb1_pc_ram2_64gb'] = {
    label = 'RAM 64GB Kit (Pro)',
    weight = 100,
    stack = false,
    close = true,
    description = '64GB pro RAM kit.',
    client = { image = 'k4mb1_pc_ram2_64gb.png' },
},

['k4mb1_pc_ram3_32gb'] = {
    label = 'RAM 32GB Kit (Elite)',
    weight = 100,
    stack = false,
    close = true,
    description = '32GB elite RAM kit.',
    client = { image = 'k4mb1_pc_ram3_32gb.png' },
},

['k4mb1_pc_ram3_64gb'] = {
    label = 'RAM 64GB Kit (Elite)',
    weight = 100,
    stack = false,
    close = true,
    description = '64GB elite RAM kit.',
    client = { image = 'k4mb1_pc_ram3_64gb.png' },
},

['k4mb1_pc_ram3_128gb'] = {
    label = 'RAM 128GB Kit (Elite)',
    weight = 100,
    stack = false,
    close = true,
    description = '128GB elite RAM kit.',
    client = { image = 'k4mb1_pc_ram3_128gb.png' },
},

['k4mb1_pc_psu1'] = {
    label = 'PSU 550W',
    weight = 1500,
    stack = false,
    close = true,
    description = '550W power supply.',
    client = { image = 'k4mb1_pc_psu1.png' },
},

['k4mb1_pc_psu2'] = {
    label = 'PSU 850W',
    weight = 1800,
    stack = false,
    close = true,
    description = '850W power supply (uses k4mb1_pc_psu2-3 mesh).',
    client = { image = 'k4mb1_pc_psu2-3.png' },
},

['k4mb1_pc_psu3'] = {
    label = 'PSU 1200W',
    weight = 2200,
    stack = false,
    close = true,
    description = '1200W power supply (uses k4mb1_pc_psu2-3 mesh).',
    client = { image = 'k4mb1_pc_psu2-3.png' },
},

['k4mb1_pc_psu2-3'] = {
    label = 'PSU 1200W',
    weight = 2200,
    stack = false,
    close = true,
    description = '1200W power supply (legacy id; prefer k4mb1_pc_psu3).',
    client = { image = 'k4mb1_pc_psu2-3.png' },
},

['k4mb1_pc_cpu_fan1'] = {
    label = 'Air CPU Cooler',
    weight = 400,
    stack = false,
    close = true,
    description = 'Air CPU cooler.',
    client = { image = 'k4mb1_pc_cpu_fan1.png' },
},

['k4mb1_pc_cpu_fan2'] = {
    label = 'AIO CPU Cooler',
    weight = 900,
    stack = false,
    close = true,
    description = 'AIO CPU cooler.',
    client = { image = 'k4mb1_pc_cpu_fan2.png' },
},

['k4mb1_pc_w_cooler'] = {
    label = 'Custom Water Cooler',
    weight = 1200,
    stack = false,
    close = true,
    description = 'Custom loop CPU cooler.',
    client = { image = 'k4mb1_pc_w_cooler.png' },
},

['k4mb1_pc_ssd'] = {
    label = '2.5" SSD',
    weight = 120,
    stack = false,
    close = true,
    description = '2.5" SATA SSD.',
    client = { image = 'k4mb1_pc_ssd.png' },
},

['k4mb1_pc_ssd_m2'] = {
    label = 'M.2 SSD',
    weight = 40,
    stack = false,
    close = true,
    description = 'M.2 SSD.',
    client = { image = 'k4mb1_pc_ssd_m2.png' },
},

['k4mb1_pc_hdd'] = {
    label = '3.5" HDD',
    weight = 500,
    stack = false,
    close = true,
    description = '3.5" hard drive.',
    client = { image = 'k4mb1_pc_hdd.png' },
},

['k4mb1_pc_front_fans'] = {
    label = 'Front Fan Kit',
    weight = 300,
    stack = false,
    close = true,
    description = 'Front case fan kit.',
    client = { image = 'k4mb1_pc_front_fans.png' },
},

['k4mb1_pc_top_fans'] = {
    label = 'Top Fan Kit',
    weight = 280,
    stack = false,
    close = true,
    description = 'Top case fan kit.',
    client = { image = 'k4mb1_pc_top_fans.png' },
},

['k4mb1_pc_back_fan'] = {
    label = 'Rear Exhaust Fan',
    weight = 200,
    stack = false,
    close = true,
    description = 'Rear case exhaust fan.',
    client = { image = 'k4mb1_pc_back_fan.png' },
},

['k4mb1-miningrig-tier1'] = {
    label = 'Mining Rig T1',
    weight = 15000,
    stack = false,
    close = true,
    consume = 0,
    description = 'Tier 1 open-frame mining rig - 0.40 MH/s / 1100 W. Place and power on to mine.',
    client = { image = 'k4mb1-miningrig-tier1.png' },
},

['k4mb1-miningrig-tier2'] = {
    label = 'Mining Rig T2',
    weight = 18000,
    stack = false,
    close = true,
    consume = 0,
    description = 'Tier 2 mining frame - 0.65 MH/s / 1500 W. Place and power on to mine.',
    client = { image = 'k4mb1-miningrig-tier2.png' },
},

['k4mb1-miningrig-tier3'] = {
    label = 'Mining Rig T3',
    weight = 22000,
    stack = false,
    close = true,
    consume = 0,
    description = 'Tier 3 industrial mining frame - 0.90 MH/s / 1850 W. Place and power on to mine.',
    client = { image = 'k4mb1-miningrig-tier3.png' },
},

['k4mb1_pc_keyboard1_mini'] = {
    label = 'Keyboard 1 Mini',
    weight = 300,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard1_mini.png' },
},

['k4mb1_pc_keyboard1_half'] = {
    label = 'Keyboard 1 Half',
    weight = 320,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard1_half.png' },
},

['k4mb1_pc_keyboard1_full'] = {
    label = 'Keyboard 1 Full',
    weight = 350,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard1_full.png' },
},

['k4mb1_pc_keyboard2'] = {
    label = 'Keyboard 2',
    weight = 360,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard2.png' },
},

['k4mb1_pc_keyboard3'] = {
    label = 'Keyboard 3',
    weight = 380,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard3.png' },
},

['k4mb1_pc_keyboard4'] = {
    label = 'Keyboard 4',
    weight = 400,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard4.png' },
},

['k4mb1_pc_keyboard5'] = {
    label = 'Keyboard 5',
    weight = 420,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard5.png' },
},

['k4mb1_pc_keyboard6'] = {
    label = 'Keyboard 6',
    weight = 440,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard6.png' },
},

['k4mb1_pc_keyboard7'] = {
    label = 'Keyboard 7',
    weight = 460,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_keyboard7.png' },
},

['k4mb1_pc_monitor1'] = {
    label = 'Monitor 1',
    weight = 2500,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor1.png' },
},

['k4mb1_pc_monitor1_curved1'] = {
    label = 'Monitor 1 Curved',
    weight = 2600,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor1_curved1.png' },
},

['k4mb1_pc_monitor1_curved2'] = {
    label = 'Monitor 1 Curved Pro',
    weight = 2700,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor1_curved2.png' },
},

['k4mb1_pc_monitor2_ultra_wide'] = {
    label = 'Monitor 2 Ultrawide',
    weight = 2800,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor2_ultra_wide.png' },
},

['k4mb1_pc_monitor3'] = {
    label = 'Monitor 3',
    weight = 2800,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor3.png' },
},

['k4mb1_pc_monitor4'] = {
    label = 'Monitor 4',
    weight = 2900,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor4.png' },
},

['k4mb1_pc_monitor5'] = {
    label = 'Monitor 5',
    weight = 3000,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor5.png' },
},

['k4mb1_pc_monitor6'] = {
    label = 'Monitor 6',
    weight = 3000,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor6.png' },
},

['k4mb1_pc_monitor7'] = {
    label = 'Monitor 7',
    weight = 3100,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor7.png' },
},

['k4mb1_pc_monitor8'] = {
    label = 'Monitor 8',
    weight = 3200,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_monitor8.png' },
},

['k4mb1_pc_mouse1'] = {
    label = 'Mouse 1',
    weight = 80,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_mouse1.png' },
},

['k4mb1_pc_mouse2'] = {
    label = 'Mouse 2',
    weight = 90,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_mouse2.png' },
},

['k4mb1_pc_mouse3'] = {
    label = 'Mouse 3',
    weight = 100,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_mouse3.png' },
},

['k4mb1_pc_mouse4'] = {
    label = 'Mouse 4',
    weight = 110,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_mouse4.png' },
},

['k4mb1_pc_mouse5'] = {
    label = 'Mouse 5',
    weight = 120,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_mouse5.png' },
},

['k4mb1_pc_mouse6'] = {
    label = 'Mouse 6',
    weight = 130,
    stack = false,
    close = true,
    consume = 0,
    description = 'Place freely as a desk kit, or near your PC case to bind it.',
    client = { image = 'k4mb1_pc_mouse6.png' },
},
```

{% endtab %}
{% endtabs %}
{% endstep %}

{% step %}

### Any other configurations?

{% hint style="success" %}
At Mosoto Scripts, we are constantly improving our resources, and for this reason you do not need to run the SQL manually, this happens automatically when you run the script for the first time.
{% endhint %}

{% hint style="info" %}
You will also no longer have to change the framework manually, for each script, as well as the language, notifications, etc. Everything happens through the `config.lua` file of **mst\_bridge**.
{% endhint %}
{% endstep %}

{% step %}

### Not working?

We hope you won’t need this step, but if you do, feel free to join our [**Discord**](https://discord.mosotoscripts.com) and open a support ticket. :)
{% endstep %}
{% endstepper %}


# Configurations

All Mosoto scripts are fully editable and customizable to match your server’s style, rules, and balance.

***

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FZiZQR2tOaA219ePi0rzx%2Fcoinconfig.png?alt=media&amp;token=0add30fe-dc1e-420a-a149-8d3f7feb36bc" alt=""><figcaption><p>config_coins.lua</p></figcaption></figure>

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2F5dHblzgEsQbY2AddD7Su%2Fhardwareconfig.png?alt=media&amp;token=60352f2f-bdea-43e5-960c-8f938ef5cb57" alt=""><figcaption><p>config_hardware.lua</p></figcaption></figure>


# Exports & Events

This section contains all the exports provided by the script. For best results, make changes with someone knowledgeable in Lua to prevent errors.

***

**COMING SOON!**


# Common Issues

Here you’ll find the most common problems users run into - along with simple solutions, so you can get back on track fast.

***


# Breathalyzer

Meet the Mosoto Breathalyzer - the ultimate tool to keep your streets safe and your gameplay real!

***

Designed for police officers to instantly test the nearest player, it detects their Blood\
Alcohol Content and logs every result with the exact time it was taken. Smooth\
animations and realistic sounds make every test feel authentic and immersive.

### Features

* **Unique Intoxication System** - Tracks BAC from the moment a player starts drinking. Dynamic consequences based on BAC, such as dizziness, blackouts, vomiting, vehicle crashes, and accidental gunfire.
* **Variety of Alcohol Types** - Each drink has unique BAC values, drinking durations, thirst increases, animations, and props.
* **Hunger Sensitivity & Realistic Thirst** - Hunger affects BAC and each drink and vomiting event affects thirst independently, with unique values and durations.
* **Smooth & Immersive Experience** - The breathalyzer uses lifelike animations, authentic blowing sounds, and detailed custom 3D prop to make every test feel realistic and engaging.
* **Interactive Testing Mechanic** - Player must hold a button to blow steadily into the breathalyzer, filling a progress bar; interruptions reset the process.
* **Automatic Logging** - Every test result is recorded with the exact time and sent via Discord Webhook to the police chat.
* **And more!**

### Preview

{% embed url="<https://www.youtube.com/watch?v=JJhOay0dPdI>" %}


# Installation

If you aren't familiar with programming or just you don't know how to set up the script, we present our installation guide which is as comprehensive as possible so you don't have any difficulties.

***

## STEP 1 - Download

* Download **mst\_breathalyzer** and **mst\_bridge** from [Portal](https://portal.cfx.re/assets/granted-assets).

## STEP 2 - Dependencies

{% hint style="info" %}
The script requires several dependencies to function properly.
{% endhint %}

**Required:**

* [es\_extended](https://github.com/esx-framework/esx_core/tree/main/%5Bcore%5D/es_extended) or [qb-core](https://github.com/qbcore-framework/qb-core) or [qbx\_core](https://github.com/Qbox-project/qbx_core)
* [mst\_bridge](https://portal.cfx.re/assets/granted-assets)

**Optional:**

* &#x20;[ox\_lib](https://github.com/communityox/ox_lib/releases) (only required if you want to use the progress bars)

## STEP 3 - Resources order

{% hint style="info" %}
You MUST start the resource below your core and bridge!
{% endhint %}

<pre data-title="SERVER.CFG"><code>ensure es_extended/qb-core/qbx_core
ensure mst_bridge
<strong>ensure mst_breathalyzer
</strong></code></pre>

## STEP 4 - Database

{% hint style="danger" %}
Without adding these items to the database, the script will not work!
{% endhint %}

* Add the images from the `inventory_images` folder inside `mst_breathalyzer` to your inventory system’s image directory.

{% tabs %}
{% tab title="MySQL" %}

```sql
DELETE FROM items WHERE name = 'breathalyzer';
DELETE FROM items WHERE name = 'whiskey';
DELETE FROM items WHERE name = 'vodka';
DELETE FROM items WHERE name = 'rum';
DELETE FROM items WHERE name = 'brandy';
DELETE FROM items WHERE name = 'tequila';
DELETE FROM items WHERE name = 'champagne';
DELETE FROM items WHERE name = 'red_wine';
DELETE FROM items WHERE name = 'white_wine';
DELETE FROM items WHERE name = 'rose';
DELETE FROM items WHERE name = 'beer';
DELETE FROM items WHERE name = 'yogurt';

INSERT INTO `items` (`name`, `label`, `weight`) VALUES
	('breathalyzer', 'Breathalyzer', 1),
	('whiskey', 'Whiskey', 1),
	('vodka', 'Vodka', 1),
	('rum', 'Rum', 1),
	('brandy', 'Brandy', 1),
	('tequila', 'Tequila', 1),
	('champagne', 'Champagne', 1),
	('red_wine', 'Red Wine', 1),
	('white_wine', 'White Wine', 1),
	('rose', 'Rose', 1),
	('beer', 'Beer', 1),
	('yogurt', 'Yogurt', 1)
;
```

{% endtab %}

{% tab title="QB" %}

```lua
breathalyzer = { name = 'breathalyzer', label = 'Breathalyzer', weight = 1, type = 'item', image = 'breathalyzer.png', unique = false, useable = true, shouldClose = true, description = 'Check someone\'s blood alcohol level' },
whiskey = { name = 'whiskey', label = 'Whiskey', weight = 1, type = 'item', image = 'whiskey.png', unique = false, useable = true, shouldClose = true, description = 'A strong drink for a strong person' },
vodka = { name = 'vodka', label = 'Vodka', weight = 1, type = 'item', image = 'vodka.png', unique = false, useable = true, shouldClose = true, description = 'Clear and powerful spirit' },
rum = { name = 'rum', label = 'Rum', weight = 1, type = 'item', image = 'rum.png', unique = false, useable = true, shouldClose = true, description = 'Sweet spirit from sugarcane' },
brandy = { name = 'brandy', label = 'Brandy', weight = 1, type = 'item', image = 'brandy.png', unique = false, useable = true, shouldClose = true, description = 'Smooth, aged liquor' },
tequila = { name = 'tequila', label = 'Tequila', weight = 1, type = 'item', image = 'tequila.png', unique = false, useable = true, shouldClose = true, description = 'Mexican spirit made from agave' },
champagne = { name = 'champagne', label = 'Champagne', weight = 1, type = 'item', image = 'champagne.png', unique = false, useable = true, shouldClose = true, description = 'Celebrate with bubbles' },
red_wine = { name = 'red_wine', label = 'Red Wine', weight = 1, type = 'item', image = 'red_wine.png', unique = false, useable = true, shouldClose = true, description = 'A glass of rich red wine' },
white_wine = { name = 'white_wine', label = 'White Wine', weight = 1, type = 'item', image = 'white_wine.png', unique = false, useable = true, shouldClose = true, description = 'A crisp, light wine' },
rose = { name = 'rose', label = 'Rose', weight = 1, type = 'item', image = 'rose.png', unique = false, useable = true, shouldClose = true, description = 'A pink wine for sunny days' },
beer = { name = 'beer', label = 'Beer', weight = 1, type = 'item', image = 'beer.png', unique = false, useable = true, shouldClose = true, description = 'Cold and refreshing pint' },
yogurt = { name = 'yogurt', label = 'Yogurt', weight = 1, type = 'item', image = 'yogurt.png', unique = false, useable = true, shouldClose = true, description = 'Helps reduce alcohol effects' },
```

{% endtab %}

{% tab title="OX" %}

```lua
['breathalyzer'] = {
    label = 'Breathalyzer',
    weight = 1000,
    stack = true,
    close = true,
    description = 'Check someone\'s blood alcohol level',
    client = {
        image = 'breathalyzer.png'
    }
},

['whiskey'] = {
    label = 'Whiskey',
    weight = 1000,
    stack = true,
    close = true,
    description = 'A strong drink for a strong person',
    client = {
        image = 'whiskey.png'
    }
},

['vodka'] = {
    label = 'Vodka',
    weight = 1000,
    stack = true,
    close = true,
    description = 'Clear and powerful spirit',
    client = {
        image = 'vodka.png'
    }
},

['rum'] = {
    label = 'Rum',
    weight = 1000,
    stack = true,
    close = true,
    description = 'Sweet spirit from sugarcane',
    client = {
        image = 'rum.png'
    }
},

['brandy'] = {
    label = 'Brandy',
    weight = 1000,
    stack = true,
    close = true,
    description = 'Smooth, aged liquor',
    client = {
        image = 'brandy.png'
    }
},

['tequila'] = {
    label = 'Tequila',
    weight = 1000,
    stack = true,
    close = true,
    description = 'Mexican spirit made from agave',
    client = {
        image = 'tequila.png'
    }
},

['champagne'] = {
    label = 'Champagne',
    weight = 1000,
    stack = true,
    close = true,
    description = 'Celebrate with bubbles',
    client = {
        image = 'champagne.png'
    }
},

['red_wine'] = {
    label = 'Red Wine',
    weight = 1000,
    stack = true,
    close = true,
    description = 'A glass of rich red wine',
    client = {
        image = 'red_wine.png'
    }
},

['white_wine'] = {
    label = 'White Wine',
    weight = 1000,
    stack = true,
    close = true,
    description = 'A crisp, light wine',
    client = {
        image = 'white_wine.png'
    }
},

['rose'] = {
    label = 'Rose',
    weight = 1000,
    stack = true,
    close = true,
    description = 'A pink wine for sunny days',
    client = {
        image = 'rose.png'
    }
},

['beer'] = {
    label = 'Beer',
    weight = 1000,
    stack = true,
    close = true,
    description = 'Cold and refreshing pint',
    client = {
        image = 'beer.png'
    }
},

['yogurt'] = {
    label = 'Yogurt',
    weight = 1000,
    stack = true,
    close = true,
    description = 'Helps reduce alcohol effects',
    client = {
        image = 'yogurt.png'
    }
},
```

{% endtab %}

{% tab title="TGIANN" %}
{% code fullWidth="false" %}

```lua
breathalyzer = { label = "Breathalyzer", weight = 1, type = "item", image = "breathalyzer.png", unique = false, useable = true, shouldClose = true, description = "Check someone's blood alcohol level" },
whiskey = { label = "Whiskey", weight = 1, type = "item", image = "whiskey.png", unique = false, useable = true, shouldClose = true, description = "A strong drink for a strong person" },
vodka = { label = "Vodka", weight = 1, type = "item", image = "vodka.png", unique = false, useable = true, shouldClose = true, description = "Clear and powerful spirit" },
rum = { label = "Rum", weight = 1, type = "item", image = "rum.png", unique = false, useable = true, shouldClose = true, description = "Sweet spirit from sugarcane" },
brandy = { label = "Brandy", weight = 1, type = "item", image = "brandy.png", unique = false, useable = true, shouldClose = true, description = "Smooth, aged liquor" },
tequila = { label = "Tequila", weight = 1, type = "item", image = "tequila.png", unique = false, useable = true, shouldClose = true, description = "Mexican spirit made from agave" },
champagne = { label = "Champagne", weight = 1, type = "item", image = "champagne.png", unique = false, useable = true, shouldClose = true, description = "Celebrate with bubbles" },
red_wine = { label = "Red Wine", weight = 1, type = "item", image = "red_wine.png", unique = false, useable = true, shouldClose = true, description = "A glass of rich red wine" },
white_wine = { label = "White Wine", weight = 1, type = "item", image = "white_wine.png", unique = false, useable = true, shouldClose = true, description = "A crisp, light wine" },
rose = { label = "Rose", weight = 1, type = "item", image = "rose.png", unique = false, useable = true, shouldClose = true, description = "A pink wine for sunny days" },
beer = { label = "Beer", weight = 1, type = "item", image = "beer.png", unique = false, useable = true, shouldClose = true, description = "Cold and refreshing pint" },
yogurt = { label = "Yogurt", weight = 1, type = "item", image = "yogurt.png", unique = false, useable = true, shouldClose = true, description = "Helps reduce alcohol effects" },
```

{% endcode %}
{% endtab %}
{% endtabs %}

## STEP 5 - Not working?

We hope you won’t need this step, but if you do, feel free to join our [**Discord**](https://discord.mosotoscripts.com) and open a support ticket. :)


# Configurations

All Mosoto scripts are fully editable and customizable to match your server’s style, rules, and balance.

***

<details>

<summary>Breathalyzer</summary>

```lua
Config.Debug = false -- Enable/disable debug mode
```

{% hint style="info" %}
**Description:** Controls debug information and detailed logging.
{% endhint %}

**Options:**

* `true`: Enables debug mode with detailed console output
* `false`: Disables debug mode (recommended for production)

{% hint style="danger" %}
**Use Cases:** Enable only when troubleshooting issues.
{% endhint %}

***

```lua
Config.Breathalyzer = {
    authorizedJobs = {    -- Jobs with minimum grade allowed to use
        ["police"] = 0,   -- Police job with minimum grade 0
        ["ambulance"] = 0 -- Ambulance job with minimum grade 0
    }
}
```

{% hint style="info" %}
**Description:** Controls which jobs can use the breathalyzer device.
{% endhint %}

**Format:** `["job_name"] = minimum_grade`

* `job_name`: The exact job name from your server
* `minimum_grade`: Minimum job grade required (0 = all grades)

***

```lua
Config.Breathalyzer = {
    scale = 0.9,                  -- Scale of the breathalyzer device
    showCommand = "breathalyzer", -- Command to open breathalyzer
    itemName = "breathalyzer",    -- Name of the breathalyzer item
    enableItemUsage = true,       -- Enable/disable usage of the item
}
```

**Scale:**

{% hint style="info" %}
**Description:** Controls the size of the breathalyzer device on screen
{% endhint %}

* **Range:** `0.1` to `1.5`
* **Default:** `0.9` (90% of original size, recommended)
* **Use Cases:** Adjust for different screen resolutions or preferences

**Show Command:**

{% hint style="info" %}
**Description:** The command players can type to open the breathalyzer
{% endhint %}

* **Default:** `'breathalyzer'`
* **Usage:** Players type `/breathalyzer` in chat

**Item Name:**

{% hint style="info" %}
**Description:** The exact name of the breathalyzer item in your inventory
{% endhint %}

* **Must Match:** The item name in your database/items configuration
* **Example:** If your item is named `'breathalyzer_device'`, change this to match

**Enable Item Usage:**

{% hint style="info" %}
**Description:** Controls whether the breathalyzer item can be used
{% endhint %}

* **Options:** `true` (enabled), `false` (disabled)
* **Use Cases:** Disable if you only want command-based access

***

```lua
Config.Breathalyzer = {
    clock = {
        useGameTime = false, -- true = in-game time, false = system time
        format24Hour = true  -- true = 24-hour format, false = 12-hour AM/PM
    }
}
```

**Use Game Time:**

{% hint style="info" %}
**Description:** Controls which time system the breathalyzer displays
{% endhint %}

**Options:**

* `true`: Shows in-game server time
* `false`: Shows real system time

**24-Hour Format:**

{% hint style="info" %}
**Description:** Controls time display format
{% endhint %}

**Options:**

* `true`: 24-hour format (13:30, 23:45)
* `false`: 12-hour format (1:30 PM, 11:45 PM)

***

```lua
Config.Breathalyzer = {
    controls = {
        blowKey = 38,  -- Key for blowing into breathalyzer
        closeKey = 177 -- Key for closing the UI
    }
}
```

**Blow Key:**

{% hint style="info" %}
**Description:** The key players press to blow into the breathalyzer
{% endhint %}

* Default: `38` (E key)

**Close Key:**

{% hint style="info" %}
**Description:** The key to close the breathalyzer interface
{% endhint %}

* Default: `177` (ESC key)

**Key Code Reference:** [FiveM Controls Documentation](https://docs.fivem.net/docs/game-references/controls/) (If you want to assign a different button, get its code from the link.)

***

```lua
Config.Breathalyzer = {
    pedDistance = 1.5 -- Distance to detect nearest player for paired test
}
```

{% hint style="info" %}
**Description:** Controls how far the breathalyzer can detect other players for paired testing.
{% endhint %}

**Range:**

* **Lower Values:** More precise, requires players to be very close (recommended)
* **Higher Values:** More forgiving, can test players from further away

</details>

<details>

<summary>Alcohol</summary>

```lua
Config.AlcoholSystem = {
    effectsEnabled = true,
    drinkingAnimationEnabled = true
}
```

***

```lua
Config.AlcoholSettings = {
    -- BAC (Blood Alcohol Content) thresholds
    sober = { min = 0.00, max = 0.50 },    -- Sober range
    impaired = { min = 0.51, max = 1.00 }, -- Impaired range
    drunk = { min = 1.01, max = 4.0 },     -- Drunk range
}
```

{% hint style="info" %}
**Description:** Defines the BAC ranges that determine a player's intoxication level.
{% endhint %}

**Customization:** You can adjust these ranges to match your server's gameplay style:

* **Sober Range:** Light effects
* **Impaired Range:** Medium effects
* **Drunk Range:** Heavy effects

***

***

```lua
Config.AlcoholSettings = {
    reduceBAC = {
        amount = 0.008,        -- Amount BAC decreases per interval
        interval = 15,         -- Interval in seconds for BAC reduction
        -- Time calculation for 1.00 BAC:
        -- 1.00 ÷ 0.008 = 125 intervals
        -- 125 intervals × 15 seconds = 1875 seconds = 31.25 minutes
    }
}
```

{% hint style="info" %}
**Description:** Controls how quickly players sober up over time.
{% endhint %}

**Customization Options:**

* **Amount:** 0.001 to as much as you want (BAC reduction per interval)
* **Interval:** 1 to as much as you want seconds (how often BAC decreases)

**Example:**

```lua
-- Default settings (0.008 every 15 seconds)
-- 1.00 BAC → 0.00 BAC = 31.25 minutes

-- Fast sobering (0.015 every 10 seconds)  
-- 1.00 BAC → 0.00 BAC = 11.1 minutes

-- Slow sobering (0.005 every 20 seconds)
-- 1.00 BAC → 0.00 BAC = 66.7 minutes

-- Very slow sobering (0.003 every 30 seconds)
-- 1.00 BAC → 0.00 BAC = 166.7 minutes (2.8 hours)
```

***

```lua
Config.AlcoholSettings = {
    hungerSensitivity = {
        enabled = true,                  -- Toggle hunger effect on BAC
        hungerSensitivityThreshold  = 30,-- Hunger percentage threshold
        hungerSensitivityMultiplier = 30 -- BAC increase percentage when hungry
    }
}
```

```lua
Config.AlcoholSettings = {
    hungerSensitivity = {
        enabled = true,                  -- Toggle hunger effect on BAC
        hungerSensitivityThreshold  = 30,-- Hunger percentage threshold
        hungerSensitivityMultiplier = 30 -- BAC increase percentage when hungry
    }
}
```

{% hint style="info" %}
**Description:** Makes alcohol effects stronger when players are hungry.
{% endhint %}

**Mechanics:**

* **Threshold:** When hunger drops below this percentage, effects amplify
* **Multiplier:** BAC effects increase by this percentage when hungry
* **Example:** At 30% hunger, 0.40 BAC becomes 0.52 BAC effect

***

```lua
effectRemovalItems = {
    ["yogurt"] = {
        time = 5000, -- Time in milliseconds to consume
        label = 'Yogurt', -- Display name for progress bar
        clearEffects = true, -- Remove drunk effects
        reduceBac = 0.30, -- Reduce BAC by amount (0.00 = no reduction)
        animation = {
            animDict = 'mp_player_intdrink',
            anim = 'loop_bottle'
        },
        prop = {
            model = 'prop_cs_script_bottle',
            bone = 60309,
            coords = vec3(0.0, 0.0, 0.03),
            rotation = vec3(0.0, 0.0, 0.0),
        },
    },
},
```

***

```lua
Config.AlcoholSettings = {
    ["whiskey"] = {
        bac = 0.40,         -- BAC increase when consumed
        time = 8000,        -- Time in milliseconds to consume
        thirstIncrease = 5, -- Increases thirst by 5%
        
        animation = {
            animDict = 'mp_player_intdrink', -- Animation dictionary
            anim = 'loop_bottle'             -- Animation name
        },
        
        prop = {
            model = 'prop_whiskey_bottle',  -- 3D model of the bottle
            bone = 60309,                   -- Bone ID to attach prop
            coords = vec3(0.0, 0.0, -0.18), -- Offset coordinates
            rotation = vec3(0.0, 0.0, -40)  -- Rotation in degrees
        }
    }
}
```

**Key Properties:**

* **BAC:** How much alcohol content the item adds (0.01 to your max BAC)
* **Time:** Consumption duration in milliseconds (1000 to 15000)
* **ThirstIncrease:** Dehydration effect (0 to 20)

**Animation & Props:**

* **animDict:** Animation library to use
* **anim:** Animation name
* **model:** 3D model name
* **bone:** Body part to attach item to
* **coords:** Position offset from bone
* **rotation:** Item rotation in degrees

**Add Your Item:**

```lua
["item_name"] = {
    bac = 0.20,         -- Adjust BAC increase (0.01 to 4.0)
    time = 8000,        -- Adjust consumption time (1000 to 15000 ms)
    thirstIncrease = 5, -- Adjust thirst increase (0 to 20)
    
    animation = {
        animDict = 'mp_player_intdrink', -- Keep default or change
        anim = 'loop_bottle'             -- Keep default or change
    },
    
    prop = {
        model = 'prop_your_item_model', -- Change to your item model
        bone = 60309,                   -- Keep default (right hand)
        coords = vec3(0.0, 0.0, -0.18), -- Adjust position if needed
        rotation = vec3(0.0, 0.0, -40)  -- Adjust rotation if needed
    }
}
```

</details>

<details>

<summary>Drunk Levels</summary>

```lua
Config.DrunkLevels = {
    {
        minBac = 0.21,        -- Minimum BAC level for these effects
        maxBac = 0.49,        -- Maximum BAC level for these effects
        
        onFoot = {             -- Effects when player is on foot
            statusEffects = { ... },
            walkingDifficulty = { ... }
        },
        
        combat = {              -- Effects during combat
            damage = { ... },
            accidentalShooting = { ... }
        },
        
        driving = {             -- Effects while driving
            steeringDrift = { ... },
            randomVehicleEvents = { ... }
        }
    }
}
```

**BAC Level Ranges:**

* **Level 1 (0.21-0.49):** Light effects, minor impairment
* **Level 2 (0.50-0.99):** Moderate effects, noticeable impairment
* **Level 3 (1.00-1.49):** Heavy effects, significant impairment
* **Level 4 (1.50-1.99):** Severe effects, major impairment
* **Level 5 (2.00+):** Extreme effects, dangerous impairment

**Effect Categories:**

* **OnFoot:** Walking, movement, and status effects
* **Combat:** Fighting, shooting, and damage effects
* **Driving:** Vehicle control and random event effects

***

```lua
onFoot = {
    statusEffects = {
        ragdoll = { enabled = true, chance = 15 }, -- Random ragdoll falls
        blackout = { enabled = true, chance = 5 }, -- Temporary unconsciousness
        vomiting = { enabled = true, chance = 25, thirstIncrease = 10 }
    },
    
    walkingDifficulty = {
        enabled = true,      -- Enable walking effects
        swayIntensity = 0.8, -- Walking sway amount
        speedReduction = 0.3 -- Movement speed reduction
    }
}
```

{% hint style="info" %}
**Description:** Controls how quickly players sober up over time.
{% endhint %}

**Customization Options:**

* **Amount:** 0.001 to as much as you want (BAC reduction per interval)
* **Interval:** 1 to as much as you want seconds (how often BAC decreases)

**Example:**

```lua
-- Default settings (0.008 every 15 seconds)
-- 1.00 BAC → 0.00 BAC = 31.25 minutes

-- Fast sobering (0.015 every 10 seconds)  
-- 1.00 BAC → 0.00 BAC = 11.1 minutes

-- Slow sobering (0.005 every 20 seconds)
-- 1.00 BAC → 0.00 BAC = 66.7 minutes

-- Very slow sobering (0.003 every 30 seconds)
-- 1.00 BAC → 0.00 BAC = 166.7 minutes (2.8 hours)
```

***

```lua
Config.AlcoholSettings = {
    hungerSensitivity = {
        enabled = true,                  -- Toggle hunger effect on BAC
        hungerSensitivityThreshold  = 30,-- Hunger percentage threshold
        hungerSensitivityMultiplier = 30 -- BAC increase percentage when hungry
    }
}
```

{% hint style="info" %}
**Description:** Makes alcohol effects stronger when players are hungry.
{% endhint %}

**Mechanics:**

* **Threshold:** When hunger drops below this percentage, effects amplify
* **Multiplier:** BAC effects increase by this percentage when hungry
* **Example:** At 30% hunger, 0.40 BAC becomes 0.52 BAC effect

***

```lua
Config.AlcoholSettings = {
    ["whiskey"] = {
        bac = 0.40,         -- BAC increase when consumed
        time = 8000,        -- Time in milliseconds to consume
        thirstIncrease = 5, -- Increases thirst by 5%
        
        animation = {
            animDict = 'mp_player_intdrink', -- Animation dictionary
            anim = 'loop_bottle'             -- Animation name
        },
        
        prop = {
            model = 'prop_whiskey_bottle',  -- 3D model of the bottle
            bone = 60309,                   -- Bone ID to attach prop
            coords = vec3(0.0, 0.0, -0.18), -- Offset coordinates
            rotation = vec3(0.0, 0.0, -40)  -- Rotation in degrees
        }
    }
}
```

**Key Properties:**

* **BAC:** How much alcohol content the item adds (0.01 to your max BAC)
* **Time:** Consumption duration in milliseconds (1000 to 15000)
* **ThirstIncrease:** Dehydration effect (0 to 20)

**Animation & Props:**

* **animDict:** Animation library to use
* **anim:** Animation name
* **model:** 3D model name
* **bone:** Body part to attach item to
* **coords:** Position offset from bone
* **rotation:** Item rotation in degrees

**Add Your Item:**

```lua
["item_name"] = {
    bac = 0.20,         -- Adjust BAC increase (0.01 to 4.0)
    time = 8000,        -- Adjust consumption time (1000 to 15000 ms)
    thirstIncrease = 5, -- Adjust thirst increase (0 to 20)
    
    animation = {
        animDict = 'mp_player_intdrink', -- Keep default or change
        anim = 'loop_bottle'             -- Keep default or change
    },
    
    prop = {
        model = 'prop_your_item_model', -- Change to your item model
        bone = 60309,                   -- Keep default (right hand)
        coords = vec3(0.0, 0.0, -0.18), -- Adjust position if needed
        rotation = vec3(0.0, 0.0, -40)  -- Adjust rotation if needed
    }
}
```

</details>

<div align="center"><figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2F3U5y01cU31GBfJhLGkF6%2Fconfig.png?alt=media&amp;token=86ebbe1d-6968-4536-9b2d-bc0ce0e848ed" alt="Configurations"><figcaption><p><code>config.lua</code></p></figcaption></figure></div>


# Exports & Events

This section contains all the exports provided by the script. For best results, make changes with someone knowledgeable in Lua to prevent errors.

***

### Exports

<details>

<summary><code>IsPlayerDrunk</code></summary>

```lua
exports['mst_breathalyzer']:isPlayerDrunk(targetId)
```

The **isPlayerDrunk** export allows you to check if any player is currently drunk. This export can check both the local player and other players.

**How to use?**

To check if the local player is drunk, use the following code:

```lua
-- Check if specific player is drunk
local targetId = 5
local isDrunk = exports['mst_breathalyzer']:isPlayerDrunk(targetId)
if isDrunk then
    print("Player " .. targetId .. " is currently drunk")
else
    print("Player " .. targetId .. " is sober")
end

-- Check if local player is drunk
local isLocalDrunk = exports['mst_breathalyzer']:isPlayerDrunk()
if isLocalDrunk then
    print("You are currently drunk")
else
    print("You are sober")
end
```

**Parameters:**

* `targetId` (number, optional): Target player's server ID. If omitted, checks local player.

**Return value**:

* Returns `true` if player is drunk (BAC > 0.50)
* Returns `false` if player is sober (BAC ≤ 0.50)

</details>

<details>

<summary><code>GetPlayerBAC</code></summary>

```lua
exports['mst_breathalyzer']:getPlayerBAC()
```

The **getPlayerBAC** export allows you to retrieve the current BAC level of the local player from the client. This export provides real-time information about the player's alcohol consumption.

**How to use?**

To get the local player's current BAC level, use the following code:

```lua
-- Get BAC of specific player
local targetId = 5
local targetBAC = exports['mst_breathalyzer']:getPlayerBAC(targetId)
if targetBAC then
    print("Player " .. targetId .. " BAC: " .. targetBAC)
    
    -- Check their drunk level
    if targetBAC <= 0.50 then
        print("Player " .. targetId .. " is sober")
    elseif targetBAC <= 1.00 then
        print("Player " .. targetId .. " is impaired")
    else
        print("Player " .. targetId .. " is drunk")
    end
else
    print("Player " .. targetId .. " BAC not available")
end

-- Get local player's BAC
local localBAC = exports['mst_breathalyzer']:getPlayerBAC()
if localBAC then
    print("Your BAC: " .. localBAC)
    
    if localBAC <= 0.50 then
        print("You are sober")
    elseif localBAC <= 1.00 then
        print("You are impaired")
    else
        print("You are drunk")
    end
else
    print("Your BAC not available")
end
```

**Parameters:**

* `targetId` (number, optional): Target player's server ID. If omitted, gets local player's BAC.

**Return value**:

* Returns `number` representing current BAC level (0.0 to 4.0)
* Returns `nil` if BAC data is not available

</details>

<details>

<summary><code>AddPlayerBAC</code></summary>

```lua
exports['mst_breathalyzer']:AddPlayerBAC(source, bacLevel)
```

The **AddPlayerBAC** export allows you to add a specific BAC level for a player from the server side. This export is useful for medical scripts, police interactions, or custom scenarios where you need to control a player's alcohol level programmatically.

**How to use?**

To set a player's BAC level, use the following code:

```lua
-- Set player's BAC to 0.5 (impaired level)
exports['mst_breathalyzer']:AddPlayerBAC(source, 0.5)

-- Set player's BAC to 0.0 (completely sober)
exports['mst_breathalyzer']:AddPlayerBAC(source, 0.0)

-- Set player's BAC to 2.0 (very drunk)
exports['mst_breathalyzer']:AddPlayerBAC(source, 2.0)
```

**Parameters:**

* `source` (number): The player's server ID
* `bacLevel` (number): The BAC level to set (0.0 to 4.0)

**Return value**:

* Returns `number` representing current BAC level (0.0 to 4.0)
* Returns `nil` if BAC data is not available

</details>

### Events

<details>

<summary><code>openUI</code></summary>

```lua
TriggerEvent('mst_breathalyzer:openUI')
```

The **mst\_breathalyzer:openUI** event allows you to open the breathalyzer interface. This event is useful for other scripts that need to force open the breathalyzer UI.

**How to use?**

To open the breathalyzer UI, use the following code:

```lua
-- Add breathalyzer option to qb-radialmenu
{
    id = 'breathalyzer',
    title = 'Breathalyzer',
    icon = 'wine-bottle',
    type = 'client',
    event = 'mst_breathalyzer:openUI',
    shouldClose = true
}
```

</details>


# Common Issues

Here you’ll find the most common problems users run into - along with simple solutions, so you can get back on track fast.

***


# Drug Detector

Enhance your FiveM police roleplay with the Mosoto Drug Detector - an essential gadget to reveal forbidden substances from suspects.

***

This tool allows police officers to detect drugs in the saliva of the nearest player. After a short, realistic processing time, results appear through red indicator lines, providing clear feedback, with an interactive user interface and an authentic spit sound adding realism to each inspection.

### Features

* **Unique Drug Effects System** - Each substance has **custom animations**, **concentration values**, and escalating **side effects** like **blurred vision**, **hallucinations**, **blackouts**, and more.
* **Immersive Test Animation & Custom 3D Prop** - Players must **hold a button to spit**, triggering a smooth animation of saliva traveling across the strip with authentic **spit sound effect**, enhanced by a **specially designed 3D detector model** for maximum realism.
* **Detailed Indicators** - Tests for **Methamphetamine, Amphetamine, Tetrahydrocannabinol, Opiates, Benzodiazepines**, and **Cocaine**, with **control line validation** for accurate results.
* **Persistent Player Data** - Drug effects and concentrations **remain saved** even after disconnecting and rejoining the server, until they naturally fade.
* **Traceable Used Items** - After testing, officers receive a **used detector item** storing the **officer’s name, suspect’s name, result**, and **timestamp**.
* **Automatic Logging** - Every inspection is instantly logged and sent to the **police Discord chat** for record-keeping.
* **And much more in the configuration file!**

### Preview

{% embed url="<https://www.youtube.com/watch?v=be6O0UELUvw>" %}


# Installation

If you aren't familiar with programming or just you don't know how to set up the script, we present our installation guide which is as comprehensive as possible so you don't have any difficulties.

***

## STEP 1 - Download

* Download **mst\_drugdetector** and **mst\_bridge** from [Portal](https://portal.cfx.re/assets/granted-assets).

## STEP 2 - Dependencies

{% hint style="info" %}
The script requires several dependencies to function properly.
{% endhint %}

**Required:**

* [es\_extended](https://github.com/esx-framework/esx_core/tree/main/%5Bcore%5D/es_extended) or [qb-core](https://github.com/qbcore-framework/qb-core) or [qbx\_core](https://github.com/Qbox-project/qbx_core)
* [mst\_bridge](https://portal.cfx.re/assets/granted-assets)

## STEP 3 - Resource order

{% hint style="info" %}
You MUST start the resource below your core and bridge!
{% endhint %}

<pre data-title="SERVER.CFG"><code>ensure es_extended/qb-core/qbx_core
ensure mst_bridge
<strong>ensure mst_drugdetector
</strong></code></pre>

## STEP 4 - Database

{% hint style="danger" %}
Without adding these items to the database, the script will not work!
{% endhint %}

{% tabs %}
{% tab title="MySQL" %}

```sql
DELETE FROM items WHERE name = 'drugdetector';
DELETE FROM items WHERE name = 'drugdetector_used';
DELETE FROM items WHERE name = 'joint';
DELETE FROM items WHERE name = 'cocaine';
DELETE FROM items WHERE name = 'ecstasy';
DELETE FROM items WHERE name = 'meth';
DELETE FROM items WHERE name = 'heroin';
DELETE FROM items WHERE name = 'morphine';
DELETE FROM items WHERE name = 'xanax';
DELETE FROM items WHERE name = 'narcan';

INSERT INTO `items` (`name`, `label`, `weight`) VALUES
	('drugdetector', 'Drug Detector', 1),
	('drugdetector_used', 'Used Drug Detector', 1),
	('joint', 'Joint', 1),
	('cocaine', 'Cocaine', 1),
	('ecstasy', 'Ecstasy', 1),
	('meth', 'Methamphetamine', 1),
	('heroin', 'Heroin', 1),
	('morphine', 'Morphine', 1),
	('xanax', 'Xanax', 1),
  ('narcan', 'Narcan', 1)
;
```

{% endtab %}

{% tab title="QB" %}

```lua
drugdetector = { name = 'drugdetector', label = 'Drug Detector', weight = 1, type = 'item', image = 'drugdetector.png', unique = false, useable = true, shouldClose = true, description = 'A device used to test for drugs in a person\'s system' },
drugdetector_used = { name = 'drugdetector_used', label = 'Used Drug Detector', weight = 1, type = 'item', image = 'drugdetector_used.png', unique = true, useable = false, shouldClose = true, description = 'A drug detector that has been used and contains test results' },
joint = { name = 'joint', label = 'Joint', weight = 1, type = 'item', image = 'joint.png', unique = false, useable = true, shouldClose = true, description = 'A cannabis joint' },
cocaine = { name = 'cocaine', label = 'Cocaine', weight = 1, type = 'item', image = 'cocaine.png', unique = false, useable = true, shouldClose = true, description = 'Cocaine powder' },
ecstasy = { name = 'ecstasy', label = 'Ecstasy', weight = 1, type = 'item', image = 'ecstasy.png', unique = false, useable = true, shouldClose = true, description = 'Ecstasy pill' },
meth = { name = 'meth', label = 'Methamphetamine', weight = 1, type = 'item', image = 'meth.png', unique = false, useable = true, shouldClose = true, description = 'Methamphetamine crystal' },
heroin = { name = 'heroin', label = 'Heroin', weight = 1, type = 'item', image = 'heroin.png', unique = false, useable = true, shouldClose = true, description = 'Heroin powder' },
morphine = { name = 'morphine', label = 'Morphine', weight = 1, type = 'item', image = 'morphine.png', unique = false, useable = true, shouldClose = true, description = 'Morphine injection' },
xanax = { name = 'xanax', label = 'Xanax', weight = 1, type = 'item', image = 'xanax.png', unique = false, useable = true, shouldClose = true, description = 'Xanax pill' },
narcan = { name = 'narcan', label = 'Narcan', weight = 1, type = 'item', image = 'narcan.png', unique = false, useable = true, shouldClose = true, description = 'Narcan spray' },
```

{% endtab %}

{% tab title="OX" %}

```lua
['drugdetector'] = {
    label = 'Drug Detector',
    weight = 1000,
    stack = true,
    close = true,
    description = 'A device used to test for drugs in a person\'s system',
    client = {
        image = 'drugdetector.png'
    }
},

['drugdetector_used'] = {
    label = 'Used Drug Detector',
    weight = 1000,
    stack = false,
    close = true,
    description = 'A drug detector that has been used and contains test results',
    client = {
        image = 'drugdetector_used.png'
    }
},

['joint'] = {
    label = 'Joint',
    weight = 50,
    stack = true,
    close = true,
    description = 'A cannabis joint',
    client = {
        image = 'joint.png'
    }
},

['cocaine'] = {
    label = 'Cocaine',
    weight = 100,
    stack = true,
    close = true,
    description = 'Cocaine powder',
    client = {
        image = 'cocaine.png'
    }
},

['ecstasy'] = {
    label = 'Ecstasy',
    weight = 50,
    stack = true,
    close = true,
    description = 'Ecstasy pill',
    client = {
        image = 'ecstasy.png'
    }
},

['meth'] = {
    label = 'Methamphetamine',
    weight = 100,
    stack = true,
    close = true,
    description = 'Methamphetamine crystal',
    client = {
        image = 'meth.png'
    }
},

['heroin'] = {
    label = 'Heroin',
    weight = 100,
    stack = true,
    close = true,
    description = 'Heroin powder',
    client = {
        image = 'heroin.png'
    }
},

['morphine'] = {
    label = 'Morphine',
    weight = 50,
    stack = true,
    close = true,
    description = 'Morphine injection',
    client = {
        image = 'morphine.png'
    }
},

['xanax'] = {
    label = 'Xanax',
    weight = 10,
    stack = true,
    close = true,
    description = 'Xanax pill',
    client = {
        image = 'xanax.png'
    }
},

['narcan'] = {
    label = 'Narcan',
    weight = 10,
    stack = true,
    close = true,
    description = 'Narcan spray',
    client = {
        image = 'narcan.png'
    }
},
```

{% endtab %}

{% tab title="TGIANN" %}
{% code fullWidth="false" %}

```lua
drugdetector = { label = "Drug Detector", weight = 1, type = "item", image = "drugdetector.png", unique = false, useable = true, shouldClose = true, description = "A device used to test for drugs in a person's system" },
drugdetector_used = { label = "Used Drug Detector", weight = 1, type = "item", image = "drugdetector_used.png", unique = true, useable = false, shouldClose = true, description = "A drug detector that has been used and contains test results" },
joint = { label = "Joint", weight = 1, type = "item", image = "joint.png", unique = false, useable = true, shouldClose = true, description = "A cannabis joint" },
cocaine = { label = "Cocaine", weight = 1, type = "item", image = "cocaine.png", unique = false, useable = true, shouldClose = true, description = "Cocaine powder" },
ecstasy = { label = "Ecstasy", weight = 1, type = "item", image = "ecstasy.png", unique = false, useable = true, shouldClose = true, description = "Ecstasy pill" },
meth = { label = "Methamphetamine", weight = 1, type = "item", image = "meth.png", unique = false, useable = true, shouldClose = true, description = "Methamphetamine crystal" },
heroin = { label = "Heroin", weight = 1, type = "item", image = "heroin.png", unique = false, useable = true, shouldClose = true, description = "Heroin powder" },
morphine = { label = "Morphine", weight = 1, type = "item", image = "morphine.png", unique = false, useable = true, shouldClose = true, description = "Morphine injection" },
xanax = { label = "Xanax", weight = 1, type = "item", image = "xanax.png", unique = false, useable = true, shouldClose = true, description = "Xanax pill" },
narcan = { label = "Narcan", weight = 1, type = "item", image = "narcan.png", unique = false, useable = true, shouldClose = true, description = "Narcan spray" },
```

{% endcode %}
{% endtab %}
{% endtabs %}

## STEP 5 - Inventory Metadata

{% hint style="info" %}
Most of inventory systems automatically detect metadata, but others require manual configuration.
{% endhint %}

{% tabs %}
{% tab title="TGIANN" %}
Insert this block of code in `tgiann-inventory/configs/configMetadataAdvance.lua`

{% code fullWidth="false" %}

```lua
drugdetector_used = function(metadata, currentLang)
        local L
        do
            local ok, labels = pcall(function()
                return exports['mst_drugdetector']:GetDrugDetectorLocaleLabels()
            end)
            if ok and type(labels) == 'table' then
                L = {
                    officer = labels.officer or "",
                    tested = labels.tested or "",
                    result = labels.result or "",
                    date_time = labels.date_time or "",
                }
            else
                L = { officer = "", tested = "", result = "", date_time = "" }
            end
        end

        local row = [[
        <div class="item_info_row">
            <div class="item_info_row_left">%s</div>
            <div class="item_info_row_right">%s</div>
        </div>
        ]]

        local rows = {}

        table.insert(rows, row:format(L.officer, metadata and (metadata.officer or "-") or "-"))
        table.insert(rows, row:format(L.tested, metadata and (metadata.tested or "-") or "-"))
        table.insert(rows, row:format(L.result, metadata and (metadata.testResult or "-") or "-"))
        table.insert(rows, row:format(L.date_time, metadata and (metadata.dateTime or "-") or "-"))

        local html = [[ <div class="item_info_container">%s</div> ]]
        return html:format(table.concat(rows, "\n"))
end,
```

{% endcode %}
{% endtab %}
{% endtabs %}

## STEP 6 - Not working?

We hope you won’t need this step, but if you do, feel free to join our [**Discord**](https://discord.mosotoscripts.com) and open a support ticket. :)


# Configurations

All Mosoto scripts are fully editable and customizable to match your server’s style, rules, and balance.

***

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FU84YDb45JXc7CFnc4Wst%2Fcode.png?alt=media&amp;token=e44b7d11-43da-4d51-a173-d740da598897" alt=""><figcaption><p>config.lua</p></figcaption></figure>


# Exports & Events

This section contains all the exports provided by the script. For best results, make changes with someone knowledgeable in Lua to prevent errors.

***


# Common Issues

Here you’ll find the most common problems users run into - along with simple solutions, so you can get back on track fast.

***


# Fingerprint Scanner

Elevate your FiveM police roleplay with the Mosoto Fingerprint Scanner - the ultimate device for fast, reliable, and immersive identity checks.

***

This tool allows police officers to identify citizens through their registered fingerprints, each linked to their personal details and photo. Using the built-in management menu, officers can easily place and edit static fingerprint scanners anywhere in-game, without touching configuration files. After a short processing time, the scan displays complete identity data through a clean, immersive UI, while glove detection ensures realistic and fair checks.

### Features

* **Citizen Registration System** - Register each citizen on a static scanner by entering their **personal details** and **taking a photo** while they provide their fingerprint. This ensures that future scans instantly display **complete** and **accurate** identity data.
* **Editable & Fully Controlled Records** - Officers can **update** registered information at any time or **delete entries** entirely, giving **full control over the fingerprint database** and ensuring all data stays relevant and correct.
* **Fast & Immersive Scanning** - Each fingerprint check takes **only a few seconds**, instantly revealing all stored citizen details. The **clean, responsive, and realistic user interface** makes every scan **smooth, seamless, and fully immersive**.
* **Automatic Scan History** - Every successful fingerprint inspection is **saved in the device’s Scan History**, allowing officers to **review past interactions** at any moment with **precise timestamps**.
* **In-Game Static Scanner Placement** - **Version 2** introduces a **built-in management menu** that lets officers **create, edit, or relocate static fingerprint scanners directly in-game -** no configuration files required.
* **Mobile Fingerprint Scanning** - Officers can request the nearest player to **place their finger** on a **handheld device**. After a short scan, the citizen’s **full profile instantly appears** and is automatically added to the **history log**. Works anywhere - **patrols, stops, street checks** - with **synchronized UI and animations**.
* **Glove Detection System -** If a suspect is **wearing gloves**, the scanner **automatically blocks the scan**, ensuring **realistic, fair, and exploitation-proof** gameplay.
* **Automatic Discord Logging** - All key actions - **creating scanners**, **registering citizens**, and **scanning fingerprints** are instantly **logged and sent to the police Discord chat** for transparent record-keeping.
* **And more in the configuration file!**

### Preview

{% embed url="<https://www.youtube.com/watch?v=0hewlPk0Oq8>" %}


# Installation

If you aren't familiar with programming or just you don't know how to set up the script, we present our installation guide which is as comprehensive as possible so you don't have any difficulties.

***

{% stepper %}
{% step %}

### Download

Download **mst\_fpscanner** from [**Portal**](https://portal.cfx.re/assets/granted-assets).
{% endstep %}

{% step %}

### Dependencies

**Required:**

* [es\_extended](https://github.com/esx-framework/esx_core/tree/main/%5Bcore%5D/es_extended) or [qb-core](https://github.com/qbcore-framework/qb-core) or [qbx\_core](https://github.com/Qbox-project/qbx_core)
* [mst\_bridge](https://portal.cfx.re/assets/granted-assets)
* [ox\_lib](https://github.com/communityox/ox_lib/releases)
* [qb-target](https://github.com/qbcore-framework/qb-target) or [ox\_target](https://github.com/communityox/ox_target/releases)

**Optional:**

* [screencapture](https://github.com/itschip/screencapture)
* [MugShotBase64](https://github.com/BaziForYou/MugShotBase64)
  {% endstep %}

{% step %}

### Resources Order

{% hint style="warning" %}
mst\_fpscanner must be at the bottom of mst\_bridge
{% endhint %}

<pre class="language-markdown" data-title="SERVER.CFG"><code class="lang-markdown">ensure es_extended/qb-core/qbx_core
ensure oxmysql
ensure ox_lib

ensure inventory
ensure phone
ensure clothing
ensure banking
ensure fuel
ensure target

<strong>ensure mst_bridge
</strong><strong>ensure mst_fpscanner
</strong></code></pre>

{% endstep %}

{% step %}

## Database

* Add the images from the `inventory_images` folder inside `mst_fpscanner` to your inventory system’s image directory.

{% tabs %}
{% tab title="MySQL" %}

```sql
DELETE FROM items WHERE name = 'mobilescanner';
DELETE FROM items WHERE name = 'staticscanner';

INSERT INTO `items` (`name`, `label`, `weight`) VALUES
	('mobilescanner', 'Mobile Fingerprint Scanner', 1),
	('staticscanner', 'Static Fingerprint Scanner', 1)
;
```

{% endtab %}

{% tab title="QB" %}

```lua
mobilescanner = { name = 'mobilescanner', label = 'Mobile Fingerprint Scanner', weight = 1, type = 'item', image = 'mobilescanner.png', unique = true, useable = true, shouldClose = true, description = 'A portable device used to scan fingerprints on the go' },
staticscanner = { name = 'staticscanner', label = 'Static Fingerprint Scanner', weight = 1, type = 'item', image = 'staticscanner.png', unique = true, useable = true, shouldClose = true, description = 'A stationary fingerprint scanner that can be placed in a location' },
```

{% endtab %}

{% tab title="OX" %}

```lua
['mobilescanner'] = {
    label = 'Mobile Fingerprint Scanner',
    weight = 1000,
    stack = false,
    close = true,
    description = 'A portable device used to scan fingerprints on the go',
    client = {
        image = 'mobilescanner.png'
    }
},

['staticscanner'] = {
    label = 'Static Fingerprint Scanner',
    weight = 2000,
    stack = false,
    close = true,
    description = 'A stationary fingerprint scanner that can be placed in a location',
    client = {
        image = 'staticscanner.png'
    }
}
```

{% endtab %}

{% tab title="TGIANN" %}
{% code fullWidth="false" %}

```lua
mobilescanner = { label = "Mobile Fingerprint Scanner", weight = 1, type = "item", image = "mobilescanner.png", unique = true, useable = true, shouldClose = true, description = "A portable device used to scan fingerprints on the go" },
staticscanner = { label = "Static Fingerprint Scanner", weight = 1, type = "item", image = "staticscanner.png", unique = true, useable = true, shouldClose = true, description = "A stationary fingerprint scanner that can be placed in a location" },
```

{% endcode %}
{% endtab %}
{% endtabs %}
{% endstep %}

{% step %}

### Storage Setup

{% hint style="info" %}
There are 2 storage options where to store your images.
{% endhint %}

{% tabs %}
{% tab title="Fivemanage" %}

1. Open [Fivemanage](https://refer.fivemanage.com/simeon)
2. Create an account
3. Go to "Tokens" in the sidebar and then "Create Token"
4. Choose a name and "Images only" type from the dropdown
5. Finish with "Create Token"
6. Add <kbd>setr FIVEMANAGE\_MEDIA\_API\_KEY yourToken</kbd> in server.cfg below `mysql_connection_string` for example
7. Copy the token you made and put it in place of `yourToken`
8. Go to `mst_fpscanner/config` and set `storage = "fivemanage"`.
9. Save & Restart the server
   {% endtab %}

{% tab title="Imgbb " %}

1. Open [Imgbb](https://api.imgbb.com/)
2. Sign Up
3. Generate an API Key
4. Add `set IMGBB_API_KEY "your_key"` in server.cfg below `mysql_connection_string` for example
5. Copy the generated key and paste it between ""
6. Go to `mst_fpscanner/config` and set `storage = "imgbb"`.
7. Save & Restart the server
   {% endtab %}
   {% endtabs %}
   {% endstep %}

{% step %}

### Any other configurations?

{% hint style="success" %}
At Mosoto Scripts, we are constantly improving our resources, and for this reason you do not need to run the SQL manually, this happens automatically when you run the script for the first time.
{% endhint %}

{% hint style="info" %}
You will also no longer have to change the framework manually, for each script, as well as the language, notifications, etc. Everything happens through the `config.lua` file of **mst\_bridge**.
{% endhint %}
{% endstep %}

{% step %}

### Not working?

We hope you won’t need this step, but if you do, feel free to join our [**Discord**](https://discord.mosotoscripts.com) and open a support ticket. :)
{% endstep %}
{% endstepper %}


# Configurations

All Mosoto scripts are fully editable and customizable to match your server’s style, rules, and balance.

***

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FZk9HBlbKU5S01rBDJ1J8%2Ffpscannerconfig.png?alt=media&amp;token=95d358c1-b9f3-4960-b4cd-f308e621ca9b" alt=""><figcaption><p>config.lua</p></figcaption></figure>


# Exports & Events

This section contains all the exports provided by the script. For best results, make changes with someone knowledgeable in Lua to prevent errors.

***

**COMING SOON!**


# Common Issues

Here you’ll find the most common problems users run into - along with simple solutions, so you can get back on track fast.

***


# Seatbelt

Upgrade your FiveM roleplay with the Mosoto Seatbelt - an optimized and lifelike seatbelt system.

***

The script is designed to be highly intuitive and realistic. Players can fasten or unfasten their seatbelt with a simple key press, each action accompanied by authentic sound effects. One of the standout features is the fully visible seatbelt, displayed through a custom model and player animation, allowing everyone - including police officers - to instantly see whether someone is properly secured.

### Features

* **Seatbelt Toggle System -** Fasten or unfasten your seatbelt using a **keybind** (default **B key**) or the `/seatbelt` command for realistic seatbelt management.
* **Visual Seatbelt Props -** **3D seatbelt models** that are fully synchronized across all players, showing who is wearing a seatbelt in the vehicle.
* **HUD Indicator -** A clean interface indicator that displays when your seatbelt is **not fastened**, with configurable minimum speed threshold for visibility.
* **Realistic Sound System -** Immersive sounds when fastening/unfastening your seatbelt, plus an **alarm sound** that plays at high speeds when the seatbelt is unfastened.
* **Advanced Ejection System** - During collisions without a seatbelt, players can be **ejected from the vehicle** with realistic physics and death chances based on impact speed.
* **Impact Damage System -** Comprehensive collision damage mechanics - **without seatbelt: ejection and high damage**, **with seatbelt: reduced damage without ejection**, featuring three levels (low, medium, high) with configurable damage ranges.
* **Visual Effects After Collisions -** Immersive post-collision effects including **timecycle modifiers**, **camera shake**, **movement clipsets**, **blackout effects**, and **heartbeat sound** for severe impacts.
* **Multiplayer Synchronization -** Full synchronization across all players - **seatbelt props**, **seatbelt state**, and **sounds** are visible/audible to everyone in the vehicle.
* **And more in the configuration file!**

### Preview

{% embed url="<https://www.youtube.com/watch?v=hlDQ4hj5uxI>" %}


# Installation

If you aren't familiar with programming or just you don't know how to set up the script, we present our installation guide which is as comprehensive as possible so you don't have any difficulties.

***

## STEP 1 - Download

* Download **mst\_seatbelt** from [Portal](https://portal.cfx.re/assets/granted-assets).

## STEP 2 - Dependencies

{% hint style="info" %}
The script requires a dependency to function properly.
{% endhint %}

**Required:**

* [interact-sound](https://github.com/plunkettscott/interact-sound)

## STEP 3 - Resources order

{% hint style="info" %}
You MUST start the resource below your core and interact-sound!
{% endhint %}

<pre data-title="SERVER.CFG"><code>ensure es_extended/qb-core/qbx_core
ensure interact-sound
<strong>ensure mst_seatbelt
</strong></code></pre>

## STEP 4 - Drag & Drop Sounds

{% hint style="danger" %}
Without adding these sounds to the interact-sound resource, the script will not work properly!
{% endhint %}

* Drag sound files from `mst_seatbelt/sounds` folder to `interact-sound/client/html/sounds` folder.

**Don't forget** to change `'client/html/sounds/demo.ogg'` with `'client/html/sounds/*.ogg'`.

<pre class="language-lua" data-title="interact-sound/fxmanifest.lua"><code class="lang-lua">files {
    'client/html/index.html',
    -- Begin Sound Files Here...
    -- client/html/sounds/ ... .ogg
<strong>    'client/html/sounds/*.ogg'
</strong>}
</code></pre>

{% hint style="warning" %}
It is possible that your server has an **old version** of interact-sound installed, so if the sounds are not working, it is **recommended** to download this version - [**interact-sound**](https://github.com/mosotoscripts/interact-sound), but **don't forget** to **add the sounds to the correct place** `interact-sound/client/html/sounds`.
{% endhint %}

## STEP 5 - Remove Other Seatbelt Resources

{% hint style="info" %}
For the script to run without problems, there should be no other resources connected to the seatbelt.
{% endhint %}

{% tabs %}
{% tab title="ESX" %}

* Go to `esx_cruisecontrol/config.lua` and turn off the **Seatbelt** configuration.

<pre class="language-lua"><code class="lang-lua">Seatbelt = {
<strong>        Enable = false, -- Must be false
</strong>        Key = "B",
        EjectCheckSpeed = 45,
        RagdollTime = 1,
        Export = function (state)
            exports[Config.HudResource]:SeatbeltState(state)
        end
}
</code></pre>

{% endtab %}

{% tab title="QBCore" %}
Go to `qb-smallresources/client` and **remove** `seatbelt.lua`.
{% endtab %}

{% tab title="Qbox" %}

* Remove **qbx\_seatbelt** resource.
  {% endtab %}
  {% endtabs %}

## STEP 6 - Not working?

We hope you won’t need this step, but if you do, feel free to join our [**Discord**](https://discord.mosotoscripts.com) and open a support ticket. :)


# Configurations

All Mosoto scripts are fully editable and customizable to match your server’s style, rules, and balance.

***

<figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FpNiO6EO0VGxMHAfI1RxW%2Fcode.png?alt=media&amp;token=758fb848-10d6-4fa5-b0aa-1665136ed4b2" alt=""><figcaption><p>config.lua</p></figcaption></figure>


# Exports & Events

This section contains all the exports provided by the script. For best results, make changes with someone knowledgeable in Lua to prevent errors.

***

### Exports

<details>

<summary><code>HasSeatbelt</code></summary>

```lua
exports['mst_seatbelt']:HasSeatbelt()
```

The **HasSeatbelt** export allows you to check if the local player is currently wearing a seatbelt. This export returns the current seatbelt state.

**How to use?**

To check if the local player is wearing a seatbelt, use the following code:

```lua
-- Check if local player is wearing a seatbelt
local hasSeatbelt = exports['mst_seatbelt']:HasSeatbelt()
if hasSeatbelt then
    print("You are wearing a seatbelt")
else
    print("You are not wearing a seatbelt")
end
```

**Return value**:

* Returns `true` if the local player is wearing a seatbelt
* Returns `false` if the local player is not wearing a seatbelt

</details>

<details>

<summary><code>ToggleSeatbelt</code></summary>

```lua
exports['mst_seatbelt']:ToggleSeatbelt()
```

The **ToggleSeatbelt** export allows you to toggle the seatbelt state for the local player. This will fasten the seatbelt if it's unfastened, or unfasten it if it's fastened.

**How to use?**

To toggle the local player's seatbelt, use the following code:

```lua
-- Toggle local player's seatbelt
local success = exports['mst_seatbelt']:ToggleSeatbelt()
if success then
    print("Seatbelt toggled successfully")
else
    print("Failed to toggle seatbelt (not in vehicle, vehicle excluded, or menu is open)")
end
```

**Return value**:

* Returns `true` if the seatbelt was toggled successfully
* Returns `false` if the player is not in a vehicle, the vehicle is excluded, or the pause menu is active

</details>

<details>

<summary><code>SetSeatbelt</code></summary>

```lua
exports['mst_seatbelt']:SetSeatbelt(state)
```

The **SetSeatbelt** export allows you to set the seatbelt state for the local player to a specific value (fastened or unfastened).

**How to use?**

To set the local player's seatbelt state, use the following code:

```lua
-- Fasten the seatbelt
local success = exports['mst_seatbelt']:SetSeatbelt(true)
if success then
    print("Seatbelt fastened")
else
    print("Failed to fasten seatbelt")
end

-- Unfasten the seatbelt
local success = exports['mst_seatbelt']:SetSeatbelt(false)
if success then
    print("Seatbelt unfastened")
else
    print("Failed to unfasten seatbelt")
end
```

**Parameters:**

* `state` (boolean): The desired seatbelt state. `true` to fasten, `false` to unfasten.

**Return value**:

* Returns `true` if the seatbelt state was set successfully
* Returns `false` if the player is not in a vehicle, the vehicle is excluded, the pause menu is active, the player is dead, or the seatbelt animation is still playing

</details>


# Integrations

Explore integrations that connect your resources with ours.

***


# jg-hud

Step-by-step guide to integrating jg-hud with mst\_seatbelt

***

## STEP 1 - Configurations

Turn `Config.UseCustomSeatbeltIntegration` to **true** and `Config.SeatbeltKeybind` to **false**

<div align="left"><figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FDNmkKoeRjQZuTcnyFxKr%2Fseatbeltconfig.jpg?alt=media&amp;token=898ffc0b-e3b1-4b9b-9f07-77a2f76da7e2" alt=""><figcaption><p>config.lua</p></figcaption></figure></div>

## STEP 2 - Modifications

Replace **jg-hud/client/cl-seatbelt.lua** with ours.

{% file src="/files/UOIYz0u7ycGGdltwi0pM" %}

Then go in **jg-hud/framework/cl-functions.lua** and find `Framework.Client.ToggleSeatbelt` then replace it with this code:

```lua
function Framework.Client.ToggleSeatbelt(vehicle, seatbeltOn)
  if GetResourceState("mst_seatbelt") == "started" and exports["mst_seatbelt"] and exports["mst_seatbelt"].SetSeatbelt then
    exports["mst_seatbelt"]:SetSeatbelt(seatbeltOn)
  end
  -- ...or add another custom seatbelt integration here!
end
```

## STEP 3 - Remove default sound effects

To hear only the **Mosoto Seatbelt** sounds you need to delete the three sound files that are from the hud located in **jg-hud/web/dist/sfx** - *seatbelt-on.mp3*, *seatbelt-off.mp3*, *seatbelt-alarm.mp3*


# wais-hudv6

Step-by-step guide to integrating jg-hud with mst\_seatbelt

***

## STEP 1 - Configurations

Turn `["belt"].["disabled"]` to **true**

<div align="left"><figure><img src="https://1455386872-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrbcBTM4p7TpOd5nMepYG%2Fuploads%2FmSzTcdyCaZDdhf6auiPQ%2Fimage.png?alt=media&amp;token=fd83a445-6972-4eb8-8415-b31c82ad62bb" alt=""><figcaption><p>config.lua</p></figcaption></figure></div>

## STEP 2 - Modifications

Replace **wais-hudv6/bridge/editable/belt.lua** with ours.

{% file src="/files/pmJcjvGDnYJqlaeY3WDZ" %}


# Common Issues

Here you’ll find the most common problems users run into - along with simple solutions, so you can get back on track fast.

***


