Ajouter des voitures au magasin de véhicules FiveM (table ESX vehicles, QBCore, QBox)
Comment ajouter une voiture à un concessionnaire : les tables ESX vehicles et vehicle_categories, les entrées QBCore et QBox shared vehicles.lua, et pourquoi une voiture s'affiche sans prix.
Symptômes typiques :
The addon car works with /car, but the dealership does not sell it. Or it shows with no name, no price, or in the wrong category.Un concessionnaire vend ce qui est listé dans ses données, pas ce qui existe dans le jeu. Ajouter une voiture prend deux étapes : le modèle doit être streamé au jeu, puis il doit être listé dans les données que votre framework utilise. Cet article couvre la deuxième étape pour ESX, QBCore et QBox.
Étape un : le modèle doit être streamé
Si le modèle n'est pas chargé, le concessionnaire ne peut pas le montrer, et un achat ne génère rien. Ajoutez d'abord la voiture comme ressource, et vérifiez qu'elle fonctionne en jeu :
/car mycarUtilisez le nom de génération, qui vient du vehicles.meta de la voiture. Si /car échoue, corrigez d'abord cela avant de toucher au magasin, voir ajout de voitures addon.
ESX : la table vehicles
Le concessionnaire ESX lit deux tables SQL. vehicle_categories contient les catégories affichées dans le menu du magasin, et vehicles contient les voitures.
DESCRIBE vehicle_categories;
DESCRIBE vehicles;Dans une base de données ESX Legacy standard ils ressemblent à ceci :
| Tableau | Colonnes |
|---|---|
vehicle_categories |
name, label |
vehicles |
name, model, price, category |
Ajoutez une catégorie si vous en avez besoin d'une nouvelle :
INSERT INTO vehicle_categories (name, label) VALUES ('mycars', 'My cars');Ensuite ajoutez la voiture :
INSERT INTO vehicles (name, model, price, category)
VALUES ('My Car', 'mycar', 85000, 'mycars');nameest le label affiché dans le magasin.modelest le nom de génération, comme dans/car. Minuscules, exact.priceest un nombre entier.categorydoit correspondre aunamed'une ligne dansvehicle_categories, ou la voiture n'apparaît dans aucune catégorie.
Redémarrez la ressource du concessionnaire, ou le magasin entier, pour qu'il relise la table. Votre liste de colonnes peut différer si vous utilisez un magasin de véhicules personnalisé, donc faites confiance à DESCRIBE plutôt qu'à ce tableau.
Conseil : pour voir ce qu'une voiture fonctionnelle ressemble, copiez les valeurs d'une ligne déjà dans le magasin avec
SELECT * FROM vehicles LIMIT 5;et éditez-les.
QBCore : shared/vehicles.lua
QBCore garde sa liste de véhicules dans un fichier Lua, qb-core/shared/vehicles.lua. Chaque entrée est une voiture :
['mycar'] = {
model = 'mycar',
name = 'My Car',
brand = 'Mic',
price = 85000,
category = 'sports',
categoryLabel = 'Sports',
hash = `mycar`,
shop = 'pdm',
},Les champs :
model: le nom de génération, identique à la clé de la table.nameetbrand: ce que le magasin affiche.price: le prix de vente.categoryetcategoryLabel: le groupe dans le menu.hash: le hash du modèle. La forme backtick le calcule pour vous.shop: l'identifiant du concessionnaire qui la vend, par exemple celui par défaut. Un nom de magasin qui n'existe pas signifie qu'aucun magasin ne vend la voiture.
La disposition exacte dépend de la version de qb-core. Certaines versions utilisent une table indexée par le modèle, d'autres une liste simple. Ouvrez votre propre fichier et copiez une entrée voisine, puis changez les valeurs, pour que la structure corresponde toujours.
Après l'édition, redémarrez qb-core et la ressource du concessionnaire. Redémarrer le core sur un serveur actif déconnecte les joueurs dans certaines configurations, donc faites-le à un moment calme, ou redémarrez tout le serveur.
QBox : qbx_core shared vehicles
QBox garde les véhicules dans son propre core, qbx_core/shared/vehicles.lua. L'idée est la même que sur QBCore : une entrée avec le modèle, nom, marque, prix, catégorie et magasin. QBox change sa disposition de données entre les versions, donc ouvrez le fichier et copiez une entrée qui fonctionne déjà sur votre version, puis éditez-la.
Redémarrez qbx_core et votre concessionnaire. N'exécutez pas un dossier qb-core séparé à côté, voir conversion de scripts QBCore en QBox.
Scripts de concessionnaire avec leur propre configuration
Pas tous les concessionnaires utilisent la liste du framework. Certains lisent leur propre fichier de configuration ou une table de base de données, et la table vehicles ou le fichier partagé est ignoré. Vérifiez d'abord la configuration du script pour une liste de véhicules. S'il en a une, ajoutez aussi la voiture là.
Problèmes de nom, prix et catégorie
La voiture n'affiche pas de nom. Le champ name est vide, ou le concessionnaire utilise le nom d'affichage du jeu. Un nom d'affichage en jeu vient de AddTextEntry avec le gameName du modèle dans vehicles.meta. Sans cela le magasin peut afficher NULL ou le modèle. Définissez le label dans vos données.
Une voiture qui coûte 0 ou est gratuite. Le prix est manquant ou pas un nombre. Supprimez les guillemets autour.
La catégorie ne s'affiche pas. Sur ESX, la valeur category n'a pas de ligne dans vehicle_categories. Sur QBCore le label de catégorie est manquant, ou le magasin filtre par une catégorie qu'il ne connaît pas.
Mauvais nom de génération. Mycar et mycar ne sont pas les mêmes dans les recherches de données. Utilisez le nom exactement comme défini, en minuscules.
Acheté, mais pas de voiture. L'achat a fonctionné et la génération non. Le modèle n'est pas streamé sur le client, ou la plaque et le propriétaire ne sont pas enregistrés. Vérifiez la console et la base de données, voir les tables du garage.
Gestion et performance des voitures addon
Une voiture ajoutée avec une mauvaise gestion ou un modèle lourd nuit à tout le serveur. Vérifiez la gestion avant de la vendre, éditez la gestion du véhicule, et testez le modèle pour la mémoire de texture, voir assets surdimensionnés.
Ajouter beaucoup de voitures à la fois
Pour un pack de voitures, une boucle en SQL économise du temps sur ESX. Écrivez les lignes en une seule instruction :
INSERT INTO vehicles (name, model, price, category) VALUES
('Car A', 'cara', 60000, 'mycars'),
('Car B', 'carb', 75000, 'mycars'),
('Car C', 'carc', 90000, 'mycars');Sur QBCore et QBox, collez les entrées l'une après l'autre dans le fichier Lua, avec une virgule après chacune.
Checklist
| Problème | Solution |
|---|---|
La voiture fonctionne avec /car mais n'est pas vendue |
Ajoutez-la à la table vehicles, ou shared/vehicles.lua |
| La voiture manque d'une catégorie sur ESX | Le category doit correspondre à un name dans vehicle_categories |
| Pas de nom ou prix affiché | Remplissez name et price, avec le prix en tant que nombre |
| Rien ne vend la voiture sur QBCore ou QBox | Vérifiez que la valeur shop correspond à un concessionnaire |
| L'achat ne génère rien | Le modèle n'est pas streamé : corrigez d'abord la voiture addon |
| Les données éditées n'ont pas d'effet | Redémarrez la ressource de données et le concessionnaire |
| Erreurs du fichier Lua après l'édition | Vérifiez les virgules et accolades autour de votre nouvelle entrée |
Réponses rapides
Pourquoi ma voiture addon ne se trouve pas dans le concessionnaire ?
Le magasin ne liste que ce qui est dans ses données : la table vehicles sur ESX, ou shared/vehicles.lua sur QBCore et QBox. Ajouter la voiture au serveur stream est une étape séparée, et les deux sont nécessaires.
Quel est le nom du modèle que je mets dans la table ?
Le nom de génération du véhicule, celui utilisé dans /car, qui est défini dans vehicles.meta du véhicule. Il doit correspondre exactement, en minuscules.
Dois-je redémarrer le serveur après l'ajout d'une voiture ?
Redémarrez la ressource qui contient les données, et le script du concessionnaire. Sur ESX le magasin lit généralement la table au démarrage, donc redémarrer suffit.
Des scripts sans ce problème
Advanced BoostingDu boosting de véhicules piloté par tablette : contrats de classe D à S+, crews et file d’attente en direct.Voir le script →
Chameleon Paints82 peintures caméléon à reflets changeants, dans un menu à appliquer en un clic.Voir le script →
Shop CreatorCréez un magasin en moins d’une minute — propriétaires, employés, coffres et braquages inclus.Voir le script →