
Shops
Système de magasins pour l'inventaire standard et ox_inventory : magasins avec panier, armureries, marché noir tournant, offres du jour, vendeurs PNJ et un éditeur de magasins en jeu.
- ESX Legacy (
es_extended) - oxmysql
- Inventaire : inventaire standard ESX ou ox_inventory (détecté au démarrage)
- Optionnel : ox_target
Fonctionnalités
- Trois types de magasins : magasin avec panier, armurerie et marché noir. Le paiement se fait par carte ou en liquide, au marché noir avec de l'argent sale.
- Le serveur vérifie les prix, le total, le poids et la distance. Stock uniquement pour les magasins achetés. Règles par type de magasin, magasin ou objet.
- Magasins à vendre : les joueurs achètent un magasin, fixent les prix, vont chercher la marchandise chez le grossiste et gèrent la caisse.
- Marché noir tournant avec emplacements, assortiment et prix changeants, plus des offres du jour dans les magasins normaux.
- Éditeur de magasins en jeu avec modèle de PNJ, scénario, marqueur avec aperçu en direct et blip personnalisé.
- Logs Discord par achat et statistiques en direct sur Discord.
Installation
- Place le dossier
off_shopsdans ton dossierresources. - Tous les objets de
config/settings/config.items.luadoivent exister dans ton inventaire – ESX : tableitems, ox_inventory :ox_inventory/data/items.lua. Les armes (weapon_…) n'ont pas besoin d'entrée avec ESX. - Dans le
server.cfg– après ESX, oxmysql et ton inventaire :
ensure oxmysql
ensure es_extended
ensure ox_inventory
ensure off_shopsLes tables sont créées automatiquement et complétées lors des mises à jour.
Configuration
config/settings/config.lua
| Option | Par défaut | Description |
|---|---|---|
serverInfo.name | 'OFF SCRIPTS' | Nom du serveur, affiché dans l'interface à la place de « OFF SCRIPTS » |
serverInfo.locale | 'de' | Langue : de, en, pl, fr, es, it ou nl |
serverInfo.color | { 155, 89, 255 } | Couleur de l'UI (RGB) |
serverInfo.design | 3 | Design de l'interface : 1 = Classique, 2 = Ticket, 3 = Storefront |
blur | true | Arrière-plan flou tant que le magasin est ouvert. L'éditeur reste net (aperçu) |
useTarget | false | true = ox_target au lieu de E |
pedSpeech | true | Le PNJ salue, dit au revoir et remercie à voix haute |
purchase.maxPerItem | 25 | Quantité max par article et par achat |
deals.enabled / count / discountPercent | false / 2 / 20 | Offres du jour (magasins normaux uniquement, pas d'armes) : activé/désactivé, nombre, remise en pourcentage |
marker.color / marker.alpha | { 155, 89, 255 } / 150 | Couleur par défaut et opacité des marqueurs |
editor.command / editor.groups | 'shopeditor' / { 'projektleitung' } | Commande et groupes ESX pour l'éditeur |
stats.enabled / updateMinutes | true / 10 | Statistiques en direct sur Discord, actualisation en minutes |
blackmarket.rotation / activeLocations | 'day' / 1 | Changement du marché noir ('day', 'week', 'month') et combien sont présents en même temps |
blackmarket.itemsPerCategory / priceVariancePercent | 2 / 15 | Articles par catégorie sur la période, variation de prix en pourcentage |
shopTypes | normal, weapon, blackmarket | Par type label, ped (vendeur), uiColor (couleur d'UI propre), blip et rules |
Règles (rules) par type de magasin, magasin ou objet : jobs, blockedJobs, minGrade et hours = { from, to } (heure en jeu, 22–5 = 22:00–04:59).
config/settings/config.locations.lua – Emplacements
{ type = 'normal', label = 'LTD Davis', interactionType = 'ped', position = vec4(-47.02, -1758.23, 29.42, 45.05), categories = { 'food', 'drinks', 'tools' } },
{ type = 'blackmarket', interactionType = 'ped', position = vec4(14.2280, -1104.0475, 29.7970, 340.0), categories = { 'weapons', 'illegal' } },| Champ | Description |
|---|---|
type | 'normal', 'weapon' ou 'blackmarket' |
interactionType | 'ped' (PNJ, vec4 avec orientation) ou 'marker' |
categories | Quelles catégories le magasin vend |
price | Optionnel : prix d'achat · sans price le magasin n'est pas à vendre |
label / rules / blip = false | Optionnel : nom propre, règles propres ou pas d'icône sur la carte |
Les emplacements avec type = 'blackmarket' sont des lieux possibles pour le marché noir – activeLocations d'entre eux sont actifs en même temps.
Catégories et objets
food = { label = 'Essen', items = { 'bread', 'kebab', 'wrap' } }, -- catégorie
{ name = 'water', label = 'Wasser', price = 10 }, -- objet- Optionnel par objet :
max(quantité max propre),image(image propre),rules(règles propres). weapon_…est traité comme une arme : achetable à l'unité, avec 42 balles dans l'inventaire ESX, pas en double.- Images : ESX charge
web/dist/assets/items/<name>.png, ox_inventory utilise les siennes. Place les images d'armes manquantes dansweb/dist/assets/weapons/<name>.png.
config/functions.lua
| Fonction | Utilité |
|---|---|
Notify(message, type) | Notify personnalisé · Serveur : Notify(source, message, type) |
HelpNotify(text) | Texte d'aide au vendeur ou au marqueur |
Logs Discord
Tu inscris les webhooks dans config/settings/config.server.lua (côté serveur uniquement) : purchases enregistre chaque achat, stats correspond aux statistiques en direct. Une url vide ('') désactive le log.
Langues
Tous les textes se trouvent dans config/locales/<langue>.json. Pour ta propre langue, copie un fichier, traduis-le et définis locale – laisse les placeholders comme %s et {total} en place.
En jeu
Appuie sur E au vendeur ou au marqueur (ou utilise ox_target), choisis les articles et paie. Au magasin, il y a un panier, à l'armurerie et au marché noir, tu choisis un seul article.
Éditeur de magasins (/shopeditor)
- À gauche se trouvent tous les magasins de l'éditeur. Les magasins de la config n'y figurent pas, tu les modifies dans
config/settings/config.locations.lua. - Nouveau crée un magasin à ta position actuelle, Modifier ouvre un magasin existant.
- Tu peux régler le type, le nom, les catégories, PNJ ou marqueur, la position avec orientation et le blip.
- PNJ : Choisis un modèle dans une liste d'images de tous les peds GTA (recherche et catégories), plus scénario et orientation, le tout avec aperçu en direct en jeu. Tu choisis un ped addon via son nom de modèle exact dans la recherche. Par défaut = vendeur de
shopTypes. - Marqueur : Type, taille, distance au sol, rotation, couleur, opacité et mouvement avec aperçu en direct en jeu.
- Blip : activé ou non, en option avec une icône et une couleur propres. Sinon, le blip de
shopTypess'applique. - Tant que l'éditeur est ouvert, tu te déplaces avec WASD et regardes autour de toi en maintenant le clic droit. Ensuite, appuie sur Prendre la position.
- Après Enregistrer, la modification s'applique immédiatement à tous les joueurs. Un marché noir créé dans l'éditeur reste fixe et vend tous les articles de ses catégories.
Magasins à vendre
Le fait qu'un magasin soit à vendre se règle avec price dans config.locations.lua pour les magasins de la config, et dans l'éditeur pour les magasins de l'éditeur (groupe Propriété : À vendre, Prix d'achat). Le marché noir n'est jamais à vendre. Les magasins sans propriétaire vendent comme avant, sans stock.
Option (ownership) | Défaut | Description |
|---|---|---|
enabled | true | Magasins à vendre on/off. Off = tout comme sans la fonction |
maxPerPlayer | 1 | Nombre de magasins par joueur |
startStock / maxStock | 20 / 200 | Stock de départ par article après l'achat / stock maximal par article |
priceRange.min / max | 0.8 / 1.5 | Prix de vente autorisé = prix de base × min à max |
wholesaleFactor | 0.6 | Prix grossiste = prix de base × facteur |
sellBackPercent | 60 | Rachat par le serveur en % du prix d'achat |
van / orderMaxUnits / orderMinutes | 'speedo' / 300 / 20 | Camionnette, unités max. par trajet, limite de temps en minutes |
vanSpawn | vec4(...) | Point de spawn de la camionnette, le joueur y est téléporté |
refundPercent | 0 | Remboursement en % si la livraison échoue ou est annulée |
wholesalers | 3 × vec3 | Grossistes, le plus proche du magasin est utilisé |
En jeu : Dans un magasin à vendre, E ouvre d'abord un choix entre Acheter et Gestion, avec une caméra sur le vendeur s'il y a un PNJ. Si le magasin appartient à quelqu'un d'autre, la boutique s'ouvre directement. Sans propriétaire, Gestion mène à l'offre, en tant que propriétaire à la gestion avec Aperçu (caisse, CA du jour/7 jours/total, graphique, articles presque épuisés), Stock, Prix, Commande et Caisse (retrait/dépôt en liquide ou sur le compte, historique, vente du magasin). Les clients paient dans la caisse et n'achètent que ce qui est en stock.
Livraison : Choisis la marchandise, le coût est payé par la caisse. Tu es téléporté au point vanSpawn et placé dans la camionnette – va chez le grossiste, E dans le marqueur (charger), reviens et gare la camionnette dans le marqueur, puis va voir le vendeur et appuie sur E. C'est seulement là que la marchandise entre en stock. Si la camionnette est détruite, si le temps est écoulé ou si tu quittes le serveur, la marchandise est perdue (remboursement selon refundPercent). Après un redémarrage du serveur, une livraison ouverte est entièrement remboursée.
Log Discord : webhook ownership dans config/settings/config.server.lua (achat, vente, livraisons, retraits/dépôts). Libérer dans l'éditeur rend un magasin à nouveau libre (stock et caisse perdus).
Problèmes fréquents
| Problème | Solution |
|---|---|
[ERROR] dans la console serveur | Le script vérifie l'installation au démarrage. Lis le message, corrige le problème, redémarre le script. |
| « Cet article est invalide » | L'objet manque dans l'inventaire (ESX : table items, ox_inventory : items.lua). |
| ox_inventory n'est pas détecté | ensure ox_inventory doit se trouver avant off_shops. |
| Le marché noir est fermé | Par défaut seulement de 22 h à 5 h, heure en jeu (rules.hours). |
| Le marché noir n'est pas là | Seuls activeLocations emplacements sont actifs – les autres au prochain changement. |
| Marché noir : « Pas assez d'argent » | Le marché noir n'accepte que l'argent sale (black_money). |
/shopeditor ne s'ouvre pas | Ton groupe ESX doit figurer dans editor.groups. |
| « Le modèle de PNJ … n'existe pas » | Vérifie le nom du modèle, p. ex. mp_m_shopkeep_01. Les peds addon doivent être streamés. |
Pas encore acheté ?
Voir Shops dans la boutique