AI Core
Dokumentacja APIZdarzenia i stan

State bagi

Wspólne wartości stanu publikowane przez ai-core i skrypty ai-* - bagi graczy, bagi pojazdów i klucze GlobalState - co trzyma każda, kto ją zapisuje i jak ją czytać i śledzić.

State bag to wartość, którą FiveM synchronizuje dla wszystkich: w GlobalState (jedna wartość dla całego serwera), na graczu albo na encji (pojeździe). Każdy zasób po każdej stronie może ją czytać, a ona śledzi zmiany bez żadnego twojego zdarzenia. ai-core i skrypty ai-* używają ich dla stanu, którego potrzebują wszyscy, nigdy dla prywatnych danych.

Tylko do odczytu. Każdy klucz poniżej ma jeden zasób-właściciela, który jako jedyny go zapisuje, zawsze z serwera. Nigdy nie zapisuj tych kluczy sam, ani z serwera, ani z klienta: właściciel by cię nadpisał, a inne skrypty widziałyby zły stan. Aby zmienić stan, wywołaj eksport właściciela (na przykład reanimację z ai-death, eksport służby z ai-core).

Jak je czytać

Lib ma klasę na każdy rodzaj. Każda trzyma lokalną kopię, więc get nic nie kosztuje, a onChange uruchamia twoje nasłuchiwanie po zmianie.

RodzajTypeScript (lib)Lua
Jeden klucz GlobalStatenew GlobalKey(key, parse): .get(), .onChange((_, value, old) => ...)GlobalState[key], AddStateBagChangeHandler(key, 'global', fn)
Wiele kluczy GlobalState z jednym prefiksemnew GlobalGroup(prefix, parse): .get(id), .ids(), .onChange((id, value, old) => ...)GlobalState[prefix .. id]
Bag graczanew PlayerState(key, parse): .get(serverId), .onChange((serverId, value, old) => ...)Player(serverId).state[key], LocalPlayer.state[key] na kliencie
Bag encjinew EntityState(key, parse): .get(entity), .getByNetId(netId), .onChange((netId, value, old) => ...)Entity(entity).state[key]

parse sprawdza surową wartość: stateNumber, stateBoolean, stateString z liba albo twoja własna funkcja, która zwraca undefined dla złej wartości. Wszystkie pochodzą z @aicore-fivem/lib/client lub @aicore-fivem/lib/server.

resource/client/index.ts
import { cache, GlobalKey, PlayerState, stateBoolean, stateNumber } from "@aicore-fivem/lib/client";
import { dutyCountKey, PLAYER_BAGS } from "@aicore-fivem/shared";

const policeOnDuty = new GlobalKey(dutyCountKey("police"), stateNumber);
const cuffed = new PlayerState(PLAYER_BAGS.cuffed, stateBoolean);

console.log(`police on duty: ${policeOnDuty.get() ?? 0}`);
policeOnDuty.onChange((_, count) => console.log(`police on duty now: ${count ?? 0}`));

cuffed.onChange((serverId, value) => {
  if (serverId === cache.serverId) console.log(value ? "you are cuffed" : "you are free");
});

Bagi graczy (PLAYER_BAGS)

Klucze, które kilka zasobów czyta na graczu. Stała: PLAYER_BAGS w @aicore-fivem/shared.

KluczStałaWłaścicielWartość
deadPLAYER_BAGS.deadai-deathtrue, dopóki gracz jest powalony. W przeciwnym razie nieobecne lub false. Przy innym skrypcie śmierci używaj zamiast tego warstwy leczenia (eksport IsDead, medical liba): inne skrypty śmierci używają własnych kluczy.
cuffedPLAYER_BAGS.cuffedai-policetrue, dopóki gracz jest skuty.
proximityPLAYER_BAGS.proximityai-voiceZasięg głosu, w kształcie z pma-voice: { index, distance, mode }.

Bagi pojazdów (VEHICLE_BAGS)

Klucze na encjach pojazdów. Stała: VEHICLE_BAGS w @aicore-fivem/shared.

KluczStałaWłaścicielWartość
ai:ownedVEHICLE_BAGS.ownedai-vehiclestrue na pojawionym posiadanym pojeździe.
ai:vidVEHICLE_BAGS.idai-vehiclesId pojazdu w ai-vehicles (liczba).
ai:propsVEHICLE_BAGS.propsai-vehiclesWygląd i tuning pojazdu (VehicleProps). ai-core stosuje go na kliencie, który jest właścicielem encji.
ai:setupVEHICLE_BAGS.setupai-vehiclesUstawienia pojawienia się (VehicleSetup, na przykład kolor wybrany w sklepie). ai-core stosuje je raz na kliencie właściciela.
fuelVEHICLE_BAGS.fuelskrypt paliwa (ai-fuel; ai-core prowadzi go dla klienckich skryptów paliwa)Poziom paliwa, 0-100.

Aby odczytać paliwo, używaj warstwy fuel liba: działa z każdym skryptem paliwa, także z tymi, które same nie zapisują bagu fuel.

Klucze GlobalState ai-core

KluczStałaWartość
ai:duty:<job>dutyCountKey(job) (prefiks DUTY_COUNT_PREFIX)Ilu graczy jest na służbie w tej pracy (liczba). Tylko liczby, nigdy kto.
ai:interactionCORE.interactionStateKey"prompt" lub "target": jak Points z liba pozwalają graczom wchodzić w interakcję (ustawienie panelu ai-core).
ai:pvpCORE.pvpStateKeytrue, gdy gracze mogą sobie nawzajem zadawać obrażenia (ustawienie panelu pvp, komenda /togglepvp).
ai:inventoryINVENTORY_STATE_KEYNazwa zasobu ekwipunku za warstwą ekwipunku ai-core. Nieustawione, dopóki żaden nie działa.
ai:vehicleKeysVEHICLE_KEYS_STATE_KEYNazwa zasobu aktywnego skryptu kluczy pojazdów. Nieustawione, dopóki żaden nie działa.
ai:appearanceAPPEARANCE_STATE_KEYNazwa zasobu aktywnego skryptu ubrań. Nieustawione, dopóki żaden nie działa.
ai:medicalCORE.medicalStateKeyNazwa zasobu aktywnego skryptu śmierci.
ai:mdtCORE.mdtStateKeyNazwa zasobu aktywnego MDT.
ai:notifyCORE.notifyStateKeyNazwa zasobu UI powiadomień, do którego trafiają karty ai-lib. Nieustawione: ai-lib rysuje własne karty.
ai:fuelFUEL_STATE_KEYNazwa zasobu aktywnego skryptu paliwa. Nieustawione, dopóki żaden nie działa.
ai:garagesGARAGES_STATE_KEYNazwa zasobu aktywnego skryptu garażu. Nieustawione, dopóki żaden nie działa.

Klucze z nazwą zasobu mówią klienckim połówkom ai-core, z którym skryptem rozmawiać. Czytaj je, gdy musisz wiedzieć, który skrypt działa (dla linii logu, podpowiedzi dla gracza), nie po to, aby wywołać ten skrypt bezpośrednio: zamiast tego wywołaj warstwę ai-core.

resource/server/index.ts
import { GlobalKey, stateBoolean } from "@aicore-fivem/lib/server";
import { CORE } from "@aicore-fivem/shared";

const pvp = new GlobalKey(CORE.pvpStateKey, stateBoolean);

pvp.onChange((_, on) => console.log(on ? "PvP is on" : "PvP is off"));

Klucze innych skryptów ai-*

Wspólny stan, który publikują niektóre skrypty ai-*, dla skryptów, które z nimi współpracują. Szczegóły są na stronie developera każdego skryptu.

KluczGdzieWłaścicielWartość
door:<id>GlobalStateai-doorlocktrue, dopóki drzwi są zamknięte.
ai:clockGlobalStateai-weathersync{ base, at, scale, frozen }: minuty gry danego dnia w czasie serwera at (ms), przesuwające się o scale minut gry na prawdziwą minutę. Klienci sami prowadzą zegar na tej podstawie.
ai:weatherGlobalStateai-weathersync{ type, blackout }: bieżąca pogoda.
ai:rweather:<id>GlobalStateai-weathersyncBieżąca pogoda regionu pogodowego.
prop:<id>GlobalStateai-propertiestrue, gdy nieruchomość ma właściciela.
rob:<id>GlobalStateai-robberiestrue, dopóki cel napadu jest opróżniony i czeka na czas odnowienia.
siren:lxPojazdai-sirensGłówny ton syreny: 0 wyłączony, 1-3 ton.
siren:manuPojazdai-sirensKlakson / ręczna syrena: 0 wyłączone, 1 klakson, 2 ręczna, 3 oba.
siren:lightbarPojazdai-sirensModel belki świetlnej przymocowanej do pojazdu; nieobecny, gdy brak.

Na tej stronie