Chaves de veículos FiveM: não consegue dirigir seu próprio carro ou trancá-lo? Corrija
Como sistemas de chaves de veículos FiveM funcionam: listas de placas, dando chaves após um desova ou compra, travando com SetVehicleDoorsLocked, e por que você perde acesso ao seu próprio carro.
Sintomas típicos:
You get in your own car: "Vehicle is locked", the engine will not start,
or the key script says you do not have the keys.Um carro que funcionava ontem e agora está trancado para seu proprietário é quase sempre um problema de lista de chaves, não um bug do jogo. Este artigo explica como sistemas de chaves funcionam, como dar chaves após um desova ou compra, e o que verificar quando você não consegue dirigir seu próprio veículo.
Como funciona um sistema de chaves
O jogo em si não possui chaves. Ele tem apenas um estado de traço em cada veículo. Um recurso de chave adiciona o resto em cima disso:
- Ele armazena qual placas cada jogador tem uma chave para. A placa é a identidade do carro, pois o identificador de entidade muda toda vez que o carro é desovado.
- Ele tranca ou destrava o veículo com natives.
- Ele bloqueia o motor, ou a porta, para jogadores que não estão na lista.
O native de traço é no lado do cliente:
-- 1 = unlocked, 2 = locked
SetVehicleDoorsLocked(vehicle, 2)
local status = GetVehicleDoorLockStatus(vehicle)
print(status)SetVehicleDoorsLocked define o estado e GetVehicleDoorLockStatus o lê de volta. Além de 1 e 2 há outros estados, como um que tranca o carro apenas para o jogador. Para um traço e destravamento simples você precisa apenas desses dois.
Dica: trancar um carro não impede um jogador de quebrar uma janela ou arrancar o motorista de um carro NPC destrancado. Qualquer coisa além do estado de traço é responsabilidade do script de chave.
Quem possui a lista
Onde a lista reside decide o que quebra após um reinício:
- Apenas memória. A lista é reconstruída quando um jogador se junta, a partir dos veículos que possuem no banco de dados. Se o script reiniciar enquanto você joga, a lista está vazia até você se reconectar.
- Baseado em banco de dados ou item. As chaves são itens no inventário, com a placa nos metadados do item. A chave sobrevive a um reinício, mas uma placa alterada a quebra.
- Verificação de proprietário. O script compara o identificador do jogador com o proprietário da placa em
owned_vehicles(ESX) ouplayer_vehicles(QBCore e QBox). Nenhuma lista separada existe.
Descubra qual deles seu recurso usa antes de depurar. O artigo sobre salvando veículos possuídos no banco de dados cobre as tabelas que a maioria dos scripts de chave leem.
Dê chaves após um desova ou uma compra
Sempre que seu próprio script cria um veículo para um jogador, o recurso de chave não sabe disso. Você tem que informá-lo, nesta ordem:
- Crie o veículo.
- Defina a placa com
SetVehicleNumberPlateText. - Chame o export ou evento do recurso de chave com essa placa.
local vehicle = CreateVehicle(model, coords.x, coords.y, coords.z, heading, true, false)
SetVehicleNumberPlateText(vehicle, plate)
-- the name of this call depends on your key resource: check its documentation
exports['your_key_resource']:GiveKeys(plate)your_key_resource e GiveKeys são placeholders. O nome real está na documentação do recurso que você usa. Se for um evento, a mesma regra se aplica: passe a placa, não o identificador de entidade.
Para uma compra a placa deve ser armazenada com a nova linha no banco de dados, e as chaves dadas no mesmo momento, ou o comprador sai da concessionária com um carro que não combina mais com nada. Veja desovando veículos para o manuseio de placa.
Arrombamento e hot-wiring
Estas são funcionalidades do script de chave, não do jogo. A lógica usual é:
- Um jogador que não está na lista de chaves tenta entrar em um carro trancado. O script executa uma verificação de habilidade ou uma barra de progresso.
- No sucesso, ele destrava o carro com
SetVehicleDoorsLocked(vehicle, 1). Para hot-wiring também deixa o motor ligar para essa sessão, tipicamente lembrando a placa em uma lista temporária. - No fracasso, ele pode alertar a polícia ou quebrar a ferramenta.
Se você construir o seu próprio, mantenha a decisão de resultado no servidor. Um cliente que decide sozinho se é permitido desbloquear qualquer carro pode ser abusado com um menu mod.
Não consegue dirigir seu próprio carro
Trabalhe através dessas causas em ordem:
A lista de chaves foi perdida. Um reinício de script, um crash ou um refresh; restart do recurso de chave esvazia uma lista baseada em memória. Reconecte, ou dispare o próprio refresh do script.
A placa mudou. Uma placa é armazenada em três lugares: o veículo no jogo, a lista de chaves ou item de chave, e a linha do banco de dados. Se um script alterar um deles (um mudador de placa, um item de placa falsa, um script de tuning) os outros param de combinar. Compare a placa na tela com a na sua tabela:
SELECT owner, plate FROM owned_vehicles WHERE plate LIKE '%MIC%';Placas também diferem em espaço em branco. MIC 001 e MIC001 são duas placas diferentes para a maioria dos scripts, portanto aparar e comparem no mesmo formato em todos os lugares.
O proprietário errado. A linha tem um identificador antigo ou citizenid, portanto a verificação do proprietário falha. Esta é a mesma causa que um carro faltando da garagem.
O carro foi desovado por outro script. Qualquer coisa criada sem uma chamada de chave é trancada para todos. Adicione a chamada de chaves onde ela é desovada.
Dois recursos de chave. Executar dois scripts de chave que ambos trancam o carro faz ele alternar entre estados. Mantenha um.
Teste rápido no jogo
Quando você duvida do próprio estado de traço, leia-o do cliente:
RegisterCommand('lockstate', function()
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
if vehicle == 0 then return end
print('lock status', GetVehicleDoorLockStatus(vehicle), GetVehicleNumberPlateText(vehicle))
end, false)Isso imprime o estado e a placa. Se o estado é 1 e você ainda não consegue dirigir, o script de chave está bloqueando o motor, não o traço.
Checklist
| Sintoma | Correção |
|---|---|
| Trancado depois de um reinício | A lista de chaves está na memória: reconecte ou deixe o script reconstruir a partir de veículos possuídos |
| Carro desovado está trancado para você | Chame o export ou evento do recurso de chave com a placa depois de SetVehicleNumberPlateText |
| Carro comprado mas sem chaves | Dê chaves no momento da compra e armazene a mesma placa no banco de dados |
| As chaves pararam de funcionar após uma mudança de placa | Atualize a placa no jogo, a lista de chaves e o banco de dados juntos |
| A placa parece correta mas não combina | Verifique espaços e caso de letra, use um formato em todos os lugares |
Estado da porta é 1 mas o motor fica desligado |
O script de chave bloqueia o motor: verifique sua lista, não o traço |
| Carro alterna entre trancado e destrancado | Dois scripts de chave estão em execução: remova um |
Respostas rápidas
Por que não consigo dirigir meu próprio carro depois de um reinício?
A maioria dos scripts de chave mantém a lista de chaves na memória. Depois de um reinício ou um reinício de script a lista está vazia, portanto o carro está trancado ou o motor se recusa a ligar. O script deve reconstruir a lista de seus veículos possuídos quando você carregar.
Como dou chaves para um carro que desovei com meu próprio script?
Chame o export ou evento de seu recurso de chave com a placa, depois de definir a placa. Todo script de chave nomeia esta chamada de forma diferente, portanto leia sua documentação em vez de copiar uma chamada de outro servidor.
Alterar a placa quebra minhas chaves?
Sim, em qualquer sistema que combine chaves por placa. Se a placa mudar no jogo mas não na lista de chaves e no banco de dados, o veículo não combina mais com uma chave. Altere todos os três juntos.
Scripts sem esse problema
Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →
Car BombPlante, detecte e desarme bombas em veículos — com celular detonador e minigame de C4.Ver script →
Chameleon Paints82 pinturas camaleão que mudam de cor, num menu de um clique.Ver script →