AI Core
Dokumentacja APILib: klient

Lokalny gracz

Zapamiętany ped, pojazd, miejsce i broń, obiekt player (pozycja, teleport, animacje), wygaszanie ekranu, pedy innych graczy i najbliższy gracz.

Wszystko o graczu siedzącym przy tym komputerze. Czytaj wartości z cache zamiast wywoływać PlayerPedId() w pętlach: ai-core trzyma jednego obserwatora dla wszystkich zasobów i wypycha zmiany, więc żaden skrypt ich nie odpytuje.

cache

Najczęściej czytane wartości lokalnego gracza, utrzymywane aktualne przez jednego obserwatora ai-core. Jak cache w ox_lib: czytaj cache.ped zamiast wywoływać PlayerPedId() i cache.vehicle zamiast GetVehiclePedIsIn co klatkę. Odczyt klucza to zwykły odczyt z pamięci, bezpieczny w pętlach i kodzie co klatkę.

Strona: Klient · Czeka: nie

Sygnatura
const cache: PlayerCache // tylko do odczytu
Lua
local ped = aiLib.cache.ped

Klucze

Prop

Type

Typ to PlayerCache.

Przykład

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

// Prędkość pokazywana w czasie jazdy, czytana z cache co 200 ms.
every(200, () => {
  if (cache.vehicle === false || cache.seat !== -1) return;
  const kmh = GetEntitySpeed(cache.vehicle) * 3.6;
  SendNUIMessage({ action: "speed", data: Math.round(kmh) });
});

cache.ped spóźnia się za zmianą modelu do 100 ms. Zaraz po zmianie modelu (SetPlayerModel) wywołaj raz PlayerPedId(). Akcje player niżej już czytają peda na świeżo.

onCache

Uruchamia handler za każdym razem, gdy zmieni się jedna zapamiętana wartość: gracz wsiadł do pojazdu albo z niego wysiadł, zmienił miejsce, wyjął albo schował broń lub dostał nowego peda. Używaj go zamiast sprawdzać wartość na timerze.

Strona: Klient · Czeka: nie

Sygnatura
onCache<K extends keyof PlayerCache>(key: K, handler: (value: PlayerCache[K], old: PlayerCache[K]) => void): void
Lua
aiLib.cache.onChange(key, function(value, old) end)

Parametry

Prop

Type

Zwracana wartość

void. Nie da się usunąć handlera; trzymaj jeden na funkcję na górze pliku.

Przykład

import { onCache, inventory, Points } from "@aicore-fivem/lib/client";

const points = new Points();

// Punkty, których canShow czyta cache.vehicle, są sprawdzane ponownie.
onCache("vehicle", () => points.refresh());

// Przedmiot broni w ręku, czytany tylko przy zmianie broni.
onCache("weapon", (weapon) => {
  const item = weapon === false ? null : inventory.currentWeapon();
  SendNUIMessage({ action: "weapon", data: item });
});

readPlayerState

Czyta pojazd, miejsce i broń peda w tej chwili, bez cache. Używa jej obserwator ai-core; potrzebujesz jej tylko dla peda, który nie jest lokalny, albo żeby ręcznie porównać z cache.

Strona: Klient · Czeka: nie

Sygnatura
readPlayerState(ped: number): { vehicle: number | false; seat: number | false; weapon: number | false }

Brak odpowiednika w Lua.

Parametry

Prop

Type

Zwracana wartość

Obiekt z vehicle (uchwyt pojazdu, false pieszo), seat (-1 kierowca i wyżej, false pieszo) i weapon (hash w ręku, false bez broni).

Przykład

import { playerPed, readPlayerState } from "@aicore-fivem/lib/client";

const ped = playerPed(12);
if (ped !== 0 && readPlayerState(ped).seat === -1) console.log("player 12 is driving");

readWeapon

Broń w ręku peda w tej chwili, false bez broni.

Strona: Klient · Czeka: nie

Sygnatura
readWeapon(ped: number): number | false

Brak odpowiednika w Lua.

Parametry

Prop

Type

Zwracana wartość

number | false: hash broni albo false, gdy ped trzyma WEAPON_UNARMED.

Przykład

import { nearestPlayer, playerPed, readWeapon } from "@aicore-fivem/lib/client";

const id = nearestPlayer(5);
if (id !== null && readWeapon(playerPed(id)) !== false) console.log("the player next to you is armed");

player

Jeden obiekt dla lokalnego peda: gdzie jest, przemieszczanie, animacje. Odczyty używają cache.ped; akcje czytają peda na świeżo, więc działają też zaraz po zmianie modelu.

player.ped

Uchwyt lokalnego peda (ta sama wartość co cache.ped).

Strona: Klient · Czeka: nie

Sygnatura
player.ped: number // właściwość tylko do odczytu

Brak odpowiednika w Lua: użyj aiLib.cache.ped.

Zwracana wartość

number: uchwyt peda.

Przykład

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

SetPedArmour(player.ped, 100);

player.coords

Pozycja peda w tej chwili.

Strona: Klient · Czeka: nie

Sygnatura
player.coords(): Vec3
Lua
local coords = aiLib.player.coords() -- vector3

Zwracana wartość

Vec3 { x, y, z } w TypeScript (z to korzeń peda, około 1 m nad podłogą). Lua zwraca vector3.

Przykład

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

const here = player.coords();
console.log(`${locationName(here).street} at ${here.x.toFixed(1)}, ${here.y.toFixed(1)}`);

player.heading

Kierunek, w którym patrzy ped, w stopniach (0-360, 0 = północ).

Strona: Klient · Czeka: nie

Sygnatura
player.heading(): number
Lua
local heading = aiLib.player.heading()

Zwracana wartość

number: kierunek w stopniach.

Przykład

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

// Zapisz miejsce i kierunek dla rekordu panelu.
const spot = { ...player.coords(), heading: player.heading() };

player.distanceTo

Odległość w linii prostej od peda do punktu, w metrach.

Strona: Klient · Czeka: nie

Sygnatura
player.distanceTo(point: Vec3): number
Lua
local metres = aiLib.player.distanceTo(point) -- vector3 albo { x, y, z }

Parametry

Prop

Type

Zwracana wartość

number: metry, mierzone w 3D.

Przykład

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

const counter = { x: 25.7, y: -1347.3, z: 29.5 };
if (player.distanceTo(counter) > 3) notify("Walk to the counter first", "error");

player.freeze

Zamraża peda w miejscu albo pozwala mu znowu się ruszać.

Strona: Klient · Czeka: nie

Sygnatura
player.freeze(state: boolean): void
Lua
aiLib.player.freeze(frozen)

Parametry

Prop

Type

Zwracana wartość

void.

Przykład

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

player.freeze(true);
setTimeout(() => player.freeze(false), 5000);

player.teleport

Przenosi gracza i czeka, aż świat wokół nowego miejsca się wczyta, za czarnym wygaszeniem ekranu. Bez z (albo z ground: "find") szuka ziemi pod x i y: używaj tego dla punktu nawigacji na mapie.

Strona: Klient · Czeka: tak (Promise w TypeScript, w Lua wstrzymuje wątek)

Sygnatura
player.teleport(to: { x: number; y: number; z?: number }, options?: TeleportOptions): Promise<void>
Lua
aiLib.player.teleport(to, options) -- wywołuj wewnątrz wątku

Parametry

Prop

Type

TeleportOptions

Prop

Type

Zwracana wartość

Promise<void>, który się rozwiązuje, gdy gracz stoi w nowym miejscu i kolizja tam się wczytała (albo po 5 sekundach bez niej). Lua nic nie zwraca.

Przykład

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

RegisterCommand(
  "tpm",
  async () => {
    const target = waypoint();
    if (!target) return notify("Set a waypoint first", "error");
    await player.teleport(target, { keepVehicle: true }); // bez z: ląduje na ziemi
  },
  false,
);

Wyszukiwanie ziemi w TypeScript stawia zamrożonego peda na rosnących wysokościach, na każdej czeka na kolizję i pomija powierzchnie wewnątrz wnętrz MLO albo IPL, więc nigdy nie ląduje na dachu ani w budynku nad ulicą. Wersja Lua bierze pierwszą znalezioną ziemię i czeka na kolizję najwyżej 3 sekundy.

player.playAnim

Odtwarza animację na pedzie. Najpierw wczytuje słownik animacji.

Strona: Klient · Czeka: tak w TypeScript (rozwiązuje się, gdy animacja się zaczęła); w Lua wstrzymuje wątek, dopóki słownik się wczytuje

Sygnatura
player.playAnim(dict: string, clip: string, options?: AnimOptions): Promise<void>
Lua
aiLib.player.playAnim(dict, clip, options) -- wywołuj wewnątrz wątku

Parametry

Prop

Type

AnimOptions

Prop

Type

Zwracana wartość

Promise<void>, który się rozwiązuje, gdy animacja się zaczęła. Odrzuca się, gdy słownik nie istnieje albo nie wczyta się w ciągu 10 sekund. Lua nic nie zwraca i nic nie robi, gdy słownik się nie wczyta.

Przykład

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

export async function handOver(): Promise<void> {
  await player.playAnim("mp_common", "givetake1_a", { flag: 48, duration: 1500 });
}

player.stopAnim

Zatrzymuje wszystko, co robi ped (ClearPedTasks): animacje i scenariusze.

Strona: Klient · Czeka: nie

Sygnatura
player.stopAnim(): void
Lua
aiLib.player.stopAnim()

Zwracana wartość

void.

Przykład

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

export async function readClipboard(): Promise<void> {
  await player.playAnim("amb@world_human_clipboard@male@idle_a", "idle_c");
  setTimeout(() => player.stopAnim(), 4000);
}

player.holdAnim

Utrzymuje odtwarzanie animacji, dopóki jej nie zatrzymasz, i przywraca ją, gdy przerwie ją upadek albo potrącenie. Opisana razem z propami na stronie Pedy, blipy i propy.

Wygaszanie ekranu i inni gracze

fadeOut

Wygasza ekran do czerni i czeka, aż będzie całkiem czarny. Używaj go, żeby ukryć teleport, zmianę modelu albo zmianę sceny.

Strona: Klient · Czeka: tak (Promise w TypeScript, w Lua wstrzymuje wątek)

Sygnatura
fadeOut(ms?: number): Promise<void>
Lua
aiLib.fadeOut(ms) -- wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<void>, który się rozwiązuje, gdy ekran jest czarny, najpóźniej po ms + 2 sekundach. Nigdy się nie odrzuca.

Przykład

import { fadeIn, fadeOut } from "@aicore-fivem/lib/client";

export async function moveToSquare(): Promise<void> {
  await fadeOut();
  SetEntityCoords(PlayerPedId(), -269.4, -955.3, 31.2, false, false, false, false);
  await fadeIn();
}

fadeIn

Rozjaśnia ekran z powrotem i czeka, aż będzie czysty. Para dla fadeOut.

Strona: Klient · Czeka: tak (Promise w TypeScript, w Lua wstrzymuje wątek)

Sygnatura
fadeIn(ms?: number): Promise<void>
Lua
aiLib.fadeIn(ms) -- wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<void>, który się rozwiązuje, gdy ekran jest czysty, najpóźniej po ms + 2 sekundach. Nigdy się nie odrzuca.

Przykład

Zobacz fadeOut: oba zawsze są używane razem.

playerPed

Ped gracza według id serwerowego. Dla lokalnego gracza zwraca cache.ped; dla innego gracza zwraca 0, gdy ten gracz nie jest na tyle blisko, żeby był strumieniowany do tego klienta.

Strona: Klient · Czeka: nie

Sygnatura
playerPed(serverId: number): number
Lua
local ped = aiLib.playerPed(serverId)

Parametry

Prop

Type

Zwracana wartość

number: uchwyt peda albo 0, gdy gracz nie jest w zasięgu tego klienta.

Przykład

import { onServerEvent, playerPed } from "@aicore-fivem/lib/client";

// Serwer mówi wszystkim w pobliżu, że gracz został skuty.
onServerEvent(
  "myscript:cuffed",
  { args: ([id]) => (typeof id === "number" ? [id] : null) },
  (id) => {
    const ped = playerPed(id);
    if (ped !== 0) SetEnableHandcuffs(ped, true);
  },
);

Nigdy nie używaj ręcznie GetPlayerPed(-1) ani GetPlayerPed(GetPlayerFromServerId(id)): nieznane id daje -1, a GetPlayerPed(-1) to lokalny ped, więc akcja trafia w złego gracza.

nearestPlayer

Najbliższy inny gracz w danej odległości, jako id serwerowe. Przechodzi tylko po graczach strumieniowanych do tego klienta. Używaj go, żeby wybrać cel akcji dawania, przeszukania, skucia albo powalenia, potem wyślij to id do serwera, który ponownie sprawdzi odległość.

Strona: Klient · Czeka: nie

Sygnatura
nearestPlayer(metres: number, options?: { from?: Vec3; filter?: (serverId: number, ped: number) => boolean }): number | null
Lua
local serverId = aiLib.nearestPlayer(metres, options) -- integer albo nil

Parametry

Prop

Type

Opcje

Prop

Type

Zwracana wartość

number | null: id serwerowe najbliższego gracza, który przeszedł filter, albo null (nil w Lua), gdy nikogo nie ma w odległości metres. Lokalny gracz nigdy nie jest zwracany.

Przykład

import { callAction, nearestPlayer, notify } from "@aicore-fivem/lib/client";

RegisterCommand(
  "givecash",
  async (_src: number, args: string[]) => {
    const target = nearestPlayer(3, { filter: (_id, ped) => !IsPedInAnyVehicle(ped, false) });
    if (target === null) return notify("Nobody is close enough", "error");
    await callAction("myscript:give", [target, Number(args[0])], { fallback: "GIVE_FAILED" });
  },
  false,
);

Na tej stronie