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)
raycast(from: Vec3, to: Vec3, options?: RaycastOptions): RayHit | nulllocal hit = aiLib.raycast(from, to, options) -- table oder nil; from / to sind vector3Parameter
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
groundZ(x: number, y: number, z?: number): number | nulllocal ground = aiLib.groundZ(x, y, z) -- number oder nilParameter
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
locationName(coords?: Vec3): LocationNamelocal where = aiLib.locationName(coords) -- coords ist ein vector3, optionalParameter
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
vehicleLabel(vehicle: string | number): stringlocal 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
waypoint(): { x: number; y: number } | nulllocal target = aiLib.waypoint() -- { x, y } oder nilRü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)
pedHeadshot(ped: number, transparent?: boolean, timeoutMs?: number): Promise<{ handle: number; txd: string } | null>local handle, txd = aiLib.pedHeadshot(ped, transparent, timeout) -- innerhalb eines Threads aufrufenParameter
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
onShot(handler: (weapon: number) => void): () => voidaiLib.onShot(function(weapon) end) -- gibt nichts zurückParameter
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)
requestModel(model: string | number, timeoutMs?: number): Promise<number>local hash = aiLib.requestModel(model, timeout) -- integer oder nil, innerhalb eines Threads aufrufenParameter
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)
requestAnimDict(dict: string, timeoutMs?: number): Promise<string>local dict = aiLib.requestAnimDict(dict, timeout) -- string oder nil, innerhalb eines Threads aufrufenParameter
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)
requestAnimSet(set: string, timeoutMs?: number): Promise<string>local set = aiLib.requestAnimSet(set, timeout) -- string oder nil, innerhalb eines Threads aufrufenParameter
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)
requestPtfxAsset(asset: string, timeoutMs?: number): Promise<string>local asset = aiLib.requestPtfxAsset(asset, timeout) -- string oder nil, innerhalb eines Threads aufrufenParameter
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)
requestTextureDict(dict: string, timeoutMs?: number): Promise<string>local dict = aiLib.requestTextureDict(dict, timeout) -- string oder nil, innerhalb eines Threads aufrufenParameter
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)
requestWeaponAsset(weapon: string | number, timeoutMs?: number): Promise<number>local hash = aiLib.requestWeaponAsset(weapon, timeout) -- integer oder nil, innerhalb eines Threads aufrufenParameter
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.
Fahrzeuge und Entities
nearestVehicle, drivenVehicle, waitForEntity, entityFromNetId und die Helfer für Fahrzeug-Props - Fahrzeuge und Entities auf dem Client finden und das Aussehen eines Fahrzeugs lesen oder anwenden.
Kamera und Timing
ScriptCamera, TickLoop, AreaFollower und ServerClock - geskriptete Kameras, Jobs pro Frame, die nur bei Bedarf laufen, den Bereich des Spielers an den Server melden und die Server-Uhr auf dem Client.