Garaje de FiveM: owned_vehicles y player_vehicles, coches faltantes reparados

¿Faltan vehículos en el garaje? Cómo funcionan las tablas owned_vehicles de ESX y player_vehicles de QBCore, las columnas stored y state, y el SQL para reparar coches atrapados afuera.

Síntomas típicos:

text
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.

Casi todo script de garaje lee lo mismo: una tabla con una fila por vehículo propiedad. Cuando falta un coche, la fila es incorrecta, no el script. Este artículo explica las dos tablas estándar, qué significan las columnas stored y state, y el SQL que arregla los casos habituales.

Las dos tablas

ESX usa owned_vehicles. QBCore y QBox usan player_vehicles. Los nombres son los mismos en todos los servidores, las columnas exactas dependen de tu versión y tu script de garaje, así que mira la tuya primero:

sql
DESCRIBE owned_vehicles;
DESCRIBE player_vehicles;

ESX: owned_vehicles

Las columnas principales en ESX Legacy:

Columna Contenido
owner El identificador ESX del jugador
plate La placa, única por coche
vehicle Un texto JSON con las propiedades del vehículo
type car, boat, aircraft...
stored 1 en el garaje, 0 afuera en el mundo
job Establecido para vehículos de trabajo, de otra forma vacío

Los scripts de garaje añaden sus propias columnas, por ejemplo para el nombre del garaje o un estado de impugnación.

QBCore y QBox: player_vehicles

Columna Contenido
citizenid El personaje que posee el coche
license El identificador de licencia del jugador
vehicle El nombre del modelo
hash El hash del modelo
mods Un texto JSON con las propiedades del vehículo
plate La placa
garage El id del garaje al que pertenece el coche
state 0 afuera, 1 garaged, 2 impounded
fuel, engine, body Últimos valores guardados

QBox usa la misma tabla con las mismas ideas. Otras columnas, como datos financieros, varían.

Propiedades como JSON

La columna vehicle en ESX y la columna mods en QBCore contienen la apariencia y ajustes del coche como JSON: colores, mods, ruedas, placa, extras, neón, etc. Un garaje lo lee cuando sacas el coche, y lo escribe de nuevo cuando lo almacenas.

lua
-- when storing, on the client
local props = lib.getVehicleProperties(vehicle)
TriggerServerEvent('my_garage:store', plate, json.encode(props))

El JSON debe ser válido. Si un script escribió una cadena rota, el coche no puede ser restaurado y aparece stock o nada en absoluto. El artículo sobre vehicle properties muestra cómo construir y aplicarlas.

Vehículos faltantes del garaje

Ejecuta estos en orden.

1. La fila existe pero pertenece a otra persona

La lista del garaje filtra por propietario. Si el valor del propietario no es el que el servidor usa para tu personaje, la fila es invisible:

sql
SELECT owner, plate, stored FROM owned_vehicles WHERE plate = 'MIC 001';
sql
SELECT citizenid, license, plate, state FROM player_vehicles WHERE plate = 'MIC 001';

Compara el propietario con tu personaje real:

  • ESX: el identificador en users.identifier para ese personaje. Con un script de múltiples personajes puede llevar un prefijo como char1:, y un vehículo comprado antes de que instalases múltiples personajes tiene el valor anterior sin él.
  • QBCore y QBox: el citizenid en la tabla players.

Después de un cambio de framework, una importación de otro servidor o una inserción manual, esta es la causa más común. Arréglalo haciendo que la fila apunte al valor correcto:

sql
UPDATE owned_vehicles SET owner = 'char1:abcdef...' WHERE plate = 'MIC 001';
UPDATE player_vehicles SET citizenid = 'ABC12345' WHERE plate = 'MIC 001';

Reemplaza los valores con los reales de tus tablas.

2. El state está atrapado «afuera»

Un coche que sacaste y que nunca regresó, por ejemplo después de un bloqueo o un reinicio, permanece marcado como afuera. El garaje solo enumera coches almacenados.

ESX, establece la bandera stored de vuelta:

sql
UPDATE owned_vehicles SET `stored` = 1 WHERE `stored` = 0;

QBCore y QBox, establece el state a garaged:

sql
UPDATE player_vehicles SET state = 1 WHERE state = 0;

Cuidado: en un servidor en vivo esto también almacena coches que los jugadores están conduciendo ahora mismo. Ejecuta al inicio, o limita con un WHERE en una placa o un propietario.

Muchos servidores ejecutan una limpieza como esta automáticamente cuando el recurso se inicia, ya que después de un reinicio ningún vehículo puede estar aún afuera. Si el tuyo no lo hace, puedes hacerlo tú mismo:

lua
-- 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)

Observa las comillas invertidas alrededor de stored en la consulta de ESX: stored es una palabra reservada en MySQL y falla sin ellas. Algunos scripts luego envían estos coches a un estado de impugnación en lugar del garaje, así que comprueba qué espera tu garaje.

3. El id del garaje no coincide

En QBCore la columna garage dice en qué garaje vive el coche. Un garaje nombrado en tu configuración que no está en la fila, o un garaje renombrado, no muestra nada. Enumera los valores en uso:

sql
SELECT garage, COUNT(*) FROM player_vehicles GROUP BY garage;

Establece los coches en un garaje que exista en tu configuración.

4. El tipo de coche no coincide

Los scripts de garaje separan coches, botes y aeronaves por la columna type o la clase de vehículo. Un bote guardado como car nunca aparece en el garaje de botes.

Placas

La placa vincula el mundo, la base de datos y las claves. Mantén estas reglas:

  • La placa es única por fila. Un duplicado causa que el coche incorrecto se cargue.
  • La placa es como máximo 8 caracteres en el juego, la columna puede ser más larga en ESX.
  • Los espacios cuentan. MIC 001 y MIC001 son dos placas, así que usa un formato.

Para claves, ve vehicle keys.

Añade un coche a un jugador por SQL

Puedes dar un vehículo insertando una fila. Toma la lista de columnas de tu propio DESCRIBE, ya que una columna requerida faltante hace que la inserción falle:

sql
INSERT INTO owned_vehicles (owner, plate, vehicle, type, `stored`)
VALUES ('identifier-here', 'MIC 001', '{"model":-1130810103,"plate":"MIC 001"}', 'car', 1);

El model en el JSON es el hash del modelo, no el nombre. Tu framework o tu garaje generalmente tiene un comando o una función que hace esto correctamente, que es la forma más segura cuando existe.

Lista de verificación

Síntoma Solución
El garaje dice que no hay vehículos Comprueba que owner o citizenid coincida con tu personaje
Coche atrapado afuera después de un bloqueo o reinicio UPDATE la bandera stored o state de vuelta a garaged, idealmente al inicio
El coche comprado no se muestra Comprueba que la fila existe, el propietario, y el garaje o tipo
La consulta stored da un error de sintaxis Pon comillas invertidas alrededor de stored
El coche se carga sin mods Comprueba que el JSON vehicle o mods es válido y no está vacío
Se carga el coche incorrecto Busca placas duplicadas
Bote o aeronave faltante Comprueba que la columna type coincida con el garaje

Respuestas rápidas

¿Por qué mi coche no está en el garaje?

O la fila no está vinculada a tu personaje (propietario incorrecto o citizenid), o el coche está marcado como afuera. Comprueba la columna del propietario y la columna stored o state en la base de datos.

¿Qué significa state en player_vehicles?

En QBCore y QBox, state es un número: 0 significa que el coche está afuera en el mundo, 1 significa que está almacenado en un garaje, 2 significa que está en la impugnación. Un coche atrapado en 0 no aparece en la lista del garaje.

¿Cómo pongo todos los coches de vuelta en el garaje?

Ejecuta un UPDATE que establezca la bandera stored o state en el valor garaged para las filas que están afuera. Es mejor ejecutarla al inicio del servidor, ya que ningún coche puede estar realmente afuera después de un reinicio.

Scripts que evitan este problema

Advanced BoostingBoosting de vehículos desde una tablet: contratos de clase D a S+, crews y cola en vivo.Ver script →Chameleon Paints82 pinturas camaleón que cambian de color, en un menú de un clic.Ver script →Car BombColoca, detecta y desactiva bombas en coches — con detonador y minijuego de C4.Ver script →

Sigue leyendo