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)
new LocalPed(options: LocalPedOptions)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
createBlip(options: BlipOptions): numberlocal 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
new Blips()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)
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
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)
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();
}