Llaves de vehículos de FiveM: ¿no puedes conducir tu propio auto o bloquearlo? Arréglalo

Cómo funcionan los sistemas de llaves de vehículos de FiveM: listas de placas, dar llaves después de un spawn o compra, bloquear con SetVehicleDoorsLocked, y por qué pierdes acceso a tu propio auto.

Síntomas 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.

Un auto que funcionaba ayer y ahora está bloqueado para su propietario es casi siempre un problema de lista de llaves, no un error del juego. Este artículo explica cómo funcionan los sistemas de llaves, cómo dar llaves después de un spawn o una compra, y qué verificar cuando no puedes conducir tu propio vehículo.

Cómo funciona un sistema de llaves

El juego en sí no tiene llaves. Solo tiene un estado de bloqueo en cada vehículo. Un recurso de llaves agrega el resto encima:

  1. Almacena cuales placas tiene una llave cada jugador. La placa es la identidad del auto, ya que el identificador de la entidad cambia cada vez que el auto se spawne.
  2. Bloquea o desbloquea el vehículo con nativos.
  3. Bloquea el motor, o la puerta, para jugadores que no están en la lista.

El nativo de bloqueo está en el cliente:

lua
-- 1 = unlocked, 2 = locked
SetVehicleDoorsLocked(vehicle, 2)

local status = GetVehicleDoorLockStatus(vehicle)
print(status)

SetVehicleDoorsLocked establece el estado y GetVehicleDoorLockStatus lo lee nuevamente. Además de 1 y 2 hay otros estados, como uno que bloquea el auto solo para el jugador. Para un bloqueo y desbloqueo simple solo necesitas esos dos.

Consejo: bloquear un auto no impide que un jugador rompa una ventana o saque al conductor de un auto NPC desbloqueado. Todo lo que va más allá del estado de bloqueo depende del script de llaves.

Quién posee la lista

Dónde vive la lista decide qué se rompe después de un reinicio:

  • Solo memoria. La lista se reconstruye cuando un jugador se une, desde los vehículos que posee en la base de datos. Si el script se reinicia mientras juegas, la lista está vacía hasta que te reconectes.
  • Base de datos o basado en artículos. Las llaves son artículos en el inventario, con la placa en los metadatos del artículo. La llave sobrevive a un reinicio, pero una placa cambiada la rompe.
  • Verificación del propietario. El script compara el identificador del jugador con el propietario de la placa en owned_vehicles (ESX) o player_vehicles (QBCore y QBox). No existe una lista separada.

Averigua cuál es el que tu recurso utiliza antes de depurar. El artículo sobre guardar vehículos poseídos en la base de datos cubre las tablas que la mayoría de los scripts de llaves leen.

Da llaves después de un spawn o una compra

Cada vez que tu propio script crea un vehículo para un jugador, el recurso de llaves no lo sabe. Tienes que decirle, en este orden:

  1. Crea el vehículo.
  2. Establece la placa con SetVehicleNumberPlateText.
  3. Llama la exportación o evento del recurso de llaves con esa 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 y GiveKeys son marcadores de posición. El nombre real está en la documentación del recurso que uses. Si es un evento, la misma regla se aplica: pasa la placa, no el identificador de la entidad.

Para una compra la placa debe ser almacenada con la nueva fila en la base de datos, y las llaves dadas en el mismo momento, o el comprador sale del concesionario con un auto que ya no coincide con nada. Ver spawning vehicles para el manejo de placas.

Forzar cerraduras y cableado

Estas son características del script de llaves, no del juego. La lógica habitual es:

  • Un jugador que no está en la lista de llaves intenta entrar en un auto bloqueado. El script ejecuta una verificación de habilidad o una barra de progreso.
  • Con éxito desbloquea el auto con SetVehicleDoorsLocked(vehicle, 1). Para cableado también permite que el motor arranque en esa sesión, típicamente recordando la placa en una lista temporal.
  • Con fracaso puede alertar a la policía o romper la herramienta.

Si construyes la tuya, mantén la decisión de resultado en el servidor. Un cliente que decide solo si está permitido desbloquear cualquier auto puede ser abusado con un menú de mods.

No puedes conducir tu propio auto

Pasa por estas causas en orden:

La lista de llaves se perdió. Un reinicio de script, un crash o un refresh; restart del recurso de llaves vacía una lista basada en memoria. Reconéctate, o dispara la actualización propia del script.

La placa cambió. Una placa se almacena en tres lugares: el vehículo en el juego, la lista de llaves o el artículo de llave, y la fila de la base de datos. Si un script cambia uno de ellos (un cambiador de placas, un artículo de placa falsa, un script de afinación) los otros dejan de coincidir. Compara la placa en pantalla con la que está en tu tabla:

sql
SELECT owner, plate FROM owned_vehicles WHERE plate LIKE '%MIC%';

Las placas también difieren en espacios en blanco. MIC 001 y MIC001 son dos placas diferentes para la mayoría de los scripts, así que recorta y compara en el mismo formato en todas partes.

El propietario equivocado. La fila tiene un identificador o citizenid antiguo, así que la verificación del propietario falla. Esta es la misma causa que un auto faltante en el garaje.

El auto fue spawneado por otro script. Cualquier cosa creada sin una llamada de llave está bloqueada para todos. Agrega la llamada de llaves donde se spawne.

Dos recursos de llaves. Ejecutar dos scripts de llaves que ambos bloqueen el auto lo hace alternar entre estados. Mantén uno.

Prueba rápidamente en el juego

Cuando dudes del estado de bloqueo en sí, léelo desde el 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)

Imprime el estado y la placa. Si el estado es 1 y aún así no puedes conducir, el script de llaves está bloqueando el motor, no el bloqueo.

Lista de verificación

Síntoma Solución
Bloqueado después de un reinicio La lista de llaves está en memoria: reconéctate o deja que el script la reconstruya desde vehículos poseídos
El auto spawneado está bloqueado para ti Llama la exportación o evento del recurso de llaves con la placa después de SetVehicleNumberPlateText
Auto comprado pero sin llaves Da llaves en el momento de la compra y almacena la misma placa en la base de datos
Las llaves dejaron de funcionar después de un cambio de placa Actualiza la placa en el juego, la lista de llaves y la base de datos juntas
La placa se ve bien pero no coincide Verifica espacios y mayúsculas/minúsculas, usa un formato en todas partes
El estado de la puerta es 1 pero el motor sigue apagado El script de llaves bloquea el motor: verifica su lista, no el bloqueo
El auto alterna entre bloqueado y desbloqueado Dos scripts de llaves se están ejecutando: quita uno

Respuestas rápidas

¿Por qué no puedo conducir mi propio auto después de un reinicio?

La mayoría de los scripts de llaves mantienen la lista de llaves en memoria. Después de un reinicio o un reinicio de script la lista está vacía, así que el auto está bloqueado o el motor se niega a comenzar. El script tiene que reconstruir la lista desde tus vehículos poseídos cuando cargas.

¿Cómo doy llaves a un auto que spawnee con mi propio script?

Llama la exportación o evento de tu recurso de llaves con la placa, después de que hayas establecido la placa. Cada script de llaves nombra esta llamada de forma diferente, así que lee su documentación en lugar de copiar una llamada de otro servidor.

¿Romper la placa rompe mis llaves?

Sí, en cualquier sistema que combine llaves por placa. Si la placa cambia en el juego pero no en la lista de llaves y la base de datos, el vehículo ya no coincide con una llave. Cambia las tres juntas.

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 →Car BombColoca, detecta y desactiva bombas en coches — con detonador y minijuego de C4.Ver script →Chameleon Paints82 pinturas camaleón que cambian de color, en un menú de un clic.Ver script →

Sigue leyendo