AI Core
API-ReferenzLib: Client

Ebenen über ai-core

medical, appearance, gestures, seatbelt, fuel, mdt, radial, world und inventory - Client-Aufrufe, die das Death-, Kleidungs-, Emote-, Gurt-, Sprit-, MDT-, Radial-, Wetter- oder Inventar-Skript erreichen, das der Server betreibt.

Diese Objekte sprechen nie mit einem bestimmten Skript. Sie fragen ai-core, und ai-core leitet an das Skript weiter, das der Server für diese Aufgabe betreibt: ai-death oder ein anderes Death-Skript, ai-appearance oder tgiann-clothing, jedes unterstützte Emote- oder Radial-Skript. Dein Skript funktioniert weiter, wenn der Betreiber eins austauscht. Wie die Ebenen funktionieren, steht unter Ebenen und die Brücke.

Wenn kein Skript dieser Art läuft, antworten die Aufrufe mit false, null oder dem eigenen Wert des Spiels, wie jeder Eintrag sagt.

medical

medical.isDead

Ob der lokale Spieler am Boden ist (tot oder im Last Stand), in dem Death-Skript, das gerade läuft. Death-Skripte halten einen bewusstlosen Ped am Leben, um ihn zu animieren, daher übersieht IsEntityDead allein sie. Nach dem ersten Aufruf ein Speicherzugriff.

Seite: Client · Wartet: nein

Signatur
medical.isDead(): boolean

Kein Lua-Zwilling: Rufe exports['ai-core']:IsDead() auf und höre auf das lokale Event ai-core:client:dead (dead).

Rückgabewert

boolean: true, wenn die Medical-Ebene von ai-core sagt, dass der Spieler am Boden ist, oder der Ped für das Spiel tot ist.

Beispiel

import { medical, notify } from "@aicore-fivem/lib/client";

RegisterCommand(
  "phone",
  () => {
    if (medical.isDead()) return notify("You cannot use the phone now", "error");
    SetNuiFocus(true, true);
  },
  false,
);

medical.onChange

Führt einen Handler aus, wenn der lokale Spieler zu Boden geht oder aufsteht.

Seite: Client · Wartet: nein

Signatur
medical.onChange(fn: (dead: boolean) => void): void

Kein Lua-Zwilling: AddEventHandler('ai-core:client:dead', function(dead) end).

Parameter

Prop

Type

Rückgabewert

void.

Beispiel

import { medical, Points } from "@aicore-fivem/lib/client";

const points = new Points();
medical.onChange(() => points.refresh()); // Punkte, deren canShow medical.isDead() liest

appearance

Aussehen auf Peds über die Aussehens-Ebene von ai-core, egal welches Kleidungs-Skript läuft.

appearance.apply

Legt ein gespeichertes Aussehen auf einen Ped mit dem Modell des Aussehens. Hole das Aussehen auf dem Server mit appearance.get(charId), erstelle den Ped mit look.model und wende es dann an. Auf dem eigenen Ped des Spielers ändert es seine Kleidung.

Seite: Client · Wartet: nein

Signatur
appearance.apply(ped: number, look: CharacterAppearance): boolean
Lua
local ok = aiLib.appearance.apply(ped, look)

Parameter

Prop

Type

Der Typ ist CharacterAppearance.

Rückgabewert

boolean: false, wenn der Ped verschwunden ist, das Modell abweicht oder kein Kleidungs-Skript läuft.

Beispiel

import { appearance, LocalPed, triggerServerCallback } from "@aicore-fivem/lib/client";
import type { CharacterAppearance } from "@aicore-fivem/shared";

// Eine schlafende Kopie eines Charakters, gekleidet wie er.
export async function showSleeper(charId: number): Promise<void> {
  const look = (await triggerServerCallback("mysleep:look", [charId]).catch(() => null)) as CharacterAppearance | null;
  if (!look) return;
  new LocalPed({
    model: look.model,
    coords: { x: 151.2, y: -1004.6, z: 29.4, heading: 90 },
    onSpawn: (ped) => appearance.apply(ped, look),
  });
}

Prüfe, was der Server sendet, bevor du es castest. Ein Ped, der mit einem anderen Modell als look.model erstellt wurde, kann das Aussehen nicht übernehmen: apply antwortet mit false.

appearance.read

Das Aussehen, das ein Ped gerade trägt.

Seite: Client · Wartet: nein

Signatur
appearance.read(ped: number): CharacterAppearance | null
Lua
local look = aiLib.appearance.read(ped) -- table oder nil

Parameter

Prop

Type

Rückgabewert

CharacterAppearance | null: das Aussehen, oder null (nil in Lua), wenn das Kleidungs-Skript es nicht sagen kann oder keins läuft.

Beispiel

import { appearance, cache } from "@aicore-fivem/lib/client";

const before = appearance.read(cache.ped); // später mit appearance.apply wiederherstellen

appearance.openMenu

Öffnet den Kleidungsladen, den Friseur oder die gespeicherten Outfits des Kleidungs-Skripts für den Spieler.

Seite: Client · Wartet: nein

Signatur
appearance.openMenu(menu: ClothingMenu): boolean
Lua
local ok = aiLib.appearance.openMenu(menu)

Parameter

Prop

Type

Der Typ ist ClothingMenu.

Rückgabewert

boolean: false, wenn das Kleidungs-Skript kein solches Menü hat oder keins läuft.

Beispiel

import { appearance, Points } from "@aicore-fivem/lib/client";

const points = new Points();
points.add("barber", {
  coords: { x: -814.3, y: -183.8, z: 37.6 },
  label: "Barber",
  onPressed: () => appearance.openMenu("barber"),
});

appearance.wearOutfit

Legt dem Spieler ein Job-Outfit (eine Uniform) an, bis reloadSkin. Es wird nicht gespeichert: Ein Reconnect oder reloadSkin gibt dem Spieler seine eigene Kleidung zurück. Nur die aufgeführten Teile ändern sich.

Seite: Client · Wartet: nein

Signatur
appearance.wearOutfit(outfit: JobOutfit): boolean
Lua
local ok = aiLib.appearance.wearOutfit(outfit)

Parameter

Prop

Type

Die Typen sind JobOutfit und OutfitPiece.

Rückgabewert

boolean: false, wenn es nicht geht (kein Kleidungs-Skript, ein Modell, das es nicht unterstützt).

Beispiel

import { appearance } from "@aicore-fivem/lib/client";

appearance.wearOutfit({
  components: [
    { id: 11, collection: "", index: 55, texture: 0 },
    { id: 4, collection: "", index: 35, texture: 0 },
  ],
  props: [{ id: 0, collection: "", index: -1, texture: 0 }],
});

appearance.reloadSkin

Legt dem Spieler wieder sein gespeichertes Aussehen an (zieht ein Job-Outfit aus).

Seite: Client · Wartet: nein

Signatur
appearance.reloadSkin(): boolean
Lua
local ok = aiLib.appearance.reloadSkin()

Rückgabewert

boolean: false ohne Kleidungs-Skript.

Beispiel

import { appearance } from "@aicore-fivem/lib/client";

RegisterCommand("offduty", () => appearance.reloadSkin(), false);

gestures

Hände hoch, Zeigen und Emotes des jeweils laufenden Emote-Skripts, über ai-core.

gestures.isHandsUp

Ob der lokale Spieler die Hände oben hat.

Seite: Client · Wartet: nein

Signatur
gestures.isHandsUp(): boolean
Lua
local up = aiLib.gestures.isHandsUp()

Rückgabewert

boolean: true, solange die Hände im laufenden Emote-Skript oben sind.

Beispiel

import { gestures, onServerCallback } from "@aicore-fivem/lib/client";

// Der Server fragt vor einem Raub, ob sich das Opfer ergeben hat.
onServerCallback("myrob:surrendered", () => gestures.isHandsUp());

gestures.isPointing

Ob der lokale Spieler zeigt.

Seite: Client · Wartet: nein

Signatur
gestures.isPointing(): boolean
Lua
local pointing = aiLib.gestures.isPointing()

Rückgabewert

boolean: true, solange er zeigt.

Beispiel

if (gestures.isPointing()) return; // kein Emote über das Zeigen starten

gestures.provider

Das Emote-Skript, das Hände hoch und Zeigen beantwortet.

Seite: Client · Wartet: nein

Signatur
gestures.provider(): string | null
Lua
local name = aiLib.gestures.provider()

Rückgabewert

string | null: sein Ressourcenname, oder null (nil), wenn keins läuft.

Beispiel

console.log(`hands up from ${gestures.provider() ?? "nothing"}`);

gestures.playEmote

Spielt ein Emote nach seinem Befehlsnamen (was Spieler nach e eingeben) im laufenden Emote-Skript ab.

Seite: Client · Wartet: nein

Signatur
gestures.playEmote(name: string): boolean
Lua
local ok = aiLib.gestures.playEmote(name)

Parameter

Prop

Type

Rückgabewert

boolean: false ohne Emote-Skript.

Beispiel

import { gestures } from "@aicore-fivem/lib/client";

RegisterCommand("hi", () => gestures.playEmote("wave"), false);

gestures.cancelEmote

Stoppt das Emote, das der Spieler abspielt (gefesselt, niedergeschlagen).

Seite: Client · Wartet: nein

Signatur
gestures.cancelEmote(): boolean
Lua
local ok = aiLib.gestures.cancelEmote()

Rückgabewert

boolean: false ohne Emote-Skript.

Beispiel

onServerEvent("mypolice:cuffed", () => gestures.cancelEmote());

gestures.emoteProvider

Das Emote-Skript, das Emotes abspielt (es kann sich von dem unterscheiden, das Hände hoch beantwortet).

Seite: Client · Wartet: nein

Signatur
gestures.emoteProvider(): string | null
Lua
local name = aiLib.gestures.emoteProvider()

Rückgabewert

string | null: sein Ressourcenname, oder null (nil), wenn keins läuft.

Beispiel

if (gestures.emoteProvider() === null) console.log("no emote script: skipping the emote");

seatbelt

Der Sicherheitsgurt des lokalen Spielers über ai-core, egal welches Gurt-Skript läuft.

seatbelt.isOn

Ob der Gurt angelegt ist. Frage bei Bedarf, nicht in jedem Frame.

Seite: Client · Wartet: nein

Signatur
seatbelt.isOn(): boolean | null
Lua
local worn = aiLib.seatbelt.isOn() -- boolean oder nil

Rückgabewert

boolean | null: true oder false; null (nil), wenn kein Gurt-Skript antwortet.

Beispiel

import { cache, notify, onCache, seatbelt } from "@aicore-fivem/lib/client";

onCache("vehicle", (vehicle) => {
  if (vehicle !== false && seatbelt.isOn() === false) notify("Buckle up", "warning");
});

seatbelt.onChange

Führt einen Handler aus, wenn sich der Gurt ändert. Nur Gurt-Skripte, die Änderungen melden, lösen ihn aus.

Seite: Client · Wartet: nein

Signatur
seatbelt.onChange(fn: (worn: boolean | null) => void): void
Lua
aiLib.seatbelt.onChange(function(worn) end)

Parameter

Prop

Type

Rückgabewert

void.

Beispiel

seatbelt.onChange((worn) => SendNUIMessage({ action: "belt", data: worn === true }));

seatbelt.provider

Das Gurt-Skript, das antwortet.

Seite: Client · Wartet: nein

Signatur
seatbelt.provider(): string | null
Lua
local name = aiLib.seatbelt.provider()

Rückgabewert

string | null: sein Ressourcenname, oder null (nil), wenn keins antwortet.

Beispiel

if (seatbelt.provider() === null) console.log("no seat belt script runs");

fuel

fuel.get

Der Spritstand eines Fahrzeugs. Der Server hält für jedes Fahrzeug einen State Bag fuel, egal welches Sprit-Skript läuft, daher ist dies ein Speicherzugriff; ohne diesen Bag ist es der Tankstand des Spiels.

Seite: Client · Wartet: nein

Signatur
fuel.get(vehicle: number): number

Kein Lua-Zwilling: Lies Entity(vehicle).state.fuel. Sprit setzen geht nur auf dem Server (fuel.set auf Fahrzeuge).

Parameter

Prop

Type

Rückgabewert

number: 0-100.

Beispiel

import { cache, every, fuel } from "@aicore-fivem/lib/client";

every(1000, () => {
  if (cache.vehicle !== false) SendNUIMessage({ action: "fuel", data: Math.round(fuel.get(cache.vehicle)) });
});

mdt

mdt.open

Öffnet das aktive Polizei-MDT für den lokalen Spieler. Das MDT prüft den Job selbst.

Seite: Client · Wartet: nein

Signatur
mdt.open(): boolean
Lua
local ok = aiLib.mdt.open()

Rückgabewert

boolean: false, wenn kein MDT läuft oder es nicht von außen geöffnet werden kann.

Beispiel

import { mdt, notify } from "@aicore-fivem/lib/client";

RegisterCommand("mdt", () => {
  if (!mdt.open()) notify("No MDT available", "error");
}, false);

radial

Einträge im jeweils laufenden Radialmenü (ai-radialmenu, oder ein anderes über die Radial-Ebene von ai-core). ai-core behält sie über Neustarts des Radialmenüs hinweg und entfernt sie, wenn deine Ressource stoppt: einmal beim Start hinzufügen.

radial.add

Fügt dem Rad einen Eintrag hinzu oder ersetzt den Eintrag mit derselben ID.

Seite: Client · Wartet: nein

Signatur
radial.add(item: RadialItem): void
Lua
aiLib.radial.add(item)

Parameter

Prop

Type

RadialItem

Prop

Type

Der Typ ist RadialItem.

Rückgabewert

void.

Beispiel

import { cache, createLocale, hasJob, radial } from "@aicore-fivem/lib/client";
import { RADIAL_VEHICLE } from "@aicore-fivem/shared";

const Locale = createLocale<typeof import("../../locales/en.json")>();

radial.add({
  id: "myscript:engine",
  label: Locale("ENGINE"),
  icon: "power-off",
  parent: RADIAL_VEHICLE,
  keepOpen: true,
  canShow: () => cache.seat === -1,
  onPressed: () => {
    if (cache.vehicle === false) return;
    SetVehicleEngineOn(cache.vehicle, !GetIsVehicleEngineRunning(cache.vehicle), false, true);
  },
});

radial.add({
  id: "myscript:police",
  label: Locale("POLICE"),
  icon: "shield-halved",
  canShow: () => hasJob(["police"]),
  items: [
    { id: "myscript:cuff", label: Locale("CUFF"), icon: "handcuffs", onPressed: () => emitNet("mypolice:cuff") },
  ],
});

radial.remove

Entfernt einen deiner Einträge. Eine unbekannte ID tut nichts.

Seite: Client · Wartet: nein

Signatur
radial.remove(id: string): void
Lua
aiLib.radial.remove(id)

Parameter

Prop

Type

Rückgabewert

void.

Beispiel

radial.remove("myscript:engine");

radial.refresh

Liest jedes canShow eines offenen Rads erneut. Rufe es auf, nachdem sich etwas geändert hat, das sie lesen, während das Rad offen sein könnte.

Seite: Client · Wartet: nein

Signatur
radial.refresh(): void
Lua
aiLib.radial.refresh()

Rückgabewert

void.

Beispiel

onMembershipChange(() => radial.refresh());

world

Die Wetter- und Zeitsynchronisation des jeweils laufenden Wetter-Skripts, pausiert, solange ein Grund besteht.

world.pauseSync

Pausiert die Wetter- und Zeitsynchronisation aus einem Grund: in einem Interieur, während einer Szene oder während dein Skript sein eigenes Wetter setzt.

Seite: Client · Wartet: nein

Signatur
world.pauseSync(reason: string): void
Lua
aiLib.world.pauseSync(reason)

Parameter

Prop

Type

Rückgabewert

void.

Beispiel

import { world } from "@aicore-fivem/lib/client";

export function enterApartment(): void {
  world.pauseSync("apartment");
  NetworkOverrideClockTime(12, 0, 0);
  SetWeatherTypeNowPersist("EXTRASUNNY");
}

export function leaveApartment(): void {
  world.resumeSync("apartment");
}

world.resumeSync

Entfernt einen Pausengrund; die Synchronisation läuft wieder, wenn kein Grund übrig ist.

Seite: Client · Wartet: nein

Signatur
world.resumeSync(reason: string): void
Lua
aiLib.world.resumeSync(reason)

Parameter

Prop

Type

Rückgabewert

void. Siehe das Beispiel bei world.pauseSync.

inventory

Das Inventar des lokalen Spielers über die Inventar-Ebene von ai-core: Das Inventar, das der Server gewählt hat, antwortet. Items geben und nehmen geht nur auf dem Server (Items).

inventory.openInventory

Öffnet den eigenen Inventarbildschirm des Spielers.

Seite: Client · Wartet: nein

Signatur
inventory.openInventory(): void
Lua
aiLib.inventory.openInventory()

Rückgabewert

void.

Beispiel

import { inventory } from "@aicore-fivem/lib/client";

RegisterCommand("bag", () => inventory.openInventory(), false);

inventory.hasItem

Ob der Spieler mindestens count Stück eines Items hat. Nutze es in canShow, damit der Spieler nur sieht, was er tun kann; der Server prüft erneut.

Seite: Client · Wartet: nein

Signatur
inventory.hasItem(item: string, count?: number): boolean
Lua
local has = aiLib.inventory.hasItem(item, count)

Parameter

Prop

Type

Rückgabewert

boolean: true, wenn der Spieler genug hat.

Beispiel

import { inventory, Points } from "@aicore-fivem/lib/client";

const points = new Points();
points.addVehicle("lockpick", {
  label: "Lockpick",
  icon: "unlock",
  canShow: (vehicle) => GetVehicleDoorLockStatus(vehicle) >= 2 && inventory.hasItem("lockpick"),
  onPressed: (vehicle) => emitNet("mykeys:lockpick", NetworkGetNetworkIdFromEntity(vehicle)),
});

inventory.currentWeapon

Das Waffen-Item in der Hand des Spielers: sein Name, Label und Bild.

Seite: Client · Wartet: nein

Signatur
inventory.currentWeapon(): HeldWeapon | null
Lua
local weapon = aiLib.inventory.currentWeapon() -- table oder nil

Rückgabewert

HeldWeapon { name: string; label: string; image?: string } (name wie WEAPON_PISTOL, image eine nui://-URL, wenn das Inventar eine hat), oder null (nil), wenn die Hand leer ist.

Beispiel

import { inventory, onCache } from "@aicore-fivem/lib/client";

// Lies es, wenn sich die Waffe ändert, nie in jedem Frame.
onCache("weapon", () => SendNUIMessage({ action: "weapon", data: inventory.currentWeapon() }));

Auf dieser Seite