Garagem FiveM: owned_vehicles e player_vehicles, carros faltando corrigido

Veículos faltando da garagem? Como as tabelas ESX owned_vehicles e QBCore player_vehicles funcionam, as colunas armazenadas e de estado, e o SQL para consertar carros presos lá fora.

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

Quase todo script de garagem lê a mesma coisa: uma tabela com uma linha por veículo possuído. Quando um carro está faltando, a linha está errada, não o script. Este artigo explica as duas tabelas padrão, o que as colunas armazenadas e de estado significam, e o SQL que conserta os casos usuais.

As duas tabelas

ESX usa owned_vehicles. QBCore e QBox usam player_vehicles. Os nomes são os mesmos em servidores, as colunas exatas dependem de sua versão e seu script de garagem, então procure pelo seu primeiro:

sql
DESCRIBE owned_vehicles;
DESCRIBE player_vehicles;

ESX: owned_vehicles

As colunas principais no ESX Legacy:

Coluna Conteúdo
owner O identificador ESX do jogador
plate A placa, única por carro
vehicle Um texto JSON com as propriedades do veículo
type car, boat, aircraft...
stored 1 na garagem, 0 lá fora no mundo
job Define para veículos de emprego, caso contrário vazio

Scripts de garagem adicionam suas próprias colunas, por exemplo para o nome da garagem ou um estado de libra.

QBCore e QBox: player_vehicles

Coluna Conteúdo
citizenid O personagem que possui o carro
license O identificador de licença do jogador
vehicle O nome do modelo
hash O hash do modelo
mods Um texto JSON com as propriedades do veículo
plate A placa
garage O id da garagem a que o carro pertence
state 0 saído, 1 armazenado, 2 apreendido
fuel, engine, body Últimos valores salvos

QBox usa a mesma tabela com as mesmas ideias. Outras colunas, como dados de financiamento, variam.

Propriedades como JSON

A coluna vehicle no ESX e a coluna mods no QBCore contêm a aparência e ajuste do carro como JSON: cores, mods, rodas, placa, extras, neon e assim por diante. Uma garagem a lê quando você pega o carro e a escreve novamente quando o armazena.

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

O JSON deve ser válido. Se um script escreveu uma string quebrada, o carro não pode ser restaurado e spawna stock ou não. O artigo sobre propriedades do veículo mostra como construí-las e aplicá-las.

Veículos faltando da garagem

Execute estes em ordem.

1. A linha existe mas pertence a alguém mais

A lista de garagem filtra por proprietário. Se o valor do proprietário não for o que o servidor usa para seu personagem, a linha é invisível:

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';

Compare o proprietário com seu personagem real:

  • ESX: o identificador em users.identifier para aquele personagem. Com um script multicaráter pode carregar um prefixo como char1: e um veículo comprado antes de instalar multicaráter tem o valor antigo sem ele.
  • QBCore e QBox: o citizenid na tabela players.

Após uma mudança de framework, uma importação de outro servidor ou um insert manual, esta é a causa mais comum. Corrija-a apontando a linha para o valor correto:

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

Substitua os valores pelos reais das suas tabelas.

2. O estado está preso "saído"

Um carro que você tirou e que nunca voltou, por exemplo após um crash ou reinício, fica marcado como saído. A garagem apenas lista carros armazenados.

ESX, defina a flag armazenada de volta:

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

QBCore e QBox, defina o estado como armazenado:

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

Atenção: em um servidor ativo isto também armazena carros que jogadores estão dirigindo agora. Execute na inicialização ou limite com um WHERE em uma placa ou um proprietário.

Muitos servidores executam uma limpeza como esta automaticamente quando o recurso inicia, pois após um reinício nenhum veículo pode ainda estar saído. Se o seu não faz, você pode fazer você mesmo:

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)

Note os backticks ao redor de stored na consulta ESX: stored é uma palavra reservada no MySQL e falha sem eles. Alguns scripts então enviam esses carros para um estado de libra em vez da garagem, então verifique o que sua garagem espera.

3. O id da garagem não corresponde

Em QBCore a coluna garage diz qual garagem o carro vive. Uma garagem nomeada em sua config que não está na linha, ou uma garagem renomeada, mostra nada. Liste os valores em uso:

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

Defina os carros para uma garagem que existe em sua config.

4. O tipo de carro não corresponde

Scripts de garagem separam carros, barcos e aeronaves pela coluna type ou a classe do veículo. Um barco salvo como car nunca aparece na garagem de barcos.

Placas

A placa vincula o mundo, o banco de dados e as chaves. Mantenha estas regras:

  • A placa é única por linha. Um duplicado faz o carro errado carregar.
  • A placa é no máximo 8 caracteres no jogo, a coluna pode ser mais longa no ESX.
  • Espaços contam. MIC 001 e MIC001 são duas placas, então use um formato.

Para chaves, veja chaves de veículo.

Adicione um carro a um jogador por SQL

Você pode dar um veículo inserindo uma linha. Pegue a lista de colunas da sua própria DESCRIBE, pois uma coluna obrigatória faltando faz o insert falhar:

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

O model no JSON é o hash do modelo, não o nome. Seu framework ou sua garagem geralmente tem um comando ou uma função que faz isto corretamente, que é o caminho mais seguro quando existe.

Lista de verificação

Sintoma Correção
Garagem diz nenhum veículo Verifique que owner ou citizenid corresponde ao seu personagem
Carro preso lá fora após um crash ou reinício UPDATE a flag armazenada ou state de volta para armazenado, idealmente na inicialização
Carro comprado não aparece Verifique que a linha existe, o proprietário e a garagem ou tipo
Consulta stored dá um erro de sintaxe Coloque backticks ao redor de stored
Carro carrega sem mods Verifique que o JSON vehicle ou mods é válido e não vazio
Carro errado carrega Procure por placas duplicadas
Barco ou aeronave faltando Verifique que a coluna type corresponde à garagem

Respostas rápidas

Por que meu carro não está na garagem?

Ou a linha não está vinculada ao seu personagem (proprietário errado ou citizenid), ou o carro está marcado como saído. Verifique a coluna de proprietário e a coluna armazenada ou de estado no banco de dados.

O que significa estado em player_vehicles?

Em QBCore e QBox, state é um número: 0 significa que o carro está lá fora no mundo, 1 significa que está armazenado em uma garagem, 2 significa que está apreendido. Um carro preso em 0 não aparece na lista de garagem.

Como coloco cada carro de volta na garagem?

Execute uma UPDATE que define a flag armazenada ou estado para o valor de garagem para as linhas que estão lá fora. É melhor executar na inicialização do servidor, pois nenhum carro pode realmente estar lá fora após um reinício.

Scripts sem esse problema

Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →Chameleon Paints82 pinturas camaleão que mudam de cor, num menu de um clique.Ver script →Car BombPlante, detecte e desarme bombas em veículos — com celular detonador e minigame de C4.Ver script →

Continue lendo