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:

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

  1. 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.
  2. Ele tranca ou destrava o veículo com natives.
  3. 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:

lua
-- 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) ou player_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:

  1. Crie o veículo.
  2. Defina a placa com SetVehicleNumberPlateText.
  3. Chame o export ou evento do recurso de chave com essa placa.
lua
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:

sql
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:

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

Continue lendo