AI Core
Dokumentacja APILib: klient

Sondy i wczytywanie

raycast, groundZ, locationName, vehicleLabel, waypoint, pedHeadshot, onShot i loadery request - pytanie gry o świat i wczytywanie zasobów gry.

Pytania do gry o świat (co jest przed graczem, jak wysoko jest ziemia, jak nazywa się ta ulica) i loadery, których każdy model, animacja i efekt potrzebuje przed użyciem.

Sondy

raycast

Sonda liniowa z odpowiedzią w tej samej klatce: w co najpierw trafia linia od from do to. Używaj jej do "na co patrzy gracz", stawiania obiektów na ziemi albo linii wzroku.

Strona: Klient · Czeka: nie (blokuje klatkę, aż test się skończy)

Sygnatura
raycast(from: Vec3, to: Vec3, options?: RaycastOptions): RayHit | null
Lua
local hit = aiLib.raycast(from, to, options) -- tabela albo nil; from / to to vector3

Parametry

Prop

Type

RaycastOptions

Prop

Type

Zwracana wartość

RayHit | null: { coords, normal, entity } dla pierwszego trafienia albo null (nil), gdy linia w nic nie trafia.

Prop

Type

Przykład

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

/** What the camera looks at within 10 m. */
export function lookedAt(): number {
  const [cx = 0, cy = 0, cz = 0] = GetGameplayCamCoord();
  const [rx = 0, , rz = 0] = GetGameplayCamRot(2);
  const pitch = (rx * Math.PI) / 180;
  const yaw = (rz * Math.PI) / 180;
  const dir = { x: -Math.sin(yaw) * Math.cos(pitch), y: Math.cos(yaw) * Math.cos(pitch), z: Math.sin(pitch) };
  const hit = raycast(
    { x: cx, y: cy, z: cz },
    { x: cx + dir.x * 10, y: cy + dir.y * 10, z: cz + dir.z * 10 },
    { flags: 2 | 4 | 16 },
  );
  return hit?.entity ?? 0;
}

To synchroniczna sonda: ogranicz się do jednej albo dwóch na klatkę.

groundZ

Wysokość ziemi pod punktem, sondując w dół od z.

Strona: Klient · Czeka: nie

Sygnatura
groundZ(x: number, y: number, z?: number): number | null
Lua
local ground = aiLib.groundZ(x, y, z) -- liczba albo nil

Parametry

Prop

Type

Zwracana wartość

number | null: wysokość ziemi albo null (nil), dopóki kolizja tam nie jest wczytana (obszar jest daleko od gracza).

Przykład

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

const { x, y, z } = player.coords();
const ground = groundZ(x, y, z + 2);
if (ground !== null) console.log(`ground is ${(z - ground).toFixed(2)} m below`);

Żeby przenieść gracza na nieznaną ziemię, użyj player.teleport bez z: czeka na kolizję na każdej wysokości.

locationName

Nazwy ulicy, ulicy poprzecznej i obszaru w punkcie. Używaj ich w alertach dispatchu, wiadomościach telefonu i HUD-ach.

Strona: Klient · Czeka: nie

Sygnatura
locationName(coords?: Vec3): LocationName
Lua
local where = aiLib.locationName(coords) -- coords to vector3, opcjonalnie

Parametry

Prop

Type

Zwracana wartość

LocationName:

Prop

Type

Przykład

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

const { street, crossing, zone } = locationName();
const text = crossing ? `${street} / ${crossing}, ${zone}` : `${street}, ${zone}`;

vehicleLabel

Nazwa wyświetlana pojazdu (Sultan RS) z nazwy modelu, hasha modelu albo encji pojazdu.

Strona: Klient · Czeka: nie

Sygnatura
vehicleLabel(vehicle: string | number): string
Lua
local name = aiLib.vehicleLabel(vehicle)

Parametry

Prop

Type

Zwracana wartość

string: etykieta modelu z gry; nazwa wyświetlana modelu, gdy gra nie ma dla niego tekstu (pojazdy dodatkowe bez wpisu tekstowego); nazwa albo hash modelu jako tekst, gdy brakuje nawet tego.

Przykład

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

onCache("vehicle", (vehicle) => {
  if (vehicle !== false && cache.seat === -1) notify(vehicleLabel(vehicle), "info", 2000);
});

waypoint

Punkt nawigacji, który gracz ustawił na mapie.

Strona: Klient · Czeka: nie

Sygnatura
waypoint(): { x: number; y: number } | null
Lua
local target = aiLib.waypoint() -- { x, y } albo nil

Zwracana wartość

{ x: number; y: number } | null: pozycja punktu nawigacji (bez wysokości: punkty nawigacji na mapie jej nie mają) albo null (nil), gdy żaden punkt nie jest ustawiony.

Przykład

Zobacz player.teleport: teleport do punktu nawigacji.

pedHeadshot

Robi zdjęcie głowy peda i czeka, aż gra je wyrenderuje. Używaj nazwy tekstury na stronie NUI jako https://nui-img/<txd>/<txd>.

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

Sygnatura
pedHeadshot(ped: number, transparent?: boolean, timeoutMs?: number): Promise<{ handle: number; txd: string } | null>
Lua
local handle, txd = aiLib.pedHeadshot(ped, transparent, timeout) -- wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<{ handle: number; txd: string } | null>: uchwyt zdjęcia i nazwa jego tekstury; null, gdy ped nie istnieje albo render trwał dłużej niż limit czasu. Lua zwraca handle, txd albo nil.

Przykład

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

export async function sendMugshot(): Promise<void> {
  const shot = await pedHeadshot(cache.ped, true);
  if (!shot) return;
  SendNUIMessage({ action: "photo", data: `https://nui-img/${shot.txd}/${shot.txd}` });
  setTimeout(() => UnregisterPedheadshot(shot.handle), 10_000);
}

Wywołaj UnregisterPedheadshot(handle), gdy zdjęcie nie jest już pokazywane.

onShot

Uruchamia handler w klatce, w której lokalny ped oddaje strzał (stres, alerty o strzałach, łuski). Jedno sprawdzenie co klatkę na twój zasób, włączone tylko wtedy, gdy broń jest w ręku.

Strona: Klient · Czeka: nie

Sygnatura
onShot(handler: (weapon: number) => void): () => void
Lua
aiLib.onShot(function(weapon) end) -- nic nie zwraca

Parametry

Prop

Type

Zwracana wartość

TypeScript: () => void, funkcja, która usuwa handler. Lua nic nie zwraca (handler zostaje).

Przykład

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

let lastAlert = 0;
onShot(() => {
  if (GetGameTimer() - lastAlert < 30_000) return; // jeden alert na 30 s
  lastAlert = GetGameTimer();
  emitNet("mypolice:shots");
});

Wczytywanie zasobów gry

Modele, animacje, efekty i tekstury muszą być wczytane przed użyciem. Każdy loader prosi o zasób i czeka, aż będzie gotowy. Zwolnij go, gdy skończysz, jak mówi każdy wpis.

requestModel

Wczytuje model (ped, pojazd, obiekt) i podaje jego hash.

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

Sygnatura
requestModel(model: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestModel(model, timeout) -- integer albo nil, wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<number>: hash modelu po wczytaniu. Odrzuca się, gdy model nie istnieje w plikach gry albo nie wczyta się na czas. Lua zwraca hash albo nil w obu przypadkach.

Przykład

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

export async function placeCone(x: number, y: number, z: number): Promise<number> {
  const hash = await requestModel("prop_roadcone02a");
  const cone = CreateObject(hash, x, y, z, false, false, false);
  SetModelAsNoLongerNeeded(hash);
  PlaceObjectOnGroundProperly(cone);
  return cone;
}

Wywołaj SetModelAsNoLongerNeeded(hash), gdy encja zostanie utworzona.

requestAnimDict

Wczytuje słownik animacji.

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

Sygnatura
requestAnimDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestAnimDict(dict, timeout) -- string albo nil, wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<string>: nazwa słownika po wczytaniu. Odrzuca się, gdy słownik nie istnieje albo nie wczyta się na czas. Lua zwraca nazwę albo nil.

Przykład

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

export async function dance(): Promise<void> {
  const dict = await requestAnimDict("anim@amb@nightclub@dancers@crowddance_facedj@");
  TaskPlayAnim(cache.ped, dict, "hi_dance_facedj_09_v2_male^1", 8, -8, -1, 1, 0, false, false, false);
  RemoveAnimDict(dict);
}

Wywołaj RemoveAnimDict(dict), gdy animacja nie jest już odtwarzana. player.playAnim wczytuje i zwalnia słownik za ciebie.

requestAnimSet

Wczytuje clipset ruchu (chód w kucki, chód rannego).

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

Sygnatura
requestAnimSet(set: string, timeoutMs?: number): Promise<string>
Lua
local set = aiLib.requestAnimSet(set, timeout) -- string albo nil, wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<string>: nazwa clipsetu po wczytaniu. Odrzuca się, gdy nie wczyta się na czas. Lua zwraca nazwę albo nil.

Przykład

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

export async function limp(): Promise<void> {
  const set = await requestAnimSet("move_m@injured");
  SetPedMovementClipset(cache.ped, set, 0.2);
}

Wywołaj RemoveAnimSet(set), gdy nie jest już używany.

requestPtfxAsset

Wczytuje zasób efektu cząsteczkowego.

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

Sygnatura
requestPtfxAsset(asset: string, timeoutMs?: number): Promise<string>
Lua
local asset = aiLib.requestPtfxAsset(asset, timeout) -- string albo nil, wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<string>: nazwa zasobu po wczytaniu. Odrzuca się, gdy nie wczyta się na czas. Lua zwraca nazwę albo nil.

Przykład

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

export async function sparks(): Promise<void> {
  const asset = await requestPtfxAsset("core");
  const { x, y, z } = player.coords();
  UseParticleFxAsset(asset);
  StartParticleFxNonLoopedAtCoord("ent_sht_electrical_box", x, y, z, 0, 0, 0, 1, false, false, false);
  RemoveNamedPtfxAsset(asset);
}

Wywołaj RemoveNamedPtfxAsset(asset), gdy skończysz.

requestTextureDict

Wczytuje strumieniowany słownik tekstur (dla DrawSprite i podobnych).

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

Sygnatura
requestTextureDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestTextureDict(dict, timeout) -- string albo nil, wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<string>: nazwa słownika po wczytaniu. Odrzuca się, gdy nie wczyta się na czas. Lua zwraca nazwę albo nil.

Przykład

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

export async function showCrosshair(): Promise<void> {
  const dict = await requestTextureDict("shared");
  every(0, () => DrawSprite(dict, "emptydot_32", 0.5, 0.5, 0.01, 0.018, 0, 255, 255, 255, 200));
}

Wywołaj SetStreamedTextureDictAsNoLongerNeeded(dict), gdy skończysz.

requestWeaponAsset

Wczytuje model i zasoby broni i podaje jej hash.

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

Sygnatura
requestWeaponAsset(weapon: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestWeaponAsset(weapon, timeout) -- integer albo nil, wywołuj wewnątrz wątku

Parametry

Prop

Type

Zwracana wartość

Promise<number>: hash broni po wczytaniu. Odrzuca się, gdy nie wczyta się na czas. Lua zwraca hash albo nil.

Przykład

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

export async function showcasePistol(): Promise<number> {
  const hash = await requestWeaponAsset("WEAPON_PISTOL");
  const { x, y, z } = player.coords();
  const object = CreateWeaponObject(hash, 0, x, y, z + 1, true, 1, 0);
  RemoveWeaponAsset(hash);
  return object;
}

Wywołaj RemoveWeaponAsset(hash), gdy skończysz.

Na tej stronie