AI Core
API-ReferenzLib: Client

Abfragen und Laden

raycast, groundZ, locationName, vehicleLabel, waypoint, pedHeadshot, onShot und die request-Lader - das Spiel nach der Welt fragen und Spiel-Assets laden.

Fragen an das Spiel über die Welt (was ist vor dem Spieler, wie hoch ist der Boden, wie heißt diese Straße) und die Lader, die jedes Modell, jede Animation und jeder Effekt vor dem Gebrauch braucht.

Abfragen

raycast

Eine Linienabfrage, die im selben Frame beantwortet wird: was die Linie von from nach to zuerst trifft. Nutze es für „worauf schaut der Spieler“, Objekte auf dem Boden platzieren oder Sichtlinien.

Seite: Client · Wartet: nein (es blockiert den Frame, bis der Test fertig ist)

Signatur
raycast(from: Vec3, to: Vec3, options?: RaycastOptions): RayHit | null
Lua
local hit = aiLib.raycast(from, to, options) -- table oder nil; from / to sind vector3

Parameter

Prop

Type

RaycastOptions

Prop

Type

Rückgabewert

RayHit | null: { coords, normal, entity } für den ersten Treffer, oder null (nil), wenn die Linie nichts trifft.

Prop

Type

Beispiel

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

/** What the camera looks at within 10 m. */
export function lookedAt(): number {
  const [cx = 0, cy = 0, cz = 0] = GetGameplayCamCoord();
  const [rx = 0, , rz = 0] = GetGameplayCamRot(2);
  const pitch = (rx * Math.PI) / 180;
  const yaw = (rz * Math.PI) / 180;
  const dir = { x: -Math.sin(yaw) * Math.cos(pitch), y: Math.cos(yaw) * Math.cos(pitch), z: Math.sin(pitch) };
  const hit = raycast(
    { x: cx, y: cy, z: cz },
    { x: cx + dir.x * 10, y: cy + dir.y * 10, z: cz + dir.z * 10 },
    { flags: 2 | 4 | 16 },
  );
  return hit?.entity ?? 0;
}

Es ist eine synchrone Abfrage: Beschränke dich auf ein oder zwei pro Frame.

groundZ

Die Bodenhöhe unter einem Punkt, abgefragt von z nach unten.

Seite: Client · Wartet: nein

Signatur
groundZ(x: number, y: number, z?: number): number | null
Lua
local ground = aiLib.groundZ(x, y, z) -- number oder nil

Parameter

Prop

Type

Rückgabewert

number | null: die Bodenhöhe, oder null (nil), solange die Kollision dort nicht geladen ist (der Bereich ist weit vom Spieler entfernt).

Beispiel

import { groundZ, player } from "@aicore-fivem/lib/client";

const { x, y, z } = player.coords();
const ground = groundZ(x, y, z + 2);
if (ground !== null) console.log(`ground is ${(z - ground).toFixed(2)} m below`);

Um den Spieler auf unbekannten Boden zu bewegen, nutze player.teleport ohne z: Es wartet auf jeder Höhe auf die Kollision.

locationName

Die Namen von Straße, Querstraße und Gebiet an einem Punkt. Nutze es in Dispatch-Alarmen, Handy-Nachrichten und HUDs.

Seite: Client · Wartet: nein

Signatur
locationName(coords?: Vec3): LocationName
Lua
local where = aiLib.locationName(coords) -- coords ist ein vector3, optional

Parameter

Prop

Type

Rückgabewert

LocationName:

Prop

Type

Beispiel

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

const { street, crossing, zone } = locationName();
const text = crossing ? `${street} / ${crossing}, ${zone}` : `${street}, ${zone}`;

vehicleLabel

Der Anzeigename eines Fahrzeugs (Sultan RS) aus einem Modellnamen, einem Modell-Hash oder einer Fahrzeug-Entity.

Seite: Client · Wartet: nein

Signatur
vehicleLabel(vehicle: string | number): string
Lua
local name = aiLib.vehicleLabel(vehicle)

Parameter

Prop

Type

Rückgabewert

string: das Label des Spiels für das Modell; der Anzeigename des Modells, wenn das Spiel keinen Text dafür hat (Add-on-Fahrzeuge ohne Texteintrag); der Modellname oder Hash als Text, wenn selbst das fehlt.

Beispiel

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

onCache("vehicle", (vehicle) => {
  if (vehicle !== false && cache.seat === -1) notify(vehicleLabel(vehicle), "info", 2000);
});

waypoint

Der Wegpunkt, den der Spieler auf der Karte gesetzt hat.

Seite: Client · Wartet: nein

Signatur
waypoint(): { x: number; y: number } | null
Lua
local target = aiLib.waypoint() -- { x, y } oder nil

Rückgabewert

{ x: number; y: number } | null: die Position des Wegpunkts (ohne Höhe: Kartenwegpunkte haben keine), oder null (nil), wenn kein Wegpunkt gesetzt ist.

Beispiel

Siehe player.teleport: zum Wegpunkt teleportieren.

pedHeadshot

Macht ein Porträtfoto eines Peds und wartet, bis das Spiel es gerendert hat. Nutze den Texturnamen in einer NUI-Seite als https://nui-img/<txd>/<txd>.

Seite: Client · Wartet: ja (Promise in TypeScript, hält in Lua den Thread an)

Signatur
pedHeadshot(ped: number, transparent?: boolean, timeoutMs?: number): Promise<{ handle: number; txd: string } | null>
Lua
local handle, txd = aiLib.pedHeadshot(ped, transparent, timeout) -- innerhalb eines Threads aufrufen

Parameter

Prop

Type

Rückgabewert

Promise<{ handle: number; txd: string } | null>: das Headshot-Handle und sein Texturname; null, wenn der Ped nicht existiert oder das Rendern länger als das Timeout dauerte. Lua gibt handle, txd oder nil zurück.

Beispiel

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

export async function sendMugshot(): Promise<void> {
  const shot = await pedHeadshot(cache.ped, true);
  if (!shot) return;
  SendNUIMessage({ action: "photo", data: `https://nui-img/${shot.txd}/${shot.txd}` });
  setTimeout(() => UnregisterPedheadshot(shot.handle), 10_000);
}

Rufe UnregisterPedheadshot(handle) auf, sobald das Bild nicht mehr angezeigt wird.

onShot

Führt einen Handler in dem Frame aus, in dem der lokale Ped einen Schuss abgibt (Stress, Schussalarme, Hülsen). Eine Prüfung pro Frame für deine Ressource, nur aktiv, solange eine Waffe in der Hand ist.

Seite: Client · Wartet: nein

Signatur
onShot(handler: (weapon: number) => void): () => void
Lua
aiLib.onShot(function(weapon) end) -- gibt nichts zurück

Parameter

Prop

Type

Rückgabewert

TypeScript: () => void, eine Funktion, die den Handler entfernt. Lua gibt nichts zurück (der Handler bleibt).

Beispiel

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

let lastAlert = 0;
onShot(() => {
  if (GetGameTimer() - lastAlert < 30_000) return; // ein Alarm pro 30 s
  lastAlert = GetGameTimer();
  emitNet("mypolice:shots");
});

Spiel-Assets laden

Modelle, Animationen, Effekte und Texturen müssen vor dem Gebrauch geladen werden. Jeder Lader fordert das Asset an und wartet, bis es bereit ist. Gib es frei, wenn du fertig bist, wie jeder Eintrag sagt.

requestModel

Lädt ein Modell (Ped, Fahrzeug, Objekt) und gibt seinen Hash.

Seite: Client · Wartet: ja (Promise in TypeScript, hält in Lua den Thread an)

Signatur
requestModel(model: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestModel(model, timeout) -- integer oder nil, innerhalb eines Threads aufrufen

Parameter

Prop

Type

Rückgabewert

Promise<number>: der Modell-Hash, sobald geladen. Es wird abgelehnt, wenn das Modell in den Spieldateien nicht existiert oder nicht rechtzeitig lädt. Lua gibt den Hash zurück, oder in beiden Fällen nil.

Beispiel

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

export async function placeCone(x: number, y: number, z: number): Promise<number> {
  const hash = await requestModel("prop_roadcone02a");
  const cone = CreateObject(hash, x, y, z, false, false, false);
  SetModelAsNoLongerNeeded(hash);
  PlaceObjectOnGroundProperly(cone);
  return cone;
}

Rufe SetModelAsNoLongerNeeded(hash) auf, sobald die Entity erstellt ist.

requestAnimDict

Lädt ein Animations-Dictionary.

Seite: Client · Wartet: ja (Promise in TypeScript, hält in Lua den Thread an)

Signatur
requestAnimDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestAnimDict(dict, timeout) -- string oder nil, innerhalb eines Threads aufrufen

Parameter

Prop

Type

Rückgabewert

Promise<string>: der Dictionary-Name, sobald geladen. Es wird abgelehnt, wenn das Dictionary nicht existiert oder nicht rechtzeitig lädt. Lua gibt den Namen oder nil zurück.

Beispiel

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

export async function dance(): Promise<void> {
  const dict = await requestAnimDict("anim@amb@nightclub@dancers@crowddance_facedj@");
  TaskPlayAnim(cache.ped, dict, "hi_dance_facedj_09_v2_male^1", 8, -8, -1, 1, 0, false, false, false);
  RemoveAnimDict(dict);
}

Rufe RemoveAnimDict(dict) auf, wenn die Animation nicht mehr abgespielt wird. player.playAnim lädt das Dictionary für dich und gibt es frei.

requestAnimSet

Lädt ein Bewegungs-Clipset (geduckt gehen, verletzt gehen).

Seite: Client · Wartet: ja (Promise in TypeScript, hält in Lua den Thread an)

Signatur
requestAnimSet(set: string, timeoutMs?: number): Promise<string>
Lua
local set = aiLib.requestAnimSet(set, timeout) -- string oder nil, innerhalb eines Threads aufrufen

Parameter

Prop

Type

Rückgabewert

Promise<string>: der Clipset-Name, sobald geladen. Es wird abgelehnt, wenn es nicht rechtzeitig lädt. Lua gibt den Namen oder nil zurück.

Beispiel

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

export async function limp(): Promise<void> {
  const set = await requestAnimSet("move_m@injured");
  SetPedMovementClipset(cache.ped, set, 0.2);
}

Rufe RemoveAnimSet(set) auf, wenn es nicht mehr genutzt wird.

requestPtfxAsset

Lädt ein Partikeleffekt-Asset.

Seite: Client · Wartet: ja (Promise in TypeScript, hält in Lua den Thread an)

Signatur
requestPtfxAsset(asset: string, timeoutMs?: number): Promise<string>
Lua
local asset = aiLib.requestPtfxAsset(asset, timeout) -- string oder nil, innerhalb eines Threads aufrufen

Parameter

Prop

Type

Rückgabewert

Promise<string>: der Asset-Name, sobald geladen. Es wird abgelehnt, wenn es nicht rechtzeitig lädt. Lua gibt den Namen oder nil zurück.

Beispiel

import { player, requestPtfxAsset } from "@aicore-fivem/lib/client";

export async function sparks(): Promise<void> {
  const asset = await requestPtfxAsset("core");
  const { x, y, z } = player.coords();
  UseParticleFxAsset(asset);
  StartParticleFxNonLoopedAtCoord("ent_sht_electrical_box", x, y, z, 0, 0, 0, 1, false, false, false);
  RemoveNamedPtfxAsset(asset);
}

Rufe RemoveNamedPtfxAsset(asset) auf, wenn du fertig bist.

requestTextureDict

Lädt ein gestreamtes Textur-Dictionary (für DrawSprite und Ähnliches).

Seite: Client · Wartet: ja (Promise in TypeScript, hält in Lua den Thread an)

Signatur
requestTextureDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestTextureDict(dict, timeout) -- string oder nil, innerhalb eines Threads aufrufen

Parameter

Prop

Type

Rückgabewert

Promise<string>: der Dictionary-Name, sobald geladen. Es wird abgelehnt, wenn es nicht rechtzeitig lädt. Lua gibt den Namen oder nil zurück.

Beispiel

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

export async function showCrosshair(): Promise<void> {
  const dict = await requestTextureDict("shared");
  every(0, () => DrawSprite(dict, "emptydot_32", 0.5, 0.5, 0.01, 0.018, 0, 255, 255, 255, 200));
}

Rufe SetStreamedTextureDictAsNoLongerNeeded(dict) auf, wenn du fertig bist.

requestWeaponAsset

Lädt das Modell und die Assets einer Waffe und gibt ihren Hash.

Seite: Client · Wartet: ja (Promise in TypeScript, hält in Lua den Thread an)

Signatur
requestWeaponAsset(weapon: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestWeaponAsset(weapon, timeout) -- integer oder nil, innerhalb eines Threads aufrufen

Parameter

Prop

Type

Rückgabewert

Promise<number>: der Waffen-Hash, sobald geladen. Es wird abgelehnt, wenn sie nicht rechtzeitig lädt. Lua gibt den Hash oder nil zurück.

Beispiel

import { player, requestWeaponAsset } from "@aicore-fivem/lib/client";

export async function showcasePistol(): Promise<number> {
  const hash = await requestWeaponAsset("WEAPON_PISTOL");
  const { x, y, z } = player.coords();
  const object = CreateWeaponObject(hash, 0, x, y, z + 1, true, 1, 0);
  RemoveWeaponAsset(hash);
  return object;
}

Rufe RemoveWeaponAsset(hash) auf, wenn du fertig bist.

Auf dieser Seite