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
GetPlayerData(): AiPlayerData | nulllocal data = exports['ai-core']:GetPlayerData() -- Tabelle oder nilParameter
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
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
IsPlayerLoaded(): booleanlocal loaded = exports['ai-core']:IsPlayerLoaded() -- booleanParameter
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
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
GetDefinitions(file: "jobs" | "gangs"): Record<string, unknown> | nulllocal jobs = exports['ai-core']:GetDefinitions('jobs') -- Tabelle mit Jobnamen als Schlüssel oder nilParameter
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
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.
Client-Exports von ai-core
Was die Client-Exports von ai-core sind, wie du sie aus TypeScript und Lua aufrufst und welcher Lib-Helfer jeden umschließt.
HUD
Jedes HUD aus- und einblenden, solange deine Vollbild-UI offen ist, lesen, ob HUDs sichtbar sind, und die eigenen Einstellungen des laufenden HUD öffnen.