Garage di FiveM: owned_vehicles e player_vehicles, auto mancanti risolte
Veicoli mancanti dal garage? Come funzionano le tabelle ESX owned_vehicles e QBCore player_vehicles, le colonne archiviate e state, e l'SQL per riparare le auto bloccate.
Sintomi tipici:
You bought a car, and the garage says "No vehicles". Or the car was parked at the street, the server restarted, and it is gone.Quasi ogni script del garage legge la stessa cosa: una tabella con una riga per ogni veicolo posseduto. Quando un'auto manca, la riga è sbagliata, non lo script. Questo articolo spiega le due tabelle standard, cosa significano le colonne archiviate e state, e l'SQL che corregge i casi usuali.
Le due tabelle
ESX usa owned_vehicles. QBCore e QBox usano player_vehicles. I nomi sono uguali su tutti i server, le esatte colonne dipendono dalla tua versione e dal tuo script del garage, quindi controlla il tuo prima:
DESCRIBE owned_vehicles;
DESCRIBE player_vehicles;ESX: owned_vehicles
Le colonne principali in ESX Legacy:
| Colonna | Contenuto |
|---|---|
owner |
L'identificatore ESX del giocatore |
plate |
La targa, unica per auto |
vehicle |
Un testo JSON con le proprietà del veicolo |
type |
car, boat, aircraft... |
stored |
1 nel garage, 0 fuori nel mondo |
job |
Impostato per i veicoli di lavoro, altrimenti vuoto |
Gli script del garage aggiungono le loro colonne, ad esempio per il nome del garage o uno stato di impound.
QBCore e QBox: player_vehicles
| Colonna | Contenuto |
|---|---|
citizenid |
Il personaggio che possiede l'auto |
license |
L'identificatore di licenza del giocatore |
vehicle |
Il nome del modello |
hash |
L'hash del modello |
mods |
Un testo JSON con le proprietà del veicolo |
plate |
La targa |
garage |
L'id del garage a cui appartiene l'auto |
state |
0 fuori, 1 in garage, 2 sequestrato |
fuel, engine, body |
Ultimi valori salvati |
QBox usa la stessa tabella con le stesse idee. Le altre colonne, come i dati finanziari, variano.
Proprietà come JSON
La colonna vehicle su ESX e la colonna mods su QBCore mantengono l'aspetto e la messa a punto dell'auto come JSON: colori, mod, ruote, targa, extra, neon e così via. Un garage lo legge quando togli l'auto, e lo scrive di nuovo quando l'archivi.
-- when storing, on the client
local props = lib.getVehicleProperties(vehicle)
TriggerServerEvent('my_garage:store', plate, json.encode(props))Il JSON deve essere valido. Se uno script ha scritto una stringa rotta, l'auto non può essere ripristinata e genera stock o no affatto. L'articolo su proprietà del veicolo mostra come costruirle e applicarle.
Veicoli mancanti dal garage
Esegui questi in ordine.
1. La riga esiste ma appartiene a qualcun altro
L'elenco del garage filtra per proprietario. Se il valore del proprietario non è quello che il server usa per il tuo personaggio, la riga è invisibile:
SELECT owner, plate, stored FROM owned_vehicles WHERE plate = 'MIC 001';SELECT citizenid, license, plate, state FROM player_vehicles WHERE plate = 'MIC 001';Confronta il proprietario con il tuo vero personaggio:
- ESX: l'identificatore in
users.identifierper quel personaggio. Con uno script multicarattere può portare un prefisso comechar1:, e un veicolo acquistato prima di aver installato multicarattere ha il vecchio valore senza di esso. - QBCore e QBox: il
citizenidnella tabellaplayers.
Dopo un cambio di framework, un'importazione da un altro server o un inserimento manuale, questa è la causa più comune. Correggi facendo puntare la riga al valore giusto:
UPDATE owned_vehicles SET owner = 'char1:abcdef...' WHERE plate = 'MIC 001';
UPDATE player_vehicles SET citizenid = 'ABC12345' WHERE plate = 'MIC 001';Sostituisci i valori con i veri valori dalle tue tabelle.
2. Lo state è bloccato "fuori"
Un'auto che hai tolto e che non è mai tornata, ad esempio dopo un crash o un riavvio, rimane marcata come fuori. Il garage elenca solo le auto archiviate.
ESX, imposta il flag archiviato indietro:
UPDATE owned_vehicles SET `stored` = 1 WHERE `stored` = 0;QBCore e QBox, imposta lo state su in garage:
UPDATE player_vehicles SET state = 1 WHERE state = 0;Attenzione: su un server live questo archivia anche le auto che i giocatori stanno guidando in questo momento. Eseguilo all'avvio, o limitalo con un
WHEREsu una sola targa o un solo proprietario.
Molti server eseguono una pulizia come questa automaticamente quando la risorsa si avvia, poiché dopo un riavvio nessun veicolo può ancora essere fuori. Se il tuo non lo fa, puoi farlo tu stesso:
-- server side, runs when the garage resource starts
AddEventHandler('onResourceStart', function(resource)
if resource ~= GetCurrentResourceName() then return end
MySQL.update('UPDATE player_vehicles SET state = 1 WHERE state = 0')
end)Nota i backtick intorno a stored nella query ESX: stored è una parola riservata in MySQL e fallisce senza di loro. Alcuni script allora inviano queste auto a uno stato di impound invece che al garage, quindi controlla cosa il tuo garage si aspetta.
3. L'id del garage non corrisponde
Su QBCore la colonna garage dice quale garage l'auto vive in. Un garage denominato nella tua config che non è nella riga, o un garage rinominato, non mostra nulla. Elenca i valori in uso:
SELECT garage, COUNT(*) FROM player_vehicles GROUP BY garage;Imposta le auto a un garage che esiste nella tua config.
4. Il tipo di auto non corrisponde
Gli script del garage separano auto, barche e aerei per la colonna type o la classe del veicolo. Una barca salvata come car non appare mai nel garage delle barche.
Targhe
La targa collega il mondo, il database e le chiavi. Mantieni queste regole:
- La targa è unica per riga. Un duplicato causa il caricamento dell'auto sbagliata.
- La targa è al massimo 8 caratteri nel gioco, la colonna può essere più lunga su ESX.
- Gli spazi contano.
MIC 001eMIC001sono due targhe, quindi usa un formato.
Per le chiavi, vedi chiavi del veicolo.
Aggiungi un'auto a un giocatore per SQL
Puoi dare un veicolo inserendo una riga. Prendi l'elenco delle colonne dal tuo DESCRIBE, poiché una colonna richiesta mancante fa fallire l'inserimento:
INSERT INTO owned_vehicles (owner, plate, vehicle, type, `stored`)
VALUES ('identifier-here', 'MIC 001', '{"model":-1130810103,"plate":"MIC 001"}', 'car', 1);Il model nel JSON è l'hash del modello, non il nome. Il tuo framework o il tuo garage di solito ha un comando o una funzione che lo fa correttamente, che è il modo più sicuro quando esiste.
Checklist
| Sintomo | Soluzione |
|---|---|
| Il garage dice nessun veicolo | Controlla che owner o citizenid corrisponda al tuo personaggio |
| Auto bloccata fuori dopo un crash o riavvio | Imposta UPDATE il flag archiviato o state di nuovo su in garage, idealmente all'avvio |
| L'auto comprata non si mostra | Controlla che la riga esista, il proprietario, e il garage o il tipo |
La query stored dà un errore di sintassi |
Metti i backtick intorno a stored |
| L'auto si carica senza mod | Controlla che il JSON vehicle o mods sia valido e non vuoto |
| L'auto sbagliata si carica | Cerca le targhe duplicate |
| Barca o aereo mancante | Controlla che la colonna type corrisponda al garage |
Risposte rapide
Perché la mia auto non è nel garage?
Sia la riga non è collegata al tuo personaggio (proprietario sbagliato o citizenid), o l'auto è marcata come fuori. Controlla la colonna del proprietario e la colonna archiviata o state nel database.
Cosa significa state in player_vehicles?
Su QBCore e QBox, state è un numero: 0 significa che l'auto è fuori nel mondo, 1 significa che è archiviata in un garage, 2 significa che è sequestrata. Un'auto bloccata a 0 non appare nell'elenco del garage.
Come rimetto ogni auto nel garage?
Esegui un UPDATE che imposta il flag archiviato o state al valore in garage per le righe che sono fuori. È meglio eseguirlo all'avvio del server, poiché nessun auto può davvero essere fuori dopo un riavvio.
Script senza questo problema
Advanced BoostingBoosting di veicoli dal tablet: contratti dalla classe D alla S+, crew e coda in tempo reale.Vedi script →
Chameleon Paints82 vernici camaleonte che cambiano colore, in un menu da applicare con un clic.Vedi script →
Car BombPiazza, individua e disinnesca bombe sui veicoli — con telefono detonatore e minigioco del C4.Vedi script →