> For the complete documentation index, see [llms.txt](https://izzyshop-1.gitbook.io/izzyshop-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://izzyshop-1.gitbook.io/izzyshop-docs/free-resources/airdrop-system/installation.md).

# Installation

#### Commands <a href="#izzy-airdrop-installation-commands" id="izzy-airdrop-installation-commands"></a>

| Command                                                  | Who          | What it does                                                                                        |
| -------------------------------------------------------- | ------------ | --------------------------------------------------------------------------------------------------- |
| `/createdrop` (default; set `AdminUI.CreateDropCommand`) | Admin        | Opens the “Create Drop” NUI (items, coords, type, time).                                            |
| `/drop`                                                  | Anyone (dev) | Spawns a quick test drop at your feet (flare-style flow).                                           |
| `/cammode`                                               | Admin        | Teleports you to photo studio, screenshots every car in `vehicles.lua`, saves PNGs to `html/cars/`. |

Admin = listed in `server/config.lua` → `Admins`, or QB admin/god permission, or ACE `command`.,

#### `/cammode` — automatic car photos (explained simply) <a href="#izzy-airdrop-installation-cammode-automatic-car-photos-explained-simply" id="izzy-airdrop-installation-cammode-automatic-car-photos-explained-simply"></a>

**Problem:** Vehicle drop UI shows car images from `html/cars/bati.png`. You need pictures for each car.

**Solution:** Admin command `/cammode`.

#### What happens when you run it <a href="#izzy-airdrop-installation-what-happens-when-you-run-it" id="izzy-airdrop-installation-what-happens-when-you-run-it"></a>

1. Checks you’re admin + `CamScreenshotWebhook` is set in `server/config.lua`.
2. Saves your current position (you get teleported back when done).
3. Teleports you to a fixed studio location, hides radar, creates a **script camera**.
4. For **every** spawn name in `shared/vehicles.lua`:

{% hint style="info" %}
Spawns the car frozen at a pose
{% endhint %}

{% hint style="info" %}
Waits a moment
{% endhint %}

{% hint style="info" %}
**`screenshot-basic`** takes a picture and **uploads to Discord** via the cammode webhook
{% endhint %}

{% hint style="info" %}
Server downloads that image from Discord URL
{% endhint %}

{% hint style="info" %}
Saves as `html/cars/vehiclename.png` (e.g. `turismo3.png`
{% endhint %}

{% hint style="info" %}
Deletes the spawned car, next one
{% endhint %}

1. Destroys camera, restores radar, teleports you back, notify “Cammode closed”.

Run `/cammode` again while running to **cancel** early.

#### What you need for cammode <a href="#izzy-airdrop-installation-what-you-need-for-cammode" id="izzy-airdrop-installation-what-you-need-for-cammode"></a>

| Property               | Description                                                                                     |
| ---------------------- | ----------------------------------------------------------------------------------------------- |
| `screenshot-basic`     | `screenshot-basic` resource running                                                             |
| `CamScreenshotWebhook` | Valid `CamScreenshotWebhook` in `server/config.lua`                                             |
| `vehicles.lua`         | Cars in `vehicles.lua` must exist in your server — missing models are skipped (console message) |

This is **only for UI thumbnails**, not related to giving cars to players.

#### `shared/vehicles.lua` <a href="#izzy-airdrop-installation-shared-vehicles-lua" id="izzy-airdrop-installation-shared-vehicles-lua"></a>

List of vehicle **spawn names** (not display names).

Used by:

| Property     | Description                              |
| ------------ | ---------------------------------------- |
| **Cammode**  | **Cammode** — which models to photograph |
| **Admin UI** | **Admin UI** — vehicle drop picker       |

Add a line like `"sultanrs",` for each car you want in the list.

***

#### `shared/cores.lua` <a href="#izzy-airdrop-installation-shared-cores-lua" id="izzy-airdrop-installation-shared-cores-lua"></a>

Tells the script how to find your framework:

| Property      | Description         |
| ------------- | ------------------- |
| `es_extended` | `es_extended` → ESX |
| `qb-core`     | `qb-core` → QBCore  |
| `qbx_core`    | `qbx_core` → QBX    |

First one that is **started** wins. You normally don’t touch this unless you use a renamed core resource.

***

#### Locales (`locales/*.lua`) <a href="#izzy-airdrop-installation-locales-locales-lua" id="izzy-airdrop-installation-locales-locales-lua"></a>

All player-facing text: UI buttons, notifications, chat messages.

Set `Config.Language` in `shared/config.lua` to match filename (`tr.lua` → `"tr"`).

Each file builds `Lang` when language matches. Keys like `ui.create_drop`, `notifications.airdrop_unlocks_in`.

***

#### Admin UI (NUI) quick guide <a href="#izzy-airdrop-installation-admin-ui-nui-quick-guide" id="izzy-airdrop-installation-admin-ui-nui-quick-guide"></a>

Open with `/createdrop` (or whatever you set as `AdminUI.CreateDropCommand`):

| Property      | Type | Default | Description                                                                                   |
| ------------- | ---- | ------- | --------------------------------------------------------------------------------------------- |
| `police`      | `—`  | `—`     | **Drop Name** — label for notify / logs (for job drops, put **job name** here e.g. `police`). |
| **Drop Type** | `—`  | `—`     | **Drop Type** — Normal / Vehicle / Job.                                                       |
| **Search**    | `—`  | `—`     | **Search** — filter item list.                                                                |
| **Items**     | `—`  | `—`     | **Items** — click to select, +/- amount, left click on card.                                  |
| **Coords**    | `—`  | `—`     | **Coords** — X Y Z or button to use your position.                                            |
| **Drop Time** | `—`  | `—`     | **Drop Time** — cosmetic time on notify (or “now”).                                           |
| **History**   | `—`  | `—`     | **History** — last drops (active + recent 5).                                                 |

**Job drop:** only players with that job see blip, crate, notify, and can loot.

#### Drop types compared <a href="#izzy-airdrop-installation-drop-types-compared" id="izzy-airdrop-installation-drop-types-compared"></a>

| Type    | Who sees it                              | Loot          | Crate model                |
| ------- | ---------------------------------------- | ------------- | -------------------------- |
| Normal  | Everyone                                 | Items from UI | `gen_crate`                |
| Job     | Only that job (+ admin creator optional) | Items from UI | `gen_crate2`               |
| Vehicle | Everyone                                 | Car to garage | Actual vehicle + parachute |

#### Security stuff (already in script) <a href="#izzy-airdrop-installation-security-stuff-already-in-script" id="izzy-airdrop-installation-security-stuff-already-in-script"></a>

* Only admins create drops from UI (server checks).
* Loot distance check (`AntiCheat`).
* Job drop loot blocked on server for wrong job.
* Scheduled drops need a server token (players can’t fake schedule).
* Cammode + save photo: admin only.

#### Common problems <a href="#izzy-airdrop-installation-common-problems" id="izzy-airdrop-installation-common-problems"></a>

| Symptom                  | Fix                                                                             |
| ------------------------ | ------------------------------------------------------------------------------- |
| No Discord logs          | Check webhook URLs in `server/config.lua`, must contain `/api/webhooks/`.       |
| Cammode does nothing     | Set `CamScreenshotWebhook`, install `screenshot-basic`, be admin.               |
| Vehicle not in garage    | `Mysql` correct, `QBDefaultGarage` exists, check server console for SQL errors. |
| Items have no image      | Fix `ItemImagePath` to your inventory images folder.                            |
| UI wrong language        | `Config.Language` + restart resource.                                           |
| Drop stuck in sky        | Usually sync/land detection; check `FallSpeed` and that clients see the entity. |
| Everyone gets job notify | They shouldn’t — update resource; job notify only goes to matching job.         |
| Can’t loot from far away | Working as intended if `AntiCheat` on — get closer.                             |

#### Restart checklist <a href="#izzy-airdrop-installation-restart-checklist" id="izzy-airdrop-installation-restart-checklist"></a>

After changing config:

```lua
ensure izzy-airdrop
```

Or full restart. NUI (HTML/JS/CSS) may need reconnect or `resmon` refresh — players sometimes need to re-open UI to see JS changes.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

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

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

```
GET https://izzyshop-1.gitbook.io/izzyshop-docs/free-resources/airdrop-system/installation.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

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