AI Core
Référence de l’APILib : shared et fivem

Accès, blips et PNJ des lieux

readAccess, isPublic, decideAccess, ACCESS_FIELDS, accessFields, readBlipStyle, BLIP_STYLE_FIELDS, PLACE_PED_SPEC, placePedFields et readPlacePed : les parties de panneau que partagent tous les lieux.

La plupart des lieux qu’ajoute un script (un magasin, un coffre, un garage, une mairie) ont les trois mêmes parties de panneau : qui peut l’utiliser, son blip sur la carte et un PNJ qui s’y tient. Chaque partie se présente en trio : une spec de données pour votre schema.ts, des champs de panneau prêts avec les libellés propres à ai-core, et un lecteur pour la valeur enregistrée. Utilisez-les pour que le panneau de chaque script ait le même aspect et le même comportement.

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

Lua : aucun de ces utilitaires n’a d’équivalent Lua (le panneau d’administration est uniquement en TypeScript).

Accès

La règle est un AccessRule : l’un des métiers listés (à son grade minimal, en service quand onDuty est défini) ou l’un des gangs listés (à son grade minimal). Les deux listes vides signifient tout le monde. La vérification client (allows(rule), voir Appartenance) et la vérification serveur (online.allows(source, rule), voir Joueurs) utilisent la même décision, si bien que ce que voit le joueur correspond à ce que le serveur autorise.

readAccess

Lit une règle d’accès depuis les propres champs d’un enregistrement (jobs, gangs, grades, onDuty). Des champs manquants signifient que tout le monde peut l’utiliser.

Côté : client, serveur et NUI · Attend : non

Signature
readAccess(value: unknown): AccessRule

Paramètres

Prop

Type

Retour

AccessRule. Les noms qui ne sont pas des chaînes sont retirés ; les grades qui ne sont pas des nombres entiers de 0 ou plus sont retirés.

Exemple

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

Indique si une règle laisse entrer tout le monde (aucun métier et aucun gang listé). Utilisez-le pour sauter des vérifications et pour montrer un lieu à tout le monde.

Côté : client, serveur et NUI · Attend : non

Signature
isPublic(rule: AccessRule): boolean

Paramètres

Prop

Type

Retour

true quand jobs et gangs sont tous deux vides.

Exemple

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

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

decideAccess

La décision de la règle d’après les appartenances d’un joueur. allows du client et online.allows du serveur l’appellent pour vous ; ne l’appelez vous-même que si vous obtenez les appartenances autrement (une page NUI, un test).

Côté : client, serveur et NUI · Attend : non

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

Paramètres

Prop

Type

Retour

true quand la règle est publique, quand un gang listé correspond à son grade minimal, ou quand un métier listé correspond à son grade minimal (et que le joueur y est en service quand onDuty est défini).

Exemple

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 : hors service

ACCESS_FIELDS

La spec de données des champs d’accès, à étaler dans les sections d’un fichier d’enregistrements de votre schema.ts.

Côté : client, serveur et NUI · Attend : non

Signature
const ACCESS_FIELDS: Record<string, DataSpec>
// { jobs : noms avec recherche de métier, facultatif ; gangs : noms avec recherche de gang, facultatif ; onDuty : bool, facultatif }

Exemple

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

Les champs de panneau de la règle d’accès (étiquettes de métiers, étiquettes de gangs, un interrupteur de service), avec les libellés et les aides du panneau propres à ai-core déjà définis.

Côté : client, serveur et NUI · Attend : non

Signature
accessFields(): WidgetSpec[]

Retour

WidgetSpec[] : trois champs aux chemins jobs, gangs et onDuty. Étalez-les dans les fields d’une carte des tabs de votre panneau.

Exemple

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 et accessFields() ne couvrent que jobs, gangs et onDuty. readAccess lit aussi grades ({ police: 2 }) quand l’enregistrement l’a ; sans lui, chaque métier ou gang listé demande le grade 0.

Blips

readBlipStyle

Lit un style de blip depuis les données du panneau. Chaque partie manquante ou invalide vient de la valeur de repli ; les valeurs restent dans leur plage (sprite 0-1000, couleur 0-100, échelle 0.3-2).

Côté : client, serveur et NUI · Attend : non

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

Paramètres

Prop

Type

Retour

Un BlipStyle.

Exemple

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 } : couleur bornée, échelle issue de la valeur de repli

BLIP_STYLE_FIELDS

La spec de données des champs d’un style de blip, pour { type: "object", fields: BLIP_STYLE_FIELDS } dans votre schema.ts. Le panneau l’affiche avec son widget blip.

Côté : client, serveur et NUI · Attend : non

Signature
const BLIP_STYLE_FIELDS: Record<string, DataSpec>
// sprite : nombre entier 0-1000, color : nombre entier 0-100, scale : nombre 0.3-2

Exemple

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 },
};

PNJ des lieux

PLACE_PED_SPEC

La spec de données de la section ped d’un lieu : modèle, scénario d’attente et position, tous facultatifs. Un lieu sans modèle n’a pas de PNJ.

Côté : client, serveur et NUI · Attend : non

Signature
const PLACE_PED_SPEC: DataSpec
// { type: "object", optional: true, fields: { model : texte jusqu’à 64, scenario : l’un des scénarios proposés, coords : vec4 } }

Les scénarios que propose le panneau : aucun (reste immobile), 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.

Exemple

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

Les champs de panneau du PNJ d’un lieu : un sélecteur de modèle de ped, une liste de scénarios et un outil de point avec cap qui se cale sur le sol. Les libellés sont ceux d’ai-core.

Côté : client, serveur et NUI · Attend : non

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

Paramètres

Prop

Type

Retour

WidgetSpec[] : trois champs à <path>.model, <path>.scenario et <path>.coords.

Exemple

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

Lit le PNJ d’un lieu depuis les données du panneau.

Côté : client, serveur et NUI · Attend : non

Signature
readPlacePed(value: unknown): PlacePed | null

Paramètres

Prop

Type

Retour

Un PlacePed, ou null quand il n’y a pas de modèle (le lieu n’a pas de PNJ). coords est omis sauf si x, y, z et heading sont tous des nombres ; un scénario vide est omis.

Exemple

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),
  };
}

Sur le client, passez shop.ped ?? undefined comme option ped d’un point Points : le point fait apparaître le PNJ et place son option de ciblage sur lui.

Sur cette page