AI Core
Trabajos y serviciosai-police

ai-police para desarrolladores

El state bag de esposado de ai-police, cómo llegan sus acciones a otros scripts a través de AI Core, y sus eventos privados.

ai-police no tiene exports. Sus multas, registros, condenas de cárcel, alertas, cacheos y depósitos pasan todos por las capas de AI Core, así que otro script nunca llama a ai-police. Lo que otro script puede leer es el estado cuffed.

State bag cuffed

true en el state bag de un jugador mientras ai-police lo tiene esposado; false (o ausente) en otro caso. El servidor lo escribe; cualquier cliente puede leerlo. El nombre de la clave es PLAYER_BAGS.cuffed en @aicore-fivem/shared.

Lado: Servidor y cliente (lectura) · Espera: no

Firma
new PlayerState<boolean>(PLAYER_BAGS.cuffed, stateBoolean).get(serverId: number): boolean | undefined
Lua
local cuffed = Player(source).state.cuffed == true   -- servidor
local cuffed = LocalPlayer.state.cuffed == true      -- cliente, el jugador local

Devuelve

true mientras está esposado. false después de quitarle las esposas, undefined / nil cuando el jugador no ha sido esposado en esta sesión.

Ejemplo

Rechazar un objeto mientras el jugador está esposado:

import { inventory, notify, PlayerState, stateBoolean } from "@aicore-fivem/lib/server";
import { PLAYER_BAGS } from "@aicore-fivem/shared";

const cuffed = new PlayerState(PLAYER_BAGS.cuffed, stateBoolean);

inventory.registerUsableItem("radio", (source: number) => {
  if (cuffed.get(source) === true) {
    notify(source, "You cannot use that while cuffed", "error");
    return;
  }
  // ... abrir la radio
});

No fijes tú cuffed: ai-police lleva en el servidor su propia lista de jugadores esposados y escoltados y solo la refleja en el state bag. Un valor escrito por otro script no es un esposado real y se sobrescribe en la siguiente acción de esposar.

Lo que ai-police envía a través de AI Core

AcciónCapa que usaQué llega allí
Write a finebilling.send de la libUna factura del trabajo de servicio del agente, con la etiqueta "Police fine".
Write a finemdt.record de la libUn registro fine con la cantidad.
Send to prisonprison.jail de la libLa condena, con el agente como by.
Send to prisonmdt.record de la libUn registro arrest con los minutos.
Shots fireddispatch.alert de la libUna alerta por zona de 150 m cada 30 s, para los trabajos de policía del panel.
Searchinventory.openInventory de la libEl inventario del objetivo se abre para el agente.
Impoundgarages.impound de la libEl script de garajes se lleva el vehículo; si se niega, el vehículo se borra.

Para reaccionar a cualquiera de estas, escucha en el lado de la capa (tu script de facturación, MDT, prisión o alertas), no en ai-police.

Eventos y callbacks privados

El contrato cliente-servidor propio del script (resource/common/police.ts). El servidor comprueba el servicio, la distancia y el estado de esposado en cada llamada. Pueden cambiar entre versiones: no los dispares ni los escuches desde otros recursos.

NombreDirecciónQué transporta
ai-police:actcallback de cliente(action, target, extra?): un agente actúa sobre el jugador más cercano (id de servidor) o el vehículo (net id). Responde { ok }.
ai-police:dutycallback de cliente(stationId): cambiar el servicio en una comisaría. Responde { ok, onDuty }.
ai-police:shotcliente -> servidor(x, y, z): el jugador disparó un arma (con límite de frecuencia, solo cuentan los que no son policía).
ai-police:client:cuffedservidor -> objetivo(cuffed: boolean).
ai-police:client:escortservidor -> objetivo(officerNetId | null): engancharse al agente, o soltarse.
ai-police:client:seatservidor -> objetivo(vehicleNetId | null): sentarse detrás en un vehículo, o salir.

En esta página