# Knowledge Base

The official Critical Scripts knowledge base.

Here you will find guides, installation instructions and useful information about our resources.


# FiveM Hall

In this category you can find useful information about the FiveM Hall resource.


# Installation Instructions

Learn how to install the resource.

{% stepper %}
{% step %}

### Download the resource

Download `cs-hall` from your keymaster and place it in your `resources` folder.
{% endstep %}

{% step %}

### [Install `cs-stream`](#user-content-fn-1)[^1]

Download `cs-stream` from: <https://github.com/criticalscripts-shop/cs-stream>

Place it in your `resources` folder and add the following to your server configuration file:

{% code title="server.cfg" %}

```txt
ensure cs-stream
```

{% endcode %}

{% hint style="warning" %}
If you choose not to use it you will have to change the default configuration as the default spotlight object is an addon and the default screen for some locations is from **The Cayo Perico Heist** DLC which your server may not be on.
{% endhint %}
{% endstep %}

{% step %}

### Ensure the resource

Add the following to your server configuration file:

{% code title="server.cfg" %}

```txt
ensure cs-hall
```

{% endcode %}
{% endstep %}

{% step %}

### Setup Ace permission

Add this to your server configuration so Ace admins can access the `/hall` command:

{% code title="server.cfg" %}

```txt
add_ace group.admin cs-hall.control allow
```

{% endcode %}

{% hint style="info" %}
This check can be changed by modifying **`cs-hall/lntegration/server.lua`**.
{% endhint %}

Alternatively, read more about permissions [here](/paid-resources/fivem-hall/permissions).
{% endstep %}

{% step %}

### Configure locations

Open `config.lua` inside `cs-hall` and enable the entries for the locations you want the hall to be available.&#x20;

{% hint style="info" %}
You can find more locations in our [`extra-hac` GitHub](https://github.com/criticalscripts-shop/extra-hac/tree/main/cs-hall/entries) and in our [Discord](https://criticalscripts.shop/discord) community.
{% endhint %}
{% endstep %}

{% step %}

### Start the resource

Run the following commands on the server console:

{% code title="FiveM Server Console" %}

```txt
refresh
ensure cs-hall
```

{% endcode %}
{% endstep %}
{% endstepper %}

[^1]: This step is optional but recommended.


# Permissions

Learn how to update the permissions of the resource.

The UI is accessed via the `/hall` command while inside an enabled hall location for players with Ace permission `cs-hall.control`. This check and how the UI is accessed can be changed by modifying `cs-hall/integration/client.lua` and `cs-hall/integration/server.lua` files. There is also an identifier-based check in parallel to Ace permission which can also be edited in `cs-hall/integration/server.lua` file to add any player identifiers you want.

**You may also find some ready-to-use framework-related integrations in our** [`extra-hac` GitHub](https://github.com/criticalscripts-shop/extra-hac/tree/main/cs-hall/integration)**.**


# Important Information

Learn important information about the resource.

* The resource is optimized with range synchronization and assets are loaded only when the player is around an active location.
* Very low-spec computers may experience a more downgraded experience.
* If you want to ensure the resource, you are advised to stop the playback in all active locations first to avoid crashes.
* The default configuration requires the `cs-stream` resource which can be [downloaded here](https://github.com/criticalscripts-shop/cs-stream), started before `cs-hall` resource.
* In the most default configured entries, adjusting the content time for buffering and syncing is turned off as it is not mandatory for a great experience. This feature is complicated and may not always work as intended, therefore it is advised to enable it only in time-critical content (e.g., a cinema).
* Some triangle / black textures may appear in monitors when there are a lot of players around, that seems to be a game texture bug.
* Minor crackling may be audible on certain songs when the camera is moved due to limitations imposed upon spatial audio.
* If content fails to load or play for any reason for the player who is controlling the UI, it will stop for everyone. If content fails to load or play for any reason for a player who is only viewing / listening, it may attempt to reload for them.
* The resource is using FiveM's KV storage to store settings and queue for all locations, if you are using a shared multi-server setup this may cause an issue and you may want to set `sv_kvsName` console variable to something unique for your server.
* There are checks in place in an attempt to verify that the transmitted data (titles, thumbnail URL, icon, etc.) are legitimate and are coming from within the resource itself; however since the client sends it, they cannot be fully trusted.


# Expansions

Learn how to add and use expansions.

`cs-hall` does **NOT** support any streaming services by default, out-of-the-box you can only queue URLs with embeddable video elements (e.g. self-hosted). In addition to that you may use controllers' expansions to expand on the supported media sources at your own risk and discretion, you can find more in our [extra-hac GitHub](https://github.com/criticalscripts-shop/extra-hac/tree/main/cs-hall/controllers) and in our [Discord](https://criticalscripts.shop/discord) community.&#x20;

To install an expansion controller, follow these steps:

{% stepper %}
{% step %}

### Copy all the contents of the controller

Copy all the contents of the controller you wish to install, not the file itself, but its contents.
{% endstep %}

{% step %}

### Open expansions file

Navigate to `cs-hall/client/dui/javascript/controllers/` and open the `expansions.js` file.
{% endstep %}

{% step %}

### Paste the contents of the controller

Paste the contents of the controller in your `expansions.js` file and save it.
{% endstep %}

{% step %}

### Restart the resource

Type `ensure cs-hall` in your server's console.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Please be mindful of the content you stream since your players also stream it through their clients.&#x20;
{% endhint %}


# FiveM VES

In this category you can find useful information about the FiveM VES resource.


# Installation Instructions

Learn how to install the resource.

{% stepper %}
{% step %}

### Download the resource

Download `cs-ves` from your keymaster and place it in your `resources` folder.
{% endstep %}

{% step %}

### Ensure the resource

Add the following to your server configuration:

{% code title="server.cfg" %}

```
ensure cs-ves
```

{% endcode %}
{% endstep %}

{% step %}

### Setup Ace permission

Add this to your server configuration so Ace admins can access the `/ves` command:

{% code title="server.cfg" %}

```txt
add_ace group.admin cs-ves.control allow
```

{% endcode %}

{% hint style="info" %}
This check can be changed by modifying **`cs-hall/lntegration/server.lua`**.
{% endhint %}

Alternatively, read more about permissions [here](/paid-resources/fivem-ves/permissions).
{% endstep %}

{% step %}

### Configure vehicles

Open `config.lua` inside `cs-ves` and enable the entries for the vehicle models you want the VES to be available.&#x20;

{% hint style="info" %}
You can find more vehicle models in our [`extra-hac` GitHub](https://github.com/criticalscripts-shop/extra-hac/tree/main/cs-ves/entries) and in our [Discord](https://criticalscripts.shop/discord) community.
{% endhint %}
{% endstep %}

{% step %}

### Start the resource

Run the following commands on the server console:

{% code title="FiveM Server Console" %}

```
refresh
ensure cs-ves
```

{% endcode %}
{% endstep %}
{% endstepper %}


# Permissions

Learn how to update the permissions of the resource.

The UI is accessed via the `/ves` command while inside an enabled hall location for players with Ace permission `cs-ves.control`. This check and how the UI is accessed can be changed by modifying `cs-ves/integration/client.lua` and `cs-ves/integration/server.lua` files. There is also an identifier-based check in parallel to Ace permission which can also be edited in `cs-ves/integration/server.lua` file to add any player identifiers you want.

**You may also find some ready-to-use framework-related integrations in our** [`extra-hac` GitHub](https://github.com/criticalscripts-shop/extra-hac/tree/main/cs-ves/integration)**.**


# Important Information

Learn important information about the resource.

* The resource is optimized with range synchronization and assets are loaded only when the player is around an active vehicle.
* Very low-spec computers may experience a more downgraded experience.
* If you want to ensure the resource, you are advised to stop the playback in all active vehicles first to avoid crashes.
* Colliding replacers will prioritize the ones that are closer to the player and may also replace objects nearby if they happen to have the same texture, this is not something that can be changed and you can avoid it by not having the same vehicles in the same area and use vehicle-specific texture replacements instead of generic objects.
* The resource works by using a vehicle's plate as an identifier. When two or more vehicles have the same plates, only one of them will work. This is true even for vehicles that are on different buckets.
* In the default configured entries, adjusting the content time for buffering and syncing is turned off as it is not mandatory for a great experience. This feature is complicated and may not always work as intended, therefore it is advised to enable it only in time-critical content.
* Some triangle / black textures may appear in monitors when there are a lot of players around, that seems to be a game texture bug.
* Minor crackling may be audible on certain songs when the camera is moved due to limitations imposed upon spatial audio.
* If content fails to load or play for any reason for the player who is controlling the UI, it will stop for everyone. If content fails to load or play for any reason for a player who is only viewing / listening, it may attempt to reload for them.
* There are checks in place in an attempt to verify that the transmitted data (titles, thumbnail URL, icon, etc.) are legitimate and are coming from the within resource itself, however since the client sends it, they cannot be fully trusted.


# Expansions

Learn how to add and use expansions.

`cs-ves` does **NOT** support any streaming services by default, out-of-the-box you can only queue URLs with embeddable video elements (e.g. self-hosted). In addition to that you may use controllers' expansions to expand on the supported media sources at your own risk and discretion, you can find more in our [extra-hac GitHub](https://github.com/criticalscripts-shop/extra-hac/tree/main/cs-ves/controllers) and in our [Discord](https://criticalscripts.shop/discord) community.&#x20;

To install an expansion controller, follow these steps:

{% stepper %}
{% step %}

### Copy all the contents of the controller

Copy all the contents of the controller you wish to install, not the file itself, but its contents.
{% endstep %}

{% step %}

### Open expansions file

Navigate to `cs-ves/client/dui/javascript/controllers/` and open the `expansions.js` file.
{% endstep %}

{% step %}

### Paste the contents of the controller

Paste the contents of the controller in your `expansions.js` file and save it.
{% endstep %}

{% step %}

### Restart the resource

Type `ensure cs-ves` in your server's console.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
Please be mindful of the content you stream since your players also stream it through their clients.&#x20;
{% endhint %}


# FiveM Video Call

In this category you can find useful information about the FiveM Video Call resource.


# Installation Instructions

Learn how to install the resource.

{% stepper %}
{% step %}

### Download the resource

* Make sure you have [yarn](https://github.com/citizenfx/cfx-server-data/tree/master/resources/%5Bsystem%5D/%5Bbuilders%5D/yarn) in your `resources` folder.
* Download `cs-video-call` and place it in your `resources` folder.
  {% endstep %}

{% step %}

### Ensure the resource

Add `ensure cs-video-call` to your server's configuration file before ensuring your phone.
{% endstep %}

{% step %}

### Hook your phone's resource

Edit your phone's `fxmanifest.lua` file and add the following at the end of of the file:

{% code title="fxmanifest.lua" %}

```
client_script '@cs-video-call/client/hooks/core.lua'
server_script '@cs-video-call/server/hooks/core.lua'
```

{% endcode %}
{% endstep %}

{% step %}

### Hook your phone's NUI

Edit your phone's NUI file (usually `index.html`) and add the following right before the `</body>` tag:

<pre><code><strong>&#x3C;script type="text/javascript" src="nui://cs-video-call/client/hooks/core.js">&#x3C;/script>
</strong></code></pre>

{% endstep %}

{% step %}

### Configure

Check the `config.lua` file inside `cs-video-call` for further configuration. Read through all options and their comments and adjust them to your setup and preferences.
{% endstep %}

{% step %}

### Setup your server's firewall

Open the required port (by default `34540`; incoming / inbound) in your firewall, on `UDP` protocol.

{% hint style="info" %}
If you are having issues getting a port open, you can use an [External Proxy Server](/paid-resources/fivem-video-call/external-proxy-server).
{% endhint %}
{% endstep %}

{% step %}

### Start the resource

Run the following commands on the server console:

{% code title="FiveM Server Console" %}

```
refresh
ensure cs-video-call
```

{% endcode %}
{% endstep %}

{% step %}

### Fix your phone's animation loop

{% hint style="warning" %}
This is optional and you don't need to do anything unless you are experiencing an animation glitch.
{% endhint %}

If your phone uses an animation loop you may need to edit it (usually found in an `animation.lua` file) and add a `not CS_VIDEO_CALL.ACTIVE` check before playing an animation to ensure an animation glitch does not occur when the video call camera is opened.
{% endstep %}

{% step %}

### Restart your phone

Ensure your phone's resource via your server's console.
{% endstep %}
{% endstepper %}


# Important Information

Learn important information about the resource.

* The video call will not work without the proxy server, direct P2P is not given as an option in order to protect players' anonymity.
* Besides your proxy server's network speeds which must match the amount of maximum active transmissions you want to have (you can limit those in the configuration), you will also need to consider bandwidth consumption if that is not unlimited by your host.
* Video render lag / freezes may be caused in very high resolutions or in very low-spec systems.
* When video call is active, the player who transmits the video cannot move. This is default GTA:V camera behavior. You can try using experimental camera mode which allows the player to move, however it might not be as smooth as the native one.
* The video call works using game capture (similar to *screenshot-basic*), the player sees whatever it's on the game of the other player. That includes visual settings / mods, game drawings / UIs but not NUIs.
* If your server is running behind a reverse proxy that you have no control over and cannot handle an extra UDP port as required by the resource, your only option may be to externally host the video call's proxy server in a different machine (for example a cheap VPS with enough bandwidth / network to work within your own limits) that can handle the requirements.
* When a player initiates a video call, it will consume approximately 2mbps of their upload speed for the transmission and when they are in a call and the other player initiates a video call it will consume approximately 2mbps of their download speed.
* Your players may be prompted by their Windows Firewall to allow a connection the first time a video call happens, this is due to the WebRTC protocol connection and cannot be circumvented.
* There are checks in place to ensure that the transmitted video feed is legitimate and is coming from the game itself, however since the client sends it, it cannot be fully trusted.


# External Proxy Server

Learn how to use an external proxy server.

{% hint style="warning" %}
This is intended only for experienced developers.
{% endhint %}

If you choose not to use the integrated proxy server you can self-host an external proxy server.\
To do so, follow the instructions below.

{% stepper %}
{% step %}

### Download

Download the external proxy server through our [GitHub](https://github.com/criticalscripts-shop/cs-video-call-eps).
{% endstep %}

{% step %}

### Install

Run `npm install` in the EPS[^1] directory and wait until it completes.
{% endstep %}

{% step %}

### Configure

Read through all options and their comments inside its `config.js` file as they are very important for the setup process, adjust them to your setup and preferences.
{% endstep %}

{% step %}

### Run

Run `node server.js` in the EPS[^1] directory and **do not close the console window**.

{% hint style="info" %}
You can use [pm2](https://pm2.keymetrics.io/docs/usage/quick-start/) to make sure the EPS[^1] runs all the time.
{% endhint %}
{% endstep %}

{% step %}

### Configure your FiveM server

Add the EPS[^1] server's IP address in the `sv_proxyIPRanges` property in your server's configuration file.
{% endstep %}
{% endstepper %}

[^1]: External Proxy Server


# Frequent Issues

Learn how to deal with frequent issues.

<details>

<summary>I can perform a video call but when the other player opens their camera all I see is a black screen, why?</summary>

Black screen issue is usually related to **UDP blocking**, complex network setup or anti-DDoS protection. **Try a different port, preferably in a high range** to see if that will resolve your issue and **make sure that port is open for UDP protocol**.\
If that doesn't work then your best solution here may be to [externally host the video call's proxy server](/paid-resources/fivem-video-call/external-proxy-server) in a different machine (for example a cheap VPS with enough bandwidth / network to work within your own limits) that can handle the requirements.

</details>

<details>

<summary>I've done everything but I cannot see a video call button, what's wrong?</summary>

Not seeing a video call button is possibly related to the hook you are using.\
First make sure you are using the correct hook for the phone you have.\
Then make sure your phone events and DOM elements are properly reflected in the hook and that the hook is configured properly.

</details>

<details>

<summary>My <strong>yarn</strong> is repeatedly trying to install the resource, what do I do?</summary>

This seems to be a current bug in the **yarn** resource related to `package.json` and the server's time zone related to the time zone of the system you copied the resource from.\
Edit `package.json` and just add or remove a space character, save it and the issue will go away.

</details>


# FiveM Stories

In this category you can find useful information about the FiveM Stories resource.


# Installation Instructions

Learn how to install the resource.

{% stepper %}
{% step %}

### Download the resource

* Make sure you have [yarn](https://github.com/citizenfx/cfx-server-data/tree/master/resources/%5Bsystem%5D/%5Bbuilders%5D/yarn) in your `resources` folder.
* Download `cs-stories` and place it in your `resources` folder.
  {% endstep %}

{% step %}

### Ensure the resource

Add `ensure cs-stories` to your server's configuration file before ensuring your phone.
{% endstep %}

{% step %}

### Hook your phone's resource

Edit your phone's `fxmanifest.lua` file and add the following at the end of of the file:

{% code title="fxmanifest.lua" %}

```
client_script '@cs-stories/client/hooks/core.lua'
server_script '@cs-stories/server/hooks/core.lua'
```

{% endcode %}
{% endstep %}

{% step %}

### Hook your phone's NUI

Edit your phone's NUI file (usually `index.html`) and add the following right before the `</body>` tag:

```
<script type="text/javascript" src="nui://cs-stories/client/hooks/core.js"></script>
```

{% endstep %}

{% step %}

### Configure

Check the `config.lua` file inside `cs-stories` for further configuration. Read through all options and their comments and adjust them to your setup and preferences.
{% endstep %}

{% step %}

### Setup your server's firewall

Open the required port (by default `35540`; incoming / inbound) in your firewall, on `TCP` protocol.

{% hint style="info" %}
If you are having issues getting a port open, you can use an [External Hosting Server](/paid-resources/fivem-stories/external-hosting-server).
{% endhint %}
{% endstep %}

{% step %}

### Start the resource

Run the following commands on the server console:

{% code title="FiveM Server Console" %}

```
refresh
ensure cs-stories
```

{% endcode %}
{% endstep %}

{% step %}

### Fix your phone's animation loop

{% hint style="warning" %}
This is optional and you don't need to do anything unless you are experiencing an animation glitch.
{% endhint %}

If your phone uses an animation loop you may need to edit it (usually found in an `animation.lua` file) and add a `not CS_STORIES.ACTIVE` check before playing an animation to ensure an animation glitch does not occur when the stories camera is opened.
{% endstep %}

{% step %}

### Restart your phone

Ensure your phone's resource via your server's console.
{% endstep %}
{% endstepper %}


# Important Information

Learn important information about the resource.

* The player will be asked for microphone approval, if they deny, their voice will not be recorded in stories. If they mistakenly deny, they will need to reset it (for now this is done by deleting the file `%AppData%\CitizenFX\media_access.json`).
* When recording a story, the voice is recorded by the player's system default microphone. This cannot be changed.
* Only the voice of the player recording is recorded. This cannot be changed.
* The recording determinates whether the player is talking using the built-in native. If you are using an external VoIP such as TokoVoip or similar you will need to edit the hook to correctly determine when the player is talking.
* A player recording a story cannot move. This is default GTA:V camera behavior. You can try using experimental camera mode which allows the player to move, however it might not be as smooth as the native one.
* Video render lag / freezes may be caused in very high resolutions or in very low-spec systems.
* The story recording works using game capture (similar to screenshot-basic), whatever it's on the game is recorded. That includes visual settings / mods, game drawings / UIs but not NUIs.
* If your server is running behind a reverse proxy that you have no control over and cannot handle an extra TCP port as required by the resource, your only option may be to externally host the stories' hosting server in a different machine (for example a cheap VPS with enough bandwidth / network / storage to work within your own limits).
* When a story is being uploaded or viewed by a player, like any other video-upload service, the player's upload / download speed is being used and network / bandwidth is consumed on the hosting server as well.
* If your hosting server host does not offer unlimited bandwidth or has a low network limit you are advised to periodically check your usage statistics if you have a lot of players uploading and viewing stories. Also make sure to check your storage if you have a ton of stories being uploaded and are not being cleaned up.
* The resource is using FiveM's KV storage to store the metadata of the saved stories, if you are using a shared multi-server setup this may cause an issue and you may want to set `sv_kvsName` console variable to something unique for your server.
* There are checks in place to ensure that the recorded video and the in-game location are legitimate and are coming from the game itself, however since the client sends them, they cannot be fully trusted.
* The stories are deleted (as per configuration) when the resource starts, so stories storage cleanup depends on how often you restart your server or the resource.


# External Hosting Server

Learn how to use an external hosting server.

{% hint style="warning" %}
This is intended only for experienced developers.
{% endhint %}

If you choose not to use the integrated hosting server you can self-host an external hosting server.\
To do so, follow the instructions below.

{% stepper %}
{% step %}

### Download

Download the external proxy server through our [GitHub](https://github.com/criticalscripts-shop/cs-stories-ehs).
{% endstep %}

{% step %}

### Install

Run `npm install` in the EHS[^1] directory and wait until it completes.
{% endstep %}

{% step %}

### Configure

Read through all options and their comments inside its `config.js` file as they are very important for the setup process, adjust them to your setup and preferences.
{% endstep %}

{% step %}

### Run

Run `node server.js` in the EHS[^1] directory and **do not close the console window**.

{% hint style="info" %}
You can use [pm2](https://pm2.keymetrics.io/docs/usage/quick-start/) to make sure the EHS[^1] runs all the time.
{% endhint %}
{% endstep %}
{% endstepper %}

[^1]: External Hosting Server


# Frequent Issues

Learn how to deal with frequent issues.

<details>

<summary>I can use the stories app but when I try to view or upload a story, an error happens, why?</summary>

If your phone is of `fx_version cerulean`*,* then you will have to route the stories' hosting server via **HTTPS**. You can do this by using a domain and Cloudflare.  Alternatively, you can change the `fx_version` of your phone to `bodacious`*.* If this was not your issue then the problem usually lies in **TCP** **blocking**, complex network setup or anti-DDoS protection. **Try a different port, preferably in a high range** to see if that will resolve your issue and **make sure that port is open for TCP protocol**.\
If that doesn't work then your best solution here may be to [externally host the stories' hosting server](/paid-resources/fivem-stories/external-hosting-server) in a different machine (for example a cheap VPS with enough bandwidth / network / storage to work within your own limits) that can handle the requirements.

</details>

<details>

<summary>I've done everything but I cannot see a stories app button, what's wrong?</summary>

Not seeing a stories app button is possibly related to the hook you are using. First make sure you are using the correct hook for the phone you have. Then make sure your phone events and DOM elements are properly reflected in the hook and that the hook is configured properly. Also note that some hooks add the stories application in the phone's application store rather than immediately adding it as an application.

</details>

<details>

<summary>My <strong>yarn</strong> is repeatedly trying to install the resource, what do I do?</summary>

This seems to be a current bug in the **yarn** resource related to `package.json` and the server's time zone related to the time zone of the system you copied the resource from.\
Edit `package.json` and just add or remove a space character, save it and the issue will go away.

</details>


# FiveM Hashed Events

In this category you can find useful information about the FiveM Hashed Events resource.


# ConVars

Learn how to configure the resource via console variables.

You can set the following ConVars in your server's configuration file using `setr` (e.g. `setr cs_hashed_events_enabled true`).

* `cs_hashed_events_enabled`
  * An easy way to control whether the resource will be enabled or not, after it has been included to every resource.

* `cs_hashed_events_server_whitelist`
  * A comma-separated list of server events that should be allowed to pass without hashing, for non-Lua resources.

* `cs_hashed_events_client_whitelist`
  * A comma-separated list of client events that should be allowed to pass without hashing, for non-Lua resources.

* `cs_hashed_events_emojify`
  * Whether you want the event hashing to be emoji-based, this will cause the events to show up as question marks in the network event log.


# Installation Instructions

Learn how to install the resource.

{% stepper %}
{% step %}

### Download the resource

Download `cs-hashed-events` and place it in your `resources` folder.
{% endstep %}

{% step %}

### Ensure the resource

Add `ensure cs-hashed-events` to your server's configuration file **before any other ensure**.
{% endstep %}

{% step %}

### Include in Lua resources

Edit the `fxmanifest.lua` file of every resource in your server that executes Lua scripts and add:

{% code title="fxmanifest.lua" %}

```lua
shared_script '@cs-hashed-events/include.lua'
```

{% endcode %}
{% endstep %}

{% step %}

### Adjust configuration

Adjust the resource configuration via its `config.lua` file and [ConVars](/paid-resources/fivem-hashed-events/convars).
{% endstep %}

{% step %}

### Restart server

Restart your server.
{% endstep %}
{% endstepper %}


# Important Information

Learn important information about the resource.

* By default the resource whitelists internal events, game events, txAdmin and vMenu events.
* For any non-Lua resource (e.g. C# / JS) that trigger events, network or not, outside of its own resource, the events will need to be whitelisted.
* To put it simply, if a "non-hashed" resource needs to communicate with a "hashed" resource via events, network or not, the events will need to be whitelisted.
* If everything is set up as intended and you have not missed anything, you can be confident non-spoofed calls are deliberate.
* This resource is purely an extra friction layer for event discovery and abuse.
  * It does not prevent exploitation by a determined adversary.
  * It does not guarantee secrecy of event names under targeted analysis.
  * It does not replace proper server-side validation, permissions, or rate limiting.
* Use this as one layer in a defense-in-depth strategy, not a remedy for all modder problems.


# Non-Spoofed Calls

Learn how to listen to the non-spoofed call event.

You can listen to the following server event for when a non-spoofed call is detected.\
A non-spoofed call is a hashed event triggered using its original (pre-hash) name.

```lua
AddEventHandler('cs-hashed-events:OnNonSpoofedCall', function(source, name, resource)
    -- (source) has triggered (name) event within (resource), do what you want with them.
end)
```


