AI Core
Dokumentacja APILib: klient

Warstwy przez ai-core

medical, appearance, gestures, seatbelt, fuel, mdt, radial, world i inventory - wywołania klienta, które docierają do dowolnego skryptu śmierci, ubrań, emotek, pasów, paliwa, MDT, menu radialnego, pogody albo ekwipunku, którego używa serwer.

Te obiekty nigdy nie rozmawiają z konkretnym skryptem. Pytają ai-core, a ai-core przekazuje wywołanie do skryptu, którego serwer używa do tego zadania: ai-death albo inny skrypt śmierci, ai-appearance albo tgiann-clothing, dowolny obsługiwany skrypt emotek albo menu radialnego. Twój skrypt działa dalej, gdy właściciel któryś wymieni. Jak działają warstwy, opisuje strona Warstwy i most.

Gdy nie działa żaden skrypt danego rodzaju, wywołania odpowiadają false, null albo własną wartością gry, jak mówi każdy wpis.

medical

medical.isDead

Czy lokalny gracz jest powalony (martwy albo w last stand), w dowolnym działającym skrypcie śmierci. Skrypty śmierci trzymają powalonego peda przy życiu, żeby go animować, więc samo IsEntityDead ich nie wykrywa. Po pierwszym wywołaniu to odczyt z pamięci.

Strona: Klient · Czeka: nie

Sygnatura
medical.isDead(): boolean

Brak odpowiednika w Lua: wywołaj exports['ai-core']:IsDead() i nasłuchuj lokalnego zdarzenia ai-core:client:dead (dead).

Zwracana wartość

boolean: true, gdy warstwa medyczna ai-core mówi, że gracz jest powalony, albo ped jest martwy dla gry.

Przykład

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

RegisterCommand(
  "phone",
  () => {
    if (medical.isDead()) return notify("You cannot use the phone now", "error");
    SetNuiFocus(true, true);
  },
  false,
);

medical.onChange

Uruchamia handler, gdy lokalny gracz zostanie powalony albo wstanie.

Strona: Klient · Czeka: nie

Sygnatura
medical.onChange(fn: (dead: boolean) => void): void

Brak odpowiednika w Lua: AddEventHandler('ai-core:client:dead', function(dead) end).

Parametry

Prop

Type

Zwracana wartość

void.

Przykład

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

const points = new Points();
medical.onChange(() => points.refresh()); // punkty, których canShow czyta medical.isDead()

appearance

Wygląd pedów przez warstwę wyglądu ai-core, niezależnie od tego, jaki skrypt ubrań działa.

appearance.apply

Nakłada zapisany wygląd na peda o modelu tego wyglądu. Pobierz wygląd na serwerze przez appearance.get(charId), utwórz peda z look.model, potem nałóż. Na własnym pedzie gracza zmienia jego ubrania.

Strona: Klient · Czeka: nie

Sygnatura
appearance.apply(ped: number, look: CharacterAppearance): boolean
Lua
local ok = aiLib.appearance.apply(ped, look)

Parametry

Prop

Type

Typ to CharacterAppearance.

Zwracana wartość

boolean: false, gdy peda już nie ma, model się różni albo nie działa żaden skrypt ubrań.

Przykład

import { appearance, LocalPed, triggerServerCallback } from "@aicore-fivem/lib/client";
import type { CharacterAppearance } from "@aicore-fivem/shared";

// Śpiąca kopia postaci, ubrana jak ona.
export async function showSleeper(charId: number): Promise<void> {
  const look = (await triggerServerCallback("mysleep:look", [charId]).catch(() => null)) as CharacterAppearance | null;
  if (!look) return;
  new LocalPed({
    model: look.model,
    coords: { x: 151.2, y: -1004.6, z: 29.4, heading: 90 },
    onSpawn: (ped) => appearance.apply(ped, look),
  });
}

Sprawdź, co wysyła serwer, zanim to rzutujesz. Ped utworzony z innym modelem niż look.model nie może przyjąć wyglądu: apply odpowiada false.

appearance.read

Wygląd, który ped nosi teraz.

Strona: Klient · Czeka: nie

Sygnatura
appearance.read(ped: number): CharacterAppearance | null
Lua
local look = aiLib.appearance.read(ped) -- tabela albo nil

Parametry

Prop

Type

Zwracana wartość

CharacterAppearance | null: wygląd albo null (nil w Lua), gdy skrypt ubrań nie potrafi tego stwierdzić albo żaden nie działa.

Przykład

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

const before = appearance.read(cache.ped); // załóż go z powrotem później przez appearance.apply

appearance.openMenu

Otwiera sklep z ubraniami, fryzjera albo zapisane stroje skryptu ubrań dla gracza.

Strona: Klient · Czeka: nie

Sygnatura
appearance.openMenu(menu: ClothingMenu): boolean
Lua
local ok = aiLib.appearance.openMenu(menu)

Parametry

Prop

Type

Typ to ClothingMenu.

Zwracana wartość

boolean: false, gdy skrypt ubrań nie ma takiego menu albo żaden nie działa.

Przykład

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

const points = new Points();
points.add("barber", {
  coords: { x: -814.3, y: -183.8, z: 37.6 },
  label: "Barber",
  onPressed: () => appearance.openMenu("barber"),
});

appearance.wearOutfit

Zakłada graczowi strój pracy (mundur) aż do reloadSkin. Nie jest zapisywany: ponowne połączenie albo reloadSkin przywraca graczowi jego ubrania. Zmieniają się tylko wymienione części.

Strona: Klient · Czeka: nie

Sygnatura
appearance.wearOutfit(outfit: JobOutfit): boolean
Lua
local ok = aiLib.appearance.wearOutfit(outfit)

Parametry

Prop

Type

Typy to JobOutfit i OutfitPiece.

Zwracana wartość

boolean: false, gdy nie może (brak skryptu ubrań, model, którego nie obsługuje).

Przykład

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

appearance.wearOutfit({
  components: [
    { id: 11, collection: "", index: 55, texture: 0 },
    { id: 4, collection: "", index: 35, texture: 0 },
  ],
  props: [{ id: 0, collection: "", index: -1, texture: 0 }],
});

appearance.reloadSkin

Zakłada graczowi z powrotem jego zapisany wygląd (zdejmuje strój pracy).

Strona: Klient · Czeka: nie

Sygnatura
appearance.reloadSkin(): boolean
Lua
local ok = aiLib.appearance.reloadSkin()

Zwracana wartość

boolean: false bez skryptu ubrań.

Przykład

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

RegisterCommand("offduty", () => appearance.reloadSkin(), false);

gestures

Ręce w górze, wskazywanie i emotki dowolnego działającego skryptu emotek, przez ai-core.

gestures.isHandsUp

Czy lokalny gracz ma ręce w górze.

Strona: Klient · Czeka: nie

Sygnatura
gestures.isHandsUp(): boolean
Lua
local up = aiLib.gestures.isHandsUp()

Zwracana wartość

boolean: true, dopóki ręce są w górze w działającym skrypcie emotek.

Przykład

import { gestures, onServerCallback } from "@aicore-fivem/lib/client";

// Serwer pyta przed napadem, czy ofiara się poddała.
onServerCallback("myrob:surrendered", () => gestures.isHandsUp());

gestures.isPointing

Czy lokalny gracz wskazuje.

Strona: Klient · Czeka: nie

Sygnatura
gestures.isPointing(): boolean
Lua
local pointing = aiLib.gestures.isPointing()

Zwracana wartość

boolean: true, dopóki wskazuje.

Przykład

if (gestures.isPointing()) return; // nie zaczynaj emotki w trakcie wskazywania

gestures.provider

Skrypt emotek, który odpowiada na ręce w górze i wskazywanie.

Strona: Klient · Czeka: nie

Sygnatura
gestures.provider(): string | null
Lua
local name = aiLib.gestures.provider()

Zwracana wartość

string | null: nazwa jego zasobu albo null (nil), gdy żaden nie działa.

Przykład

console.log(`hands up from ${gestures.provider() ?? "nothing"}`);

gestures.playEmote

Odtwarza emotkę według nazwy komendy (tego, co gracze wpisują po e) w działającym skrypcie emotek.

Strona: Klient · Czeka: nie

Sygnatura
gestures.playEmote(name: string): boolean
Lua
local ok = aiLib.gestures.playEmote(name)

Parametry

Prop

Type

Zwracana wartość

boolean: false bez skryptu emotek.

Przykład

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

RegisterCommand("hi", () => gestures.playEmote("wave"), false);

gestures.cancelEmote

Zatrzymuje emotkę, którą odtwarza gracz (skuty, powalony).

Strona: Klient · Czeka: nie

Sygnatura
gestures.cancelEmote(): boolean
Lua
local ok = aiLib.gestures.cancelEmote()

Zwracana wartość

boolean: false bez skryptu emotek.

Przykład

onServerEvent("mypolice:cuffed", () => gestures.cancelEmote());

gestures.emoteProvider

Skrypt emotek, który odtwarza emotki (może się różnić od tego, który odpowiada na ręce w górze).

Strona: Klient · Czeka: nie

Sygnatura
gestures.emoteProvider(): string | null
Lua
local name = aiLib.gestures.emoteProvider()

Zwracana wartość

string | null: nazwa jego zasobu albo null (nil), gdy żaden nie działa.

Przykład

if (gestures.emoteProvider() === null) console.log("no emote script: skipping the emote");

seatbelt

Pas bezpieczeństwa lokalnego gracza przez ai-core, niezależnie od tego, jaki skrypt pasów działa.

seatbelt.isOn

Czy pas jest zapięty. Pytaj na żądanie, nie co klatkę.

Strona: Klient · Czeka: nie

Sygnatura
seatbelt.isOn(): boolean | null
Lua
local worn = aiLib.seatbelt.isOn() -- boolean albo nil

Zwracana wartość

boolean | null: true albo false; null (nil), gdy nie odpowiada żaden skrypt pasów.

Przykład

import { cache, notify, onCache, seatbelt } from "@aicore-fivem/lib/client";

onCache("vehicle", (vehicle) => {
  if (vehicle !== false && seatbelt.isOn() === false) notify("Buckle up", "warning");
});

seatbelt.onChange

Uruchamia handler, gdy zmieni się pas. Wyzwalają go tylko skrypty pasów, które zgłaszają zmiany.

Strona: Klient · Czeka: nie

Sygnatura
seatbelt.onChange(fn: (worn: boolean | null) => void): void
Lua
aiLib.seatbelt.onChange(function(worn) end)

Parametry

Prop

Type

Zwracana wartość

void.

Przykład

seatbelt.onChange((worn) => SendNUIMessage({ action: "belt", data: worn === true }));

seatbelt.provider

Skrypt pasów, który odpowiada.

Strona: Klient · Czeka: nie

Sygnatura
seatbelt.provider(): string | null
Lua
local name = aiLib.seatbelt.provider()

Zwracana wartość

string | null: nazwa jego zasobu albo null (nil), gdy żaden nie odpowiada.

Przykład

if (seatbelt.provider() === null) console.log("no seat belt script runs");

fuel

fuel.get

Poziom paliwa pojazdu. Serwer trzyma state bag fuel dla każdego pojazdu niezależnie od skryptu paliwa, więc to odczyt z pamięci; bez tego bagu to poziom zbiornika z gry.

Strona: Klient · Czeka: nie

Sygnatura
fuel.get(vehicle: number): number

Brak odpowiednika w Lua: czytaj Entity(vehicle).state.fuel. Ustawianie paliwa jest tylko na serwerze (fuel.set na stronie Pojazdy).

Parametry

Prop

Type

Zwracana wartość

number: 0-100.

Przykład

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

every(1000, () => {
  if (cache.vehicle !== false) SendNUIMessage({ action: "fuel", data: Math.round(fuel.get(cache.vehicle)) });
});

mdt

mdt.open

Otwiera aktywne policyjne MDT dla lokalnego gracza. MDT samo sprawdza pracę.

Strona: Klient · Czeka: nie

Sygnatura
mdt.open(): boolean
Lua
local ok = aiLib.mdt.open()

Zwracana wartość

boolean: false, gdy nie działa żadne MDT albo nie da się go otworzyć z zewnątrz.

Przykład

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

RegisterCommand("mdt", () => {
  if (!mdt.open()) notify("No MDT available", "error");
}, false);

radial

Pozycje w dowolnym działającym menu radialnym (ai-radialmenu albo inne przez warstwę radialną ai-core). ai-core trzyma je przez restarty menu radialnego i usuwa, gdy twój zasób się zatrzyma: dodaj raz przy starcie.

radial.add

Dodaje pozycję do koła albo zastępuje pozycję o tym samym id.

Strona: Klient · Czeka: nie

Sygnatura
radial.add(item: RadialItem): void
Lua
aiLib.radial.add(item)

Parametry

Prop

Type

RadialItem

Prop

Type

Typ to RadialItem.

Zwracana wartość

void.

Przykład

import { cache, createLocale, hasJob, radial } from "@aicore-fivem/lib/client";
import { RADIAL_VEHICLE } from "@aicore-fivem/shared";

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

radial.add({
  id: "myscript:engine",
  label: Locale("ENGINE"),
  icon: "power-off",
  parent: RADIAL_VEHICLE,
  keepOpen: true,
  canShow: () => cache.seat === -1,
  onPressed: () => {
    if (cache.vehicle === false) return;
    SetVehicleEngineOn(cache.vehicle, !GetIsVehicleEngineRunning(cache.vehicle), false, true);
  },
});

radial.add({
  id: "myscript:police",
  label: Locale("POLICE"),
  icon: "shield-halved",
  canShow: () => hasJob(["police"]),
  items: [
    { id: "myscript:cuff", label: Locale("CUFF"), icon: "handcuffs", onPressed: () => emitNet("mypolice:cuff") },
  ],
});

radial.remove

Usuwa jedną z twoich pozycji. Nieznane id nic nie robi.

Strona: Klient · Czeka: nie

Sygnatura
radial.remove(id: string): void
Lua
aiLib.radial.remove(id)

Parametry

Prop

Type

Zwracana wartość

void.

Przykład

radial.remove("myscript:engine");

radial.refresh

Ponownie czyta każde canShow otwartego koła. Wywołaj ją po zmianie czegoś, co czytają, gdy koło może być otwarte.

Strona: Klient · Czeka: nie

Sygnatura
radial.refresh(): void
Lua
aiLib.radial.refresh()

Zwracana wartość

void.

Przykład

onMembershipChange(() => radial.refresh());

world

Synchronizacja pogody i czasu dowolnego działającego skryptu pogody, wstrzymywana, dopóki obowiązuje powód.

world.pauseSync

Wstrzymuje synchronizację pogody i czasu z powodu: wewnątrz wnętrza, w czasie sceny albo gdy twój skrypt ustawia własną pogodę.

Strona: Klient · Czeka: nie

Sygnatura
world.pauseSync(reason: string): void
Lua
aiLib.world.pauseSync(reason)

Parametry

Prop

Type

Zwracana wartość

void.

Przykład

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

export function enterApartment(): void {
  world.pauseSync("apartment");
  NetworkOverrideClockTime(12, 0, 0);
  SetWeatherTypeNowPersist("EXTRASUNNY");
}

export function leaveApartment(): void {
  world.resumeSync("apartment");
}

world.resumeSync

Usuwa jeden powód wstrzymania; synchronizacja znów działa, gdy nie zostaje żaden powód.

Strona: Klient · Czeka: nie

Sygnatura
world.resumeSync(reason: string): void
Lua
aiLib.world.resumeSync(reason)

Parametry

Prop

Type

Zwracana wartość

void. Zobacz przykład world.pauseSync.

inventory

Ekwipunek lokalnego gracza przez warstwę ekwipunku ai-core: odpowiada ekwipunek wybrany przez serwer. Dawanie i zabieranie przedmiotów jest tylko na serwerze (Przedmioty).

inventory.openInventory

Otwiera ekran własnego ekwipunku gracza.

Strona: Klient · Czeka: nie

Sygnatura
inventory.openInventory(): void
Lua
aiLib.inventory.openInventory()

Zwracana wartość

void.

Przykład

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

RegisterCommand("bag", () => inventory.openInventory(), false);

inventory.hasItem

Czy gracz ma co najmniej count sztuk przedmiotu. Używaj jej w canShow, żeby gracz widział tylko to, co może zrobić; serwer sprawdza ponownie.

Strona: Klient · Czeka: nie

Sygnatura
inventory.hasItem(item: string, count?: number): boolean
Lua
local has = aiLib.inventory.hasItem(item, count)

Parametry

Prop

Type

Zwracana wartość

boolean: true, gdy gracz ma wystarczająco.

Przykład

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

const points = new Points();
points.addVehicle("lockpick", {
  label: "Lockpick",
  icon: "unlock",
  canShow: (vehicle) => GetVehicleDoorLockStatus(vehicle) >= 2 && inventory.hasItem("lockpick"),
  onPressed: (vehicle) => emitNet("mykeys:lockpick", NetworkGetNetworkIdFromEntity(vehicle)),
});

inventory.currentWeapon

Przedmiot broni w ręku gracza: jego nazwa, etykieta i obrazek.

Strona: Klient · Czeka: nie

Sygnatura
inventory.currentWeapon(): HeldWeapon | null
Lua
local weapon = aiLib.inventory.currentWeapon() -- tabela albo nil

Zwracana wartość

HeldWeapon { name: string; label: string; image?: string } (name jak WEAPON_PISTOL, image to adres nui://, gdy ekwipunek go ma) albo null (nil), gdy ręka jest pusta.

Przykład

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

// Czytaj ją, gdy zmienia się broń, nigdy co klatkę.
onCache("weapon", () => SendNUIMessage({ action: "weapon", data: inventory.currentWeapon() }));

Na tej stronie