AI Core
Dokumentacja APILib: klient

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)

Sygnatura
new LocalPed(options: LocalPedOptions)
Lua
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

Sygnatura
createBlip(options: BlipOptions): number
Lua
local 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

Sygnatura
new Blips()
Lua
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)

Sygnatura
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

Sygnatura
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)

Sygnatura
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();
}

Na tej stronie