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.
| Rodzaj | TypeScript (lib) | Lua |
|---|---|---|
| Jeden klucz GlobalState | new GlobalKey(key, parse): .get(), .onChange((_, value, old) => ...) | GlobalState[key], AddStateBagChangeHandler(key, 'global', fn) |
| Wiele kluczy GlobalState z jednym prefiksem | new GlobalGroup(prefix, parse): .get(id), .ids(), .onChange((id, value, old) => ...) | GlobalState[prefix .. id] |
| Bag gracza | new PlayerState(key, parse): .get(serverId), .onChange((serverId, value, old) => ...) | Player(serverId).state[key], LocalPlayer.state[key] na kliencie |
| Bag encji | new 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.
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.
| Klucz | Stała | Właściciel | Wartość |
|---|---|---|---|
dead | PLAYER_BAGS.dead | ai-death | true, 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. |
cuffed | PLAYER_BAGS.cuffed | ai-police | true, dopóki gracz jest skuty. |
proximity | PLAYER_BAGS.proximity | ai-voice | Zasię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.
| Klucz | Stała | Właściciel | Wartość |
|---|---|---|---|
ai:owned | VEHICLE_BAGS.owned | ai-vehicles | true na pojawionym posiadanym pojeździe. |
ai:vid | VEHICLE_BAGS.id | ai-vehicles | Id pojazdu w ai-vehicles (liczba). |
ai:props | VEHICLE_BAGS.props | ai-vehicles | Wygląd i tuning pojazdu (VehicleProps). ai-core stosuje go na kliencie, który jest właścicielem encji. |
ai:setup | VEHICLE_BAGS.setup | ai-vehicles | Ustawienia pojawienia się (VehicleSetup, na przykład kolor wybrany w sklepie). ai-core stosuje je raz na kliencie właściciela. |
fuel | VEHICLE_BAGS.fuel | skrypt 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
| Klucz | Stała | Wartość |
|---|---|---|
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:interaction | CORE.interactionStateKey | "prompt" lub "target": jak Points z liba pozwalają graczom wchodzić w interakcję (ustawienie panelu ai-core). |
ai:pvp | CORE.pvpStateKey | true, gdy gracze mogą sobie nawzajem zadawać obrażenia (ustawienie panelu pvp, komenda /togglepvp). |
ai:inventory | INVENTORY_STATE_KEY | Nazwa zasobu ekwipunku za warstwą ekwipunku ai-core. Nieustawione, dopóki żaden nie działa. |
ai:vehicleKeys | VEHICLE_KEYS_STATE_KEY | Nazwa zasobu aktywnego skryptu kluczy pojazdów. Nieustawione, dopóki żaden nie działa. |
ai:appearance | APPEARANCE_STATE_KEY | Nazwa zasobu aktywnego skryptu ubrań. Nieustawione, dopóki żaden nie działa. |
ai:medical | CORE.medicalStateKey | Nazwa zasobu aktywnego skryptu śmierci. |
ai:mdt | CORE.mdtStateKey | Nazwa zasobu aktywnego MDT. |
ai:notify | CORE.notifyStateKey | Nazwa zasobu UI powiadomień, do którego trafiają karty ai-lib. Nieustawione: ai-lib rysuje własne karty. |
ai:fuel | FUEL_STATE_KEY | Nazwa zasobu aktywnego skryptu paliwa. Nieustawione, dopóki żaden nie działa. |
ai:garages | GARAGES_STATE_KEY | Nazwa 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.
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.
| Klucz | Gdzie | Właściciel | Wartość |
|---|---|---|---|
door:<id> | GlobalState | ai-doorlock | true, dopóki drzwi są zamknięte. |
ai:clock | GlobalState | ai-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:weather | GlobalState | ai-weathersync | { type, blackout }: bieżąca pogoda. |
ai:rweather:<id> | GlobalState | ai-weathersync | Bieżąca pogoda regionu pogodowego. |
prop:<id> | GlobalState | ai-properties | true, gdy nieruchomość ma właściciela. |
rob:<id> | GlobalState | ai-robberies | true, dopóki cel napadu jest opróżniony i czeka na czas odnowienia. |
siren:lx | Pojazd | ai-sirens | Główny ton syreny: 0 wyłączony, 1-3 ton. |
siren:manu | Pojazd | ai-sirens | Klakson / ręczna syrena: 0 wyłączone, 1 klakson, 2 ręczna, 3 oba. |
siren:lightbar | Pojazd | ai-sirens | Model belki świetlnej przymocowanej do pojazdu; nieobecny, gdy brak. |
Zdarzenia UI ai-lib
Klienckie zdarzenia, które ai-lib wysyła, gdy gracz odpowiada na menu, okno wprowadzania, wybierak przedmiotów, minigrę lub podpowiedź albo anuluje pasek postępu - dla skryptów, które same wywołują eksporty ai-lib.
Zdarzenia mostu frameworków
Zdarzenia ESX, QB / Qbox i vRP, które ai-core wysyła, aby skrypty napisane dla tych frameworków działały dalej, z ich dokładnymi argumentami, oraz zdarzenia frameworków, na które ai-core odpowiada.