# Script BootStore

# Introduction

**BootStore** transforme le coffre de vos véhicules en un véritable espace de rangement interactif. Les objets stockés sont visibles et manipulables directement en jeu : vos joueurs peuvent les prendre en main, les déposer au sol, les ranger dans un véhicule, ou les donner à un autre joueur.

Le mod inclut également :

- une **physique de suspension réaliste** (le véhicule s'écrase visuellement selon le poids transporté),
- un **effet de caméra dynamique** lors du portage d'objets lourds,
- une **mise en surbrillance** de l'objet visé,
- un **outil de configuration en jeu** pour positionner précisément chaque objet dans n'importe quel véhicule, sans toucher au code.

# Dépendances & Installation

<table id="bkmrk-d%C3%A9pendancestatutr%C3%B4le"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr><th>Dépendance

</th><th>Statut

</th><th>Rôle

</th></tr><tr><td>**ox\_lib**

</td><td>Obligatoire

</td><td>Notifications, TextUI, callbacks, cercles de progression

</td></tr><tr><td>**ox\_target**

 ou

**qb-target**

</td><td>Un des deux requis

</td><td>Système de ciblage pour interagir avec les objets/coffres

</td></tr><tr><td>**Framework**

 (ESX / QBCore / QBox)

</td><td>Optionnel

</td><td>Uniquement nécessaire si tu utilises le verrouillage par métier

</td></tr></tbody></table>

> ##### BootStore fonctionne aussi en **standalone**, sans framework, si tu n'as pas besoin de restrictions par métier.

#### Installation 

Place le dossier de la ressource dans ton dossier resources. Dans ton server.cfg, assure-toi que les dépendances démarrent avant BootStore :

```cfg
ensure ox_lib
ensure ox_target   # ou qb-target
ensure BootStore
```

- Renseigne ta MasterKey dans `<span class="editor-theme-code">config.lua</span>` (voir chapitre suivant).
- Démarre ou redémarre la ressource.

# Activation de la licence (MasterKey)

BootStore nécessite une **MasterKey** valide pour fonctionner. C'est ta clé personnelle qui identifie ton serveur auprès de MasterMods.

### Comment l'obtenir

Rends-toi sur : [**https://ressources.mastermods.dev/CreerMasterKey.php**](https://ressources.mastermods.dev/CreerMasterKey.php)

Génère ta clé, puis renseigne-la dans `<span class="editor-theme-code">config.lua</span>` :

```lua
Config.MasterKey = "MM-XXXXXXXX"
```

Sans clé valide (ou avec la clé d'exemple laissée par défaut), le script affichera un avertissement en console et certaines fonctionnalités resteront désactivées.

### Détail des options importantes

**`<strong class="editor-theme-bold editor-theme-code">Config.Framework</strong>` / `<strong class="editor-theme-bold editor-theme-code">Config.TargetSystem</strong>` / `<strong class="editor-theme-bold editor-theme-code">Config.InventorySystem</strong>`** Laissés sur `<span class="editor-theme-code">'auto'</span>`, BootStore détecte automatiquement ce qui tourne sur ton serveur. Si tu as plusieurs ressources compatibles installées en même temps et que la détection automatique se trompe, force la valeur correspondante.

**`<strong class="editor-theme-bold editor-theme-code">Config.InteractionMode</strong>`** Détermine comment un joueur ouvre le coffre : viser chaque objet un par un (`<span class="editor-theme-code">aim</span>`), ou ouvrir un menu unique listant tout le contenu (`<span class="editor-theme-code">menu</span>`), ou laisser le choix au joueur (`<span class="editor-theme-code">both</span>`).

# Ajout et configuration d'un véhicule

Contrairement à une configuration manuelle dans un fichier, BootStore utilise un **outil de configuration en jeu**.

### Étapes

1. Approche-toi d'un véhicule (moins de 5 mètres).
2. Tape `<span class="editor-theme-code">/config</span>` en jeu.
3. Une interface s'ouvre : choisis le nom, le modèle 3D de l'objet, son type, son icône, et éventuellement une porte requise pour y accéder.
4. Valide : l'outil te fait ensuite positionner l'objet en deux temps (le fameux "double gizmo") :
    - **Phase 1** : position/rotation de l'objet **dans l'emplacement du véhicule** **voulu**.
    - **Phase 2** : position/rotation de l'objet **une fois tenu en main** par le joueur.
5. Une fois validé, la configuration est sauvegardée et s'applique immédiatement à tous les véhicules du même modèle.

### Réutiliser une configuration existante (loadouts)

La commande `<span class="editor-theme-code">/loadout</span>` permet de dupliquer la configuration d'objets déjà présents sur un véhicule proche, pour l'appliquer tel quel (position coffre + main incluses) à un autre modèle, sans repasser par le gizmo.

# Utilisation en jeu

- **Ouvrir la porte si nécessaire** : viser le véhicule (mode `<span class="editor-theme-code">aim</span>`) ou utiliser l'option de menu (mode `<span class="editor-theme-code">menu</span>`), selon `<span class="editor-theme-code">Config.InteractionMode</span>`.
- **Prendre un objet** : interagir avec l'objet ciblé (mis en surbrillance si `<span class="editor-theme-code">Config.EnableGlow</span>` est actif).
- **Porter un objet** : l'objet apparaît en main, avec une éventuelle animation selon la configuration.
- **Poser au sol** : touche **E** par défaut (`<span class="editor-theme-code">mm_drop</span>`), remappable dans les paramètres clavier de FiveM.
- **Ranger dans un véhicule** : interagir avec un coffre compatible en tenant l'objet.
- **Donner à un autre joueur** : interaction directe entre joueurs à proximité.
- **Effets visuels** : plus le poids porté/embarqué est élevé, plus la suspension du véhicule s'écrase et plus la caméra du joueur tangue (si ces options sont activées).

# Commandes en chat

<table id="bkmrk-commandeusage%2Fconfig"><colgroup><col></col><col></col></colgroup><tbody><tr><th>Commande

</th><th>Usage

</th></tr><tr><td>`<span class="editor-theme-code">/config</span>`

</td><td>Ouvre l'outil de configuration sur le véhicule le plus proche

</td></tr><tr><td>`<span class="editor-theme-code">/loadout</span>`

</td><td>Duplique la configuration d'un véhicule proche vers un autre modèle

</td></tr><tr><td>`<span class="editor-theme-code">/refreshcache</span>`

</td><td>Force le rechargement du cache des objets configurés autour du joueur

</td></tr><tr><td>`<span class="editor-theme-code">mm_drop</span>`

 (touche E)

</td><td>Pose l'objet actuellement tenu en main

</td></tr></tbody></table>

# Compatibilité Framework / Ciblage / Inventaire

BootStore s'adapte automatiquement à :

- **Frameworks** : ESX, QBCore, QBox, ou standalone (aucun framework).
- **Ciblage** : ox\_target ou qb-target.
- **Inventaire** : pont optionnel vers ox\_inventory ou qb-inventory (selon `<span class="editor-theme-code">Config.InventorySystem</span>`).

Si tu utilises plusieurs de ces ressources en parallèle sur ton serveur, force la valeur correspondante dans `<span class="editor-theme-code">config.lua</span>` plutôt que de laisser `<span class="editor-theme-code">'auto'</span>`, pour éviter toute ambiguïté.

---

#### Verrouillage par métier (jobs)

BootStore peut restreindre l'accès à certains objets selon le métier (job) du joueur, si un framework compatible (ESX, QBCore, QBox) est détecté ou forcé.

La vérification du job se fait **côté serveur**, directement auprès du framework, ce qui garantit qu'elle ne peut pas être contournée depuis le client du joueur.

> En mode standalone (aucun framework), aucune restriction de ce type n'est appliquée.

# Options pour développeur & exports

Si tu développes une autre ressource (script d'anti-triche, mini-jeu, script métier personnalisé...), BootStore expose des événements et des exports pour s'y greffer sans modifier son code interne.

#### Événements diffusés (`<span class="editor-theme-code">AddEventHandler</span>`)

```lua
BootStore:onPropTaken(source, propData, vehicleNetId)
BootStore:onPropDropped(source, propData, coords)
BootStore:onPropStored(source, propData, vehicleNetId)
BootStore:onPropGiven(sourceFrom, sourceTo, propData)
BootStore:onVehicleSpawnedWithProps(vehicleNetId, propsList)
BootStore:onConfigSaved(vehicleModel, propData)
```

#### Exports disponibles

```lua
exports['BootStore-INT']:IsPlayerHoldingProp(source)        -- bool
exports['BootStore-INT']:GetHeldPropData(source)            -- table | nil
exports['BootStore-INT']:GetVehiclePropsConfig(netId)        -- table (liste, vide si rien/refusé)
exports['BootStore-INT']:ForceDropProp(source)               -- bool (true si une dépose a été déclenchée)
```

# FAQ / Problèmes courants

**Le script ne démarre pas / rien ne fonctionne.** Vérifie que ta MasterKey est bien renseignée dans `<span class="editor-theme-code">config.lua</span>` et qu'elle n'est pas la clé d'exemple. Génère la tienne sur [https://ressources.mastermods.dev/CreerMasterKey.php](https://ressources.mastermods.dev/CreerMasterKey.php).

**Les objets configurés n'apparaissent pas dans le coffre.** Utilise `<span class="editor-theme-code">/refreshcache</span>` pour forcer le rechargement du cache, ou vérifie que le véhicule a bien été configuré avec `<span class="editor-theme-code">/config</span>`.

**Le job ne restreint pas correctement l'accès à un objet.** Assure-toi que `<span class="editor-theme-code">Config.Framework</span>` correspond bien à ton framework (ou laisse `<span class="editor-theme-code">'auto'</span>` si un seul framework tourne sur ton serveur).

**Deux systèmes de ciblage sont installés et ça ne fonctionne pas comme prévu.** Force `<span class="editor-theme-code">Config.TargetSystem</span>` sur la valeur souhaitée plutôt que de laisser `<span class="editor-theme-code">'auto'</span>`.

**J'ai activé `<strong class="editor-theme-bold editor-theme-code">Config.Debug</strong>` mais je ne vois rien.** Les logs de debug s'affichent dans la console F8. Les commandes `<span class="editor-theme-code">/mm_testrotorder</span>` et `<span class="editor-theme-code">/mm_liveadjust</span>` ne sont disponibles qu'avec `<span class="editor-theme-code">Config.Debug = true</span>`.

---

## 13. Support

Pour toute question, bug, ou demande d'assistance, contacte l'équipe MasterMods via Discord : **discord.mastermods.dev**

# Config via le web

BootStore inclut un **tableau de bord en ligne**, accessible depuis le site MasterMods, lié directement à ta MasterKey.

### Connexion

Rends-toi sur le [tableau de bord BootStore ](https://ressources.mastermods.dev/bootStore/index.php)et connecte-toi avec ta MasterKey (la même que celle renseignée dans `<span class="editor-theme-code">config.lua</span>`). Chaque clé n'a accès qu'à ses propres données — impossible de voir ou modifier la configuration d'un autre serveur.

### Ce que tu peux y faire

- **Visualiser et gérer tes véhicules configurés** : consulter la liste des modèles configurés via `<span class="editor-theme-code">/config</span>`, sans avoir besoin de te reconnecter en jeu.
- **Bibliothèque de presets** : parcourir, valider ou gérer les presets d'objets créés en jeu (voir chapitre 6).
- **Bibliothèque de loadouts** : gérer les loadouts créés via `<span class="editor-theme-code">/loadout</span>` pour les réutiliser plus facilement d'un véhicule à l'autre.
- **Suivi en direct** *(si activé)* : une carte affichant la position et le statut des objets actuellement actifs sur ton serveur.

### Accès

Le tableau de bord est disponible à l'adresse fournie sur le site MasterMods, dans la section BootStore. Connexion requise via ta MasterKey.