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:
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:
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.
-- 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:
SELECT owner, plate, stored FROM owned_vehicles WHERE plate = 'MIC 001';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.identifierpara aquele personagem. Com um script multicaráter pode carregar um prefixo comochar1:e um veículo comprado antes de instalar multicaráter tem o valor antigo sem ele. - QBCore e QBox: o
citizenidna tabelaplayers.
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:
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:
UPDATE owned_vehicles SET `stored` = 1 WHERE `stored` = 0;QBCore e QBox, defina o estado como armazenado:
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
WHEREem 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:
-- 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:
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 001eMIC001sã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:
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 →