> For the complete documentation index, see [llms.txt](https://lunaris-1.gitbook.io/untitled/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lunaris-1.gitbook.io/untitled/script/ls-vipshop/ajouter-un-type-de-produit-vip.md).

# Ajouter un type de produit VIP

Les **produits VIP** (poids inventaire, salaire périodique, etc.) sont des « bonus » attachés à un achat VIP. Pour en ajouter un nouveau (ex. slots garage, accès zone) :

1. **Déclarer le type VIP** dans `Config.VipProductTypes` (config.lua).
2. **Créer le module** dans `server/vip_products/` ou `server/vip_products_custom/` qui enregistre le handler.

#### 1. Déclarer dans config.lua

```lua
Config.VipProductTypes = {
  -- ... existants (inventory_weight, paycheck) ...
  { key = "garage_slots", label = "Slots garage", handler = "garage_slots", valueType = "number", min = 0, step = 1, default = 0 },
}
```

* **key** : identifiant du produit VIP.
* **label** : libellé dans l’admin (section « Contenu du produit VIP »).
* **handler** : nom du fichier Lua (sans `.lua`) dans `server/vip_products/` ou `server/vip_products_custom/`.
* **valueType**, **min**, **step**, **default** : utilisés par l’UI admin pour le champ (number, etc.).

#### 2. Créer le module VIP

Crée `server/vip_products_custom/garage_slots.lua` (ou `server/vip_products/garage_slots.lua`) :

```lua
if type(OCShop_RegisterVipProduct) == 'function' then
    OCShop_RegisterVipProduct({
        key = 'garage_slots',
        validate = function(payload)
            if type(payload) ~= 'table' then return false, 'payload invalide' end
            local slots = tonumber(payload.slots)
            if not slots or slots < 0 then return false, 'slots invalide' end
            return true
        end,
        apply = function(src, payload, ctx)
            -- ctx: { level, identifier, source = "player_refresh" | "vip_grant" | ... }
            local slots = tonumber(payload.slots) or 0
            -- TODO: appliquer les slots garage au joueur (export, event, BDD)
            return true
        end
    })
end
```

* **validate** : valide le payload saisi dans l’admin pour ce type VIP.
* **apply** : appelé à l’application du VIP (connexion, achat/renouvellement VIP, refresh). Tu y mets la logique qui donne l’avantage au joueur.

***
