AI Core
Podstawyai-inventory

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ć.
stringSchowek 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

Sygnatura
AddItem(inv: number | string, item: string, count: number, metadata?: Record<string, unknown>, slot?: number): boolean
Lua
local 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

Sygnatura
RemoveItem(inv: number | string, item: string, count: number, metadata?: Record<string, unknown>, slot?: number): boolean

Prop

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

Sygnatura
GetItemCount(inv: number | string, item: string, metadata?: Record<string, unknown>): number

Ile sztuk item (pasujących do metadata, jeśli podano) zawiera ekwipunek. 0 dla nieznanego ekwipunku lub przedmiotu. Strona: serwer · Czeka: nie.

CanCarryItem

Sygnatura
CanCarryItem(inv: number | string, item: string, count: number, metadata?: Record<string, unknown>): boolean

Czy count sztuk by się zmieściło (komórki i waga), bez ich dodawania. Strona: serwer · Czeka: nie.

GetItems

Sygnatura
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

Sygnatura
GetWeight(inv: number | string): { weight: number; maxWeight: number } | null

Niesiona 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

Sygnatura
RegisterUsableItem(name: string, handler: (source: number, item: { name: string; slot: number; count: number; metadata: Record<string, unknown> }) => unknown): void

Prop

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

Sygnatura
RegisterStash(name: string, label: string, slots: number, maxWeight: number, jobs?: string[], personal?: boolean): void

Prop

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

Sygnatura
OpenInventory(source: number, inv: number | string): boolean

Zwraca

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

Sygnatura
ClearInventory(inv: number | string): void

Opróż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

Sygnatura
RegisterShop(name: string, label: string, items: Array<{ name: string; price: number }>): void
OpenShop(source: number, name: string): boolean

Prop

Type

OpenShop zwraca false, gdy sklep jest nieznany lub gracz nie ma ekwipunku.

Przedmioty

Sygnatura
Items(name?: string): { name, label, weight, stack, unique, close, description, type, image, useable } | Record<string, ...> | null

Jedna 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

EksportZwracaCo robi
OpenSelf()nicOtwiera własny ekran gracza z ziemią, bagażnikiem lub schowkiem na rękawiczki w pobliżu (jak F2).
OpenInventory(type, data)nictype "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()nicZamyka ekran.
GetItemCount(item: string)numberIle sztuk gracz ma przy sobie.
HasItem(items, amount?)booleanitems to nazwa, lista (każda co najmniej amount, domyślnie 1) lub { name: count }.
GetPlayerItems()arrayStosy 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)

ArgumentTypCo to jest
sourcenumberGracz.
namestringNazwa przedmiotu.
slotnumberKomórka, w której był stos.
metadataRecord<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 (zwraca success, response, wywołuje cb), 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, weaponWheel i setStashTarget są akceptowane i nic nie robią.
  • Bez odpowiedzi: hooki (registerHook, removeHooks), UpdateVehicle, ConfiscateInventory / ReturnInventory, GetContainerFromSlot, RegisterShop (sklepy pochodzą z panelu lub z własnego RegisterShop ai-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.

Na tej stronie