Aller au contenu
Blog

Restaurer l’inventaire d’un joueur FiveM après un dupe ou un bug

Rendez à un joueur ses objets, son argent et ses voitures sur ESX, QBCore ou ox_inventory depuis une sauvegarde, sans restaurer tout le serveur. SQL inclus.

Par Termi

5 min de lecture
  • Backups
  • Rollback
  • ox_inventory
  • Dupes
Sur cette page

Un bug avale l’inventaire d’un joueur, ou un dupe laisse un joueur avec quarante pistolets qui portent le même numéro de série. Remettre tout le serveur à la nuit dernière pénalise tous ceux qui ont joué depuis. Mieux vaut restaurer seulement les lignes d’un personnage. Ce guide montre où ESX, QBCore et ox_inventory rangent ces lignes, comment les copier à la main depuis une sauvegarde et comment repérer les objets dupliqués.

Où se trouve un personnage dans la base

  • ESX garde le personnage dans users, avec identifier pour clé, l’argent dans la colonne JSON accounts et, avec ox_inventory, les objets dans inventory. Les voitures sont dans owned_vehicles, avec owner pour clé.
  • QBCore et Qbox le gardent dans players, avec citizenid pour clé et money et inventory en colonnes JSON. Les voitures sont dans player_vehicles.
  • ox_inventory ajoute la table ox_inventory pour les stashes, avec owner et name pour clé, et range le coffre et la boîte à gants d’une voiture dans les colonnes trunk et glovebox de la table des véhicules.
  • Tout le reste vit dans ses propres tables : user_licenses sur ESX, et playerskins, player_outfits et apartments sur QBCore.

Restaurer un personnage à la main

Il vous faut une sauvegarde antérieure au problème, chargée dans une base séparée. Ne la chargez jamais par-dessus la base en production. Assurez-vous d’abord que le joueur est hors ligne et le reste jusqu’à la fin : le framework enregistre l’inventaire qu’il garde en mémoire à la prochaine sauvegarde ou à la déconnexion, et cet enregistrement écrase votre restauration.

Chargez la sauvegarde dans une base jetable à côté de la base en production :

terminal
mysql -u root -p -e "CREATE DATABASE restore_scratch"
mysql -u root -p restore_scratch < fivem-2026-10-22.sql

Recopiez ensuite les colonnes du personnage depuis la base jetable. fivem est ici la base en production, mettez le nom de la vôtre :

QBCore · Qbox
UPDATE fivem.players AS live
JOIN restore_scratch.players AS old ON old.citizenid = live.citizenid
SET live.inventory = old.inventory, live.money = old.money
WHERE live.citizenid = 'ABC12345';
ESX · ox_inventory
UPDATE fivem.users AS live
JOIN restore_scratch.users AS old ON old.identifier = live.identifier
SET live.inventory = old.inventory, live.accounts = old.accounts
WHERE live.identifier = 'char1:9a4f00ab12cd34ef';

Les voitures et les stashes suivent le même schéma, par citizenid ou owner. Avant de recopier des lignes, vérifiez que le joueur n’a pas vendu une voiture et qu’une plaque n’appartient pas désormais à quelqu’un d’autre, puis supprimez la base jetable quand vous avez terminé.

Une restauration au niveau des lignes remet tout l’inventaire dans l’état de la sauvegarde : tout ce que le joueur a gagné depuis disparaît. Dites-lui à quelle heure vous avez restauré.

Repérez d’abord les objets dupliqués

Si les dégâts viennent d’un dupe, restaurer le dupeur ne suffit pas, car les copies ont peut-être déjà été vendues ou données. Les armes et les autres objets uniques portent un numéro de série : metadata.serial dans ox_inventory et info.serie dans qb-inventory. Le même numéro à deux endroits, c’est une copie. Sur MySQL 8 ou MariaDB 10.6 et plus récents, cette requête liste chaque numéro qui apparaît plus d’une fois chez les joueurs QBCore qui utilisent ox_inventory :

duplicate serials
SELECT j.serial, COUNT(*) AS copies, GROUP_CONCAT(p.citizenid) AS holders
FROM players AS p,
  JSON_TABLE(p.inventory, '$[*]' COLUMNS (serial VARCHAR(64) PATH '$.metadata.serial')) AS j
WHERE j.serial IS NOT NULL
GROUP BY j.serial
HAVING copies > 1;

Pour ESX, remplacez players et citizenid par users et identifier ; pour qb-inventory, prenez $.info.serie comme chemin. Les stashes, coffres et boîtes à gants contiennent aussi des objets : lancez donc la même requête sur ox_inventory.data et sur la table des véhicules avant de décider qui a dupé.

Restaurer un joueur avec FiveDock

FiveDock s’occupe du travail avec la base jetable. Sur Metro, vous choisissez une sauvegarde et un joueur dans le panel, et FiveDock restaure seulement les lignes liées aux identifiants de ce joueur dans les tables du framework : le personnage avec son argent et son inventaire, les voitures, les licences, les skins, les tenues, les appartements et les stashes ox_inventory. Avant tout changement, il affiche le nombre de lignes que la restauration va toucher.

Les alertes d’objets dupliqués sur Metro surveillent le même numéro de série dans deux inventaires, ou une pile qui grossit sans explication. Chaque détection garde qui détenait l’objet et une sauvegarde de ce moment : le point de restauration est donc déjà là quand vous regardez. Les alertes d’argent, sur tous les plans, publient sur Discord quand un transfert dépasse un seuil ou qu’un joueur gagne de l’argent trop vite.

Les sauvegardes elles-mêmes sont comprises dans tous les plans : quotidiennes sur Free et City, toutes les heures sur Metro, chiffrées sur votre machine avec une clé que FiveDock ne voit jamais. Sur Free et City, une restauration remet tout le serveur ; une seule table ou un seul joueur, c’est Metro.

Questions fréquentes

Peut-on restaurer un seul joueur sur FiveM sans restaurer tout le serveur ?

Oui. Chargez une sauvegarde antérieure au problème dans une base séparée et recopiez les lignes de ce personnage : players sur QBCore ou users sur ESX, plus ses voitures et ses stashes. FiveDock Metro le fait depuis le panel, un joueur à la fois, avec le nombre de lignes qu’il va modifier.

Comment trouver les objets dupés sur mon serveur FiveM ?

Cherchez les numéros de série uniques détenus plus d’une fois. ox_inventory stocke le numéro de série d’une arme dans metadata.serial : une requête JSON_TABLE sur la colonne d’inventaire liste donc chaque numéro qui a plus d’une copie. Les alertes d’objets dupliqués de FiveDock font cette vérification pour vous et publient sur Discord.

Restaurer un joueur supprime-t-il les objets gagnés après la sauvegarde ?

Oui. Une restauration au niveau des lignes remet toute la colonne dans l’état de la sauvegarde. Choisissez la sauvegarde la plus récente d’avant le problème et dites au joueur à quelle heure vous avez restauré.

Que se passe-t-il si le joueur est en ligne pendant la restauration ?

Son framework enregistre ce qu’il garde en mémoire à la prochaine sauvegarde ou à la déconnexion, ce qui écrase la restauration. Expulsez-le, ou attendez qu’il soit hors ligne.

Tous les articles