AI Core
API-Referenzai-core: Client-Exports

Spieler

Charakter, Geld, Jobs, Dienst und Gangs des lokalen Spielers lesen, prüfen, ob ein Charakter geladen ist, und Job- und Gang-Definitionen lesen.

Diese Exports lesen, was ai-core über den Spieler weiß, der an diesem Spiel sitzt: seinen Charakter, sein Geld, seine Jobs und Gangs. Der Server sendet diese Daten einmal an den eigenen Client des Spielers, wenn der Charakter lädt, und danach nur die Werte, die sich ändern. Die Daten eines anderen Spielers erreichen diesen Client nie.

Nutze in TypeScript getPlayerData(key) und onPlayerData(key, handler) der Lib, statt GetPlayerData immer wieder aufzurufen. Nutze in Lua aiLib.playerData.get(key) und aiLib.playerData.onChange(key, handler). Sie lesen den Export einmal und folgen dann jeder Änderung, die ai-core schickt.

GetPlayerData

Gibt alles, was ai-core über den geladenen Charakter des lokalen Spielers weiß, in einer Tabelle zurück: Charakter, Geld, Jobs, Dienst, den Hauptjob, Gangs, die aktive Gang und Metadaten. Nutze es, um die Daten einmal zu lesen, wenn deine Ressource startet; folge Änderungen mit onPlayerData (TS) oder aiLib.playerData.onChange (Lua).

Seite: Client · Wartet: nein

Signature
GetPlayerData(): AiPlayerData | null
Lua
local data = exports['ai-core']:GetPlayerData() -- Tabelle oder nil

Parameter

Keine.

Rückgabe

AiPlayerData, solange ein Charakter in der Welt steht, null (nil in Lua) auf dem Charakterbildschirm, bevor der erste Charakter lädt und nachdem der Spieler zum Charakterbildschirm zurückgekehrt ist.

Prop

Type

Beispiel

resource/client/index.ts
import { getPlayerData, onPlayerData } from "@aicore-fivem/lib/client";

// Zeigt einen Blip nur für die Polizei, solange der Spieler als Polizist im Dienst ist.
let blip = 0;

function updateBlip(duty: string | null): void {
  if (duty === "police" && blip === 0) {
    blip = AddBlipForCoord(441.8, -982.0, 30.7); // Polizeiwache Mission Row
    SetBlipSprite(blip, 60);
  } else if (duty !== "police" && blip !== 0) {
    RemoveBlip(blip);
    blip = 0;
  }
}

// Einmal lesen (die Lib fragt GetPlayerData von ai-core für dich), dann jeder Änderung folgen.
updateBlip(getPlayerData("duty") ?? null);
onPlayerData("duty", (duty) => updateBlip(duty));

Das ist die eigene Kopie des Spielers, um Dinge auf dem Bildschirm anzuzeigen. Entscheide nie etwas daraus, dem der Server vertrauen muss (eine Zahlung, ein Item, Zugang zu einem Lager): Der Server prüft erneut mit seinen eigenen Exports.

IsPlayerLoaded

Sagt, ob auf diesem Client ein Charakter in der Welt steht. Nutze es, bevor du etwas startest, das einen Charakter braucht (ein HUD, eine Job-Schleife), wenn deine Ressource starten kann, nachdem der Spieler bereits geladen ist.

Seite: Client · Wartet: nein

Signature
IsPlayerLoaded(): boolean
Lua
local loaded = exports['ai-core']:IsPlayerLoaded() -- boolean

Parameter

Keine.

Rückgabe

boolean: true, sobald der Charakter in die Welt gesetzt wurde, false auf dem Charakterbildschirm, während der Spieler einen Spawnpunkt wählt und nachdem er zum Charakterbildschirm zurückgekehrt ist.

Beispiel

resource/client/index.ts
import { resourceExport } from "@aicore-fivem/lib/client";
import { CORE } from "@aicore-fivem/shared";

const core = resourceExport("ai-core");

function start(): void {
  console.log("character ready, starting the job loop");
}

// Der Spieler kann geladen haben, bevor diese Ressource gestartet ist (ein Neustart): zuerst prüfen, dann zuhören.
if (core.IsPlayerLoaded()) start();
on(CORE.clientPlayerLoadedEvent, start);

GetDefinitions

Gibt jeden Job oder jede Gang so zurück, wie das Admin-Panel sie speichert (Labels, Ränge und die anderen Felder, die das Panel bearbeitet). Framework-Brücken nutzen es, um die Job-Tabellen von ESX / QB aufzubauen. Lies es einmal und folge dann dem Client-Event ai-core:client:definitions, das für jeden Job oder jede Gang auslöst, die das Panel ändert.

Seite: Client · Wartet: nein

Signature
GetDefinitions(file: "jobs" | "gangs"): Record<string, unknown> | null
Lua
local jobs = exports['ai-core']:GetDefinitions('jobs') -- Tabelle mit Jobnamen als Schlüssel oder nil

Parameter

Prop

Type

Rückgabe

Record<string, unknown>: ein Datensatz pro Job oder Gang, nach seinem Namen (police, ambulance). Die Datensätze sind die eigenen Daten des Panels und werden nicht geprüft. null, wenn file weder "jobs" noch "gangs" ist.

Beispiel

resource/client/index.ts
import { resourceExport } from "@aicore-fivem/lib/client";
import { CORE } from "@aicore-fivem/shared";

const core = resourceExport("ai-core");

// Eine lokale Kopie jedes Jobs, aktuell gehalten.
const jobs: Record<string, unknown> = { ...(core.GetDefinitions("jobs") ?? {}) };

on(CORE.clientDefinitionsEvent, (file: string, name: string, definition: unknown) => {
  if (file !== "jobs") return;
  if (definition === null) delete jobs[name];
  else jobs[name] = definition;
});

Für die Rangnamen und Labels eines Jobs oder einer Gang auf dem Server nutze die Server-Exports von ai-core oder die Server-Lib; der Server ist die Seite, die Ränge prüft.

Auf dieser Seite