ai-inventory dla deweloperów
Eksporty serwera i klienta ai-inventory, przedmioty do użycia, sklepy skryptów, zdarzenie usedItem oraz API ox_inventory i qb-inventory, na które odpowiada.
Do przedmiotów we własnym skrypcie używaj warstwy ekwipunku AI Core: inventory z biblioteki (serwer inventory.addItem, removeItem, getItemCount, hasItem, canCarryItem, registerUsableItem, registerStash, openInventory, registerShop...; klient inventory.hasItem, openInventory, currentWeapon) albo aiLib.inventory w Lua. Działa z każdym ekwipunkiem, którego używa serwer, więc właściciel może zastąpić ai-inventory. Zobacz dokumentację biblioteki. Poniższe eksporty są do szczególnych przypadków i do odczytu tego, na co odpowiada sam ai-inventory.
Odwołania do ekwipunku
Każdy eksport serwera, który przyjmuje inv, akceptuje:
| Wartość | Ekwipunek |
|---|---|
number (lub ciąg z liczbą) | Ekwipunek gracza według ID na serwerze. Gracz musi mieć wczytaną postać. |
string | Schowek według nazwy (klucz schowka z panelu lub nazwa zarejestrowana przez RegisterStash) albo bagażnik lub schowek na rękawiczki pojazdu według tablicy ("trunk:<plate>", "glovebox:<plate>" lub sama tablica dla bagażnika). |
{ id: string, owner: string | number } | Kopia osobistego schowka jednej postaci. |
Eksporty działają na ekwipunkach, które są w pamięci: gracze online, schowki zarejestrowane przez skrypty oraz schowki z panelu, bagażniki i schowki na rękawiczki otwarte przez kogoś od restartu (są zwalniane po 5 minutach bezczynności). Dla niewczytanego ekwipunku AddItem i RemoveItem odpowiadają false, a GetItemCount odpowiada 0.
Eksporty serwera
Typowane jako AiInventoryServerExports w @aicore-fivem/shared: resourceExport("ai-inventory") w TypeScript.
AddItem
Dodaje przedmioty do ekwipunku. Stosy o tej samej nazwie i metadanych łączą się do rozmiaru stosu przedmiotu; reszta trafia do wolnych komórek.
Strona: serwer · Czeka: nie
AddItem(inv: number | string, item: string, count: number, metadata?: Record<string, unknown>, slot?: number): booleanlocal ok = exports['ai-inventory']:AddItem(source, 'water', 2)Parametry
Prop
Type
Zwraca
boolean: true, gdy dodano wszystkie sztuki. false, gdy ekwipunek lub przedmiot jest nieznany, count jest nieprawidłowy albo przedmiot się nie mieści (komórki lub waga). Gdy odpowiada false, nic nie jest dodawane.
Przykład
import { resourceExport, onClientCallback } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const inv = resourceExport("ai-inventory");
onClientCallback("myscript:buyWater", (source) => {
if (!inv.CanCarryItem(source, "water", 1)) return fail("NO_SPACE");
if (!inv.AddItem(source, "water", 1)) return fail("NO_SPACE");
return { ok: true };
});RemoveItem
Zabiera przedmioty z ekwipunku.
Strona: serwer · Czeka: nie
RemoveItem(inv: number | string, item: string, count: number, metadata?: Record<string, unknown>, slot?: number): booleanProp
Type
Zwraca
boolean: true, gdy zabrano wszystkie sztuki. false, gdy jest ich za mało (wtedy nic nie jest zabierane). Broń zabrana graczowi jest też zabierana z jego rąk.
GetItemCount
GetItemCount(inv: number | string, item: string, metadata?: Record<string, unknown>): numberIle sztuk item (pasujących do metadata, jeśli podano) zawiera ekwipunek. 0 dla nieznanego ekwipunku lub przedmiotu. Strona: serwer · Czeka: nie.
CanCarryItem
CanCarryItem(inv: number | string, item: string, count: number, metadata?: Record<string, unknown>): booleanCzy count sztuk by się zmieściło (komórki i waga), bez ich dodawania. Strona: serwer · Czeka: nie.
GetItems
GetItems(inv: number | string): Array<{ name, label, weight, slot, count, amount, metadata, info, stack, unique, close, description, type, image }>Każdy stos ekwipunku. count / metadata (nazwy ox) i amount / info (nazwy qb) mają te same wartości; weight to łączna waga stosu w gramach. Pusta lista dla nieznanego ekwipunku. Strona: serwer · Czeka: nie.
GetWeight
GetWeight(inv: number | string): { weight: number; maxWeight: number } | nullNiesiona waga i limit w gramach (maxWeight 0 = bez limitu). null, gdy ekwipunek nie jest wczytany. Strona: serwer · Czeka: nie.
RegisterUsableItem
Uruchamia twoją funkcję, gdy gracz używa przedmiotu. Najpierw odtwarzana jest animacja przedmiotu (jeśli jest); twoja funkcja uruchamia się po jej zakończeniu.
Strona: serwer · Czeka: nie
RegisterUsableItem(name: string, handler: (source: number, item: { name: string; slot: number; count: number; metadata: Record<string, unknown> }) => unknown): voidProp
Type
Przykład
import { resourceExport, notify } from "@aicore-fivem/lib/server";
const inv = resourceExport("ai-inventory");
inv.RegisterUsableItem("repairkit", (source, item) => {
const ped = GetPlayerPed(String(source));
const vehicle = GetVehiclePedIsIn(ped, false);
if (vehicle === 0) {
notify(source, "Sit in a vehicle first", "error");
return false; // zachowaj przedmiot
}
emitNet("myscript:repair", source, NetworkGetNetworkIdFromEntity(vehicle));
});Przedmiot musi mieć włączone Can be used w panelu, aby gracze mogli go użyć z ekranu, oraz Used up per use powyżej 0, aby był zużywany. Jeden handler na nazwę przedmiotu: ponowna rejestracja go zastępuje. Handler zostaje po zatrzymaniu twojego zasobu; rejestruj go raz przy starcie.
RegisterStash
Rejestruje schowek ze skryptu (dom, szafka gangu). Wspólne schowki są wczytywane od razu i pozostają wczytane.
Strona: serwer · Czeka: nie
RegisterStash(name: string, label: string, slots: number, maxWeight: number, jobs?: string[], personal?: boolean): voidProp
Type
Schowek skryptu nie ma miejsca w świecie: otwieraj go przez OpenInventory.
OpenInventory
Otwiera ekwipunek na ekranie gracza, obok jego własnego.
Strona: serwer · Czeka: nie
OpenInventory(source: number, inv: number | string): booleanZwraca
boolean: true, gdy otwarto. false, gdy gracz nie ma wczytanego ekwipunku, ekwipunek jest nieznany lub niewczytany albo jest to własny ekwipunek gracza.
Przykład
import { resourceExport, onClientCallback } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const inv = resourceExport("ai-inventory");
inv.RegisterStash("gang_ballas", "Ballas locker", 60, 200_000);
onClientCallback("myscript:openLocker", (source) => {
return inv.OpenInventory(source, "gang_ballas") ? { ok: true } : fail("CANNOT_OPEN");
});Przed wywołaniem OpenInventory sprawdź na serwerze, czy gracz może go otworzyć (gang, odległość): eksport otwiera to, o co prosisz.
ClearInventory
ClearInventory(inv: number | string): voidOpróżnia ekwipunek. Strona: serwer · Czeka: nie.
RegisterShop and OpenShop
Sklep bez miejsca, otwierany przez twój skrypt (aplikacja telefonu, menu NPC). Kupowanie jest możliwe tylko wtedy, gdy gracz ma go otwartego, płatne z gotówki, potem z banku. Sklep z panelu o tym samym ID ma pierwszeństwo.
Strona: serwer · Czeka: nie
RegisterShop(name: string, label: string, items: Array<{ name: string; price: number }>): void
OpenShop(source: number, name: string): booleanProp
Type
OpenShop zwraca false, gdy sklep jest nieznany lub gracz nie ma ekwipunku.
Przedmioty
Items(name?: string): { name, label, weight, stack, unique, close, description, type, image, useable } | Record<string, ...> | nullJedna definicja przedmiotu (kształt ox), wszystkie definicje według nazwy, gdy name jest pominięte, albo null dla nieznanej nazwy. stack jest true, gdy rozmiar stosu jest większy niż 1; unique, gdy wynosi 1. Strona: serwer · Czeka: nie.
Eksporty klienta
| Eksport | Zwraca | Co robi |
|---|---|---|
OpenSelf() | nic | Otwiera własny ekran gracza z ziemią, bagażnikiem lub schowkiem na rękawiczki w pobliżu (jak F2). |
OpenInventory(type, data) | nic | type "stash" lub "shop" z data jako ID (lub { id }), "drop" z ID zrzutu; cokolwiek innego otwiera własny ekwipunek gracza. Serwer i tak sprawdza dostęp. |
CloseInventory() | nic | Zamyka ekran. |
GetItemCount(item: string) | number | Ile sztuk gracz ma przy sobie. |
HasItem(items, amount?) | boolean | items to nazwa, lista (każda co najmniej amount, domyślnie 1) lub { name: count }. |
GetPlayerItems() | array | Stosy gracza (name, label, slot, count, amount, metadata, info, weight, stack, close, description). |
OpenSelf i HasItem są typowane jako AiInventoryClientExports.
Zdarzenia
ai-inventory:usedItem
Wywoływane na serwerze po każdym użyciu przedmiotu.
Strona: serwer (zdarzenie lokalne)
| Argument | Typ | Co to jest |
|---|---|---|
source | number | Gracz. |
name | string | Nazwa przedmiotu. |
slot | number | Komórka, w której był stos. |
metadata | Record<string, unknown> | Metadane stosu. |
status | { hunger?, thirst?, stress? } | Wartości potrzeb przedmiotu z panelu. |
on("ai-inventory:usedItem", (source: number, name: string) => {
if (name === "joint") emitNet("myscript:highEffect", source);
});AI Core zamienia to na własne zdarzenie ai-core:itemUsed (source, name, status), którego należy nasłuchiwać, jeśli twój skrypt ma działać z każdym ekwipunkiem.
API ox_inventory
ai-inventory robi provide dla ox_inventory i odpowiada na jego eksporty (pisane pod ox_inventory 2.44). Ekwipunki są nazywane jak w ox: source gracza, nazwa schowka, { id, owner } dla schowków osobistych, tablica dla bagażników.
- Serwer:
AddItem(zwracasuccess, response, wywołujecb),RemoveItem,GetItem,GetItemCount,Search(count/slots),CanCarryItem,CanCarryWeight,CanCarryAmount,GetInventory,GetInventoryItems,GetSlot,GetSlotWithItem,GetSlotsWithItem,GetSlotIdWithItem,GetSlotIdsWithItem,GetEmptySlot,SetMetadata,SetDurability,SetMaxWeight,RegisterStash,ClearInventory,Items,ItemList,forceOpenInventory(schowek, gracz, sklep),CreateTemporaryStash,CustomDrop,RemoveInventory,SwapSlots. - Klient:
openInventory,closeInventory,Search,GetItemCount,GetPlayerItems,GetPlayerWeight,GetPlayerMaxWeight,Items,useSlot,getCurrentWeapon/GetCurrentWeapon.displayMetadata,weaponWheelisetStashTargetsą akceptowane i nic nie robią. - Bez odpowiedzi: hooki (
registerHook,removeHooks),UpdateVehicle,ConfiscateInventory/ReturnInventory,GetContainerFromSlot,RegisterShop(sklepy pochodzą z panelu lub z własnegoRegisterShopai-inventory).
API qb-inventory
ai-inventory robi provide dla qb-inventory (API 2.0). Zwracane przedmioty mają oba kształty: count / metadata i amount / info.
- Serwer:
AddItem(identifier, item, amount, slot, info),RemoveItem,HasItem(nazwa, lista lub{ name = amount }),GetItemCount,GetItemByName,GetItemsByName,GetItemBySlot,CanAddItem,GetFreeWeight,GetSlots,ClearInventory,SetItemData,CreateInventory,OpenInventory,OpenInventoryById,RemoveInventory,CloseInventory. - Klient:
HasItem,CloseInventory. - Bez odpowiedzi: hooki i listenery,
CreateShop/OpenShop,SetInventory,GetInventory,SaveInventory,LoadInventory,UseItem,GetFirstSlotByItem,GetSlotsByItem,GetTotalWeight.
Baza danych i logi
Tabela ai_inventory_inventories: jeden wiersz na zapisany ekwipunek (id, JSON items). Zapisuje ją tylko ai-inventory; zmiany są zapisywane co 30 sekund, przy zwalnianiu i przy zatrzymaniu. Kanały logów: moves (domyślnie wyłączony), drops, gives, purchases, crafting.
ai-inventory
Ekwipunek z siatką, rozmiarami przedmiotów, szybkimi slotami, przedmiotami na ziemi, schowkami, bagażnikami i schowkami na rękawiczki, sklepami, wytwarzaniem i bronią. Odpowiada na API ox_inventory i qb-inventory.
ai-hud
HUD i potrzeby postaci. Zdrowie, pancerz, głód, pragnienie, stres, pieniądze, praca, prędkościomierz, nazwa ulicy, głos i podpowiedzi klawiszy.