AI Core
Dokumentacja APILib: shared i fivem

Dostęp, blipy i NPC miejsc

readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields i readPlacePed: części panelu wspólne dla każdego miejsca.

Większość miejsc, które dodaje skrypt (sklep, schowek, garaż, ratusz), ma te same trzy części panelu: kto może z niego korzystać, jego blip na mapie i NPC, który tam stoi. Każda część przychodzi jako trójka: specyfikacja danych do twojego schema.ts, gotowe pola panelu z etykietami samego ai-core i czytnik zapisanej wartości. Używaj ich, żeby panel każdego skryptu wyglądał i działał tak samo.

TypeScript
import { readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields, readPlacePed } from "@aicore-fivem/lib/shared";

Lua: żadna z nich nie ma odpowiednika w Lua (panel administratora jest tylko dla TypeScript).

Dostęp

Reguła to AccessRule: jedna z wymienionych prac (od minimalnego stopnia, na służbie, gdy ustawiono onDuty) albo jeden z wymienionych gangów (od minimalnego stopnia). Obie listy puste oznaczają wszystkich. Sprawdzenie na kliencie (allows(rule), zobacz Członkostwo i dane gracza) i na serwerze (online.allows(source, rule), zobacz Gracze i postacie) używają tej samej decyzji, więc to, co widzi gracz, zgadza się z tym, na co pozwala serwer.

readAccess

Czyta regułę dostępu z własnych pól rekordu (jobs, gangs, grades, onDuty). Brakujące pola oznaczają, że może z niego korzystać każdy.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
readAccess(value: unknown): AccessRule

Parametry

Prop

Type

Zwracana wartość

AccessRule. Nazwy, które nie są stringami, są usuwane; stopnie, które nie są liczbami całkowitymi od 0 w górę, są usuwane.

Przykład

import { readAccess } from "@aicore-fivem/lib/shared";

readAccess({ label: "Armoury", jobs: ["police"], grades: { police: 2 }, onDuty: true });
// { jobs: ["police"], gangs: [], grades: { police: 2 }, onDuty: true }

isPublic

Czy reguła wpuszcza wszystkich (żadne prace ani gangi nie są wymienione). Używaj jej, żeby pominąć sprawdzenia i pokazać miejsce wszystkim.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
isPublic(rule: AccessRule): boolean

Parametry

Prop

Type

Zwracana wartość

true, gdy zarówno jobs, jak i gangs są puste.

Przykład

import { isPublic, readAccess } from "@aicore-fivem/lib/shared";

isPublic(readAccess({})); // true

decideAccess

Decyzja reguły na podstawie członkostw gracza. allows klienta i online.allows serwera wywołują ją za ciebie; wywołuj ją sam tylko wtedy, gdy masz członkostwa w inny sposób (strona NUI, test).

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
decideAccess(
  rule: AccessRule,
  jobs: ReadonlyArray<{ job: string; grade: number }>,
  gangs: ReadonlyArray<{ gang: string; grade: number }>,
  dutyJob: string | null,
): boolean

Parametry

Prop

Type

Zwracana wartość

true, gdy reguła jest publiczna, gdy wymieniony gang pasuje od minimalnego stopnia albo gdy wymieniona praca pasuje od minimalnego stopnia (a gracz jest w niej na służbie, gdy ustawiono onDuty).

Przykład

import { decideAccess, readAccess } from "@aicore-fivem/lib/shared";

const rule = readAccess({ jobs: ["police"], grades: { police: 2 }, onDuty: true });
decideAccess(rule, [{ job: "police", grade: 3 }], [], "police"); // true
decideAccess(rule, [{ job: "police", grade: 3 }], [], null);     // false: poza służbą

ACCESS_FIELDS

Specyfikacja danych pól dostępu, do rozwinięcia w sections pliku rekordów w twoim schema.ts.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
const ACCESS_FIELDS: Record<string, DataSpec>
// { jobs: nazwy z wyszukiwaniem prac, opcjonalne; gangs: nazwy z wyszukiwaniem gangów, opcjonalne; onDuty: bool, opcjonalne }

Przykład

resource/server/schema.ts
import { ACCESS_FIELDS } from "@aicore-fivem/lib/shared";

const stashSections = {
  label: { type: "text", min: 1, max: 48 },
  coords: { type: "vec3" },
  ...ACCESS_FIELDS,
};

accessFields

Pola panelu reguły dostępu (tagi prac, tagi gangów, przełącznik służby) z już ustawionymi etykietami i podpowiedziami panelu samego ai-core.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
accessFields(): WidgetSpec[]

Zwracana wartość

WidgetSpec[]: trzy pola pod ścieżkami jobs, gangs i onDuty. Rozwiń je w fields karty w tabs twojego panelu.

Przykład

resource/server/schema.ts
import { accessFields } from "@aicore-fivem/lib/shared";

import type { CardSpec } from "@aicore-fivem/shared";

const accessCard: CardSpec = { icon: "lock", title: "ADMIN_CARD_ACCESS", fields: [...accessFields()] };

ACCESS_FIELDS i accessFields() obejmują tylko jobs, gangs i onDuty. readAccess czyta też grades ({ police: 2 }), gdy rekord je ma; bez tego każda wymieniona praca albo gang wymaga stopnia 0.

Blipy

readBlipStyle

Czyta styl blipa z danych panelu. Każda brakująca albo zła część pochodzi z wartości zastępczej; wartości są trzymane w zakresie (sprite 0-1000, kolor 0-100, skala 0.3-2).

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
readBlipStyle(value: unknown, fallback: BlipStyle): BlipStyle

Parametry

Prop

Type

Zwracana wartość

BlipStyle.

Przykład

import { readBlipStyle } from "@aicore-fivem/lib/shared";

readBlipStyle({ sprite: 52, color: 500 }, { sprite: 52, color: 2, scale: 0.8 });
// { sprite: 52, color: 100, scale: 0.8 }: kolor ograniczony, skala z wartości zastępczej

BLIP_STYLE_FIELDS

Specyfikacja danych pól stylu blipa, do { type: "object", fields: BLIP_STYLE_FIELDS } w twoim schema.ts. Panel pokazuje ją swoim widżetem blip.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
const BLIP_STYLE_FIELDS: Record<string, DataSpec>
// sprite: liczba całkowita 0-1000, color: liczba całkowita 0-100, scale: liczba 0.3-2

Przykład

resource/server/schema.ts
import { BLIP_STYLE_FIELDS } from "@aicore-fivem/lib/shared";

const sections = {
  blip: { type: "bool" },
  blipStyle: { type: "object", optional: true, fields: BLIP_STYLE_FIELDS },
};

NPC miejsc

PLACE_PED_SPEC

Specyfikacja danych sekcji ped miejsca: model, scenariusz bezczynności i pozycja, wszystko opcjonalne. Miejsce bez modelu nie ma NPC.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
const PLACE_PED_SPEC: DataSpec
// { type: "object", optional: true, fields: { model: tekst do 64 znaków, scenario: jeden z oferowanych scenariuszy, coords: vec4 } }

Scenariusze oferowane przez panel: brak (stoi nieruchomo), WORLD_HUMAN_STAND_IMPATIENT, WORLD_HUMAN_CLIPBOARD, WORLD_HUMAN_STAND_MOBILE, WORLD_HUMAN_AA_COFFEE, WORLD_HUMAN_SMOKING, WORLD_HUMAN_GUARD_STAND, WORLD_HUMAN_COP_IDLES, WORLD_HUMAN_HANG_OUT_STREET.

Przykład

resource/server/schema.ts
import { PLACE_PED_SPEC } from "@aicore-fivem/lib/shared";

const sections = { ped: PLACE_PED_SPEC, label: { type: "text", min: 1, max: 48 } };

placePedFields

Pola panelu NPC miejsca: wybierak modelu peda, lista scenariuszy i narzędzie punktu z kierunkiem, które przyciąga do ziemi. Etykiety pochodzą z samego ai-core.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
placePedFields(path?: string): WidgetSpec[]

Parametry

Prop

Type

Zwracana wartość

WidgetSpec[]: trzy pola pod <path>.model, <path>.scenario i <path>.coords.

Przykład

resource/server/schema.ts
import { placePedFields } from "@aicore-fivem/lib/shared";

import type { CardSpec } from "@aicore-fivem/shared";

const npcCard: CardSpec = { icon: "user", title: "ADMIN_CARD_NPC", fields: [...placePedFields()] };

readPlacePed

Czyta NPC miejsca z danych panelu.

Strona: Klient, serwer i NUI · Czeka: nie

Sygnatura
readPlacePed(value: unknown): PlacePed | null

Parametry

Prop

Type

Zwracana wartość

PlacePed albo null, gdy nie ma modelu (miejsce nie ma NPC). coords jest pomijane, chyba że wszystkie x, y, z i heading są liczbami; pusty scenariusz jest pomijany.

Przykład

resource/common/shop.ts
import { readPlacePed, readBlipStyle, readAccess, str, type PlacePed, type BlipStyle, type AccessRule } from "@aicore-fivem/lib/shared";

export interface Shop {
  label: string;
  ped: PlacePed | null;
  blipStyle: BlipStyle;
  access: AccessRule;
}

export function readShop(id: string, v: Record<string, unknown>): Shop {
  return {
    label: str(v.label, id, 48),
    ped: readPlacePed(v.ped),
    blipStyle: readBlipStyle(v.blipStyle, { sprite: 52, color: 2, scale: 0.8 }),
    access: readAccess(v),
  };
}

Na kliencie podaj shop.ped ?? undefined jako opcję ped punktu Points: punkt spawnuje NPC i dodaje do niego swoją opcję targetu.

Na tej stronie