AI Core
Jobs und Diensteai-police

ai-police für Entwickler

Der State Bag cuffed von ai-police, wie seine Aktionen andere Skripte über AI Core erreichen, und seine privaten Events.

ai-police hat keine Exports. Seine Bußgelder, Einträge, Haftstrafen, Alarme, Durchsuchungen und Beschlagnahmungen laufen alle über die Layer von AI Core, daher ruft ein anderes Skript ai-police nie auf. Was ein anderes Skript lesen kann, ist der Zustand cuffed.

State Bag cuffed

true im State Bag eines Spielers, solange ai-police ihn gefesselt hält; sonst false (oder fehlend). Der Server schreibt ihn; jeder Client kann ihn lesen. Der Schlüsselname ist PLAYER_BAGS.cuffed in @aicore-fivem/shared.

Seite: Server und Client (lesen) · Wartet: nein

Signatur
new PlayerState<boolean>(PLAYER_BAGS.cuffed, stateBoolean).get(serverId: number): boolean | undefined
Lua
local cuffed = Player(source).state.cuffed == true   -- Server
local cuffed = LocalPlayer.state.cuffed == true      -- Client, der lokale Spieler

Rückgabewert

true, solange gefesselt. false nach dem Abnehmen der Handschellen, undefined / nil, wenn der Spieler in dieser Sitzung nie gefesselt war.

Beispiel

Ein Item ablehnen, solange der Spieler gefesselt ist:

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;
  }
  // ... das Funkgerät öffnen
});

Setze cuffed nicht selbst: ai-police führt seine eigene Liste gefesselter Spieler und Abführungen auf dem Server und spiegelt sie nur in den State Bag. Ein von einem anderen Skript geschriebener Wert ist keine echte Fesselung und wird bei der nächsten Handschellen-Aktion überschrieben.

Was ai-police über AI Core sendet

AktionGenutzter LayerWas dort ankommt
Bußgeld ausstellenbilling.send der LibEine Rechnung vom Job im Dienst des Beamten, Label „Police fine“.
Bußgeld ausstellenmdt.record der LibEin fine-Eintrag mit dem Betrag.
Ins Gefängnis schickenprison.jail der LibDie Strafe, mit dem Beamten als by.
Ins Gefängnis schickenmdt.record der LibEin arrest-Eintrag mit den Minuten.
Schüssedispatch.alert der LibEin Alarm pro Bereich von 150 m alle 30 s, an die Polizeijobs aus dem Panel.
Durchsucheninventory.openInventory der LibDas Inventar des Ziels öffnet sich für den Beamten.
Beschlagnahmegarages.impound der LibDas Garagenskript übernimmt das Fahrzeug; lehnt es ab, wird das Fahrzeug gelöscht.

Um auf eines davon zu reagieren, höre auf der Seite des Layers (dein Rechnungs-, MDT-, Gefängnis- oder Alarmskript), nicht auf ai-police.

Private Events und Callbacks

Der eigene Client-Server-Vertrag des Skripts (resource/common/police.ts). Der Server prüft bei jedem Aufruf Dienst, Entfernung und den Fesselungszustand. Sie können sich zwischen Versionen ändern: Löse sie nicht aus anderen Ressourcen aus und höre nicht darauf.

NameRichtungWas es überträgt
ai-police:actClient-Callback(action, target, extra?): Ein Beamter handelt am nächsten Spieler (Server-ID) oder Fahrzeug (Net-ID). Antwortet mit { ok }.
ai-police:dutyClient-Callback(stationId): den Dienst an einer Dienststelle umschalten. Antwortet mit { ok, onDuty }.
ai-police:shotClient -> Server(x, y, z): Der Spieler hat eine Waffe abgefeuert (mit Rate-Limit, nur Nicht-Polizisten zählen).
ai-police:client:cuffedServer -> Ziel(cuffed: boolean).
ai-police:client:escortServer -> Ziel(officerNetId | null): am Beamten befestigen oder loslassen.
ai-police:client:seatServer -> Ziel(vehicleNetId | null): sich hinten in ein Fahrzeug setzen oder aussteigen.

Auf dieser Seite