Pedy, blipy i propy
LocalPed, Blips, createBlip, attachProp, PreviewVehicle i player.holdAnim - lokalni NPC, blipy na mapie, trzymane propy, pojazdy w salonie i trzymane animacje.
Rzeczy, które widzi tylko ten klient: NPC za ladą, blipy na mapie, prop w ręku gracza, auto w salonie. Żadna z nich nie jest sieciowa, więc nigdy nie walczą z blokadą encji i nic nie kosztują serwera. Punkt już tworzy własnego NPC i blip (ped i blip w points.add); używaj tych klas dla tych bez punktu.
Lokalne pedy
new LocalPed
Ped widoczny tylko dla tego klienta (sprzedawca, NPC pracy). Jest tworzony, gdy gracz podejdzie na distance od coords, i usuwany, gdy odejdzie, więc tysiąc NPC na mapie nic nie kosztuje, dopóki ktoś nie podejdzie. Stoi zamrożony, nie można go zranić i ignoruje zdarzenia (strzały, popychanie).
Strona: Klient · Czeka: nie (model wczytuje się w tle, gdy gracz się zbliży)
new LocalPed(options: LocalPedOptions)local ped = aiLib.LocalPed.new(options)Parametry
Prop
Type
LocalPedOptions
Prop
Type
Składowe
Prop
Type
Przykład
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),
});
// Później, gdy praca się skończy:
guard.remove();Odległość jest mierzona od coords, a nie od przyczepionego rodzica. Ped, który podąża za ruchomą encją (attach albo seat w pojeździe, który odjeżdża), potrzebuje dużego distance i własnego sprawdzenia zasięgu, bo inaczej zostaje tam, gdzie go utworzono.
Blipy
createBlip
Tworzy jeden nazwany blip na mapie i zwraca jego uchwyt. Usuwasz go sam przez RemoveBlip(handle); dla blipów, które przebudowujesz przy zmianie panelu, użyj grupy Blips.
Strona: Klient · Czeka: nie
createBlip(options: BlipOptions): numberlocal blip = aiLib.Blips.create(options)Parametry
Prop
Type
BlipOptions
Prop
Type
Styl blipa wybrany w twoim panelu administratora (widżet blip, czytany przez readBlipStyle) rozwija się wprost w te opcje: createBlip({ ...style, coords, label }).
Zwracana wartość
number: uchwyt blipa.
Przykład
import { createBlip, createLocale } from "@aicore-fivem/lib/client";
const Locale = createLocale<typeof import("../../locales/en.json")>();
// Cel dostawy z trasą GPS; usuwany po dostarczeniu.
const target = createBlip({
coords: { x: 1197.4, y: -3253.6, z: 7.1 },
sprite: 478,
color: 5,
label: Locale("DELIVERY"),
shortRange: false,
route: true,
});
// ... przy dostarczeniu:
RemoveBlip(target);new Blips
Grupa blipów według id: add zastępuje blip o tym samym id, a clear usuwa je wszystkie. Używaj jednej grupy na funkcję.
Strona: Klient · Czeka: nie
new Blips()local blips = aiLib.Blips.new()Metody
Prop
Type
W Lua wywołuj metody z dwukropkiem: blips:add(id, options).
Przykład
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") });
// Garaż został zamknięty:
blips.remove("airport");Propy i trzymane animacje
attachProp
Tworzy lokalny prop i przyczepia go do kości peda (telefon w ręku, pudło niesione przed sobą). Prop nie ma kolizji, chyba że o nią poprosisz.
Strona: Klient · Czeka: tak (Promise: najpierw wczytuje model)
attachProp(model: string | number, options: AttachPropOptions): Promise<number>Brak odpowiednika w Lua: utwórz obiekt i sam wywołaj AttachEntityToEntity.
Parametry
Prop
Type
AttachPropOptions
Prop
Type
Zwracana wartość
Promise<number>: encja propa albo 0, gdy model się nie wczyta albo ped już nie istnieje. Nigdy się nie odrzuca.
Przykład
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);
}Prop usuwasz sam przez DeleteEntity. Zapomniane propy są usuwane, gdy twój zasób się zatrzyma.
player.holdAnim
Utrzymuje odtwarzanie animacji, dopóki jej nie zatrzymasz. Gdy przerwie ją upadek, potrącenie albo ragdoll, jest przywracana w ciągu pół sekundy. Używaj jej do noszenia, trzymania telefonu albo pętli pracy. Jedno trzymanie na zasób: nowe zastępuje stare.
Strona: Klient · Czeka: nie
player.holdAnim(dict: string, clip: string, options?: HoldAnimOptions): { stop(): void }Brak odpowiednika w Lua: odtwórz animację przez aiLib.player.playAnim i sprawdzaj ją zadaniem aiLib.every.
Parametry
Prop
Type
HoldAnimOptions
Prop
Type
Zwracana wartość
{ stop(): void }: wywołaj stop(), żeby zakończyć trzymanie i wyczyścić zadania peda. Wywołanie stop() na trzymaniu, które zostało już zastąpione, nic nie robi.
Przykład
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 },
});
// Kończy się samo, gdy gracz wsiądzie do pojazdu.
player.holdAnim("anim@heists@box_carry@", "idle", {
while: () => cache.vehicle === false,
});
setTimeout(() => box && DeleteEntity(box), 60_000);
}Pojazdy w salonie
new PreviewVehicle
Lokalny pojazd podglądu dla salonów i sklepów: zamrożony, niezniszczalny, zamknięty i czysty. Pokazanie nowego modelu zastępuje stary, a ostatnie wywołanie zawsze wygrywa (starsze wywołanie, które jeszcze wczytuje model, nic nie robi). Usuwany przy clear() i gdy twój zasób się zatrzyma. Nic sieciowego.
Strona: Klient · Czeka: show czeka (Promise)
new PreviewVehicle()Brak odpowiednika w Lua.
Składowe
Prop
Type
Przykład
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();
}