AI Core
API-ReferenzLib: Client

Peds, Blips und Props

LocalPed, Blips, createBlip, attachProp, PreviewVehicle und player.holdAnim - lokale NPCs, Karten-Blips, gehaltene Props, Ausstellungsfahrzeuge und gehaltene Animationen.

Dinge, die nur dieser Client sieht: ein NPC hinter einer Theke, Karten-Blips, ein Prop in der Hand des Spielers, ein Ausstellungsauto. Keins davon ist vernetzt, daher geraten sie nie mit dem Entity-Lockdown aneinander und kosten den Server nichts. Ein Punkt erstellt bereits seinen eigenen NPC und Blip (ped und blip von points.add); nutze diese Klassen für die ohne Punkt.

Lokale Peds

new LocalPed

Ein Ped, den nur dieser Client sieht (ein Ladenbesitzer, ein Job-NPC). Er wird erstellt, wenn der Spieler in distance um coords kommt, und gelöscht, wenn er geht, sodass tausend NPCs auf der Karte nichts kosten, bis jemand herankommt. Er steht eingefroren, kann nicht verletzt werden und ignoriert Ereignisse (Schüsse, Schubsen).

Seite: Client · Wartet: nein (das Modell lädt im Hintergrund, wenn der Spieler in die Nähe kommt)

Signatur
new LocalPed(options: LocalPedOptions)
Lua
local ped = aiLib.LocalPed.new(options)

Parameter

Prop

Type

LocalPedOptions

Prop

Type

Mitglieder

Prop

Type

Beispiel

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

const guard = new LocalPed({
  model: "s_m_m_security_01",
  coords: { x: -1037.6, y: -2737.8, z: 20.2, heading: 330 },
  scenario: "WORLD_HUMAN_GUARD_STAND",
  distance: 80,
  onSpawn: (ped) => SetPedComponentVariation(ped, 0, 1, 0, 0),
});

// Später, wenn der Job endet:
guard.remove();

Die Entfernung wird von coords aus gemessen, nicht von einem angehängten Elternobjekt. Ein Ped, der einer sich bewegenden Entity folgt (attach oder seat an einem Fahrzeug, das wegfährt), braucht eine große distance und eine eigene Reichweitenprüfung, sonst bleibt er, wo er erstellt wurde.

Blips

createBlip

Erstellt einen benannten Karten-Blip und gibt sein Handle zurück. Du entfernst ihn selbst mit RemoveBlip(handle); für Blips, die du neu aufbaust, wenn sich das Panel ändert, nutze eine Blips-Gruppe.

Seite: Client · Wartet: nein

Signatur
createBlip(options: BlipOptions): number
Lua
local blip = aiLib.Blips.create(options)

Parameter

Prop

Type

BlipOptions

Prop

Type

Ein Blip-Stil, der in deinem Admin-Panel gewählt wurde (das blip-Widget, gelesen mit readBlipStyle), lässt sich direkt in diese Optionen einsetzen: createBlip({ ...style, coords, label }).

Rückgabewert

number: das Blip-Handle.

Beispiel

import { createBlip, createLocale } from "@aicore-fivem/lib/client";

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

// Ein Lieferziel mit GPS-Route; bei Lieferung entfernt.
const target = createBlip({
  coords: { x: 1197.4, y: -3253.6, z: 7.1 },
  sprite: 478,
  color: 5,
  label: Locale("DELIVERY"),
  shortRange: false,
  route: true,
});
// ... bei Lieferung:
RemoveBlip(target);

new Blips

Eine Gruppe von Blips nach ID: add ersetzt einen Blip mit derselben ID, und clear entfernt alle. Nutze eine Gruppe pro Feature.

Seite: Client · Wartet: nein

Signatur
new Blips()
Lua
local blips = aiLib.Blips.new()

Methoden

Prop

Type

In Lua rufst du die Methoden mit Doppelpunkt auf: blips:add(id, options).

Beispiel

import { Blips, createLocale } from "@aicore-fivem/lib/client";

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

const GARAGES = [
  { id: "legion", coords: { x: 215.8, y: -810.1, z: 30.7 } },
  { id: "airport", coords: { x: -796.5, y: -2023.3, z: 9.2 } },
];

for (const garage of GARAGES)
  blips.add(garage.id, { coords: garage.coords, sprite: 357, color: 3, label: Locale("GARAGE") });

// Eine Garage wurde geschlossen:
blips.remove("airport");

Props und gehaltene Animationen

attachProp

Erstellt ein lokales Prop und hängt es an einen Ped-Bone (ein Handy in der Hand, eine Kiste, die vorne getragen wird). Das Prop hat keine Kollision, außer du verlangst sie.

Seite: Client · Wartet: ja (Promise: es lädt zuerst das Modell)

Signatur
attachProp(model: string | number, options: AttachPropOptions): Promise<number>

Kein Lua-Zwilling: Erstelle das Objekt und rufe AttachEntityToEntity selbst auf.

Parameter

Prop

Type

AttachPropOptions

Prop

Type

Rückgabewert

Promise<number>: die Prop-Entity, oder 0, wenn das Modell nicht lädt oder der Ped nicht mehr existiert. Es wird nie abgelehnt.

Beispiel

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

export async function readNewspaper(): Promise<void> {
  const paper = await attachProp("prop_cliff_paper", {
    bone: 18905,
    offset: { x: 0.12, y: 0.03, z: 0.02 },
    rotation: { x: 10, y: 0, z: 0 },
  });
  const hold = player.holdAnim("amb@world_human_tourist_map@male@base", "base");
  setTimeout(() => {
    hold.stop();
    if (paper) DeleteEntity(paper);
  }, 10_000);
}

Du löschst das Prop selbst mit DeleteEntity. Props, die du vergessen hast, werden gelöscht, wenn deine Ressource stoppt.

player.holdAnim

Hält eine Animation am Laufen, bis du sie stoppst. Wenn ein Sturz, ein Stoß oder ein Ragdoll sie unterbricht, wird sie innerhalb einer halben Sekunde wieder aufgenommen. Nutze es zum Tragen, ein Handy halten oder eine Arbeitsschleife. Ein Halten pro Ressource: Ein neues ersetzt das alte.

Seite: Client · Wartet: nein

Signatur
player.holdAnim(dict: string, clip: string, options?: HoldAnimOptions): { stop(): void }

Kein Lua-Zwilling: Spiele die Animation mit aiLib.player.playAnim ab und prüfe sie mit einem aiLib.every-Job.

Parameter

Prop

Type

HoldAnimOptions

Prop

Type

Rückgabewert

{ stop(): void }: Rufe stop() auf, um das Halten zu beenden und die Tasks des Peds zu leeren. stop() bei einem Halten, das schon ersetzt wurde, tut nichts.

Beispiel

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

export async function carryBox(): Promise<void> {
  const box = await attachProp("hei_prop_heist_box", {
    bone: 60309,
    offset: { x: 0.025, y: 0.08, z: 0.255 },
    rotation: { x: -145, y: 290, z: 0 },
  });
  // Endet von selbst, wenn der Spieler in ein Fahrzeug steigt.
  player.holdAnim("anim@heists@box_carry@", "idle", {
    while: () => cache.vehicle === false,
  });
  setTimeout(() => box && DeleteEntity(box), 60_000);
}

Ausstellungsfahrzeuge

new PreviewVehicle

Ein lokales Vorschaufahrzeug für Ausstellungsräume und Shops: eingefroren, unzerstörbar, verriegelt und sauber. Ein neues Modell zu zeigen ersetzt das alte, und der letzte Aufruf gewinnt immer (ein älterer Aufruf, der sein Modell noch lädt, tut nichts). Wird bei clear() gelöscht und wenn deine Ressource stoppt. Nichts ist vernetzt.

Seite: Client · Wartet: show schon (Promise)

Signatur
new PreviewVehicle()

Kein Lua-Zwilling.

Mitglieder

Prop

Type

Beispiel

import { PreviewVehicle, setVehicleSetup } from "@aicore-fivem/lib/client";

const preview = new PreviewVehicle();
const STAGE = { x: -44.4, y: -1097.1, z: 26.4, heading: 120 };

export async function showCar(model: string, color: number): Promise<void> {
  const vehicle = await preview.show(model, STAGE, (v) => setVehicleSetup(v, { colors: [color, color] }));
  if (vehicle) SetVehicleNumberPlateText(vehicle, "SHOWROOM");
}

export function leaveShowroom(): void {
  preview.clear();
}

Auf dieser Seite