# rcore.cz

This page is the documentation for our script that we are creating, you can found their tips and tutorials on how to use scripting API, edit configuration and more.

#### Social links

Discord: <https://discord.gg/F28PfsY>\
YouTube: <https://www.youtube.com/c/rcore>

{% hint style="info" %}
Need some help? The best option is to create a ticket at our discord server :)
{% endhint %}


# CFX Auth system

All you need to know about the new CFX auth system so you can use our resources you have just bought.

We are using new CFX protection system for our resources. That means you will find your resources after the payment on the keymaster website.

### Where can I find my resources?

You can find them all on the keymaster <https://keymaster.fivem.net/asset-grants>.

{% embed url="<https://2290428088-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MZErcztD5BvrKnwRGJq%2Fuploads%2F8PsEiqYDoOWq86MmC0Lm%2Fcfx.png?alt=media&token=d8551c24-4d91-4d7e-8082-da1b7790099a>" %}
key master assets location
{% endembed %}

### I can't find my resources

You probably bought our resources with different CFX account. You need to transfer them to the account that you are using for keys to your server. Use the guide bellow

{% content-ref url="/pages/uGvgJlElSWRlnQnQHRwo" %}
[Transfer script to another account](/cfx-auth-system/how-to-transfer-script)
{% endcontent-ref %}


# Transfer script to another account

#### Welcome to the guide “how to transfer the script“ from one to another account

## Where can I find the owner's name?

#### First of all we need to know, who is the server's owner.

Open the [fivem server list](https://servers.fivem.net/servers), find your server here and click on the server's description. If you did that successfully you should be able to see this

<figure><img src="/files/1xR4mCTy0U7k6brDWutz" alt=""><figcaption><p>Server information</p></figcaption></figure>

Pay attention to the *listed* **Owner**. With this little trick we now know the username of the owner to whom we need to transfer the script

#### I didn't find my server there, is there any other way to do it?

There is another way how to acquire the owner's username of the server but it always lead back to the server list

You will need to find specific information in the **server's console** it looks like this

<figure><img src="/files/22vAaNFucENabc4bo3y8" alt=""><figcaption><p>Server console auth nucleus</p></figcaption></figure>

Check the text "eo3r9b" which will be different for every server

Now we know what ID our server is.

Now we will open the internet browser

Head back to the website "servers.fivem.net" but add some additional information to the URL

<https://servers.fivem.net/servers/detail/eo3r9b>

As you can see we have added "/detail/ + eo3r9b"

And if you did everything correctly, you will see this on the website

<figure><img src="/files/1xR4mCTy0U7k6brDWutz" alt=""><figcaption></figcaption></figure>

## Transferring the script

Now we know the user name and we can transfer the script

Now you need to log-in to your [fivem keymaster](https://keymaster.fivem.net/login) after you log into the account, check this [for this page](https://keymaster.fivem.net/asset-grants) that is called **"Purchased assets"**

There you're going to see the list of bought resources

<figure><img src="/files/HeeXgg3KpSYaHqaw6O9g" alt=""><figcaption></figcaption></figure>

Look for the button called **"Transfer to another account"** Click on the button and it will lead to this page

<figure><img src="/files/C6U5LFjneSctpqE6hKVD" alt=""><figcaption></figcaption></figure>

Just enter the username to who you wish to transfer the script and that's it.

<figure><img src="/files/Mthml0auejSxAnObZWVa" alt=""><figcaption><p>Entering name of target user</p></figcaption></figure>

<figure><img src="/files/RP1rTfn3N7Is5uisYqGo" alt=""><figcaption></figcaption></figure>


# Error: You lack the required entitlement

| Is there something familiar in **server console** like this? |
| ------------------------------------------------------------ |

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

There could be a several reasons why this is happening

1. You have bought the script with other fivem account than the server's owner is
2. The server needs to be restarted
3. Your OS time may be ahead/behind of real time.

**I have bought the script with annother account (1)**

If this is the case, check to this guide [Transfer resource guide](https://documentation.rcore.cz/faq/how-to-transfer-script).

**I have not restarted the server**

It feels like there is no need to explain this. Restart it!

**Operation system doesn't have the right time?**

You just need to open this website: [https://time.is/](https://time.is) and just choose where the server is located, and if it will be ahead/behind more than one minute please correct this issue unless the problem won't be solved.

How do I sync time?

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


# Error: syntax error near '<\1>'

How to fix this error? It's simple, just update your server.

There are two possible ways why this error occurs

* You have used FileZilla which is breaking the structure of the script so please use WinSCP which works as expected and doesn't break anything.\
  \
  If you did not use FileZilla but you "drag and drop it" with Remote Desktop Control that will still damage it, so please drag and drop the zip and unzip it on server do not move it with method "file by file"\\
* Your server is outdated and needs to be at least 4752 or greater.

### FileZilla set binary mode

If you are using FileZilla try reupload whole resource with binary mode

<figure><img src="/files/vABBc8hrjJciLEGChBis" alt=""><figcaption><p>Binary transfer mode</p></figcaption></figure>

### How can I check my version?

Write into your server console `version`command

### How to update?

#### Windows

Please check this video

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

#### Linux

1. Download the last recommended artifact from this page <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>
2. Turn off your server
3. Delete `cache` & `alpine` folder
4. Unzip `fx.tar.xz` with command `tar -xf fx.rar.xz`
5. Start the server and write `version` to see a new version

#### Windows

Exactly the same but you use windows FXServer artifact <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>

And remove the server folder and replace it with the newly downloaded version.


# Updating server

### How to update?

#### Windows

Please check this video

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

#### Linux

1. Download the last recommended artifact from this page <https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/>
2. Turn off your server
3. Delete `cache` & `alpine` folder
4. Unzip `fx.tar.xz` with command `tar -xf fx.rar.xz`
5. Start the server and write `version` to see a new version

#### Windows

Exactly the same but you use windows FXServer artifact <https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/>

And remove the server folder and replace it with the newly downloaded version.


# onesync

There are more ways to enable onesync so let's take a look at how to do it in two ways.

* By putting the command in server.cfg

```
# enable OneSync (required for server-side state awareness)
set onesync true
```

* By putting startup command

```
+set onesync true
```

If we done everything correctly we can check the final result by command **onesync** in server console

![](/files/qW4S3263nWiLMNbAZdVO)

The onesync has to be always on "on" if there is "legacy" or "off" that's bad and the resources will not work.

Know issues:

* TXAdmin can rewrite the onesync which can be a reason why the status of onesync has not changed.
* You may have more commands in server.cfg / anywhere else where you execute "set onesync" where the value could be different than "true" like above


# How to change IP

Simple tutorial “how to change your server's IP whenever you need it“

{% hint style="info" %}
You can change the IP whenever you want there is no limit of changes. First you can assign the script on your own dev server, then you can change IP to live server in the matter of seconds.
{% endhint %}

First, login into your rcore.cz account by using the rcore account you used to buy your resources. On the upper side of your screen is the "servers" section, click on that.

![](/files/nKGTpYYBi5EKbI2Yndv2)

Click on “edit server“.

![](/files/ZNf87x38Y8I6RliS2c2q)

Change the IP address. Once you are done, click on “save“. The change is done immediately and there is no limit of changing IP address.

![](/files/uV39c1nCyOCFWRg7MNIH)


# Forgot your password?

How to reset your password

## Getting started

{% hint style="info" %}
You can reset the password whenever you want. There is no delay and no limit of changing the password.
{% endhint %}

![](/files/UFDkcNUKzYDeuAioENet)

Now, enter the e-mail address that you are using to log-in into the rcore custormer's center.

![](/files/477j3kJ8QtU9xzySvWdF)

Now check your e-mail. There should be an e-mail from rcore. Follow the instructions in the e-mail and by clicking on “Create new password“. Please have in mind that the password reset request is valid only for 5 minutes. You need to change the password within these 5 minutes!

![](/files/dUk8omLtqpiq5rgo87UW)

You will now be redirected to log-in page where you can set up a new password.

![](/files/SwyHcy51H2nKYPnWsT5G)

Create a new password and press “Send request“ .

![](/files/3CDqYvSdh8Q1PSuelq6D)

After all these steps, your password should be reset. Now you are free to log-in into the rcore's customer's center.


# General issues

### You lack the required entitlement

Do you see something like this in the console?

![](/files/761Vqog2CSzq1QR1hG68)

Please read this guide: [Error: You lack the required entitlement](/cfx-auth-system/you-lack-the-entitlement)

### Syntax error near '<\1>'

Do you see something like this in the console?

![](/files/mqTUFiILf9zRSaVtpWLs)

Please read this guide: [Error: syntax error near '<\1>'](/cfx-auth-system/error-syntax-error-near-less-than-1-greater-than)

### Could not find dependency / Can't run

Do you see something like this in the console?

![](/files/gJXnbfy9tf8UbMg4g8JK)

![](/files/4cyHSzU7zhEfS60H4kXc)

![](/files/eYcF94JqgnLj16K2Qmb5)

Follow this guide please: [Updating server](/server/updating-server)

Do you see something like this in the console?

![](/files/g5FD70o5jybB4XqlQBA8)

![](/files/ZaJA0yF5K8DnBhsQpR57)

Follow this guide please: [onesync](/server/onesync)


# Cannot verify license

Why the verification of the script failed

{% hint style="info" %}
**There are several reasons that can cause this problem. Make sure you check all of them.**
{% endhint %}

1. Make sure your **firewall is not blocking** ports 80/443.
2. Check the version of your server. *Old server versions can cause timeout requests.*
3. AntiDDOS may be blocking our server.

For the point 3. You will need to allow these IPs mentioned below

1. 193.70.80.3
2. 2001:41d0:303:203::


# Cannot hear any music

Is there a problem with music from xradio / xdj / radiocar?

There can be many reasons, few scripts have edited xsound to the point where it's almost broken and unplayable.

This one is compatible with phone that can play youtube is known as "crewPhone" or "gcPhone"

If you don't have the phone mentioned above, follow this.

I recommend first updating xsound to the newest version.

Make sure that onesync is enabled and not on "legacy", you can check the onesync status by command `onesync` if it will be one "off" or "legacy" it may cause problems to xradio + radio car

If you cannot hear music but others can there be several reasons

You have muted NUI in-game

![NUI Volume](https://rco.re/docs/xsound/NUI%20Volume.png)

if you do not have muted NUI then the user need to go to the

control panel -> Sound and everything that is not used has to be disabled because youtube is confused and don't know what audio player to pick

![Control panel](https://rco.re/docs/xsound/Control%20panel.png)

The last thing that is a problem for most people is the loading screen, if you mute the youtube player there it will be muted everywhere, so unmute it.


# ECONNRESET: Unable to execute a query

```lua
SCRIPT ERROR: @rcore_whiteboard/server/lib/db.lua:17: rcore_whiteboard was unable to execute a query!
read ECONNRESET
```

When script sends queries with large data it could sometimes ends with ECEONNRESET error which could be easily fixed by increasing `max_allowed_packet` size in database.


# ‌🏑 rcore\_airhockey

Air Hockey is an exciting gamemode for FiveM that turns every static air hockey table object into a playable and challenging two-player experience.

[**Buy Here**](https://store.rcore.cz/package/5464031)

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

## Common Issues & Solutions

{% hint style="danger" %}
This script **REQUIRES** artifact version **4752** or **newer**
{% endhint %}

### You lack the required entitlement

Do you see something like this in the console?

![](/files/761Vqog2CSzq1QR1hG68)

Please read this guide: [Error: You lack the required entitlement](/cfx-auth-system/you-lack-the-entitlement)

### Syntax error near '<\1>'

Do you see something like this in the console?

![](/files/mqTUFiILf9zRSaVtpWLs)

Please read this guide: [Error: syntax error near '<\1>'](/cfx-auth-system/error-syntax-error-near-less-than-1-greater-than)

### Could not find dependency / Can't run

Do you see something like this in the console?

![](/files/gJXnbfy9tf8UbMg4g8JK)

![](/files/eYcF94JqgnLj16K2Qmb5)

![](/files/4cyHSzU7zhEfS60H4kXc)

Follow this guide please: [Updating server](/server/updating-server)

Do you see something like this in the console?

![](/files/g5FD70o5jybB4XqlQBA8)

![](/files/ZaJA0yF5K8DnBhsQpR57)

Follow this guide please: [onesync](/server/onesync)


# How To Play

How to play Air Hockey

<div><figure><img src="/files/4VUmth8CxgPIFVpsgLjl" alt=""><figcaption><p>Joining the Table</p></figcaption></figure> <figure><img src="/files/23xfi01sLbS7TfUJDXF5" alt=""><figcaption><p>Rules</p></figcaption></figure></div>

1. Air Hockey is a game designed for two players
2. Both players need to come near the table to start the game
3. A notification prompt will show up on their screens with a message "Press E to play"
4. The first player who joins the table by pressing E becomes the "host" of the game
5. The host can choose their side and set the game rules.
6. The second player that joins the table plays on the opposite side of the host.
7. The goal of the game is to score the puck on the opponent's net.


# Spawning a Hockey Table

Ability to spawn more Air Hockey tables through the script.

<figure><img src="/files/EN9LiqRHBeWGakAuQle8" alt=""><figcaption><p>Del Perro Pier</p></figcaption></figure>

All Air Hockey tables that's already spawned by other scripts/maps will be playable. If you want to spawn extra tables, you can do it in **config.lua**

```lua
Objects = {{
    pos = vector3(-1635.939453, -1052.837891, 12.148856),
    heading = 318.0
}, {
    pos = vector3(-1634.047485, -1054.425537, 12.148856),
    heading = 318.0
}}
```


# ‌💪 rcore\_armwrestling

GeneralStep by step installation guide, config preview, locale preview, common issues & solutions and most importantly code snippets to help you integrate our system with known resources.

{% embed url="<https://www.youtube.com/watch?feature=emb_title&v=jnepGumQjP8>" %}
Showcase
{% endembed %}

[**Buy Here**](https://store.rcore.cz/package/4355439)

## Common Issues & Solutions

{% hint style="danger" %}
this script **REQUIRES** artifact version **4752** or **newer**
{% endhint %}

### You lack the required entitlement

Do you see something like this in the console?

![](/files/761Vqog2CSzq1QR1hG68)

Please read this guide: [Error: You lack the required entitlement](/cfx-auth-system/you-lack-the-entitlement)

### Syntax error near '<\1>'

Do you see something like this in the console?

![](/files/mqTUFiILf9zRSaVtpWLs)

Please read this guide: [Error: syntax error near '<\1>'](/cfx-auth-system/error-syntax-error-near-less-than-1-greater-than)

### Could not find dependency / Can't run

Do you see something like this in the console?

![](/files/gJXnbfy9tf8UbMg4g8JK)

![](/files/4cyHSzU7zhEfS60H4kXc)

![](/files/eYcF94JqgnLj16K2Qmb5)

Follow this guide please: [Updating server](/server/updating-server)

Do you see something like this in the console?

![](/files/g5FD70o5jybB4XqlQBA8)

![](/files/ZaJA0yF5K8DnBhsQpR57)

Follow this guide please: [onesync](/server/onesync)


# How to place arm table

If you want to place a new table on the map you will need to use CodeWalker you will need one of the mentioned arm-wrestling objects to play arm-wrestling.

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

Possible objects to play on

```
prop_arm_wrestle_01
bkr_prop_clubhouse_arm_wrestle_01a
bkr_prop_clubhouse_arm_wrestle_02a
```

After we have placed the object we will need to put it into config.lua

```lua
TABLES = {
    {
        pos = vector3(-191.9174, 6273.261, 30.97095),
        model = 'prop_arm_wrestle_01',
        headingOffset = 90.0, -- sets player's relative heading to the object's heading
        blip = true, -- display blip on map
    },
}
```


# ‌🎴 rcore\_banners

Step by step installation guide, config preview, inventory items setup guide, listed all exports / events for API

* 🏙️ [**Buy Here**](https://store.rcore.cz/package/6075584)

## ✅ Recommended Hosting Options

Use a trusted third-party image host for banners:

* [**FiveManage**](https://fivemanage.com/)\
  Offers a **free tier with 10 GB storage** — perfect for hosting multiple banners.


# How to Begin

Our resource offers a comprehensive business system that enables players to interact with billboards, create custom posters, and display text, images, or even GIFs on billboards throughout Los Santos.

This guide provides step-by-step instructions on how players can access, create, and manage business banners and billboards. Follow the steps below to get started.

***

### Adding admin rights

### ESX Server

* To set admin rights directly in-game, use the `/setgroup` command. This command assigns administrative permissions to a player based on their player ID. You have two options: `admin` and `superadmin`.

*Example*: `/setgroup playerId admin`

**Command Usage**:

* **playerId**: The unique ID of the player in the server (can be found via `/playerId`).
* **group**: The role you want to assign. You have two options:
  * **admin**: This grants standard administrative privileges, allowing the player to manage server activities, monitor players, and handle routine server issues.
  * **superadmin**: This provides full administrative access, including permissions to modify core server settings, manage all aspects of server control, and access advanced commands that may not be available to standard admins.

### QBCore Server

Follow the guide to set admin rights: [Setting Permissions Guide](https://docs.qbcore.org/qbcore-documentation/guides/setting-permissions).

***

### Step 0: How to define business

**To register business**

<details>

<summary>ESX</summary>

* Open your **txAdmin** (your server's control panel).
* Go to the **Live Console** tab.
* Type the following command `bannersetup es_extended` and press **Enter**:

</details>

<details>

<summary><strong>QBCore</strong></summary>

You have **two options** to register your business with QBCore:

✅ **Option 1: Use the Deployer Command (Easy Way)**

* Open **txAdmin** (your server's control panel).
* Go to the **Live Console** tab.
* Type the following command `bannersetup qb-core` and press **Enter**:

🛠️ **Option 2: Manual Setup**

* Find the section related to **QBCore jobs**. (`rcore_banners/business.md`)
* Copy the business/job info into: `qb-core/shared/jobs.lua`

</details>

<details>

<summary>QBOX</summary>

You have **two options** to register your business with QBOX:

🛠️ **Option 1: Manual Setup**

* Find the section related to **QBOX jobs**. (`rcore_banners/business.md`)
* Copy the business/job info into: `qbx-core/shared/jobs.lua`

</details>

<details>

<summary>STANDALONE</summary>

* Admins can set player jobs using the following command in-game:

*Example*: `/set_business_job playerId printers 4`

* **playerId**: The ID of the player
* **jobName**: The name of the job (e.g., printers)
* **grade**: The job grade (e.g., 4)

> **Tip**: To find a player's ID, they can use the chat command:
>
> ```
> /playerId
> ```
>
> This will display their ID number.

```lua
local Jobs = {
    ['printers'] = {
        grades = {
            ['4'] = {
                name = "boss",
                isboss = true,
            },
            ['3'] = {
                name = "manager",
            },
            ['2'] = {
                name = "novice",
            },
            ['1'] = {
                name = "member",
            }
        }
    },
    ['gov'] = {
        grades = {
            ['4'] = {
                name = "boss",
                isboss = true,
            },
            ['3'] = {
                name = "manager",
            },
            ['2'] = {
                name = "novice",
            },
            ['1'] = {
                name = "member",
            }
        }
    }
}
```

</details>

***

### Step 1: Accessing the Billboards

Players must be in specific jobs to interact with billboards and access the billboard management menu.

**To access and manage a billboard:**

1. Ensure you are in one of the following jobs:
   * **GOV**
   * **Printers**
2. Approach the billboard in-game and locate the **yellow marker** found below it to open the buy/management menu.
3. Once you arrive at the interact point, access the creation menu to design your banner. Here, you can add custom text, images, or GIFs to your banner for display.

***

### Step 2: Creating a Business Banner

To create a business banner, follow these instructions:

1. Head to the interact point to begin creating a business banner. By default, the coordinates for the interaction points are:
   * **Printers:** `(-1050.323, -242.605, 44.020)`
   * **GOV:** `(-546.980, -207.210, 38.127)`
2. Make sure that you have boss grade in that job, open menu - select Work Stations, that will open UI with option: Create banner/Custom
3. Fill the banner name and your image (recommend to use: gyazo.com)
4. Enjoy your new created business banner, that can be now used on the billboard.

***

### Step 3: Managing and Customizing Banners (Non-Business)

*Note: This section is not related to business banners.*

1. Any player can use the `/banners` command to access available options. However, only **admins** can create custom banners.
2. As an admin, use the `/banners` command and select the **Custom** option. This allows you to define and manage banners for other players on the server.
3. The options available in the `/banners` command are dynamic and depend on the user’s permissions.

### Step 4: Adding New Banners for All Players

Whenever new banners are added to the system, admins can create or modify them as follows:

1. Use the `/banners` command and choose the **Custom** option to add new banners or edit existing ones.

***

Follow these steps to take full advantage of the business banners and billboards system, and bring your business promotions to life in Los Santos!


# How to Update

Step by step documentation how to properly update your banners resource

> Follow these exact steps to avoid breaking everything.

***

### 1. 🛑 Make a Backup

**Before doing anything**, create a backup of your old banners resource.

* Go to your `resources` folder.
* Find these folders:
  * `[banners]`
  * `rcore_banners`
  * `rcore_banners_assets`
* Right-click → **Send to → Compressed (zipped) folder**.
* Name it something like `banners_backup.zip`.

✅ Now you're safe in case something goes wrong.

***

### 2. 🧹 Delete the Old Banners

* Delete the following folders from your `resources` folder:
  * `[banners]`
  * `rcore_banners`
  * `rcore_banners_assets`

⚠️ Make sure they're **really gone** before continuing.

***

### 3. ⬇️ Download the Latest Version

* Go to your [**Keymaster Portal**](https://keymaster.fivem.net/).
* Download the **latest version** of the banners resource.
* You’ll get a `.zip` file — open it.

***

### 4. 📁 Install the New Banners

* Inside the ZIP, find the `[banners]` folder.
* Drag and drop it into your `resources` folder.

***

### 5. 📁 Enjoy your updated banners

***


# Common issues & solutions

Step-by-step documentation to resolve common issues with banners

## 🖼️ Why You Can't See Your Placed Posters or Billboard Images

Are your **posters, banners, or billboard images/text** not appearing in-game —\
even though the upload succeeded or the placement message was sent?

Don’t worry — this guide explains **every possible reason** and how to fix it quickly.

***

### ⚙️ Overview

If your banner or poster isn’t showing up, it’s usually caused by one of the following:

* A **conflicting resource** disables or clears decals.
* Another script repeatedly calls **render-blocking natives**.
* **Graphics settings** or **shader mods** hide decal layers.
* The **resource start order** in your `server.cfg` is incorrect.

To help diagnose these issues faster, we’ve introduced a new debug command:

***

### 🧰 Banner Visibility Helper: `debug_banners_visible`

The `debug_banners_visible` feature acts as a **diagnostic guide**, helping you identify why banners, posters, or billboard images are not visible in-game.\
It does **not automatically fix issues**, but provides information to help you resolve them manually.

Use this helper in-game to review:

* Whether banners are properly loaded and visible on your client.
* Any detected conflicts or rendering problems that may prevent images from showing.

You can also **type this helper command in your txAdmin Live Console** to run it remotely for testing.

<figure><img src="/files/9pHAhBVmoEkYlrPgc901" alt="Result of command" width="254"><figcaption><p>Example output from the visibility helper</p></figcaption></figure>

💡 *Use this visibility helper first whenever your uploaded or placed banners don’t appear. It will point you toward the cause, such as resource conflicts, rendering issues, or missing permissions.*

***

### 🔎 What to Look For

If banners or posters still don’t appear after using the debug tools, check the following common causes:

* **Disable any “FPS booster”, “optimization”, or shader mods.**\
  These often call functions that remove or hide decals globally.
* **Check your graphics settings.**\
  Make sure **Texture Quality** and **Decal Quality** are **not set to Low** — low settings can prevent decals from rendering entirely.
* **Watch out for graphics mods or shader packs.**\
  Mods such as **NaturalVision Evolved (NVE)**, **Redux**, or similar packs can change material behavior and\
  **break decal rendering**, causing banners to disappear.\
  ➝ *Try testing without them enabled to confirm.*
* **Restart your client** after removing or reordering conflicting resources.\
  Some changes only take effect after a full client restart.

If banners reappear after disabling a mod or resource, you’ve found the conflict.

***

### 🧩 Possible Script Conflicts

It’s possible that another resource is interfering with **decal rendering**, preventing banners or posters from appearing correctly.\
This usually happens when a script repeatedly calls one or both of the following native functions each frame:

```lua
SetDisableDecalRenderingThisFrame(true)
RemoveDecalsInRange(...)
```

If you find those natives remove them from script and make sure to reach out so we can list as known conflict resource.

***

## ❌ Error: `SCRIPT ERROR: ?:-1: table index is nil`

This error typically means the script is trying to access a value in a table that doesn't exist — often because it's `nil`.

### ✅ Cause

You're likely using a **new version of the script** with an **old configuration or structure** — especially if you skipped a full reinstall.

### 🩹 Fix

Follow these steps carefully:

1. Fully **delete** the old folders:
   * `[banners]`
   * `rcore_banners`
   * `rcore_banners_assets`
2. Download and install the **latest version** from [**Keymaster**](https://keymaster.fivem.net/).
3. **Do not overwrite** the new version over the old one — always do a clean install.

> ℹ️ *This is a very common mistake.* Overwriting old files often causes this exact error.

***

## 🖼️ Banner Image Hosting Limitations

### 🚫 Imgur and Discord Are No Longer Supported

Due to recent policy changes and abuse prevention measures, **Discord** and **Imgur** are no longer reliable for hosting images:

* **Imgur** has restricted hotlinking support.\
  [Learn more here](https://github.com/citizenfx/fivem/pull/2407)
* **Discord** now blocks direct image links in some cases.\
  [Details here](https://www.reddit.com/media?url=https%3A%2F%2Fpreview.redd.it%2Fnot-sure-if-this-is-real-v0-t2yhv60cj3rb1.jpg%3Fauto%3Dwebp%26s%3D00cedeec15b58db36a1ea444957fcb11decbba55)

> ℹ️ **Note:** We block Imgur and Discord image links internally. Images hosted on these platforms may are not going to load on fivem.

## 🧰 Banner Billboard Access Helper: `debug_banners_player`

* Type: This command is client only

The `debug_banners_player` helper is a **diagnostic tool** designed to help you understand why a player **cannot access or interact** with a banner or billboard marker.\
It does **not automatically fix** access issues but provides clear feedback to guide you through resolving them manually.

Use this helper in-game to check:

* Whether your current **job or role** allows access to the selected banner.
* If you are **within the required marker range**.
* Any restrictions or configuration mismatches preventing interaction.

***

### 🧾 How to Fix Access Issues

If the helper reports missing job permissions or denied access:

1. **Check your current job**
   * Use your framework’s job management command (e.g. `/setjob`, `/job`, `/charinfo`) to confirm your active role.
   * Ensure it matches one of the jobs listed in your banner configuration.
2. **Verify job registration**
   * Make sure the job is correctly defined in your framework (ESX/QB-Core).
   * If using a custom job, ensure it’s **registered before** the `rcore_banners` resource starts.
3. **Restart and retest**
   * Update your job if needed.
   * Restart your client or re-log and use the helper again to confirm access.

💡 *Use this helper whenever players can’t see or interact with billboard markers. It helps you identify and fix access restrictions step by step.*

***

## ✅ Recommended Hosting Options

Use a trusted third-party image host for banners:

* [**FiveManage**](https://fivemanage.com/)\
  Offers a **free tier with 10 GB storage** — perfect for hosting multiple banners.

***

> ⚠️ **This script requires artifacts version 4752 or newer, and OneSync must be enabled.**

> ℹ️ **Always make sure you're using the latest update** from your [Keymaster](https://keymaster.fivem.net/) account before submitting support tickets.


# Installation

Step by step documentation how to properly install script.

## Database

The database will be imported automatically for you when you start the resource for the first time.

## Script

1. [Download the script from Keymaster](#script-download).
2. [Place the files in the resources folder](#place-files).
3. [Edit the server.cfg](#edit-server-cfg).
4. [Define items using Deployer or manually](#define-items).
5. [Define business job](#define-items).
6. [Start the server](#start-server).

***

### Step 1: Download the Script <a href="#script-download" id="script-download"></a>

* Download the script from [keymaster](https://keymaster.fivem.net).

***

### Step 2: Place the Files <a href="#place-files" id="place-files"></a>

* Open the downloaded `.zip`, copy the `[banners]` folder, and put it in your resources folder.

<details>

<summary>Resource folder image</summary>

<figure><img src="/files/deDG1ZXOvXUotsfPrxkQ" alt="Resource Folder"><figcaption><p>Resources folder</p></figcaption></figure>

</details>

***

### Step 3: Edit server.cfg <a href="#edit-server-cfg" id="edit-server-cfg"></a>

Go to your `server.cfg` and add `ensure [banners]`.

***

### Step 4: Define Items <a href="#define-items" id="define-items"></a>

* To define items in the RCore Banners script, you can either use the Deployer command or edit the configuration manually.
* Item definitions can be found at `rcore_banners/inventory_items.lua`
* Item images are located in `rcore_banners/assets/inventory_images/`

<details>

<summary>Using the Deployer command</summary>

* Full guide at this page [Inventory](/paid-resources/rcore_banners/inventory)

1. Start the server.
2. Open the server console (`txAdmin - Live console`)
3. Type the following command to automatically define items:

   ```bash
   bannersetup mf-inventory
   bannersetup es_extended
   ```

> **Note:** `inventory_name` should correspond to the name of your inventory system. Ensure it matches your configuration to avoid errors.

> **Note:** The deployer supports: **mf-inventory** and **es\_extended**. For other inventories, please follow the manual setup guide.

</details>

<details>

<summary>Manually Adding Items</summary>

* Follow this guide at this page [Inventory](/paid-resources/rcore_banners/inventory)

</details>

***

### Step 4.5: Define ace permissions <a href="#define-aces" id="define-aces"></a>

* Add to bottom of server.cfg permission part (script need this permission to use properly ACE permission)

```lua
add_ace resource.rcore_banners command.add_ace allow
add_ace resource.rcore_banners command.remove_ace allow
add_ace resource.rcore_banners command.add_principal allow
add_ace resource.rcore_banners command.remove_principal allow
```

### Step 5: Define jobs for business/billboards <a href="#define-jobs" id="define-jobs"></a>

✍️ Define Jobs

* Job setup is required to control which groups can access billboards

<details>

<summary>How to define business?</summary>

* Follow this guide at this page [Guide](/paid-resources/rcore_banners/how_to_begin)

</details>

***

### Step 6: Enjoy <a href="#start-server" id="start-server"></a>

* Start your server and enjoy RCore Banners.

## Commands

| Command        | Description                                                                                                    |
| -------------- | -------------------------------------------------------------------------------------------------------------- |
| /banners       | This is used for opening banner menu with all server banners                                                   |
| /rbanner       | This is used for removing nearby poster at player position.                                                    |
| /billboardHide | This is used for hiding billboards - it will enable tool, which allows to select billboards to hide on server. |


# Inventory Items

{% hint style="warning" %}
Requires properly setup config for inventory from [Installation](/paid-resources/rcore_banners/installation)!
{% endhint %}

There are two ways of setting up inventory items. You can use the integrated **Asset Deployer** that automatically inserts items into your database (for mf-inventory and es\_extended), or you can do all necessary edits **Manually**.

* Item definitions can be found at `rcore_banners/inventory_items.lua`
* Item images are located in `rcore_banners/assets/inventory_images/`

## Asset Deployer

The Asset Deployer automatically inserts SQL items into your database.

### Available deploys:

* Resource: **mf-inventory**
  * items
* Resource: **es\_extended**
  * items

### Running deploy

Execute command `bannersetup <deploy-resource> [name]` in **server console**, where `deploy-resource` is needed and represents resource from **Available Deploys** and `name` is optional (if it's not filled, all deploys for resource will be deployed)\_ and represents specific deploy for resource.

## Manually

### ox\_inventory

1. Open `ox_inventory/data/items.lua` file.
2. Add these items:

```lua
    ['paper'] = {
        name = 'paper',
        label = 'Paper',
        weight = 100,
        stack = true,
        close = true,
        consume = 0,
    },
    ['banner'] = {
        name = 'banner',
        label = 'Banner',
        weight = 100,
        stack = true,
        close = true,
        consume = 0,
        export = 'rcore_banners.banner'
    },
    ['banner_remover'] = {
        name = 'banner_remover',
        label = 'Banner Remover',
        weight = 150,
        stack = true,
        close = true,
        consume = 0,
        export = 'rcore_banners.banner_remover'
    },
```

3. Copy images from `rcore_banners/assets/inventory_images/` to `ox_inventory/web/images/`.
4. Restart your server. Server need to be restarted for proper registration of usable items!

### qb-inventory / qs-inventory / aj-inventory / lj-inventory / ps-inventory

1. Open `qb-core/shared/items.lua` / `qs-inventory/shared/items.lua` file.
2. Add these items:

```lua
     ['banner'] = {
        name = 'banner',
        label = 'Banner',
        weight = 100,
        type = 'item',
        image = 'banner.png',
        unique = false,
        useable = true,
        shouldClose = true,
        combinable = nil,
    },
    ['banner_remover'] = {
        name = 'banner_remover',
        label = 'Banner remover',
        weight = 100,
        type = 'item',
        image = 'banner_remover.png',
        unique = false,
        useable = true,
        shouldClose = true,
        combinable = nil,
    },
    ['paper'] = {
        name = 'paper',
        label = 'Paper',
        weight = 100,
        type = 'item',
        image = 'banner_remover.png',
        unique = false,
        useable = true,
        shouldClose = true,
        combinable = nil,
    },
```

3. Copy images from `rcore_banners/assets/inventory_images/` to `qb-inventory/html/images/` / `qs-inventory/html/images/`.
4. Restart your server. Server need to be restarted for proper registration of usable items!

### mf-inventory

1. Use asset deployer command, that insert SQL items to database - `bannersetup mf-inventory items`.

### es\_extended (default esx inventory)

1. Use asset deployer command, that insert SQL items to database - `bannersetup es_extended items`.


# Configs

All values are properly described in specific config file itself.

### Where to find specific stuff?

Below there you find all neccesary info, to make proper adjustments in the banners itself.

## General

There you can find other essential stuff for banners.

{% content-ref url="/pages/AemxKvAqn23qXkTpKQI1" %}
[General](/paid-resources/rcore_banners/configs/general)
{% endcontent-ref %}

## Billboards

There you can find all informations related to billboards and the price management itself.

{% content-ref url="/pages/UwPelnt2vF0EzkihTLqZ" %}
[Billboards](/paid-resources/rcore_banners/configs/billboards)
{% endcontent-ref %}

## Business

There you can find all business stuff related to banners.

{% content-ref url="/pages/xguxqCN8H22khZQJodEY" %}
[Business](/paid-resources/rcore_banners/configs/business)
{% endcontent-ref %}

## Permissions

There you can find all informations related to admin permissions to the banners app / stations UI.

{% content-ref url="/pages/xqcFv7V9tVzsv8Z7IHXV" %}
[Permissions](/paid-resources/rcore_banners/configs/permissions)
{% endcontent-ref %}

## Job

There you can find all informations related to banners poster job.

{% content-ref url="/pages/b9iXr5N59aPAXKyk4BYE" %}
[Job](/paid-resources/rcore_banners/configs/job)
{% endcontent-ref %}

## Config

Main config where all necessary stuff is defined.

{% content-ref url="/pages/vPe65Z8ZkkrfjM9RajYu" %}
[Configs](/paid-resources/rcore_banners/configs)
{% endcontent-ref %}


# General

Other config stuff that keep essential stuff for rcore\_banners.

## Where to find it?

Path: **rcore\_banners/configs/general.lua**

## How it structure looks?

```lua
Config.General = {
    Items = {
        BANNER_PLACER = 'banner', -- Item used for banner placer
        BANNER_REMOVER = 'banner_remover' -- Item used for banner removeing
    },
    
    NEED_EDITOR_ITEM_STATE = false, -- Does player need to have item banner to start placing banners in world?
    NEED_REMOVE_BANNER_ITEM_STATE = false, -- Does player need to have item banner remove to start removing banners in world?
}
```


# Billboards

Step-by-Step Explanation Guide on how billboards margin is managed.

## **How to modify price for current area which billboards is in?**

Path: **rcore\_banners/configs/billboards.lua**

**If you want to rise price of all billboards in DOWNT AIRP zone by you will do it like this:**

**Step 1: Determine the Base Price of the Billboard**

The base price of a billboard is 5000. This is the price that all billboards start with, regardless of their location.

**Step 2: Apply the Zone Price Modifier**

The zone price modifier is a multiplier that is applied to the base price of a billboard based on the area of the zone in which it is located. The zone price modifiers are as follows:

* `AIRP = 1.5`: This means that billboards in the AIRP zone will cost 1.5 times the base price.
* `ALAMO = 0.5`: This means that billboards in the ALAMO zone will cost 0.5 times the base price.

**Step 3: Calculate the Final Price**

To calculate the final price of a billboard, multiply the base price by the zone price modifier. For example, a billboard in the AIRP zone would cost 5000 \* 1.5 = 7500.

**Example:**

If you want to buy a billboard in the DOWNT zone, the process would be as follows:

1. Determine the base price: 5000
2. Apply the zone price modifier: 1.5
3. Calculate the final price: 5000 \* 1.5 = 7500

Therefore, the billboard would cost 7500.

```lua
Config.Billboards = {
    BUY_BASE_PRICE = 5000,

    ZONE_PRICE_MODIFIERS = {
        AIRP = 1.5,
        ALAMO = 0.5,
        ALTA = 0.75,
        ARMYB = 0.25,
        BANHAMC = 0.75,
        BANNING = 0.5,
        BEACH = 1.25,
        BHAMCA = 0.75,
        BRADP = 0.5,
        BRADT = 0.5,
        BURTON = 0.5,
        CALAFB = 0.75,
        CANNY = 0.5,
        CCREAK = 0.5,
        CHAMH = 1.0,
        CHIL = 1.25,
        CHU = 0.75,
        CMSW = 0.25,
        CYPRE = 0.75,
        DAVIS = 0.75,
        DELBE = 1.25,
        DELPE = 1.25,
        DELSOL = 1.25,
        DESRT = 0.25,
        DOWNT = 1.5,
        DTVINE = 1.5,
        EAST_V = 1.25,
        EBURO = 0.75,
        ELGORL = 0.25,
        ELYSIAN = 0.75,
        GALFISH = 0.5,
        GOLF = 1.0,
        GRAPES = 0.5,
        GREATC = 0.5,
        HARMO = 0.5,
        HAWICK = 0.75,
        HORS = 1.0,
        HUMLAB = 0.25,
        JAIL = 0.25,
        KOREAT = 1.0,
        LACT = 0.5,
        LAGO = 0.75,
        LDAM = 0.5,
        LEGSQU = 1.5,
        LMESA = 0.75,
        LOSPUER = 1.25,
        MIRR = 1.0,
        MORN = 1.25,
        MOVIE = 1.25,
        MTCHIL = 0.25,
        MTGORDO = 0.25,
        MTJOSE = 0.25,
        MURRI = 1.0,
        NCHU = 0.75,
        NOOSE = 0.25,
        OCEANA = 0.0,
        PALCOV = 0.5,
        PALETO = 0.5,
        PALFOR = 0.25,
        PALHIGH = 0.75,
        PALMPOW = 0.25,
        PBLUFF = 1.25,
        PBOX = 1.5,
        PROCOB = 0.75,
        RANCHO = 0.75,
        RGLEN = 1.5,
        RICHM = 1.5,
        ROCKF = 1.5,
        RTRAK = 0.75,
        SANAND = 1.0,
        SANCHIA = 0.25,
        SANDY = 0.5,
        SKID = 0.75,
        SLAB = 0.25,
        STAD = 1.5,
        STRAW = 0.75,
        TATAMO = 0.25,
        TERMINA = 0.75,
        TEXTI = 0.75,
        TONGVAH = 1.0,
        TONGVAV = 0.75,
        VCANA = 1.25,
        VESP = 1.25,
        VINE = 1.5,
        WINDF = 0.25,
        WVINE = 1.5,
        ZANCUDO = 0.5,
        ZP_ORT = 0.75,
        ZQ_UAR = 0.5
    }
}
```


# Business

All business related stuff to rcore\_banners can be found there.

## **Where to find it?**

Path: **rcore\_banners/configs/business.lua**

### File preview

```lua
Config.Business = {
    Enabled = true, -- What is business state for banners enabled / disabled?
    
    ServiceFee = true, -- Is service feee enabled?
    ServiceFeeTime = 14, -- Each 14 days service fee is taken from business bank account
    ServiceFeePercentage = 10, -- 10% of business bank account is taken for service fee
    SellBannerPercentage = 50, -- 50% of billboard price is given to player when selling banner

    Printers = {
        ProductionItem = 'paper', -- Which item is needed for production?
        ProductionItemNeed = true, -- Is requirement of item needed for production needed?
        Cooldown = 2 * 60 * 1000 -- 2 mins cooldown
    },

    SocietyOptionsESX = {
        checkBal = true, -- Allow to check society money from boss menu.
        withdraw = true, -- Allow to withdraw from society (boss menu)
        deposit = true, -- Allow to deposit to society (boss menu)
        employees = true, -- Allow to hire employees in business (boss menu)
        salary = true, -- Allow to adjust employeees salary (boss menu)
        grades = true, -- Allow to adjust grades in boss menu.
        wash = false, -- Allow to wash business money.
    },

    -- List of job grades, which holds specific permission access.

    Permissions = {
        ['boss'] = {
            ['workstation'] = {
                [WORKSTATION_PERMS.ACCESS_WORKSTATION_CUSTOM] = true,
                [WORKSTATION_PERMS.ACCESS_WORKSTATION_MANAGEMENT] = true,
                [WORKSTATION_PERMS.CAN_SET_BANNER] = true,
                [WORKSTATION_PERMS.CAN_UPDATE_TARGET_BATCH] = true,
                [WORKSTATION_PERMS.CAN_STOP_TARGET_PRODUCTION] = true,
            },
        },
        ['manager'] = {
            ['workstation'] = {
                [WORKSTATION_PERMS.ACCESS_WORKSTATION_CUSTOM] = true,
                [WORKSTATION_PERMS.ACCESS_WORKSTATION_MANAGEMENT] = true,
                [WORKSTATION_PERMS.CAN_SET_BANNER] = true,
                [WORKSTATION_PERMS.CAN_UPDATE_TARGET_BATCH] = true,
                [WORKSTATION_PERMS.CAN_STOP_TARGET_PRODUCTION] = true,
            },
        }
    },

    -- List of business 

    List = {
        ['printers'] = {
            enabled = true, -- Is business enabled and can be used?
            name = "printers", -- Name of business
            pos = vec3(-1064.736, -243.742, 44.021), -- Location of business
            blipEnabled = true, -- Should show blip on the map?
            blip = {
                name = "Printers",
                color = 5, -- Yellow
                scale = 1.0, -- Blip size
                sprite = 783, -- See https://docs.fivem.net/docs/game-references/blips/ if you want to change it to something else.
            },
            interact = {
                {
                    type = Interact.PRODUCTION_MINIGAME,
                    pos = vec3(-1053.114, -231.452, 44.021),
                    heading = 296.965
                },
                {
                    type = Interact.PRODUCTION_MINIGAME,
                    pos = vec3(-1053.698, -230.260, 44.021),
                    heading = 296.965
                },
                {
                    type = Interact.BOSS_MENU,
                    pos = vec3(-1050.323, -242.605, 44.020),
                    heading = 126.0
                }
            },
        }
    }
}
```


# Permissions

Step-by-Step Explanation Guide on How Permissions Work in Our Banners Resource

Permissions determine who has access to specific banners and what they can do with them. They are crucial for ensuring that banners are used appropriately and that sensitive information is protected.

## How it works?

Path: **rcore\_banners/configs/permissions.lua**

Our resource is using permissions based of user group.

We have already premade groups for ESX/QBCore used groups.

* QBCore: god, admin
* ESX: superadmin, admin

**Structure of permissions**

```lua
Config.Permissions = {
    Groups = {
        ['superadmin'] = {
            [WORKSTATION_PERMS.CAN_SET_BANNER] = true,
            [WORKSTATION_PERMS.CAN_PRODUCE_BANNER] = true,
            [WORKSTATION_PERMS.CAN_UPDATE_TARGET_BATCH] = true,
            [WORKSTATION_PERMS.CAN_STOP_TARGET_PRODUCTION] = true,

            [WORKSTATION_PERMS.ACCESS_WORKSTATION_CUSTOM] = true,
            [WORKSTATION_PERMS.ACCESS_WORKSTATION_BANNER_CREATION] = true,
            [WORKSTATION_PERMS.ACCESS_WORKSTATION_MANAGEMENT] = true,

            [APP_PERMS.ACCESS_CUSTOM_BANNER] = true,
            [APP_PERMS.ACCESS_ARCHIVE_BANNER] = true,
        },
        ['god'] = {
            [WORKSTATION_PERMS.CAN_SET_BANNER] = true,
            [WORKSTATION_PERMS.CAN_PRODUCE_BANNER] = true,
            [WORKSTATION_PERMS.CAN_UPDATE_TARGET_BATCH] = true,
            [WORKSTATION_PERMS.CAN_STOP_TARGET_PRODUCTION] = true,
            
            [WORKSTATION_PERMS.ACCESS_WORKSTATION_CUSTOM] = true,
            [WORKSTATION_PERMS.ACCESS_WORKSTATION_BANNER_CREATION] = true,
            [WORKSTATION_PERMS.ACCESS_WORKSTATION_MANAGEMENT] = true,

            [APP_PERMS.ACCESS_CUSTOM_BANNER] = true,
            [APP_PERMS.ACCESS_ARCHIVE_BANNER] = true,
        },
        ['admin'] = {
            [APP_PERMS.ACCESS_CUSTOM_BANNER] = true,
            [APP_PERMS.ACCESS_ARCHIVE_BANNER] = true,
        }
    }
}
```

## Type of permissions

### Dashboard

All permission related to rcore\_banners dashboard UI (/banners)

#### APP\_PERMS\_ACCESS\_CUSTOM\_BANNER

<pre><code><strong>APP_PERMS_ACCESS_CUSTOM_BANNER
</strong></code></pre>

* Player with this permission is allow to create new server global banners.

#### APP\_PERMS\_ACCESS\_ARCHIVE\_BANNER

```
APP_PERMS_ACCESS_ARCHIVE_BANNER
```

* Player with this permission is allow to access archive page, where all banners stored with options to restore them or delete them from server.

### Work stations (printers)

All permissions related to rcore\_banners business (stations).

```
WORKSTATION_PERMS.CAN_PRODUCE_BANNER
```

* Player with this permission is allowed to produce banner at work station.

```
WORKSTATION_PERMS.CAN_SET_BANNER
```

* Player with this permission is allowed to what banner is going to be produced on specific printer which players is at.

```lua
WORKSTATION_PERMS.CAN_UPDATE_TARGET_BATCH
```

* Player with this permission is allowed to update batch of active printer with specific amount which he desire.

```lua
WORKSTATION_PERMS.CAN_STOP_TARGET_PRODUCTION
```

* Player with this permission is allowed to stop current active production of banner if its active.

```
WORKSTATION_PERMS.ACCESS_WORKSTATION_CUSTOM
```

* Player with this permission is allowed to open page where he can create new business banner.

```
WORKSTATION_PERMS.ACESS_WORKSTATION_MANAGEMENT
```

* Player with this permission is allowed to to access work station management menu.


# Job

This is config related to banners poster placing job.

We have included simple job system without need to be a part of business for anybody.\
The mission task is place poster around Los Santos, simple as it is.

**File preview**

```lua
Config.Job = {
    pos = vec3(270.824, 7.128, 79.245),   -- Coords where people take the job

    RequiredDeliveries = 2,               -- How many posters needs to be placed to mission be done?
    InteractCheckDist = 2.0,              -- Check distance to render helpKeys / interaction
    ActiveJobPeopleLimit = 5,             -- How many people can do job at the time?

    ResetPool = 2 * 60 * 1000,            --  Reset current poster point to be back in the arary pool -> 2 mins

    DeliverDuration = 6 * 1000,           -- Cooldown for placing posters in delivery area.
    ResetMissionCooldown = 5 * 60 * 1000, -- Mission reset state

    NPC = {
        heading = -100.0, -- Heading of start mission NPC
        model = 'a_m_m_soucent_02' -- Start mission NPC model
    },

    SecondsPerKilometer = {
        ['poster_placement'] = 46.3, -- Dont adjust it.
    },

    Blip = {
        Enabled = true, -- Render job location blip?
        scale = 1.0,    -- Scale of blip
        sprite = 267,   -- P symbol
        color = 5,      -- Yellow
        type = 'job_static', -- Dont adjust it
    }
}

JobLocations = {
    { pos = vec3(-1063.016, -2543.65, 20.62),   rot = vec3(0, 0, 60) },
    { pos = vec3(-1190.562, -1573.05, 4.825),   rot = vec3(0, 0, 125) },
    { pos = vec3(-1699.368, 184.65, 64.37),     rot = vec3(0, 0, 125) },
    { pos = vec3(310.839, 181.765, 104.35),     rot = vec3(0, 0, 20) },
    { pos = vec3(465.75, -1852.445, 28.21),     rot = vec3(0, 0, 175.96) },
    { pos = vec3(-545.036, -203.059, 38.675),   rot = vec3(0, 0, 30) },
    { pos = vec3(208.2, -921.705, 31.15),       rot = vec3(0, 0, -35) },
    { pos = vec3(1218.216, -417.705, 68.175),   rot = vec3(0, 0, -105) },
    { pos = vec3(-425.6, 1108.455, 328.135),    rot = vec3(0, 0, 164.5) },
    { pos = vec3(797.05, -2136.48, 29.999),     rot = vec3(0, 0, -180) },
    { pos = vec3(-3030.482, 60.75, 12.06),      rot = vec3(0, 0, -120) },
    { pos = vec3(702, 563.167, 129.5),          rot = vec3(0, 0, -20) },
    { pos = vec3(-1045.026, -1029.15, 2.58),    rot = vec3(0, 0, -60) },
    { pos = vec3(-788.9, 308.72, 86.15),        rot = vec3(0, 0, 0) },
    { pos = vec3(-998.319, -322.35, 38.275),    rot = vec3(0, 1, -62.5) },
    { pos = vec3(230.292, -407.74, 48.375),     rot = vec3(0, 0, 160) },
    { pos = vec3(-528.15, -855.011, 30.425),    rot = vec3(0, 0, 180) },
    { pos = vec3(763.426, -947.7, 26.275),      rot = vec3(0, 0, 96) },
    { pos = vec3(137.853, -1474.6, 29.81),      rot = vec3(0, 0, -40.4) },
    { pos = vec3(1150.35, -292.433, 69.48),     rot = vec3(0, 0, -170) },
    { pos = vec3(-1618.889, -1049.25, 13.6),    rot = vec3(0, 0, 140) },
    { pos = vec3(-2256.5, 235.642, 175.05),     rot = vec3(0, 0, 179) },

    -- 142

    { pos = vec3(419.641, -986.05, 29.875),     rot = vec3(0, 0, -90) },
    { pos = vec3(-554.332, 274.35, 83.475),     rot = vec3(0, 0, -5) },
    { pos = vec3(-1126.816, -1561.701, 4.83),   rot = vec3(0, 0, 35) },
    { pos = vec3(-1396.85, -592.888, 30.775),   rot = vec3(0, 0, -147) },
    { pos = vec3(-1279.4, 311.658, 65.94),      rot = vec3(0, 0, 60.9) },
    { pos = vec3(-159.774, -1427.009, 31.665),  rot = vec3(0, 0, -57.7) },
    { pos = vec3(555.282, -1563.469, 29.725),   rot = vec3(0, 0, -135.1) },
    { pos = vec3(217.787, 301.1, 106.035),      rot = vec3(0, 0, 69) },
    { pos = vec3(-61, -207.764, 46.245),        rot = vec3(0, 0, -20) },
    { pos = vec3(-130.799, -884.9, 29.93),      rot = vec3(0, 0, -110) },
    { pos = vec3(434.335, -2039.761, 23.895),   rot = vec3(0, 0, 140) },
    { pos = vec3(-231.604, -1298.944, 31.75),   rot = vec3(0, 0, 0) },
    { pos = vec3(947.9, -1458.78, 31.85),       rot = vec3(0, 0, -179.8) },
    { pos = vec3(1133.9, -963.072, 47.95),      rot = vec3(0, 0, -166.7) },
    { pos = vec3(1022, 160.278, 81.44),         rot = vec3(0, 0, -122) },
    { pos = vec3(-2283.602, 372.85, 175.05),    rot = vec3(0, 0, -135) },
    { pos = vec3(-800.3, -94.84, 38.1),         rot = vec3(0, 0, 27.1) },
    { pos = vec3(-546.55, -45.461, 42.95),      rot = vec3(0, 2, -114) },
    { pos = vec3(-1377.65, -946.811, 10.215),   rot = vec3(0, 0, -56) },
    { pos = vec3(1089.2, -505.245, 63.475),     rot = vec3(0, -1, 5) },
    { pos = vec3(269.328, -641.8, 42.47),       rot = vec3(0, 0, -110) },

    -- 143

    { pos = vec3(-941.9, -1190.512, 5.35),      rot = vec3(0, 0, 29.5) },
    { pos = vec3(-1411.444, -96.376, 52.96),    rot = vec3(0, 0, 107.5) },
    { pos = vec3(194.194, -1819.134, 29.105),   rot = vec3(0, 0, 140) },
    { pos = vec3(189.139, -1091.49, 29.74),     rot = vec3(0, 0, 90) },
    { pos = vec3(-600, -351.126, 35.425),       rot = vec3(0, -2.16, 1.2) },
    { pos = vec3(863.361, -1015.34, 30.44),     rot = vec3(0, 0, -90) },
    { pos = vec3(-1065.998, -2548.815, 14.395), rot = vec3(0, 0, 60) },
    { pos = vec3(-242.85, -349.054, 30.45),     rot = vec3(0, 0, -132.5) },
    { pos = vec3(-1313.35, -691.059, 26.335),   rot = vec3(0, 0, 129) },
    { pos = vec3(-569.25, -681.635, 32.8),      rot = vec3(0, 0, -180) },
    { pos = vec3(-231.604, -1298.944, 31.75),   rot = vec3(0, 0, 0) },
    { pos = vec3(442.8, -690.119, 29.13),       rot = vec3(0, 0, -180) },
    { pos = vec3(322.55, 312.226, 105.715),     rot = vec3(0, 0, 167.2) },
    { pos = vec3(-103.994, -585.95, 36.72),     rot = vec3(0, 0, 70) },
    { pos = vec3(-1190.6, -1572.996, 4.82),     rot = vec3(0, 0, 125) },
    { pos = vec3(-1802.043, -1196.85, 13.47),   rot = vec3(0, 0, -130) },
    { pos = vec3(47.85, -177.132, 55.52),       rot = vec3(0, 0, 160) },
    { pos = vec3(-1317.75, -396.824, 37.04),    rot = vec3(0, 0, -148) },
    { pos = vec3(491.128, -1300.8, 29.745),     rot = vec3(0, 0, 90) },
    { pos = vec3(219.228, 1189.95, 226.045),    rot = vec3(0, 0, 103.5) },
    { pos = vec3(1320.674, -1650.8, 52.6),      rot = vec3(0, 0, -141) }
}

```


# Config

This is main config, where you find all necessary stuff.

**File preview**

```lua
Config = {
    Debug = true,
    DebugLevel = {
        'BRIDGE',
        'INFO',
        'CRITICAL',
        'WARNING',
        'SUCCESS',
        'ERROR',
        'SOCIETY',
        'DEBUG',
        'LOD',
        'MENU',
        'FRONTEND',
    },

    Interact = {
        Key = 'E'
    },
    
    MINIGAME = {
        COOLDOWN = 5 * 60 * 1000 -- This is the printer time when it will be restarted.
    },

    -- All settings related to banners app UI.

    UI_SETTINGS = {
        MINIGAME_LINE_THICKNESS = 20, -- Thickness of the line
        MINIGAME_POINTS_PER_LEVEL = 15, -- How many points player needs to get to level up
        MINIGAME_MAX_LEVEL = 3, -- Max level for minigame
        
        APP_LOGO = 'logo.png', -- Can be found in client/ui/web/build/logo.png

        NEED_EDITOR_ITEM_STATE = Config.General.NEED_EDITOR_ITEM_STATE, -- Validate if user needs item for placing banners?
        NEED_EDITOR_ITEM_NAME = Config.General.Items.BANNER_PLACER, -- Which item is needed for placing banners?

        NEED_PRODUCTION_ITEM_STATE = Config.Business.Printers.ProductionItemNeed, -- What item does player need for production?
        NEED_PRODUCTION_ITEM_NAME = Config.Business.Printers.ProductionItem, -- Is item required for production of banners?
    },


    -- Framework events, if you are using adjusted / renamed framework then adjust it in there.

    Events = {
        ['qb-openBossMenu'] = 'qb-bossmenu:client:OpenMenu',
        ['esx-openBossMenu'] = 'esx_society:openBossMenu',
        ['esx:playerLoaded'] = 'esx:playerLoaded',
        ['esx:setJob'] = 'esx:setJob',
        ['esx:playerLogout'] = 'esx:onPlayerLogout',
        ['QBCore:Client:OnPlayerLoaded'] = 'QBCore:Client:OnPlayerLoaded',
        ['QBCore:Client:OnJobUpdate'] = 'QBCore:Client:OnJobUpdate',
    },

    FW = {
        CORE_NAME_QB = 'qb-core', -- Name of qb-core core resource
        CORE_NAME_ESX = 'es_extended', -- Name of es_extended core resource
    },

    Menu = {
        -- MENU POSITIONS: top-left | top-right | bottom-left | bottom-right
        -- HELPKEYS POSITIONS: top-left | top-right | bottom-left | bottom-right
        JobSettings = {
            menuPosition = 'top-right',     --menu position
            helpKeysPosition = 'bottom-right' -- Help keys position for settings menu
        },
        MINIGAME = {
            helpKeysPosition = 'bottom-left' -- Help keys position for controls
        },
        Production = {
            menuPosition = 'top-right' --menu position
        },
        Banners = {
            helpKeysPosition = 'top-right' -- Help keys position for controls
        },
        Billboards = {
            menuPosition = 'top-right' -- menu position
        }
    },


    RemoveBannerDuration = 10 * 1000, -- How long it will take to remove banner?
    PlaceBannerDuration = 1 * 1000, -- How lot it will take to place a banner.

    Framework = nil,
    MysqlType = nil, -- [0 - oxmysql, 1 - ghmattimysql, 2 - mysql-async]

    Notify = Notify.RCORE, -- [ESX - es_extended, QB - qb-core, RCORE - rcore_banners] AUTO_DETECT - Automatic detection will be performed]
    Inventory = Inventories.AUTO_DETECT,   -- [OX - ox_inventory, ESX - es_extended, QB - qb-inventory, MF - mf-inventory, QS - qs-inventory, PS-inventory AUTO_DETECT - Automatic detection will be performed]
    
    EnableTargetInteract = false, -- Enable target for business
    Target = nil, -- ox_target | qb-target

    Locale = 'en', -- Chosoe you language ['en' - english, 'cs' - czech, 'it' - italy, 'de' - germnan]

    Commands = {
        banners = 'banners',
        removeBanners = 'rbanner',
    },

    Animations = {
        REMOVE_BANNER = {   -- Animation used for removing a banner
            dict = 'timetable@maid@cleaning_window@idle_a',
            name = 'idle_a'
        },
        PLACE_BANNER = {    -- Animation used for placing a banner
            dict = 'anim@amb@nightclub@poster@',
            name = 'poster_placement'
        }
    },

    LOD = {
        AREA_DEBUG = true, -- Enable area debug for LOD
        RENDER_DISTANCE = 300.0, -- How far banners are rendered (300)
        RENDER_DISTANCE_TOLERANCE = 150.0, -- How far banners are rendered
        CLOSE_TO_ANY_BANNER_CHECK = 2.5, -- How close player needs to be to any banner to be able to place new one
    },

    KEYS = {
        EDITOR_EXIT = 'Backspace'
    },

    Editor = {
        MODIFIER_BANNER_SCALE = 1.0, -- Modifier scale value for banner itself.
        DEFAULT_BANNER_SCALE = 1.0, -- Default scale for the banner.

        MIN_BANNER_SCALE = 0.0, -- Min scale cannot -1 (negative)
        MAX_BANNER_SCALE = 3.0, -- Max banner scale, recommended to keep it as it is.
        
        CLOSEST_BANNER_CHECK = 2.5, -- Used for checking closest placed banner.
        CHECK_SURFACE_DIST = 8.0, -- Used when placing banners in worrld
        CHECK_BILLBOARD_DIST = 30.0, -- Used when placing banners at billboard.

        KEYS = {
            ExitEditor = 'BACK',
            ExitEditorKeyName = 'Backspace',
            CreateBanner = 'E',
            CreateBannerKeyName = 'E',
            ScaleBannerUp = 'IOM_WHEEL_UP', -- Help keys
            ScaleBannerUpKeyName = 'WheelUp', -- Help keys
            ScaleBannerDown = 'IOM_WHEEL_DOWN', -- Help keys
            ScaleBannerDownKeyName = 'WheelDown', -- Help keys
        }
    },

    Experimental = {
        InitWait = 1500, -- Wait for NUI to be cached before initializing
    },
}
```


# Guides


# How to change UI logo?

Step by step documentation how to change the app logo.

### Script

1. Go to this file and open it: `[banners]/rcore_banners/config.lua`
2. Search for Config.UI\_SETTINGS, you should see something like this.

```lua
UI_SETTINGS = {
    MINIGAME_LINE_THICKNESS = 20, -- Thickness of the line
    MINIGAME_POINTS_PER_LEVEL = 15, -- How many points player needs to get to level up
    MINIGAME_MAX_LEVEL = 3, -- Max level for minigame
    
    APP_LOGO = 'logo.png', -- Can be found in client/ui/web/build/logo.png

    NEED_EDITOR_ITEM_STATE = Config.General.NEED_EDITOR_ITEM_STATE, -- Validate if user needs item for placing banners?
    NEED_EDITOR_ITEM_NAME = Config.General.Items.BANNER_PLACER, -- Which item is needed for placing banners?

    NEED_PRODUCTION_ITEM_STATE = Config.Business.Printers.ProductionItemNeed, -- What item does player need for production?
    NEED_PRODUCTION_ITEM_NAME = Config.Business.Printers.ProductionItem, -- Is item required for production of banners?
},
```

3. You can use image link or defined it the logo in client/ui/web/build/logo.png
4. Set your logo in UI\_SETTINGS.APP\_LOGO.
5. Save your rcore\_banners/config.lua
6. Restart your server, now you should see your logo there.


# How to create new server banner?

Step by step documentation how to create new server banners.

### There are 2 types of bannners:

* **Custom** - is banner created from image URL
* **YTD** - is banned created from image defined in ytd file (texture dictionary).

**General info**

Supported image formats:

* **JPEG**
* **PNG**
* **GIF**

### Custom banner

1. Make sure before accessing that you have permissions to access dashboard banner creation.

   ```lua
   APP_PERMS.ACCESS_CUSTOM_BANNER
   ```
2. Open ./banners there should be option Custom banner, you should see same as the image below.

<figure><img src="/files/EmRsq7PG0vZ9QMHo5iY5" alt=""><figcaption><p>Custom banner, if you have permissions - there should be this option visible.</p></figcaption></figure>

3. Now select your banner type, when doing custom, select Custom banner option.
4. Banner name should be name of the banner which will hold specific banner.
5. Your banner should be the image url of the banner under which banner name is defined.
6. When you have filled all informations, should look like this:

<figure><img src="/files/u0UoeI1GmuHT640c0KHx" alt=""><figcaption><p>Filled informations for new banner.</p></figcaption></figure>

7. Now click on Save banner, you should see this confirmation pop-up:

<figure><img src="/files/qFoq13r5D98xaWe2r9NF" alt=""><figcaption><p>Confirmation menu if you want to add this banner to server or exit.</p></figcaption></figure>

8. When you click on Save, the banner should be added to server, anybody will be able to use it!

<figure><img src="/files/hrWP7pWxYGjrTlY6RZsc" alt=""><figcaption><p>When banner is sucessfully added, you get redirect to homepage + get success notification.</p></figcaption></figure>

### YTD banner

1. Add the image to `rcore_banners/stream/rcore_banners.ytd` with OpenIV
2. Now load in-game and open./banners there should be option Dictionary banner, you should see same as the image below.

<figure><img src="/files/GPv26s7fTvWdDpCuOj0O" alt=""><figcaption><p>In navbar Custom banner should be visible.</p></figcaption></figure>

3. When you click on Custom banner, now you should see this banner creation form.\\

   <figure><img src="/files/GdskFYELZh7jltpr0fNy" alt=""><figcaption><p>When you havid valid banners, then you will be able to save it.</p></figcaption></figure>
4. When you click on save you should be redirect to homepage and your new ytd banner should be visible for all users.

<figure><img src="/files/hrWP7pWxYGjrTlY6RZsc" alt=""><figcaption><p>New YTD banner named god was added, enjoy!</p></figcaption></figure>


# How to create business?

Step by step documentation how to create business in rcore\_banners

After defining your business configuration, ensure you've saved the changes to the file.

1. **Verify Resource**: Make sure the `rcore_banners` resource is running within your server.
2. **Refresh**: Execute the following command in your server console: refresh, ensure rcore\_banners
3. **Registering as business**: Then run in your server console /bannersetup business (This command refreshes the business data and sets up the newly defined business.)
4. By following these steps, you'll successfully define a new business in `rcore_banners`.

* Note: The business part is supported by default for QBCore/ESX only!

### Choosing a Unique Identifier

Assign a unique identifier to your business that will be used internally to reference it.

### Setting Business Properties

* **enabled:** Set to `true` if the business should be active and usable.
* **name:** Provide a human-readable name for your business.
* **pos:** Specify the location using `vec3(X, Y, Z)` format (X, Y, and Z coordinates).
* **blipEnabled:** Set to `true` if you want a map blip for your business.
* **blip:** Define properties for the blip (optional):
  * `name`: Name displayed on the map.
  * `color`: Color of the blip (refer to documentation for color codes).
  * `scale`: Size of the blip.
  * `sprite`: Sprite icon displayed on the blip (refer to documentation for sprite codes).

### Defining Interactions

* **interact:** Define interaction points for players within your business. Each interaction point requires:
  * `type`: Type of interaction (e.g., `Interact.PRODUCTION_MINIGAME`, `Interact.BOSS_MENU`).
  * `pos`: Position using `vec3(X, Y, Z)` format.
  * `heading` (optional): Heading or rotation of the interaction point.

### Setting Employee Grades

* **grades:** Define different employee grades with corresponding salaries:
  * `name`: Name of the grade.
  * `salary`: Salary associated with the grade.
  * `isBoss`: Set to `true` for the boss grade.

### Example Configuration

Here's an example configuration based on the provided template:

```lua
List = {
  ['my_business'] = {
    enabled = true,
    name = "My Business",
    pos = vec3(x, y, z),
    blipEnabled = true,
    blip = {
      name = "My Business Blip",
      color = 5, -- Yellow (refer to docs for color codes)
      scale = 1.0,
      sprite = 783,
    },
    interact = {
      {
        type = Interact.PRODUCTION_MINIGAME,
        pos = vec3(x1, y1, z1),
        heading = 90,
      },
      {
        type = Interact.BOSS_MENU,
        pos = vec3(x2, y2, z2),
        heading = 180,
      },
    },
    grades = {
      {
        name = 'employee',
        salary = 50,
      },
      {
        name = 'manager',
        salary = 100,
      },
      {
        name = 'boss',
        salary = 200,
        isBoss = true,
      },
    },
  }
}
```


# How to buy billboard?

Step by step documentation how to buy billboard

Here's how to purchase a billboard in rcore\_banners:

* **Business Membership:** You must be a member of a business authorized to rent billboards from the Government (GOV).
* **Billboard Marker:** Locate a billboard with a yellow marker at its base.
* **Interaction:** Stand near the yellow marker and press E to open the purchase menu.
* **Purchase Confirmation:** Follow the on-screen prompts to confirm and complete the billboard purchase.

*Note: You'll need sufficient in-game funds to finalize the purchase.*


# How to place banner?

Step by step documentation how to place banner?

Follow these steps to place a banner in your FiveM GTA V server:

1. **Open Banner Menu**: Navigate to `./banners` in your server directory.
2. **Select a Banner**: Choose any banner from the list and click on the "Editor" button.
3. **Edit Banner**: The menu will close, and you'll see the selected banner in front of you. Use the options below to manipulate it:
   * Press `Backspace` to exit from the editor.
   * Scroll up to increase the size of the banner.
   * Scroll down to decrease the size of the banner.
   * Press `E` to place the banner.
   * Note: Help keys will be displayed in the upper left corner of your screen.
4. **Placement**: The banner placement is based on your player camera. Aim where you want to place the banner, and it will appear in that location as shown in the preview.
5. **Troubleshooting**: If you encounter any issues with placing the banner, a message will appear explaining why you cannot place it. Keep it simple and summarize the message. Ensure your placement adheres to the rules of the server.


# Cannot see banners?

Step by step documentation how to fix issues with seeing banners/posters.

Follow these steps to fix visibility of the banners/posters.

1. **Open server.cfg**: Navigate to your `server.cfg` in your server directory.
2. **Adjust the order of resources**: Define ensure \[banners] as last resource to be started.
3. **Clear your server cache**: Go to cache/files/ and delete those files: rcore\_banners\_assets, rcore\_banners.
4. **Final step**: Restart your server, now you should be able to see banners.


# Expired images

Step by step documentation how to fix issues with expired images

Follow these steps to fix visibility of the banners/posters.

1. **Open your database**: Navigate to your database and look for rcore\_banners\_list
2. **Check image which is not visibile in-game**: Select target image URL and open it in browser.
3. **Replace**: If you cannot see any image under that url (typically for discord) that means its expired, you need to upload as recommend for example will be gyazo.com.

TIP: All expired images are seen on resource start - to make it more easier.


# API

All exports and events that script provides for developers.

## Events

### World interact

```lua
rcore_banners:server:worldInteract
```

* All data related to placing or removing banners will be sent via this event, along with any relevant information.
* Side: server
* Usage:

```lua
AddEventHandler('rcore_banners:server:worldInteract', function(bannerId, playerId, actionType, locationType)
    -- bannerId: DB-ID of banner.
    -- playerId: Player which has done some interaction in world.
    -- actionType: Which task has player done currently: [ADDED_BANNER, REMOVED_BANNER]
    -- locationType: When the interaction has happened? [WORLD, BILLBOARD]
end)
```

### Work stations

```
rcore_banners:server:Stations
```

* All data related to business stations, if any changes, there will be sent to this event.
* Side: server
* Usage:

```lua
AddEventHandler('rcore_banners:server:Stations', function(businessName, playerId, stationIdx, stationState, changeState, data)
    -- businessName: Name of business of which change is related to
    -- playerId: Player which has done some interaction at work station.
    -- stationIdx: Unique of station where the changes happened.
    -- stationState: What happend to station: [UPDATED_STATION, STARTED_PRODUCTION]
    -- changeState: Informational string change.
    -- data: Any relevant extra data that are associated with stationState / change state.
end)
```

### AddBannerIntoSystem

```
exports.rcore_banners:AddBannerIntoSystem
```

* Allow to create own banner from your own resource to defined into banners
* Side: server
* Type: export
* Usage:

```lua
local state, statusCode = exports.rcore_banners:AddBannerIntoSystem({
    banner_name = 'banner_name', -- Name of the banner
    banner_type = 'custom', -- Type needs to be custom!
    banner_image = 'banner_image_url' -- Link to your banner image (Accepting only: image/png, image/jpg image/gif)
})

if state then
    print('Banner was defined into rcore_banners resource')
end
```

### AddBannerToPlayerInventory

```
exports.rcore_banners:AddBannerToPlayerInventory
```

* Allow to give banner item, which exist in the banners resource via export.
* Side: server
* Type: export
* Usage:

```lua
local playerId = 1
local amount = 10
local bannerName = 'rcore_banners'

local itemState, itemStatusCode = exports.rcore_banners:AddBannerToPlayerInventory(playerId, amount, {
    banner_name = bannerName,
})

if itemState then
    print('Banner item was added to the player')
end
```

### Billboards

```
rcore_banners:server:Billboards
```

* All data related to billboards, if any changes, there will be sent to this event.
* Side: server
* Usage:

```lua
AddEventHandler('rcore_banners:server:Billboards', function(session)
    -- session - Array of data related to billboard changes

    -- Example session structure:
    -- session = {
    --     initiator: playerId,                          -- Player initiating the action
    --     initiatorName: GetPlayerName(playerId),       -- Name of the player initiating the action
    --     billboardId: billboardId,                     -- ID of the billboard involved in the action
    --     owner: owner,                                 -- Owner of the billboard (business/faction)
    --     action: 'buyBillboard',                       -- Type of action: [buyBillboard, sellBillboard, setBillboardImage, transferBillboard]
    
    --     data: {
    --         -- Specific dynamic data related to the action
    --         -- For example, if action is 'sellBillboard'
    --         sellPrice: sellPrice,                    -- Selling price of the billboard
    --         targetSociety: targetSociety,            -- Target business to sell the billboard to
    --         targetSocietyCut: targetSocietyCut,      -- Cut for the target business from the sale
    --         ownedBusinessReturn: ownedBusinessReturn  -- Return amount for the owned business
    --     }
    --     OR
    --     data: {
    --         -- Specific dynamic data related to the action
    --         -- For example, if action is 'setBillboardImage'
    --         side: side,                               -- Side of the billboard (if applicable A or B)
    --         banner_name: data['banner_name'],         -- Name of the banner
    --         banner_image: data['banner_image']        -- URL or data of the new billboard image
    --     }
    -- }

    -- Handle the changes based on the action type
    if session.action == 'buyBillboard' then
        -- Handle buy billboard logic
    elseif session.action == 'sellBillboard' then
        -- Handle sell billboard logic
    elseif session.action == 'setBillboardImage' then
        -- Handle set billboard image logic

        local side = session.data.side
        local bannerName = session.data.banner_name
        local bannerImage = session.data.banner_image
    elseif session.action == 'transferBillboard' then
        -- Handle transfer billboard logic
    end
end)
```


# ‌🏀 rcore\_basketball

GeneralStep by step installation guide, config preview, locale preview, common issues & solutions and most importantly code snippets to help you integrate our system with known resources.

{% embed url="<https://www.youtube.com/watch?v=9CwoM_D1-xY>" %}
Showcase
{% endembed %}

[**Buy Here**](https://store.rcore.cz/package/5302250)

## Installation

Resource should autodetect your framework and database. If the resource doesn't seem to work properly, go to rcore\_basketball/config.lua and adjust `Framework`

Alternatively you can always create a ticket on our discord and we will help you :)


# Configure new hoop

1. Go to your server console and type `basketadmintool serverId`, where `serverId` is your ID on your server
2. Go back to your game and configure the hoop (controls will be shown on your screen)
3. After finishing configuration, press ENTER
4. Go back to your server console and copy the printed config
5. Paste the config into basketball's config


# ‌🏓 rcore\_beerpong

Step by step installation guide, config preview, locale preview, common issues & solutions and most importantly code snippets to help you integrate our system with known resources.

{% embed url="<https://www.youtube.com/watch?v=3wx-jUGH1Bk>" %}
showcase
{% endembed %}

[**Buy Here**](https://store.rcore.cz/package/5014042)

## Installation Guide

{% hint style="danger" %}
This script **REQUIRES** artifact version **4752** or **newer**
{% endhint %}

### Configuration

Make sure to read the contents of *config.lua* and configure all the stuff that's necessary for this resource to work correctly.

## Common Issues & Solutions

### You lack the required entitlement

Do you see something like this in the console?

![](/files/761Vqog2CSzq1QR1hG68)

Please read this guide: [Error: You lack the required entitlement](/cfx-auth-system/you-lack-the-entitlement)

### Syntax error near '<\1>'

Do you see something like this in the console?

![](/files/mqTUFiILf9zRSaVtpWLs)

Please read this guide: [Error: syntax error near '<\1>'](/cfx-auth-system/error-syntax-error-near-less-than-1-greater-than)

### Could not find dependency / Can't run

Do you see something like this in the console?

![](/files/gJXnbfy9tf8UbMg4g8JK)

![](/files/eYcF94JqgnLj16K2Qmb5)

![](/files/4cyHSzU7zhEfS60H4kXc)

Follow this guide please: [Updating server](/server/updating-server)

Do you see something like this in the console?

![](/files/g5FD70o5jybB4XqlQBA8)

![](/files/ZaJA0yF5K8DnBhsQpR57)

Follow this guide please: [onesync](/server/onesync)


# How to use

### ESX / QBCore

You will need item called "cups" and simply in inventory just click on use

### Standalone mode

In standalone mode you need to use command: /createbeerpong


# ‌📹 rcore\_bodycam

GeneralStep by step installation guide, config preview, locale preview, common issues & solutions and most importantly code snippets to help you integrate our system with known resources.

{% embed url="<https://www.youtube.com/watch?v=-w_7XY7ISbs>" %}
Showcase
{% endembed %}

[**Buy Here**](https://store.rcore.cz/package/5057178)

## Common Issues & Solutions

{% hint style="danger" %}
this script **REQUIRES** artifact version **4752** or **newer**
{% endhint %}

### You lack the required entitlement

Do you see something like this in the console?

![](/files/761Vqog2CSzq1QR1hG68)

Please read this guide: [Error: You lack the required entitlement](/cfx-auth-system/you-lack-the-entitlement)

### Syntax error near '<\1>'

Do you see something like this in the console?

![](/files/mqTUFiILf9zRSaVtpWLs)

Please read this guide: [Error: syntax error near '<\1>'](/cfx-auth-system/error-syntax-error-near-less-than-1-greater-than)

### Could not find dependency / Can't run

Do you see something like this in the console?

![](/files/gJXnbfy9tf8UbMg4g8JK)

![](/files/4cyHSzU7zhEfS60H4kXc)

![](/files/eYcF94JqgnLj16K2Qmb5)

Follow this guide please: [Updating server](/server/updating-server)

Do you see something like this in the console?

![](/files/g5FD70o5jybB4XqlQBA8)

![](/files/ZaJA0yF5K8DnBhsQpR57)

Follow this guide please: [onesync](/server/onesync)


# Integration

## ME/DO Integration

To record **me**/**do**, you have to inform the cam framework that player has written a **me** or **do**.

To do so, in your serverside command handler, trigger the following event

```lua
-- for a DO
TriggerEvent('rcore_cam:do', Source, text)

-- for a ME
TriggerEvent('rcore_cam:me', Source, text)

-- Example (do NOT use the following code)
RegisterCommand('do', function(source, args)
    local Source = source
    local text = table.concat(args, " ")
    Send3dTextToMany("DO", 'lsrp_chat:do', Source, text, 'msg_do')
    TriggerEvent('rcore_cam:do', Source, text) -- example of triggering a DO
end, true)
```

## Animation integration

By default, the camera system can't detect if your scripts are playing animations on peds. To do so, you have to put the following line in `fxmanifest.lua` of all resources that use `TaskPlayAnim` and you want such animations to be in recordings (i.e. emotes resource)

```lua
client_script '@rcore_cam/include/anim.lua'
```


# Anticheat

This script uses cameras to show the view of security footage. If your anticheat disables freecam, please enable it.


# Recordings don't save

When running your server on Linux, the `rcore_bodycam/recordings` folder has to be writeable. If recordings don't save, most common issue is, the script can't write to the `recordings/` folder.

To fix it, open the `rcore_bodycam` resource in your FTP client, right click the `recordings/` and select either "Properties" or "File permissions"

Set permissions according to the following screenshots

Example in FileZille ![](/files/PoMSxQZRRIQm16JAJSPP)

Example in WinSCP ![](/files/3mh8Mg7jvoSc9CkVFKQw)


# ‌🎳 rcore\_bowling

GeneralStep by step installation guide, config preview, locale preview, common issues & solutions and most importantly code snippets to help you integrate our system with known resources.

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

[**Buy Here**](https://store.rcore.cz/package/5125529)

## Installation

Resource should autodetect your framework and database. If the resource doesn't seem to work properly, go to rcore\_bowling/config.lua and adjust `Framework`

Alternatively you can always create a ticket on our discord and we will help you :)


# Configure new alley

1. Go to your server console and type `bowlingadmintool serverId alleyName`

* where `serverId` is your ID on your server
* where alleyName is a name for your alley

2. Go back to your game and configure the alley (controls will be shown on your screen)
   * You will see a red ball where you aim
   * first, point at the middle of the beginning of the lane and press ENTER
   * second, point at the middle of the end of the lane and press ENTER
   * third, point at where the ball should spawn (on the rack) and press ENTER
   * last, an interaction point will appear. If it's on the wrong side, press RIGHT arrow
   * once the intraction point is configured, press ENTER
3. Repeat step 2 until all lanes are configured
4. Once you're done, press BACKSPACE
5. Go back to your server console and copy the printed config
   * OR find a file prefixed with cfg\_ containing your place name in rcore\_bowling
6. Paste the config at the end of bowling's config


# ‌🎥 rcore\_cam

GeneralStep by step installation guide, config preview, locale preview, common issues & solutions and most importantly code snippets to help you integrate our system with known resources.

## Common Issues & Solutions

{% hint style="danger" %}
this script **REQUIRES** artifact version **4752** or **newer**
{% endhint %}

### You lack the required entitlement

Do you see something like this in the console?

![](/files/761Vqog2CSzq1QR1hG68)

Please read this guide: [Error: You lack the required entitlement](/cfx-auth-system/you-lack-the-entitlement)

### Syntax error near '<\1>'

Do you see something like this in the console?

![](/files/mqTUFiILf9zRSaVtpWLs)

Please read this guide: [Error: syntax error near '<\1>'](/cfx-auth-system/error-syntax-error-near-less-than-1-greater-than)

### Could not find dependency / Can't run

Do you see something like this in the console?

![](/files/gJXnbfy9tf8UbMg4g8JK)

![](/files/4cyHSzU7zhEfS60H4kXc)

![](/files/eYcF94JqgnLj16K2Qmb5)

Follow this guide please: [Updating server](/server/updating-server)

Do you see something like this in the console?

![](/files/g5FD70o5jybB4XqlQBA8)

![](/files/ZaJA0yF5K8DnBhsQpR57)

Follow this guide please: [onesync](/server/onesync)


# Integration

## ME/DO Integration

To record **me**/**do**, you have to inform the cam framework that player has written a **me** or **do**.

To do so, in your serverside command handler, trigger the following event

```lua
-- for a DO
TriggerEvent('rcore_cam:do', Source, text)

-- for a ME
TriggerEvent('rcore_cam:me', Source, text)

-- Example (do NOT use the following code)
RegisterCommand('do', function(source, args)
    local Source = source
    local text = table.concat(args, " ")
    Send3dTextToMany("DO", 'lsrp_chat:do', Source, text, 'msg_do')
    TriggerEvent('rcore_cam:do', Source, text) -- example of triggering a DO
end, true)
```

## Animation integration

By default, the camera system can't detect if your scripts are playing animations on peds. To do so, you have to put the following line in `fxmanifest.lua` of all resources that use `TaskPlayAnim` and you want such animations to be in recordings (i.e. emotes resource)

```lua
client_script '@rcore_cam/include/anim.lua'
```


# Anticheat

This script uses cameras to show the view of security footage. If your anticheat disables freecam, please enable it.


# ‌⛺ rcore\_camping

**Complete camping system**

* 📦 Buy here <https://rcore.cz/r/camping>

## Common Issues & Solutions

{% hint style="danger" %}
this script **REQUIRES** artifact version **4752** or **newer**
{% endhint %}

### Version check

{% hint style="info" %}
Before submitting a support ticket or using anything in the documentation, always make sure that you have the **newest update** from your keymaster.
{% endhint %}


# Installation

## SQL

You can find `assets/sql/db.sql` file in assets folder, please insert that sql into your database. It will insert camping items into 'items' table.

## Config setup

Open the `config.lua` file.

### Framework

This script can be standalone, if needed, and we implemented two basic frameworks. You can change to your preferred framework like this:

```lua
Config.Framework = Frameworks.ESX -- for ESX
Config.Framework = Frameworks.QBCORE -- for QB
```

To implement your custom framework, take a look at the [Framework](https://documentation.rcore.cz/paid-resources/rcore_camping/framework) easy guide.

### Targeting system

This script can be standalone, if needed, and we implemented two basic integrations. You can change to your preferred targeting system like this:

```lua
Config.TargetingSystem = TargetingSystems.RCORE -- standalone
Config.TargetingSystem = TargetingSystems.QTARGET -- qtarget
Config.TargetingSystem = TargetingSystems.QBTARGET -- qb-target
```

If you use `QTARGET` or `QBTARGET` integration you need to have the selected script added to your server. If you renamed your script you also need to change it in `TargetingSystems`. For example if your qb-target script folder is called `qbtarget` you need to rename it also in `TargetingSystems`.

### OX Inventory

If you use ox\_inventory script and you are not able to use camping items from inventory check [OX Inventory section](https://documentation.rcore.cz/paid-resources/rcore_camping/ox_inventory)

### License type

Change `LicenseType` to the type of license you use to save your player data. We use this information to get the player's identifier.

```lua
Config.LicenseType = 'license' --license, steam, discord
```

### Language

To change the language of this script, you can simply change `Config.Locale` to any available language in `locales` folder.

### Consumable beer

Do not forget to add [beer](https://documentation.rcore.cz/paid-resources/rcore_camping/beer) into drunk system or any alternative system you use for eating/drinking.


# Config

**You can change individual values in config.lua**

## Debug

If you see anything wrong and you would like to know more, for example to show in support ticket, you can set `Config.Debug = true` to see more debug info in client (F8) console ingame, or server console.

## DeleteAllCommandName

This command could be used by player with group listed in `Config.AllowedGroups` and it deletes all existing camping props/objects placed on server.

## AllowedDistance

Biggest distance allowed for each item type to be interacted with by player. All item types should be filled here.

```lua
Config.AllowedDistance = {
    [Types.TENT] = 12.0,
    [Types.CHAIR] = 3.0,
    [Types.FIREPLACE] = 3.0,
    [Types.GAZEBO] = 10.0,
    [Types.BEER] = 3.0,
}
```

## HeadingSpeed

Defines how fast should be changing of object heading during placement.

## Controls

Defines all controls for object placement

## ChanceToBrokeFlint

When light item is used there is a change that the item breaks. If you want the item to be unbreakable set the value to `0`.

## LightItems

Defines all items that could be used for lighting up the fireplace. All items uses `ChanceToBrokeFlint`.

## Heal in Tent

Defines if players will be healed while in tent.

Config.HealingInterval - defines how often is player healed (in seconds) Config.HealthPerRestore - defines how much % from max health should be player healed in each interval (1 - 100%)

## Destroyable objects

Config.AllowDestroyableObjects - Defines if objects could be destroyed with gunshots. When set to `false` `DestroyChance` and `DestroyableObjects` are both ignored.

Config.DestroyChance - defines chance if object should be destroyed or not (0 - always fail, 100 - always success, 0-100)

```lua
Config.DestroyChance = {
    UNARMED = 0, -- fists, melee attacks without weapons
    MELEE_WEAPONS = 5, -- knife, nightstick, hammer, ...
    RANGED_WEAPONS = 5, -- pistols, smgs, rifles, shotguns, ...
    THROWABLE_WEAPONS = 5, -- grenade, molotov, ...
    EXPLOSION = 100,
    VEHICLE = 100,
    FIRE = 100,
}
```

Config.DestroyableObjects - defines objects which could be destroyed with gunshots.

## beerContainedOptions

Defines which item should be added to player when beerkeg is cleared.

```lua
local beerContainedOptions = {
    ['3_3'] = 'beerkeg',        -- full beerkeg
    ['2_3'] = 'beerkeg_2_3',    -- 2/3 beerkeg
    ['1_3'] = 'beerkeg_1_3',    -- 1/3 beerkeg
    ['0_3'] = 'beerkeg_0_3',    -- empty beerkeg
}
```

## PlaceableObjects

List of all camping objects which could be used.

### FIREPLACE

```lua
{
    object = 'rcore_wood_fire', -- default object without fire
    usableItem = 'fireplace', -- name of item registered as usable for object placement
    type = Types.FIREPLACE, -- this defines the item is FIREPLACE
    options = {
        inFireObject = 'prop_beach_fire', -- propname of object when fireplace is lighted on
    }
},
```

### TENT

```lua
{
    object = 'ba_prop_battle_tent_01', -- default object
    usableItem = 'tent_1', -- name of item registered as usable for object placement
    type = Types.TENT, -- this defines the item is TENT
},
```

### CHAIR

```lua
{
    object = 'prop_skid_chair_01', -- default object
    usableItem = 'chair_1', -- name of item registered as usable for object placement
    type = Types.CHAIR, -- this defines the item is CHAIR
},
```

### GAZEBO

```lua
{
    object = 'prop_gazebo_01', -- default object
    usableItem = 'gazebo_1', -- name of item registered as usable for object placement
    type = Types.GAZEBO, -- this defines the item is GAZEBO
},
```

### BEER

```lua
{
    object = 'prop_keg_01', -- default object
    usableItem = 'beerkeg', -- name of item registered as usable for object placement
    type = Types.BEER, -- this defines the item is BEER
    beerContained = 30.0, --how many liters of beer are in keg
    full = 30.0, -- how many liters of beer are in full keg
    containerItemOptions = beerContainedOptions -- check `beerContainedOptions` section
},
```

## ObjectOffset

You could define offset for each camping object. If object is not placed correctly on the floor during placement you could add offset to it here.

```lua
['rcore_wood_fire'] = vector3(0.0, 0.0, 0.1), -- X, Y, Z
```

## FireCraftable

Defines which items could be cooked on fireplace. You could choose length of cooking and result for each item.

```lua
{
    name = 'raw_chicken', -- item which could be cooked
    result = 'cooked_chicken', -- item player receives after cooking
    failChance = 50, -- (optional) you could define % chance of burning the items and have no result
                     -- 100 always succeeds, 0 always fails
    time = 30 * SECONDS, -- how long it takes to cook the item
    anim = Animation.CHICKEN,
}
```

You could also add additional required items with specific amounts for cooking. Amount is `1` by default if not specified

```lua
{
    name = 'raw_chicken', -- item which could be cooked
    additionalRequiredItems = {
        {name = 'garlic', amount = 2},
        {name = 'salt'},
    },
    result = 'cooked_chicken', -- item player receives after cooking
    time = 30 * SECONDS, -- how long it takes to cook the item
    anim = Animation.CHICKEN,
}
```


# Consumable Beer

Do not forget to add both beer items into your drunk system or any alternative system you use for eating/drinking.

## Rcore drunk system

* 📦 Buy here [drunk\_system](https://store.rcore.cz/package/5161129)

```lua
Config.DrunkList = {
    {
        name = "beer_05",
        numbersOfSips = 5, -- max 5 sips then the vodka bottle will be empty.
        eachSipGiveDrunk = 2, -- 2 * 5 = 10% drunk from one beer if he drink whole
        attachmentInfo = DefaultAttachmentPropertiesOfItem,
    },
    {
        name = "beer_03",
        numbersOfSips = 3, -- max 5 sips then the vodka bottle will be empty.
        eachSipGiveDrunk = 2, -- 2 * 5 = 10% drunk from one beer if he drink whole
        attachmentInfo = DefaultAttachmentPropertiesOfItem,
    }
}
```


# OX Inventory

{% hint style="danger" %}
if everything works fine and you are able to use all camping items leave `Config.ox_inventory` as `false`
{% endhint %}

A lot of people have problem with ox\_inventory and its backward compatability with "ESX.RegisterUsableItems" so its best to switch in config to ox\_inventory.

in rcore\_camping/config.lua

```lua
Config.ox_inventory = true
```

in ox\_inventory item list add/update your camping items if you add new items to camping do not forget to add them also into ox\_inventory item list

```lua
['tent_1'] = {
    label = 'Tent',
    weight = 5,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.tent_1',
    },
},
['tent_2'] = {
    label = 'Big Tent',
    weight = 5,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.tent_2',
    },
},
['chair_1'] = {
    label = 'Chair',
    weight = 2,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.chair_1',
    },
},
['chair_2'] = {
    label = 'Chair',
    weight = 2,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.chair_2',
    },
},
['chair_3'] = {
    label = 'Chair',
    weight = 2,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.chair_3',
    },
},
['gazebo_1'] = {
    label = 'Gazebo Black',
    weight = 1,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.gazebo_1',
    },
},
['gazebo_2'] = {
    label = 'Gazebo Blue',
    weight = 1,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.gazebo_2',
    },
},
['gazebo_3'] = {
    label = 'Gazebo White',
    weight = 1,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.gazebo_3',
    },
},
['beerkeg'] = {
    label = 'Beer Keg - 30L',
    weight = 8,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.beerkeg',
    },
},
['beerkeg_2_3'] = {
    label = 'Beer Keg - 30L - 2/3',
    weight = 6,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.beerkeg_2_3',
    },
},
['beerkeg_1_3'] = {
    label = 'Beer Keg - 30L - 1/3',
    weight = 3,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.beerkeg_1_3',
    },
},
['beerkeg_0_3'] = {
    label = 'Beer Keg - 30L - Empty',
    weight = 1,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.beerkeg_0_3',
    },
},
['fireplace'] = {
    label = 'Fireplace',
    weight = 5,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.fireplace',
    },
},
['flint'] = {
    label = 'Flint',
    weight = 1,
    consume = 0,
    stack = true,
    close = true,
    description = nil,
    server = {
        export = 'rcore_camping.flint',
    },
},
```


# Frameworks

If you use any custom framework other than ESX/QBCore, you will have to write a small integration to our script.

This will required the very basics of LUA or programming, as you will be only rewriting some existing values.

We can't really provide support to include all your frameworks, so please pay attention and follow this easy guide :)

First of all, add your framework to Frameworks in `config.lua`.

### Where?

The framework integration is located in the file `server\lib\frameworkBridge.lua`

### How?

Here you can see a commented part starting at line 62 (marked with line `CUSTOM FRAMEWORK`). All you have to do to start is to simply remove comment from the `elseif` block.

Inside the `elseif` block copy paste the QBCORE integration above (in the file) and simply add your own functions.

### **Am I doing it right?**

Let's say your framework is called STEVE, for better preview :) Your integration should then look like this:

```lua
elseif Config.Framework == Frameworks.STEVE then
    QBCore = {}
    ESX = {}
    Steve = ... -- function to get object of your framework

    ESX.GetPlayerFromId = function(source)
        local xPlayer = {}
        local stevePlayer = Steve.GetPlayer(source)

        ---------
        xPlayer.getMoney = function()
            return stevePlayer.GetMoney("cash") -- ***
        end
        ---------

        ... -- and other needed functions here

        return xPlayer
    end
end
```

So if you understand correctly, you should now know, that you simply need to only write the return functions inside xPlayer functions, like the one marked with `***`.

### List of used functions

### ESX

```lua
xPlayer = ESX.GetPlayerFromId(playerId)
xPlayer.getGroup()
xPlayer.addInventoryItem(itemName, amount)
xPlayer.removeInventoryItem(itemName, amount)
xPlayer.getInventoryItem(itemName) -- returns count, name

ESX.RegisterUsableItem(item, cb)
ESX.UseItem(playerId, xItem.name) -- xItem returned by getInventoryItem
```

### QBCore

```lua
QBCore.Functions.HasPermission(src, group)
QBCore.Functions.CreateUseableItem(item, cb)

player = QBCore.Functions.GetPlayer(source)
player.Functions.AddItem(itemName, amount)
player.Functions.RemoveItem(itemName, amount)
player.Functions.GetItemByName(itemName) -- returns amount, anme

QBCore.Functions.UseItem(player.source, item) -- item returned by GetItemByName
```


# API

**Integrate Camping with your system**

{% hint style="danger" %}
All events are **SERVER SIDE**!
{% endhint %}

## Server Events

### Extinguish fire

**If fireplace object exists on provided coords, player is in allowed distance and fireplace is lighted, the object is deleted and replaced with `object` specified in config**

```lua
TriggerEvent('rcore_camping:extinguish', objCoords)
```

### Light fireplace

**If fireplace object exists on provided coords, player is in allowed distance and fireplace is not lighted, player needs any item specified in `Config.LightItems` (flint by default) and after successful usage of light item the item is removed and the object is deleted and replaced with `inFireObject` specified in config**

```lua
TriggerEvent('rcore_camping:fire', objCoords)
```

### Add fuel to fireplace

**If fireplace object exists on provided coords, player is in allowed distance and fireplace is lighted, player needs 'wood' item, the item is removed and fireplace duration is increased on success**

```lua
TriggerEvent('rcore_camping:addFuel', objCoords)
```

### Cook on fireplace

**If fireplace object exists on provided coords, player is in allowed distance and fireplace is lighted, player needs item specified in `Config.FireCraftable` and after some time the item is replaced with result item**

```lua
TriggerEvent('rcore_camping:canCook', objCoords, cookData)
```

### Clear campign object

**If any camping object exists on provided coords while player is in allowed distance, the object is removed and added into player's inventory (this does not apply for fireplace)**

```lua
TriggerEvent('rcore_camping:clear', objCoords)
```

### Enter a tent

**If tent object exists on provided coords, player is in allowed distance and not already in any tent, player enters the tent.**

```lua
TriggerEvent('rcore_camping:enterTent', objCoords)
```

### Take a beer from beerkeg

**If beerkeg object exists on provided coords, player is in allowed distance and beerkeg is not empty, player takes beer from beerkeg**

```lua
TriggerEvent('rcore_camping:takeBeer', objCoords, BeerType['0_5'])
TriggerEvent('rcore_camping:takeBeer', objCoords, BeerType['0_3'])
```

### Sit on chair

**If chair object exists on provided coords, player's state of sitting is updated with provided `true/false` value**

```lua
TriggerEvent('rcore_camping:sit', objCoords, true) -- is sitting
TriggerEvent('rcore_camping:sit', objCoords, false) -- is not sitting
```

### Place a camping object

**places a camping object on coords**

```lua
TriggerEvent('rcore_camping:place', objName, objCoords, objHeading)
```

### Place a camping object

**server event which places a camping object on coords**

```lua
TriggerEvent('rcore_camping:serverPlace', objName, objCoords, objHeading)
```

### Cancel placement

**cancels current placement of camping object and returns last camping item used to player's inventory**

```lua
TriggerEvent('rcore_camping:cancel')
```

### Leave a tent

**If player is in any tent, player leaves the tent**

```lua
TriggerEvent('rcore_camping:leaveTent')
```

### Camping object placed

**server event called when camping object is placed on coords**

```lua
AddEventHandler('rcore_camping:objectPlaced', function(objName, objCoords, objHeading)

end)
```

### Camping object cleared

**server event called when camping object is cleared on coords**

```lua
AddEventHandler('rcore_camping:objectCleared', function(objName, objCoords)

end)
```


# ‌🎪 rcore\_carnival

Step by step installation guide, config preview, locale preview, common issues & solutions and most importantly code snippets to help you integrate our system with known resources.

{% embed url="<https://www.youtube.com/watch?v=edtcIqp4BAY>" %}
Bang the beaver
{% endembed %}

{% embed url="<https://www.youtube.com/watch?v=VB1i_KCYALQ>" %}
Claw machine
{% endembed %}

[**Buy Here**](https://store.rcore.cz/package/5334367)

## Installation Guide

{% hint style="danger" %}
This script **REQUIRES** artifact version **4752** or **newer**
{% endhint %}

### Configuration

Make sure to read the contents of *config.lua* and configure all the stuff that's necessary for this resource to work correctly.

## Common Issues & Solutions

### You lack the required entitlement

Do you see something like this in the console?

![](/files/761Vqog2CSzq1QR1hG68)

Please read this guide: [Error: You lack the required entitlement](/cfx-auth-system/you-lack-the-entitlement)

### Syntax error near '<\1>'

Do you see something like this in the console?

![](/files/mqTUFiILf9zRSaVtpWLs)

Please read this guide: [Error: syntax error near '<\1>'](/cfx-auth-system/error-syntax-error-near-less-than-1-greater-than)

### Could not find dependency / Can't run

Do you see something like this in the console?

![](/files/gJXnbfy9tf8UbMg4g8JK)

![](/files/eYcF94JqgnLj16K2Qmb5)

![](/files/4cyHSzU7zhEfS60H4kXc)

Follow this guide please: [Updating server](/server/updating-server)

Do you see something like this in the console?

![](/files/g5FD70o5jybB4XqlQBA8)

![](/files/ZaJA0yF5K8DnBhsQpR57)

Follow this guide please: [onesync](/server/onesync)


# Create new minigame

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


# rcore\_casino

High-end casino that offers a wide variety of gambling games and activities for players to take part in. There are plenty of casino games to choose from, including blackjack, poker, roulette, slot mac

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

[**Buy Here**](https://store.rcore.cz/package/5156878)

## Common Issues & Solutions

{% hint style="danger" %}
This script **REQUIRES** artifact version **4752** or **newer**
{% endhint %}

### Replacing The Lucky Wheel Vehicle

Players that have a job casino, and grade 1 or higher, can deliver a vehicle to the Lucky Wheel podium. Drive into a marker in front of the casino garage to deliver/replace the podium vehicle.

![Casino Garage](/files/i0CbknrVvoHxerlehlPG)

### You lack the required entitlement

Do you see something like this in the console?

![](/files/761Vqog2CSzq1QR1hG68)

Please read this guide: [Error: You lack the required entitlement](/cfx-auth-system/you-lack-the-entitlement)

### Syntax error near '<\1>'

Do you see something like this in the console?

![](/files/mqTUFiILf9zRSaVtpWLs)

Please read this guide: [Error: syntax error near '<\1>'](/cfx-auth-system/error-syntax-error-near-less-than-1-greater-than)

### Could not find dependency / Can't run

Do you see something like this in the console?

![](/files/gJXnbfy9tf8UbMg4g8JK)

![](/files/eYcF94JqgnLj16K2Qmb5)

![](/files/4cyHSzU7zhEfS60H4kXc)

Follow this guide please: [Updating server](/server/updating-server)

Do you see something like this in the console?

![](/files/g5FD70o5jybB4XqlQBA8)

![](/files/ZaJA0yF5K8DnBhsQpR57)

Follow this guide please: [onesync](/server/onesync)


# Installing Maps

How to configure casino maps.

Welcome to the **Installing Maps** guide! Here, you'll find all the resources you need to set up the casino for your preferred map. To get started, simply select one of the subpages from the list below that corresponds to the map you're using. Each guide provides detailed instructions tailored to that specific map.


# UncleJust Casino

How to configure rcore\_casino for UncleJust casino map.

<figure><img src="/files/er24mNjcychhrw9wVU8p" alt=""><figcaption><p>UncleJust Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 1

<figure><img src="/files/ygLJSWYhtuUKXEbsx7Qw" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>


# DlcIplLoader

How to configure rcore\_casino for DLCIplLoader casino map.

<figure><img src="/files/er24mNjcychhrw9wVU8p" alt=""><figcaption><p>DlcIplLoader Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 1

<figure><img src="/files/ygLJSWYhtuUKXEbsx7Qw" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>


# Gabz Casino

How to configure rcore\_casino for Gabz casino map.

<figure><img src="/files/er24mNjcychhrw9wVU8p" alt=""><figcaption><p>Gabz Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 2

<figure><img src="/files/luOU9grrXjniHYx4qz5I" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>

After we configure fxmanifest.lua, look for "extra" folder that comes with our casino .zip pack

<figure><img src="/files/rTZePNWFpRH5WuAGoosK" alt=""><figcaption></figcaption></figure>

Copy 'extra/gabz-casino/gabz\_vw\_vwdlc\_int\_01.ytyp' inside 'cfx-gabz-casino\stream\ytyp\\'


# NoPixel Casino

How to configure rcore\_casino for NoPixel3 casino map.

<figure><img src="/files/er24mNjcychhrw9wVU8p" alt=""><figcaption><p>NoPixel Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 3

<figure><img src="/files/vwz6Y8fUYIvuJaTXJCKy" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>

After we configure fxmanifest.lua, look for "extra" folder that comes with our casino .zip pack

<figure><img src="/files/rTZePNWFpRH5WuAGoosK" alt=""><figcaption></figcaption></figure>

* Copy "extra\nopixel\gbz\_vw\_vwdlc\_int\_01.ytyp" inside nopixel-casino\stream\Main\ytyp
* Copy "extra\nopixel\vw\_vwint01\_betting\_desks.ydr" inside nopixel-casino\stream\Main\ydr
* Delete nopixel-casino\stream\Main\ydr\vw\_prop\_vw\_luckywheel\_01a.ydr


# K4MB1 Casino

How to configure rcore\_casino for K4MB1 casino map.

<figure><img src="/files/b2mZzEHSs3p0lzCClvmz" alt=""><figcaption><p>K4MB1 Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 4

<figure><img src="/files/651AaGt852UiJ9uuSAH2" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>


# rcore\_casino\_interior

How to configure rcore\_casino for rcore\_casino\_interior casino map.

<figure><img src="/files/er24mNjcychhrw9wVU8p" alt=""><figcaption><p>rcore_casino_interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`
2. Change the `MapType`option to 5

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and add 'rcore\_casino\_interior\` in your dependencies if it's not there yet.

before:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>


# Underground Casino Paleto

How to configure rcore\_casino for Underground Paleto casino map.

<figure><img src="/files/3s8Sk2K2WsaI3nVyrgID" alt=""><figcaption><p>Underground Paleto Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 6

<figure><img src="/files/2cWuDEANOUXibuA0ePH1" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>


# K4MB1 Enterable Diamond Casino

How to configure rcore\_casino for K4MB1 enterable Diamond Casino map.

<figure><img src="/files/er24mNjcychhrw9wVU8p" alt=""><figcaption><p>K4MB1 Old Enterable Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 7

<figure><img src="/files/fP2BDupuZ3hI1zrvX5KK" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>

After we configure fxmanifest.lua, look for "extra" folder that comes with our casino .zip pack

<figure><img src="/files/rTZePNWFpRH5WuAGoosK" alt=""><figcaption></figcaption></figure>

Copy 'extra\k4mb1-old-casino\brown\_casinoextended.ytyp' inside 'casinointerior\stream\base'


# Patoche Casino

How to configure rcore\_casino for Patoche Casino map.

<figure><img src="/files/DwfWaPMnWtqGUWjSUiBY" alt=""><figcaption><p>Patoche Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 8

<figure><img src="/files/V3Q1SkwlUHkrDD2iaSz1" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>


# Clawles: Casino Los Santos

How to configure rcore\_casino for Patoche Casino map.

<figure><img src="/files/hGHrpNMUwLyDLzsLJokA" alt=""><figcaption><p>Clawles Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 9

<figure><img src="/files/sJ1tXyIiE8CXzKPvr8hv" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>


# Molo Casino

How to configure rcore\_casino for Molo Casino map.

<figure><img src="/files/eRCkQqi8ymdFkhwo9WDf" alt=""><figcaption><p>Molo Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 10

<figure><img src="/files/Td7voizdoWPmYuC1EShB" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>


# Jurassic Jackpot Casino

How to configure rcore\_casino for Jurassic Jackpot Casino map.

<figure><img src="/files/lFhndeVlKDu6hugbU8rx" alt=""><figcaption><p>Jurassic Jackpot Casino Interior</p></figcaption></figure>

1. Head into 'rcore\_casino/config.lua\` and look for part about `MapType`

<figure><img src="/files/W5hDI5XQzarF6E4Wsk1Y" alt=""><figcaption></figcaption></figure>

2. Change the `MapType`option to 11

<figure><img src="/files/nuckxTyTkk95PfdbKBeX" alt=""><figcaption></figcaption></figure>

After we configured map in the config, please head into 'rcore\_casino/fxmanifest.lua' and if you have in dependencies 'rcore\_casino\_interior\` you will have to remove it.

before:

<figure><img src="/files/3xR81GYZJHW3BaUdR6XG" alt=""><figcaption></figcaption></figure>

after:

<figure><img src="/files/by0Gj4f7xPPQb5w4tJml" alt=""><figcaption></figcaption></figure>


# Standalone Version

Standalone version limits

The standalone version of the Casino does not rely on any framework. Instead, it utilizes a simple storage system implemented in the MySQL table casino\_players.

### /config.lua

To enable the Casino to work on Standalone version, please set Active = 3, under Framework settings.

### Initial Chips

Every player who enters the Casino for the first time receives an initial chip amount. By default, this value is set to 100,000 chips. You can modify this value in the config.lua file, specifically under the Framework settings section.

### Disabled Society

For the society feature to work in the standalone version, you need to implement your own methods to handle the society's funds.

#### /server/main/society.lua

> GetMoneyFromSociety()
>
> GiveMoneyToSociety(money)
>
> RemoveMoneyFromSociety(money)

### Casino Workers

Admins can hire players as casino workers to assist with tasks such as delivering vehicles for the Lucky Wheel competition. This can be achieved by using the admin command /casinoworkers, which requires the ACE permission level "admin" to be granted.

### Lucky Wheel Vehicle Giving

When a player wins a vehicle from the Lucky Wheel, the vehicle is spawned in front of the Casino entrance. Subsequently, the doors of the vehicle are unlocked for the winner. However, if you prefer, you can save the vehicle directly to their garage by implementing your own method in /server/main/cache.lua

> Cache:GiveVehicle(playerId, vehicleProps), under Framework.Active == 3


# Custom Framework

How to set-up casino for your own framework

### /config.lua

To enable the Casino to work with a custom framework, please set Active = 4, under Framework settings.

### /server/framework/custom.lua

> ESX.GetPlayerFromId = function(source)

This file contains the server-side player structure with example data. Make sure to swap out the example data with actual data using your framework, while keeping the original function names and properties intact.

### /server/main/cache.lua

> Cache:PlayerOwnsVehicle(identifier, plate)

This function verifies if the player is the owner of a vehicle by checking the vehicle plate. Please include your own method to determine whether the player is the owner or not.

> Cache:GiveVehicle(playerId, vehicleProps)

This function awards the podium vehicle to the winner after they win it on the Lucky Wheel spin. Please implement your own method to store the vehicle information in the MySQL database.

### /server/main/society.lua

> GetMoneyFromSociety()

This function retrieves the current balance of the society account.

> GiveMoneyToSociety(money)

This function deposits money into the society account.

> RemoveMoneyFromSociety(money)

This function deducts money from the society account.

You have the option to customize events within the functions or disable the Society feature in the config.lua file if it's not needed.

### /client/framework/playerdata.lua

> UpdatePlayerDataForCustomFramework()

This file contains the client-side player structure with example data. Make sure to swap out the example data with actual data using your framework, while keeping the original function names and properties intact.

> RemovePlayerHunger(itemName)
>
> RemovePlayerThirst(itemName)

This function handles player hunger removal after eating a snack at the Casino Bar. Please implement your own function for handling hunger removal within it.

### /client/job/bossmenu.lua

> bossMenu.on("key", function()

This function opens the bossmenu in the Casino office. You can implement your own event to handle the opening of the bossmenu or remove the bossMenu object if the bossmenu checkpoint is not required.

### /client/main/casino.lua

> SetInventoryBusy(isBusy)

This function allows for locking/unlocking the player's inventory during gameplay or when managing chips at the Cashier. Please implement your own method for handling this functionality.


# Installing on QBCore

Installing rcore\_casino on a qb-core server.

### Setting Up Config

Open the file **config.lua** and setup your framework settings, inside **Framework {}** and **Events {}**

<figure><img src="/files/6KLysExAQdfzEQtr19PV" alt=""><figcaption></figcaption></figure>

### Casino MLO

Please make sure you have a casino map with default coordinates installed on your server (the casino entrance can be modified, as long as the main casino area and tables are at the default coords).\
**If you don't have any casino map on your server, please use our rcore\_casino\_map. Otherwise, delete the rcore\_casino\_map folder.**

{% hint style="danger" %}
Some MLOs / IPL Loaders can make glitches inside casino, such as broken doors, disabled screens, invisible walls. Make sure you don't use something you don't need :)
{% endhint %}

### Known issues with bob74\_ipl

If you use **bob74\_ipl** loader, Inside Track doesn't work properly. Please do following steps to fix the Inside Track betting screen.

Locate file '\[standalone]\bob74\_ipl\fxmanifest.lua' and delete following code

```
"dlc_bikers/gang.lua" -- this file breaks Inside Track big screen, keep it only if you really need it
```

## Fixing Ambient Sound

Players can hear ambient sound (background noises of casino) once they enter the building. If ambient sound doesn't play, make sure that none of your other resources blocks it.

In qb-core, a resource called **qb-smallresources** blocks ambient sound on purpose. To stop this, please do following steps:

1. Locate and open file 'qb-smallresources\client\ignore.lua' file
2. Remove the following line from the file

```
StartAudioScene("CHARACTER_CHANGE_IN_SKY_SCENE")
```

## Importing Job

Players can enter restricted areas and replace the podium vehicle. To import casino job, please open file 'qb-core\shared\jobs.lua' and add following code block after your last job.

```
['casino'] = {
        label = 'Casino',
        defaultDuty = true,
        grades = {
            ['0'] = { name = 'Novice', payment = 50 },
            ['1'] = { name = 'Experienced', payment = 100 },
            ['2'] = { name = 'Boss', isboss = true, payment = 200 },
        },
    },
```

## Importing Inventory Items

{% content-ref url="/pages/ZN3RUUbqy9iul9o29jQr" %}
[Installing Inventory Items](/paid-resources/rcore_casino/inventory-items)
{% endcontent-ref %}

## Making Snack Items Eatable/Drinkable

Inside casino, players can sit down at the bar and use their casino snacks. To make the snacks affect player's hunger, please do following steps.

1. Locate and open file 'qb-smallresources\config.lua'
2. Add following code after your last item in *CostumablesEat*

```lua
-- Casino Bar Snacks
["casino_burger"] = math.random(25, 40),
["casino_psqs"] = math.random(25, 40),
["casino_ego_chaser"] = math.random(25, 40),
["casino_sandwitch"] = math.random(25, 40),
["casino_donut"] = math.random(25, 40)
```

3\. Add following code after your last item in *ConsumeablesDrink*

```lua
-- Casino Bar Drinks
["casino_beer"] = math.random(25, 40),
["casino_coke"] = math.random(25, 40),
["casino_sprite"] = math.random(25, 40),
["casino_luckypotion"] = math.random(25, 40),
["casino_coffee"] = math.random(25, 40)
```

## Editing qb-shops

There is one more qb-core resource that collides with our casino and needs to be edited, **qb-shops**. To do so, please do following steps.

1. Locate file '\[qb]\qb-shops\config.lua' and remove following code blocks

```lua
Config.SellCasinoChips = {
    coords = vector4(950.37, 34.72, 71.87, 33.82),
    radius = 1.5,
    ped = 's_m_y_casino_01'
}
```

```lua
 ["casino"] = {
        [1] = {
            name = 'casinochips',
            price = 1,
            amount = 999999,
            info = {},
            type = 'item',
            slot = 1,
        }
    },
```

```lua
-- Casino Locations
    ["casino"] = {
        ["label"] = "Casino",
        ["coords"] = vector4(949.29, 32.13, 71.95, 79.54),
        ["ped"] = 'csb_tomcasino',
        ["scenario"] = "WORLD_HUMAN_STAND_MOBILE",
        ["radius"] = 1.5,
        ["targetIcon"] = "fas fa-coins",
        ["targetLabel"] = "Buy Chips",
        ["products"] = Config.Products["casino"],
        ["showblip"] = true,
        ["blipsprite"] = 617,
        ["blipcolor"] = 0
    },

    ["casinobar"] = {
        ["label"] = "Casino Bar",
        ["coords"] = vector4(937.45, 27.22, 71.83, 61.21),
        ["ped"] = 'a_m_y_smartcaspat_01',
        ["scenario"] = "WORLD_HUMAN_VALET",
        ["radius"] = 1.5,
        ["targetIcon"] = "fas fa-wine-bottle",
        ["targetLabel"] = "Open Casino Bar",
        ["products"] = Config.Products["liquor"],
        ["showblip"] = false,
        ["blipsprite"] = 52,
        ["blipcolor"] = 0
    },
```

2\. Locate file '\[qb]\qb-shops\client\main.lua' and remove following code blocks

```lua
if not ShopPed["casino"] then ShopPed["casino"] = {} end
    local current = Config.SellCasinoChips.ped
    current = type(current) == 'string' and joaat(current) or current
    RequestModel(current)

    while not HasModelLoaded(current) do
        Wait(0)
    end
    ShopPed["casino"] = CreatePed(0, current, Config.SellCasinoChips.coords.x, Config.SellCasinoChips.coords.y, Config.SellCasinoChips.coords.z-1, Config.SellCasinoChips.coords.w, false, false)
    FreezeEntityPosition(ShopPed["casino"], true)
    SetEntityInvincible(ShopPed["casino"], true)
    SetBlockingOfNonTemporaryEvents(ShopPed["casino"], true)
```

```lua
exports['qb-target']:AddTargetEntity(ShopPed["casino"], {
            options = {
                {
                    label = 'Sell Chips',
                    icon = 'fa-solid fa-coins',
                    action = function()
                        TriggerServerEvent("qb-shops:server:sellChips")
                    end
                }
            },
            distance = 2.0
        })
```

```lua
 local sellChips = CircleZone:Create(vector3(Config.SellCasinoChips.coords["x"], Config.SellCasinoChips.coords["y"], Config.SellCasinoChips.coords["z"]), Config.SellCasinoChips.radius, {useZ = true})
        sellChips:onPlayerInOut(function(isPointInside)
            if isPointInside then
                inChips = true
                exports["qb-core"]:DrawText(Lang:t("info.sell_chips"))
            else
                inChips = false
                exports["qb-core"]:HideText()
            end
        end)
```

{% hint style="info" %}
If you don't use the resource qb-shops, please make sure it's disabled.
{% endhint %}


# Installing on ESX

Installing rcore\_casino on an ESX server.

### Setting Up Config

Open the file **config.lua** and setup your framework settings, inside **Framework {}** and **Events {}**

<figure><img src="/files/pQylcTsycMlB1EUQSaFC" alt=""><figcaption></figcaption></figure>

## Importing Inventory Items

{% content-ref url="/pages/ZN3RUUbqy9iul9o29jQr" %}
[Installing Inventory Items](/paid-resources/rcore_casino/inventory-items)
{% endcontent-ref %}

### Casino MLO

Please make sure you have a casino map with default coordinates installed on your server (the casino entrance can be modified, as long as the main casino area and tables are at the default coords).\
**If you don't have any casino map on your server, please use our rcore\_casino\_map. Otherwise, delete the rcore\_casino\_map folder.**

{% hint style="danger" %}
Some MLOs / IPL Loaders can make glitches inside casino, such as broken doors, disabled screens, invisible walls. Make sure you don't use something you don't need :)
{% endhint %}

### Known issues with bob74\_ipl

If you use **bob74\_ipl** loader, Inside Track doesn't work properly. Please do following steps to fix the Inside Track betting screen.

Locate file '\[standalone]\bob74\_ipl\fxmanifest.lua' and delete following code

```
"dlc_bikers/gang.lua" -- this file breaks Inside Track big screen, keep it only if 
```


# Installing Inventory Items

How to install casino inventory items

{% hint style="info" %}
The inventory icons are located in the casino zip folder, inside extra\inventory icons\\
{% endhint %}

### qb-inventory

Insert the inventory icons in: **qb-inventory\html\images**

Insert the inventory items in: **qb-core\shared\items.lua**

```
["casino_beer"] = {
        ["name"] = "casino_beer",
        ["label"] = "Casino Beer",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_beer.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Beer"
    },
    ["casino_burger"] = {
        ["name"] = "casino_burger",
        ["label"] = "Casino Burger",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_burger.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Burger"
    },
    ["casino_chips"] = {
        ["name"] = "casino_chips",
        ["label"] = "Casino Chips",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_chips.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Chips"
    },
    ["casino_coffee"] = {
        ["name"] = "casino_coffee",
        ["label"] = "Casino Coffee",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_coffee.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Coffee"
    },
    ["casino_coke"] = {
        ["name"] = "casino_coke",
        ["label"] = "Casino Kofola",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_coke.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Kofola"
    },
    ["casino_donut"] = {
        ["name"] = "casino_donut",
        ["label"] = "Casino Donut",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_donut.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Donut"
    },
    ["casino_ego_chaser"] = {
        ["name"] = "casino_ego_chaser",
        ["label"] = "Casino Ego Chaser",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_ego_chaser.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Ego Chaser"
    },
    ["casino_luckypotion"] = {
        ["name"] = "casino_luckypotion",
        ["label"] = "Casino Lucky Potion",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_luckypotion.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Lucky Potion"
    },
    ["casino_psqs"] = {
        ["name"] = "casino_psqs",
        ["label"] = "Casino Ps & Qs",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_psqs.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Ps & Qs"
    },
    ["casino_sandwitch"] = {
        ["name"] = "casino_sandwitch",
        ["label"] = "Casino Sandwitch",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_sandwitch.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Sandwitch"
    },
    ["casino_sprite"] = {
        ["name"] = "casino_sprite",
        ["label"] = "Casino Sprite",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_sprite.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Sprite"
    },
```

### ox\_inventory

Insert the inventory icons in: **ox\_inventory\web\images**

Insert the inventory items in: **ox\_inventory\data\items.lua**

```
['casino_beer'] = {
    label = 'Casino Beer',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_burger'] = {
    label = 'casino burger',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_chips'] = {
    label = 'casino chips',
    weight = 0,
    close = true,
    consume = 0,
    stack = true,
},

['casino_coffee'] = {
    label = 'casino coffee',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_coke'] = {
    label = 'casino coke',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_donut'] = {
    label = 'casino donut',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_ego_chaser'] = {
    label = 'casino ego chaser',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_luckypotion'] = {
    label = 'casino luckypotion',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_psqs'] = {
    label = 'Casino Ps & Qs',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_sandwitch'] = {
    label = 'casino sandwitch',
    weight = 0,
    close = true,
    consume = 0,
},

['casino_sprite'] = {
    label = 'casino sprite',
    weight = 0,
    close = true,
    consume = 0,
},
```

### qs-inventory

Insert the inventory items in: **qb-core\shared\items.lua(QB), qs-inventory\shared\items.lua(ESX)**

```
["casino_beer"] = {
        ["name"] = "casino_beer",
        ["label"] = "Casino Beer",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_beer.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Beer"
    },
    ["casino_burger"] = {
        ["name"] = "casino_burger",
        ["label"] = "Casino Burger",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_burger.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Burger"
    },
    ["casino_chips"] = {
        ["name"] = "casino_chips",
        ["label"] = "Casino Chips",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_chips.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Chips"
    },
    ["casino_coffee"] = {
        ["name"] = "casino_coffee",
        ["label"] = "Casino Coffee",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_coffee.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Coffee"
    },
    ["casino_coke"] = {
        ["name"] = "casino_coke",
        ["label"] = "Casino Kofola",
        ["weight"] = 0,
        ["type"] = "item",
        ['image'] = 'casino_coke.png',
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Kofola"
    },
    ["casino_donut"] = {
        ["name"] = "casino_donut",
        ["label"] = "Casino Donut",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_donut.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Donut"
    },
    ["casino_ego_chaser"] = {
        ["name"] = "casino_ego_chaser",
        ["label"] = "Casino Ego Chaser",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_ego_chaser.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Ego Chaser"
    },
    ["casino_luckypotion"] = {
        ["name"] = "casino_luckypotion",
        ["label"] = "Casino Lucky Potion",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_luckypotion.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Lucky Potion"
    },
    ["casino_psqs"] = {
        ["name"] = "casino_psqs",
        ["label"] = "Casino Ps & Qs",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_psqs.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Ps & Qs"
    },
    ["casino_sandwitch"] = {
        ["name"] = "casino_sandwitch",
        ["label"] = "Casino Sandwitch",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_sandwitch.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Sandwitch"
    },
    ["casino_sprite"] = {
        ["name"] = "casino_sprite",
        ["label"] = "Casino Sprite",
        ["weight"] = 0,
        ["type"] = "item",
        ["image"] = "casino_sprite.png",
        ["unique"] = false,
        ["useable"] = false,
        ["shouldClose"] = false,
        ["combinable"] = nil,
        ["description"] = "Casino Sprite"
    },
```

### esx

Insert the items in your database

{% tabs %}
{% tab title="esx 1.1" %}

```
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_beer', 'Casino Beer', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_burger', 'Casino Burger', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_chips', 'Casino Chips', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_coffee', 'Casino Coffee', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_coke', 'Casino Kofola', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_donut', 'Casino Donut', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_ego_chaser', 'Casino Ego Chaser', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_luckypotion', 'Casino Lucky Potion', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_psqs', 'Casino Ps & Qs', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_sandwitch', 'Casino Sandwitch', '-1');
INSERT INTO `items` (`name`, `label`, `limit`) VALUES ('casino_sprite', 'Casino Sprite', '-1');
```

{% endtab %}

{% tab title="esx 1.2+" %}

```
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_beer', 'Casino Beer', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_burger', 'Casino Burger', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_chips', 'Casino Chips', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_coffee', 'Casino Coffee', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_coke', 'Casino Kofola', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_donut', 'Casino Donut', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_ego_chaser', 'Casino Ego Chaser', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_luckypotion', 'Casino Lucky Potion', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_psqs', 'Casino Ps & Qs', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_sandwitch', 'Casino Sandwitch', '0');
INSERT INTO `items` (`name`, `label`, `weight`) VALUES ('casino_sprite', 'Casino Sprite', '0');
```

{% endtab %}
{% endtabs %}


# The Cashier

The cashier options

At the Casino Cashier, players can either purchase chips using money or trade in their existing chips for cash.

**Events that are being used for the Cashier** (located in /server/main/casino.lua)

> Casino:AcquireChips
>
> Casino:TradeInChips
>
> Casino:DailyBonus

### Anti-Spam

To prevent abuse and unauthorized actions, there is a default rate limit set for the cashier events, which allows only one event per second. If a player exceeds this limit and triggers these events more frequently, a warning message is displayed in the server console. This alert informs the server admins that there may be suspicious activity where the player is attempting to exploit the system and acquire chips without proper means. As a security measure, an antispam mechanism is activated, triggering the server event "Casino:Anticheat:Ban" along with the player's ID. You can modify this behavior in:

> **/server/main/casino.lua**
>
> LimitCashierRate(playerId)

### Daily Bonus

By default, players can receive a daily bonus of 1000 chips at the Cashier. This feature is enabled by default and can be adjusted in the config.lua file, under the "CASHIER\_DAILY\_BONUS" option. If you wish to disable the daily bonus, simply set "CASHIER\_DAILY\_BONUS = 0" in the configuration.

### VIP Membership

Players have the option to purchase a VIP membership, which grants them exclusive access to VIP areas and the ability to participate in high-stakes games at the Casino. The price and the duration of the membership can be configured in config.lua, options:

> CASHIER\_VIP\_PRICE
>
> CASHIER\_VIP\_DURATION


# Society

Society Info & Settings

When players purchase chips from the Cashier, the money spent is deposited into a shared society account. Conversely, when players trade in their chips for money, the funds are drawn from this account. This setup adds a realistic economic element to your casino.

### esx\_society, esx\_addonaccount

1. set `SocietyFramework` to `'esx_addonaccount'` in casino's config.lua
2. insert `'society_casino'` row in the MYSQL tables: `addon_account`and `addon_account_data`

```sql
INSERT INTO `addon_account` (`name`, `label`, `shared`) VALUES ('society_casino', 'society_casino', 1);
INSERT INTO `addon_account_data` (`account_name`, `money`, `owner`) VALUES ('society_casino', 0, NULL);
```

### qb-management, qb-bossmenu

1. install the "casino" job in your /shared/jobs.lua
2. set `SocietyName` to `'casino'`**,** and `SocietyFramework` to `'qb-management'` in casino's config.lua
3. insert `'casino'` row in the MYSQL table: `management_funds` (type boss)

### qb-banking 2.0 and higher

1. install the "casino" job in your /shared/jobs.lua
2. set `SocietyName` to `'casino'` and `SocietyFramework` to `'qb-banking'` in casino's config.lua
3. insert `'casino'` row in the MYSQL table: `bank_accounts` (type job)

### renewed-banking

1. set `SocietyFramework` to `Renewed-Banking` in casino's config.lua
2. insert `'society_casino'` in the MYSQL table: `bank_accounts_new`

### okokbanking

1. insert your society name in the MYSQL table: `okokbanking_societies` if not using addonaccount.
2. insert your society name in Config.Societies list in okokbanking's config file

### 710-management

1. create your society in 710-management menu, and make sure it's installed in the MYSQL table: `management_accounts`
2. set `SocietyFramework` to `710-Management` in casino's config.lua

### custom society resource

If you're using a custom framework/resource, you can manage the casino funds with your own society resource. Modify these three functions in **/server/main/society.lua**:

#### 1. To deduct money from the society fund:

```lua
function RemoveMoneyFromSociety(money)
    -- Add your own method to manage society money here
end
```

#### 2. To add money to the society fund:

```lua
function GiveMoneyToSociety(money)
    -- Add your own method to manage society money here
end
```

#### 3. To retrieve money from the society fund:

```lua
function GetMoneyFromSociety()
    -- Add your own method to manage society money here
    return 10000
end
```

To edit the society settings, look into file **config.lua**

### **Enabling Society Account**

```
EnableSociety = true
```

Whether you want to use a society account for all Casino payouts/deposits. When disabled, all payouts are directly sent to players without affecting any bank/society accounts.

### Limiting Payouts (Empty Society Account)

```
SocietyEmptyWithdrawPercentage = 35
```

When your society account is empty, you can reduce players payouts. Example code above is a percentage, how much money players get from their chips-to-money transaction.

![](/files/Me6K52mEGwrCXl9WS7ei)

### Disabling Payouts (Empty Society Account)

```
SocietyEmptyWithdrawPercentage = 0
```

To halt all Casino payouts (Trade In Chips at the Cashier) when your society account is empty , use the example setting above.

![](/files/blhtzFTQHnPQIhL4cSoH)


# Lucky Wheel & Podium Vehicle

Lucky Wheel Info & Settings.

### Replacing The Podium Vehicle

Players that have a job casino, and grade 1 or higher, can deliver a vehicle to the Lucky Wheel podium. Drive into a marker in front of the casino garage to deliver/replace the podium vehicle.

![Casino Garage at the Diamond Casino (934.481, -1.952, 78.764)](/files/i0CbknrVvoHxerlehlPG)

<figure><img src="/files/ggC63bcVJOZFsbuCP2kz" alt=""><figcaption><p>Casino Grarge at Molo Casino (976.999146, 5.256740, 80.990143)</p></figcaption></figure>

After a player wins a podium vehicle, the vehicle is stored in his garage.

### Podium Vehicle Ownership Check

By default, casino workers have to own the vehicle which they want to deliver to the podium. You can disable this ownership check in config.lua. When disabled, any vehicle that they are sit in can be delivered.

```
JOB_PODIUMCAR_OWNERSHIP_CHECK = true
JOB_PODIUMCAR_OWNERSHIP_DELETE_ORIGINAL = true
```

### Lucky Wheel Winning Chance & Money / Chips

You can customize the winning chance of individual items in Lucky Wheel. By default, these are the default winning chances.

![Lucky Wheel](/files/IRSnQIeVgErqIXjIFXRi)

| Item    | Win Chance in % |
| ------- | --------------- |
| Chips1  | 8.4 %           |
| Chips2  | 7.56 %          |
| Chips3  | 6.72 %          |
| Chips4  | 5.88 %          |
| Drinks  | 8.4 %           |
| Money1  | 8.4 %           |
| Money2  | 7.56 %          |
| Money3  | 6.72 %          |
| Money4  | 5.88 %          |
| Money5  | 5.04 %          |
| Money6  | 4.2 %           |
| Money7  | 3.36 %          |
| Money8  | 2.52 %          |
| Money9  | 1.68 %          |
| Nothing | 8.4 %           |
| Random  | 8.4 %           |
| Vehicle | 0.84 %          |

You can find all the Lucky Wheel settings in **const.lua** (LuckyWheelItems)\
**Changing win chance**:\
use only numbers between 1 (Very Unlikely) to 100 (Default)\
**Changing value of money and chips items**:\
if it's too bad for your server economy to win such high prices, you can replace money and chips values with your own.\
Don't forget to edit the values on the Lucky Wheel texture as well.\
If you don't know how, please download this picture: [prop\_luckywheel\_decal\_dprop\_luckywheel\_decal\_a.zip](https://rco.re/docs/casino/prop_luckywheel_decal_dprop_luckywheel_decal_a.zip) and use Photoshop to edit the numbers. Don't reposition the pictures or the texts. Everything has to have the same position.\
After you're done, contact us on our support: <https://discord.gg/F28PfsY> and we will help you convert it back to the Lucky Wheel texture.


# Table Games

Setting up table games.

![Table Games](/files/fU8AonMvzejfIQnif1vA)

There are three types/colors of tables, for each table game.

* Green (normal bets)
* Purple (High Stake, VIP tables)
* Blue (Junior, low bets)

### Poker

To setup Poker tables, look for PokerTableDatas {} inside **const.lua**

```
Title = "Poker"
```

Name of the table.

```
PlaceBetsTime = 40
```

Duration in seconds. How much time players have for placing their bets.

```
MinBetValueAntePlay = 10
```

Minimum Ante bet. Minimum bet that is needed for playing the table.

```
MaxBetValueAntePlay = 5000
```

Maximum Ante bet.

```
MinBetValuePairPlus = 10
```

Minimum Pair Plus bet.

```
MaxBetValuePairPlus = 500
```

Maximum Pair Plus bet.

```
BadScoreBegins = -1 -- will be deleted in future..
```

When a player leaves the table with losings bigger than 1, the dealer cheers up the player.

```
GoodScoreBegins = 1
```

When a player leaves the table with winnings bigger than 1, the dealer congrats the player.

### Blackjack

To setup Poker tables, look for BlackjackTableDatas {} inside **const.lua**

```
Title = "Blackjack"
```

Name of the table.

```
PlaceBetsTime = 40
```

Duration in seconds. How much time players have for placing their bets.

```
MinimumBet = 10
```

Minimum bet. Minimum bet that is needed for playing the table.

```
MaximumBet = 5000
```

Maximum bet.

```
BadScoreBegins = -1 -- will be deleted in future..
```

When a player leaves the table with losings bigger than 1, the dealer cheers up the player.

```
GoodScoreBegins = 1
```

When a player leaves the table with winnings bigger than 1, the dealer congrats the player.

### Roulette

To setup Poker tables, look for RouletteTableDatas {} inside **const.lua**

```
Title = "Roulette"
```

Name of the table.

```
MaxBets = 10
```

Maximum number of used betting blocks on the table.

```
MinBetValue = 10
```

Minimum bet. Minimum bet that is needed for playing the table.

```
MaxBetValue = 500
```

Maximum amount of chips that can be placed by one click.

```
MaxBetValueOutside = 5000
```

Maximum amount of chips that can be placed on outside bets.

```
MaxBetValueInside = 500
```

Maximum amount of chips that can be placed on inside bets.

```
PlaceBetsTime = 40
```

Duration in seconds. How much time players have for placing their bets.

```
SpinDelayMin = 5
SpinDelayMax = 12
```

Duration in seconds. It takes randomly from 5 to 12 seconds for the ball to land.

```
BadScoreBegins = -1 -- will be deleted in future..
```

When a player leaves the table with losings bigger than 1, the dealer cheers up the player.

```
GoodScoreBegins = 1
```

When a player leaves the table with winnings bigger than 1, the dealer congrats the player.


# Slot Machines

Customizing slot machines.

### Winning Chance

All slot machines are set to be more unlucky, so it doesn't harm your server economy. You can change all the settings in **const.lua** (machineModels).

### Jackpot Limit / Reducers

```
jackpotLimiter = 100
```

Jackpots can be hit only once per 100 spins. You can change the value for each machine.

```
ShowUpReducer = 70
```

Show up recuder can be set on each item of each slot machine individually.\
Example: Setting ShowUpReducer to 70 for Sevens, in Miner, will do following:

![Slots Winning Chance](/files/eMngjhiO76Z7NLP1TQkU)

Seven will have 100% (same) chance to hit for first time, then (-70%), 30% chance to hit for second time, then (-70%), 9% chance to hit for third time.

### Unlucky Factor

```
unluckyFactor = 5
```

Each 5th spin will hit 0 chips no matter what, set unluckyFactor = 2 for each second spin, set to 1000 if you don't need it.

{% hint style="info" %}
Please don't change any other values unless you know what you're doing.
{% endhint %}

{% hint style="warning" %}
Max bet of each machine it set to fit the scores written on the machine models. Don't change it, unless you don't care about breaking the scoring :)
{% endhint %}

###


# Casino Bar

Customizing bar settings.

### Prices

All prices of the bar items, including snacks, are stored in **const.lua**, inside CasinoInventoryItems.

### Snacks

All bought snacks are stored in your inventory. To eat your snacks, sit down at the casino bar and press **E**. Then you can choose from your purchased snacks.

![Burger :D](/files/uaIIBL3Tnczt2NW746pM)

### Thirst & Hunger

Eating casino snacks at bar affects your thirst and hunger (esx\_status, consumables)


# Inside Track

All settings for Inside Track.

### Main Settings

All the settings are stored in **config.lua**.

```
IT_STARTING_SOON_TIME = 0
```

Duration in seconds. For how long to show a \*standby\* picture on the big screen. It's disabled by default, but you may find it useful :)

```
IT_MAIN_EVENT_ENABLED = true
```

Whether to enable the Main Event, when disabled, the big screen turns off.

```
IT_MAIN_EVENT_BETTING_TIME = 60 * 5
```

Duration in seconds. How much time players have to bet on the Main Event.

```
IT_MAIN_EVENT_RACE_DURATION = 33
```

Duration in seconds. How much does it take for the horses to finish the race in Main Event.

```
IT_MAIN_EVENT_MIN_PLAYERS = 1
```

Minimum amount of players that are needed in the room, for the Main Event to start.

```
IT_MAIN_EVENT_RACE_MAX_BET = 10000
```

Maximum bet for Main Event.

```
IT_MAIN_EVENT_RACE_MIN_BET = 10
```

Minimum bet for the Main Event.

```
IT_LOCAL_RACE_DURATION = 30
```

Duration in seconds. How much does it take for the horses to finish the race in the single player mode.

```
IT_LOCAL_RACE_MAX_BET = 10000
```

Maximum bet for the single player mode.

```
IT_LOCAL_RACE_MIN_BET = 10
```

Minimum bet for the single player mode.

### Changing Horse Odds

![](/files/MfBMNyJYVi5Uyj8qeqrL)

By default, horses are generated randomly for each race.\
Each race will consist of two Favorites (Evens - 5 to 1), two Middle-of-the-Pack (6 to 1 - 15 to 1), and two Outliers (16 to 1 - 30 to 1).

The configs are made separately for MAin Event and single player mode.

```
IT_MAIN_EVENT_HORSE_ODDS = {1, 5, 6, 15, 16, 30}
IT_LOCAL_RACE_HORSE_ODDS = {1, 5, 6, 15, 16, 30}
```

If it's too bad for your server economy to win big (high odds, such as 30:1..) you can set the odds differently.\
This exampe picks two Favorites (Evens - 4 to 1), two Middle-of-the-Pack (5 to 1 - 8to 1), and two Outliers (9to 1 - 12to 1):

```
IT_MAIN_EVENT_HORSE_ODDS = {1, 4, 5, 8, 9, 12}
IT_LOCAL_RACE_HORSE_ODDS = {1, 4, 5, 8, 9, 12}
```

{% hint style="warning" %}
The numbers have to be in range 1-30, in order, and can't be used more than once.
{% endhint %}

### Big Screen Not Turning On

If your Inside Track big screen doesn't turn on, some of your other resources block it. Double-check if you're not using multiple IPLs, MLOs for casino.


# Translations

You can translate the whole resource to your language. Here's how.

### Main Translation

The main translation (all texts of the UI) is stored in **config.lua**, inside Translation {}.

### Bar Drinks

Names of all bar drinks (Vodka, Whiskey, Champagne...) are stored in **const.lua**, inside CasinoInventoryItems {}.

### Table Games

Names of all table games (Poker, Roulette High Stakes...) are stored in **const.lua**, inside PokerTableDatas {}, RouletteTableDatas {}, and BlackjackTableDatas {}.

### Slot Machines

Names of slot machines, and items of each slot machine, are stored in **const.lua**, inside machineModels {}, the *name* properties.


# Discord Hook

Setting up Discord logging.

![Discord](/files/4V8h40fS3HRy5xId3loO)

To enable Discord Hook, look into file **config\_server.lua** inside ServerConfig {}

```
Discord = true
```

Whether to enable Discord Hook.

```
DiscordInterval = 60000 * 30
```

Send interval in miliseconds. The default interval is 30 minutes (60000 \* 30).

```
HookUrl = "https://discord.com/api/webhooks/???"
```

Your Discord Hook url.


# MYSQL Info

Info about used mysql tables.

All MYSQL tables are installed automatically. This is what is being used.

| MYSQL Table       | Info                                                            |
| ----------------- | --------------------------------------------------------------- |
| casino\_players   | casino players (VIP membership, Lucky Wheel cooldowns, etc.)    |
| casino\_settings  | casino settings (podium vehicle)                                |
| jobs (ESX)        | casino job "casino"                                             |
| job\_grades (ESX) | job grades for "casino" job                                     |
| items (ESX)       | casino inventory items (all rows starting with name "casino\_") |


# CasinoControl (Exports)

Controlling casino from an another resource.

### Getting The CasinoControl Object

```lua
local Casino = exports["rcore_casino"]:GetCasinoControl()
```

### Functions

```lua
Casino.GetCasinoPlayer(playerId)
```

Returns PlayerData of player. Returns nil if player isn't inside the casino.

```lua
Casino.GetCasinoPlayers()
```

Returns PlayerData array of all players inside casino.

```lua
Casino.IsPlayerInCasino(playerId)
```

Checks if player is currently inside the casino.

```lua
Casino.IsPlayerBusy(playerId)
```

Check if player is busy. Returns true when playing a game, interacting with a bartender, or sitting somewhere. Don't move/teleport/interact with the player if they're busy.

```lua
Casino.StopPlaying(playerId)
```

Force player to finish playing and leave their chair, if busy.

```lua
Casino.BlockPlaying(playerId)
```

Block player from entering games, interacting with bartenders, sitting on chairs. Also forcing them to finish playing if busy. Rejoining the server resets it.

```lua
Casino.AllowPlaying(playerId)
```

Allow player to enter games and interact again.

```lua
Casino.KickPlayer(playerId)
```

Warn player to behave, by kicking them out of the building.

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

```lua
Casino.ToggleVIP(playerId, vip)
```

Enables or disables VIP Casino Membership of player.

```lua
Casino.SetLuckySpinCooldown(playerId, durationseconds)
```

Set/Reset Lucky Wheel cooldown for player.

```lua
Casino.SetFreeDrinksFor(playerId, durationseconds)
```

Gives player free drinks for duration (Lucky Wheel free drinks price)

```lua
Casino.ResendPlayerCasinoProgress(playerId)
```

Sends player their new progress (VIP state, cooldowns...)

```lua
Casino.ToggleCasinoActivity(activity, enabled)
```

Toggles the casino feature on/off. List of activity names:

| activity          |
| ----------------- |
| slots             |
| luckywheel        |
| insidetrack       |
| drinkingbar       |
| roulette          |
| poker             |
| blackjack         |
| cashier           |
| seating           |
| cameras           |
| officeelevator    |
| officeelevatorout |
| casinoteleporter  |

```lua
Casino.ToggleCasino(enabled)
```

Enables/Disables the casino and locks/unlocks the entrance.

```lua
Casino.UpdateSetting(setting, settingContent)
```

Updates the casino setting.

```lua
Casino.GetSetting(setting)
```

Gets the casino setting. List of setting names:

| setting          | description                                |
| ---------------- | ------------------------------------------ |
| PodiumPriceProps | vehicle props of the actual podium vehicle |

### PlayerData

```lua
local Player = Casino.GetCasinoPlayer(playerId)
```

| Property            | Description                                             |
| ------------------- | ------------------------------------------------------- |
| Player.playerId     | Player ID                                               |
| Player.playerName   | Player name                                             |
| Player.playerChips  | Player chips                                            |
| Player.enterTime    | Casino enter time (server game timer)                   |
| Player.sessionScore | How much player earned/lost since he entered the casino |
| Player.currentGame  | Player GameData, returns nil when idle                  |

### GameData

```
local GameData = Player.currentGame
```

| Property             | Description                                                |
| -------------------- | ---------------------------------------------------------- |
| GameData.type        | GameType of current game                                   |
| GameData.coords      | Position of the game, if avaiable                          |
| GameData.hash        | Model of the playing slot machine, if playing Slots        |
| GameData.bartenderId | Index of the bartender, if using one                       |
| GameData.chair       | Index of the chair, if playing table games or Inside Track |

### GameTypes

|              |
| ------------ |
| Blackjack    |
| Inside Track |
| Lucky Wheel  |
| Roulette     |
| Slots        |
| Bartender    |
| Bar          |
| Sitting      |

### Server Events

```lua
AddEventHandler("PlayerJoinedCasino", function(playerId)
    ...
end)
```

```lua
AddEventHandler("PlayerLeftCasino", function(playerId)
   ... 
end)
```

### Client Events

```lua
-- Gets local player state
TriggerEvent("Casino:GetPlayerState", function(o)
        if not o then
            return print("I'm not inside the Casino.")
        end
        print("My Balance: " .. o.chips)
        print("Am I Boss: " .. tostring(o.is_boss))
        print("Am I VIP:" .. tostring(o.is_vip))

        print("My Casino Items:")

        for k, v in pairs(o.items) do
            print(k .. " = " .. o.items[k])
        end

        print("Money: " .. o.money)
    end)
```


# Casino Job & Office

Info about the casino job & the office

![Casino Office](/files/Nz29dqSTQ2rXi03n5L9x)

### Office features

* Using the computer (accessing casino cameras)
* Elevators
* Ability to sit down anywhere
* Accesing Boss Menu
* *More features will be added in the future updates*

### Job Features

| Job Grade       | Features                                                                                                                                    |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| 0 / novice      | • accessing restricted areas                                                                                                                |
| 1 / experienced | <p>• accessing restricted areas<br>• replacing the podium vehicle</p>                                                                       |
| 2 / boss        | <p>• accessing restricted areas<br>• replacing the podium vehicle<br>• accessing office computer<br>• accessing boss menu inside office</p> |

*More features will be added in the future updates.*

### Location

![Location](/files/guEg0TCYDfkabXFETmBQ)

The office doors are located next to the "High Limit" table games.


# Changing Odds

Changing win chance for the casino games.

There are a few options that let you change the winning odds for the table games. These options can be found in **const.lua**

### Blackjack (BlackjackTableData in const.lua)

```
DealerBlackjackPossibility = 25
```

This value represents the percentage chance that the dealer will get a blackjack (Ace + 10-value card) at the start of each round. By default, this is set to **25%**. Increasing this number makes blackjack more frequent for the dealer, making the game harder for players.

```
Dealer21Possibility = 25
```

This value determines the dealer’s chance of reaching a total of **21** through multiple draws in a round. Set at **25%** by default, increasing this value makes the dealer more likely to reach a perfect score.

### Poker (PokerTableData in const.lua)

```
UnluckyRound = 3 
```

By default, **every 3rd round** is designated as an "unlucky round" for the player, meaning there is a higher chance of receiving weak or unplayable cards. Increasing this number makes unlucky rounds less frequent, while lowering it makes the game more difficult.

### Roulette (RouletteTableData in const.lua)

```
UnluckyRound = 4
```

On **every 4th spin**, the wheel is more likely to land on a number that **players have not bet on** or on a number that minimizes the casino’s losses. Lowering this number increases the frequency of these unlucky rounds.

```
TriggerUnluckyRoundFrom = 10000
```

If the potential payout for a spin would cost the casino **more than 10,000 chips**, the game will automatically choose an unlucky number instead. Adjust this value to change when the casino begins rigging spins to minimize losses.

### Lucky Wheel (LuckyWheelItems in const.lua)

```
possibility = 100
```

Each item on the Lucky Wheel has a **possibility** value, which works like a weighted lottery. The higher the number, the greater the chance that item will be selected. These values are not percentage-based but instead represent **relative weight**—if an item has `200` and another has `100`, the first item is **twice as likely** to be chosen. Adjust these values to control the rarity of different prizes.


# Christmas Decorations

How to add christmas decorations

### Adding a Christmas Tree

To add a christmas tree in casino, open file **/rcore\_casino/xmas/xmas\_sv.lua**, and add this piece of code for spawning a christmas tree:

```lua
table.insert(XMAS_TREES, {
    map = 1, -- the map it should be for
    position = vector3(944.8862, 48.21997, 79.9), -- position of the tree
    heading = 40.0, -- heading of the tree
    rewardMin = 100, -- min. amount
    rewardMax = 1000, -- max amount
    rewardChooseFrom = {"casino_chips", "casino_beer"}, -- choose reward randomly from these inventory items
    cooldown = (60 * 60 * 24) -- 24 hours cooldown
})
```

{% hint style="info" %}
Remember to set option **Xmas = true** in config.lua in order to see christmas trees
{% endhint %}


# v2


# Casino Editor

The **Casino Editor** is an in-game admin tool for creating, placing, and maintaining casino elements without manually editing configuration files.

It opens through the `casinoeditor` command (server-permitted), then starts a free-camera editing mode with an interactive menu system.

## What the Casino Editor is

The editor is a live world-builder for the casino resource. It lets you:

* browse editable entities by category,
* create new entities,
* move/update existing entities,
* register discovered map props as saved entities,
* and delete entities.

Changes are sent to the server and get synced with all players.

## How to open the Casino Editor

* Casino editor can be opened with a command `/casinoeditor`.
* Players need to be whitelisted for "Editor" permission in configs/casino.lua

> You cannot open the editor while currently playing a casino game.

## Editor Categories

The **Editor main page** is split into grouped sections and opens dedicated menus for each module.

### Core / Staff

<table data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-cover data-type="image">Cover image</th></tr></thead><tbody><tr><td align="center"><a href="/pages/culCweE9hFyFoQAnmGnr">Bartender</a></td><td><a href="/files/vpH2mIKMa60yc4DlPnVW">/files/vpH2mIKMa60yc4DlPnVW</a></td></tr><tr><td align="center"><a href="/pages/ygUdod9yyBKXVTtsabh8">Cashiers</a></td><td><a href="/files/kB04nJCXhyDGvCCPHJz5">/files/kB04nJCXhyDGvCCPHJz5</a></td></tr><tr><td align="center"><a href="/pages/wxoKcWtjeI7cjt7C6IA2">Ambient Peds</a></td><td><a href="/files/v7YDwggcSyMduZ00LAgG">/files/v7YDwggcSyMduZ00LAgG</a></td></tr></tbody></table>

### Games

<table data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-cover data-type="image">Cover image</th></tr></thead><tbody><tr><td align="center"><a href="/pages/rOOnAivqiEpWuvRQd7qF">Inside Track</a></td><td><a href="/files/04mdIrXDIX10SwShOCAG">/files/04mdIrXDIX10SwShOCAG</a></td></tr><tr><td align="center"><a href="/pages/hzvwXxRNPEIlywZywspK">Lucky Wheel</a></td><td><a href="/files/dX9MUukGZUPFngqdOwNz">/files/dX9MUukGZUPFngqdOwNz</a></td></tr><tr><td align="center"><a href="/pages/SjO37BCBYjbijS6mgMst">Roulette</a> / <a href="/pages/jW4j77dwwGm6bnrV48RY">Blackjack</a> / <a href="/pages/wkyXyEygqg0IPHKlaJpr">Poker</a></td><td><a href="/files/GR0Q3l75OLnAqZBdeHrD">/files/GR0Q3l75OLnAqZBdeHrD</a></td></tr><tr><td align="center"><a href="/pages/Zy3D2rYaeRsIvm70GBVF">Slots</a></td><td><a href="/files/ffOklcuugPb5vI1PAH97">/files/ffOklcuugPb5vI1PAH97</a></td></tr></tbody></table>

### Interior

<table data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-cover data-type="image">Cover image</th></tr></thead><tbody><tr><td align="center"><a href="/pages/Ns1yOUongaX7W0HdKVrB">Seats</a></td><td><a href="/files/dTSCRXmeN3QQkRmdMqGl">/files/dTSCRXmeN3QQkRmdMqGl</a></td></tr><tr><td align="center"><a href="/pages/zTV5FdJNljBzdns0zKoM">Podium Spinners</a></td><td><a href="/files/YDBpd9lboO6h0slzqd0f">/files/YDBpd9lboO6h0slzqd0f</a></td></tr><tr><td align="center"><a href="/pages/cXxWJYJ6qtUCWlOJ8IWl">Digital Walls</a></td><td><a href="/files/tDMxVIO3CBS3uAfktg1f">/files/tDMxVIO3CBS3uAfktg1f</a></td></tr><tr><td align="center"><a href="/pages/G0NUmpKgD6pOQX727m4V">Restricted Areas</a></td><td><a href="/files/mtJgO9egMfCrvjJqCbVR">/files/mtJgO9egMfCrvjJqCbVR</a></td></tr><tr><td align="center"><a href="/pages/OKID4xrOpSGZnStJIJ2Q">Elevators</a></td><td><a href="/files/67pSxJrD8I2BIjB7o0m9">/files/67pSxJrD8I2BIjB7o0m9</a></td></tr><tr><td align="center"><a href="/pages/wyECOXFeV4buBbHmMeUI">Office Computers</a></td><td><a href="/files/D6aoWMiNIEbJkKKJdJjD">/files/D6aoWMiNIEbJkKKJdJjD</a></td></tr><tr><td align="center"><a href="/pages/9XWjVmZbzMa9XN6xF6YB">Walking Peds</a></td><td data-object-fit="cover"><a href="/files/zJksTt1KUNMJNUju7BGf">/files/zJksTt1KUNMJNUju7BGf</a></td></tr></tbody></table>

### Others

<table data-view="cards"><thead><tr><th align="center"></th><th data-hidden data-card-cover data-type="image">Cover image</th></tr></thead><tbody><tr><td align="center"><a href="/pages/ZqPjIj0uJvdhgZTiCIQq">Blip Icons</a></td><td><a href="/files/6800u5yDa8X7gUJ1Wx5d">/files/6800u5yDa8X7gUJ1Wx5d</a></td></tr><tr><td align="center"><a href="/pages/2PSZQcGOotbj9dwGAHbn">Casino Settings</a></td><td><a href="/files/zFG9p6xeCFDqIkrUlfXa">/files/zFG9p6xeCFDqIkrUlfXa</a></td></tr><tr><td align="center">Ambient Sounds</td><td><a href="/files/kq5aVWC6urD1liSiUvIa">/files/kq5aVWC6urD1liSiUvIa</a></td></tr><tr><td align="center"><a href="/pages/U61yH7ymRwGWFbVqB0Bf">Checkpoints</a></td><td><a href="/files/JI0SyoUWBf1NgSBiDa17">/files/JI0SyoUWBf1NgSBiDa17</a></td></tr><tr><td align="center"><a href="/pages/9zLOOugVm24msQjZy4hR">Bouncers</a></td><td><a href="/files/JSAqM6j4GCkRVqdI4pt7">/files/JSAqM6j4GCkRVqdI4pt7</a></td></tr></tbody></table>

## Core editor workflow

1. Open the main menu and pick a category.
2. Create a new item or select an existing one.
3. Edit properties (name, coords, heading/rotation, colors, toggles, restrictions, etc.).
4. Save/update (server event is fired and object gets synced for all players.
5. Return to main menu and continue with other categories.


# Editor Gizmo

How to use gizmo mode and editor selection

This guide explains how selection + gizmo mode works in the Casino Editor.

<div data-full-width="false"><figure><img src="/files/jg1ta4TMhPyeE5VnIg7d" alt=""><figcaption></figcaption></figure></div>

## Selection flow (click behavior)

1. **First click on an object** → selects it and opens that object's editor menu.
2. **Second click on the same object** (while its menu is already open) → enables **gizmo mode**.
3. In gizmo mode, you can move/rotate the selected object directly with the mouse.
4. Press **ESC** or **Right Mouse Button** to finish gizmo mode and return to editor freecam.

***

## Gizmo controls

<table data-full-width="false"><thead><tr><th>Control</th><th>Mode / Action</th><th>What it does</th></tr></thead><tbody><tr><td><code>T</code></td><td>Translate mode</td><td>Switches gizmo to movement mode (change object coordinates / position).</td></tr><tr><td><code>R</code></td><td>Rotate mode</td><td>Switches gizmo to rotation mode (change object rotation / heading).</td></tr><tr><td><code>ESC</code></td><td>Exit gizmo</td><td>Stops gizmo control and returns to normal editor freecam.</td></tr><tr><td><code>Right Mouse Button</code></td><td>Exit gizmo</td><td>Stops gizmo control and returns to normal editor freecam.</td></tr></tbody></table>

***

## Previews

### Moving objects with gizmo

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFicarM3Z9iXA9Tfz78vZ%2Fuploads%2FWiZrwfwyP5IruZt5iPNP%2Fgizmo_move.mp4?alt=media&token=dae3c0df-010c-4840-bc03-21cb037f5cc3>" %}

### Rotating objects with gizmo

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFicarM3Z9iXA9Tfz78vZ%2Fuploads%2FCeWHirpF8Q4CPjbQTRaU%2Fgizmo_rot.mp4?alt=media&token=f31c978e-ee36-49f9-ba35-b09816d0e9bd>" %}


# Cashiers

Managing cashiers in the Casino Editor

The **Cashiers** editor page manages cashier NPCs used by the casino system.

<div data-full-width="false"><figure><img src="/files/GaNI18AyvVKGbpWBYSoF" alt=""><figcaption></figcaption></figure></div>

### Editor Settings

<table data-full-width="false"><thead><tr><th>Setting</th><th>Type</th><th>Info</th></tr></thead><tbody><tr><td>Name</td><td>Text</td><td>Choose a display name for the cashier</td></tr><tr><td>Cashier config</td><td>Select/List</td><td>Choose which cashier preset is used</td></tr><tr><td>Ped model</td><td>Select/List</td><td>Choose which NPC model the cashier uses</td></tr><tr><td>Job based</td><td>Toggle</td><td>Mark this cashier position job-based (rcore_casino_jobs)</td></tr><tr><td>Society enabled</td><td>Toggle</td><td>Enable society/account integration for this cashier</td></tr><tr><td>Society name</td><td>Text/List</td><td>Set the society/account name used when society is enabled</td></tr><tr><td>Proximity</td><td>Number</td><td>Set proximity distance in meters</td></tr><tr><td>Load only interiors</td><td>Toggle</td><td>Load this cashier only while players are in interiors</td></tr></tbody></table>

## CashierConfigs

Cashier presets are defined in `rcore_casino/configs/cashier.lua` inside the `CashierConfigs` table. The editor "Cashier config" setting selects one of these config IDs.

<table data-full-width="false"><thead><tr><th>Config option</th><th>Type</th><th>Info</th></tr></thead><tbody><tr><td>id</td><td>Text</td><td>Unique config ID used by cashiers (example: <code>default</code>)</td></tr><tr><td>color</td><td>Color (RGB)</td><td>Menu theme color for this cashier config</td></tr><tr><td>pedSkinId</td><td>Number</td><td>Internal ped skin variant/index for the cashier UI/profile</td></tr><tr><td>caption</td><td>Text</td><td>Cashier menu caption/title text</td></tr><tr><td>acquireChipsEnabled</td><td>Toggle</td><td>Allow players to buy/acquire chips</td></tr><tr><td>tradeInChipsEnabled</td><td>Toggle</td><td>Allow players to trade chips back into money</td></tr><tr><td>dailyBonus</td><td>Number</td><td>Daily bonus chips amount</td></tr><tr><td>dailyBonusSaveData</td><td>Text</td><td>Save key used for daily bonus cooldown/limits</td></tr><tr><td>tradeInDailyLimit</td><td>Number</td><td>Maximum chips tradable per day</td></tr><tr><td>tradeInDailyLimitSaveData</td><td>Text</td><td>Save key used for trade-in daily limit tracking</td></tr><tr><td>exchangeRate</td><td>Number</td><td>Money per chip conversion rate</td></tr><tr><td>showPlayerBalance</td><td>Toggle</td><td>Show player balance in cashier menu</td></tr><tr><td>showSocietyBalance</td><td>Toggle</td><td>Show society balance in cashier menu</td></tr><tr><td>showBonusChipsBalance</td><td>Toggle</td><td>Show bonus chips balance in cashier menu</td></tr><tr><td>onOpen</td><td>Function</td><td>Callback executed when cashier menu opens</td></tr><tr><td>onClose</td><td>Function</td><td>Callback executed when cashier menu closes</td></tr><tr><td>items</td><td>List</td><td>Custom purchasable entries (name, price, description, icon, confirmation, onPurchase, separators)</td></tr></tbody></table>

## Cashier Skins

Cashier ped models are defined in `rcore_casino/configs/cashier.lua` in the `CashierSkins` list.

```lua
CashierSkins = {"s_f_y_casino_01", "u_f_m_casinocash_01", "ADD_YOUR_PED_MODEL_HERE"}
```

In order to choose models in the editor, you have to add them in this list. Find more ped models at fivem docs: <https://docs.fivem.net/docs/game-references/ped-models/>


# Ambient Peds

Managing ambient peds in the Casino Editor

The **Ambient Peds** editor page manages ambient pedestrian groups used to populate the casino.

<div data-full-width="false"><figure><img src="/files/UGkMEyqQDDqE8qDkZm8c" alt=""><figcaption></figcaption></figure></div>

### Editor Settings

<table data-full-width="false"><thead><tr><th>Setting</th><th>Type</th><th>Info</th></tr></thead><tbody><tr><td>Name</td><td>Text</td><td>Choose a display name for the ambient ped group</td></tr><tr><td>Ped count</td><td>Number</td><td>Set how many ambient peds are in the group (up to 5)</td></tr><tr><td>Radius</td><td>Number</td><td>Set the spawn/distribution radius for the group</td></tr><tr><td>Heading</td><td>Number</td><td>Set the group heading direction</td></tr><tr><td>Ped 1-5 model</td><td>Select/List</td><td>Choose the NPC model for each ped slot</td></tr><tr><td>Ped 1-5 scenario</td><td>Select/List</td><td>Choose the scenario/animation behavior for each ped slot</td></tr><tr><td>Proximity</td><td>Number</td><td>Set proximity distance in meters</td></tr><tr><td>Load only interiors</td><td>Toggle</td><td>Load this ped group only while players are in interiors</td></tr></tbody></table>

## AmbientPedModels

Ambient ped models available in editor are defined in `rcore_casino/configs/ambientpeds.lua` in the `AmbientPedModels` list.

Only models from this list can be selected in the ambient ped editor for ped slots.

```lua
AmbientPedModels = {"a_f_m_bevhills_01", "a_f_m_bevhills_02", "a_f_m_ktown_01", "ADD_YOUR_PED_HERE"}
```

## AmbientScenarios

Ambient scenarios available in editor are defined in `rcore_casino/configs/ambientpeds.lua` in the `AmbientScenarios` list.

These are used by the editor's scenario selectors for each ped slot.

```lua
AmbientScenarios = {"PROP_HUMAN_SEAT_BENCH_DRINK_BEER", "PROP_HUMAN_SEAT_CHAIR_UPRIGHT", "PROP_HUMAN_SEAT_CHAIR_FOOD", "ADD_YOUR_SCENARIO_HERE"}
```

## AmbientAnimations

Ambient animation definitions are in `rcore_casino/configs/ambientpeds.lua` in the `AmbientAnimations` table.

Each animation entry defines animation dictionary + animation name

```lua
AmbientAnimations = {{
    name = "base",
    dict = "amb@world_human_cheering@female_c"
}, {
    name = "base",
    dict = "anim@amb@office@boardroom@boss@female@"
}, {
    name = "simple_inspect_v1_idartistfemale",
    dict = "anim@amb@business@cfid@cfid_desk_docs@"
}, {
    name = "ADD_YOUR_ANIM_NAME_HERE",
    dict = "ADD_YOUR_ANIM_DICT_HERE"
}}

```




---

[Next Page](/llms-full.txt/1)

