AI Core
Référence de l’API

Lib : serveur

@aicore-fivem/lib/server - chaque utilitaire serveur avec sa signature, et son jumeau Lua sur aiLib quand il existe.

TypeScript
import { onClientCallback, inventory, online, fail } from "@aicore-fivem/lib/server";

L’entrée serveur réexporte aussi les utilitaires /fivem : voir Lib : shared et fivem. La dernière colonne donne le jumeau Lua sur aiLib (Lib pour Lua).

Entrées client

Chaque requête client passe par la porte d’entrée : vérification d’un vrai joueur, limite de fréquence, garde-fous, un parseur d’arguments, éventuellement un seul appel à la fois.

UtilitaireRôleLua
onClientCallback(name, handler, options?) / onClientCallback(name, { args, guards?, rate?, lock? }, handler)Répond à triggerServerCallback ; args transforme les valeurs brutes en valeurs vérifiées (null refuse).onClientCallback (options rate, lock, ace)
onClientEvent(name, handler, options?) / onClientEvent(name, { args, ... }, handler)Un événement réseau d’un client, par la même porte.onClientEvent
triggerClientCallback(name, source, args = [], timeoutMs?): Promise<unknown>Interroge un client (onServerCallback côté client).triggerClientCallback
isAdmin(ace?), hasCharacter(), near(point | (source) => point, metres)Garde-fous pour guards: [...].isAdmin(source, ace?)
eventSource(): numberLe joueur qui a envoyé l’événement (à lire avant le premier await).
isOnline(source): booleanSi le joueur est connecté.
progressFor(source, { label, duration, anim?, scenario?, face?, allowVehicle?, canCancel?, freeze?, disable?, minRatio? }): Promise<boolean>Une action minutée que le serveur vérifie : la barre d’ai-lib sur le client du joueur, true seulement si elle est allée à son terme là-bas et qu’assez de temps est passé ici.progressFor (attend)
minigameFor(source, { game, difficulty?, rounds?, keys?, pins?, picks?, minMs? }): Promise<"won" | "lost" | "broken">Un test d’adresse ou un crochetage dont un flux serveur a besoin ; une victoire plus rapide que minMs compte comme perdue.minigameFor (attend)
new PendingActions({ minRatio? }): start(source, data, ms), take(source, token), peek, cancelDialogues que le serveur attend : un jeton, libéré à la déconnexion.
TypeScript
onClientCallback(
  "repair",
  { args: oneArg(readId), guards: [hasCharacter()], lock: true },
  async (source, netId) => {
    if (!inventory.hasItem(source, "repairkit")) return fail("NO_KIT");
    if (!(await progressFor(source, { label: t("REPAIRING"), duration: 8000 })))
      return fail("CANCELLED");
    inventory.removeItem(source, "repairkit");
    return { ok: true };
  },
);
Lua
aiLib.onClientCallback('repair', function(source, netId)
  if not aiLib.inventory.hasItem(source, 'repairkit') then return aiLib.fail('NO_KIT') end
  if not aiLib.progressFor(source, { label = 'Repairing', duration = 8000 }) then
    return aiLib.fail('CANCELLED')
  end
  aiLib.inventory.removeItem(source, 'repairkit', 1)
  return { ok = true }
end, { lock = true })

Joueurs

UtilitaireRôleLua
onCharacter({ loaded(source, character), unloaded(source, charId, reason) })Chargement et déchargement des personnages ; rejoue aussi les personnages chargés avant un redémarrage.onCharacter
online.sources(), online.character(source), online.charId(source), online.name(source, { fallback? })Joueurs chargés, reflétés depuis les événements d’ai-core.online.sources, character, name(src, fallback)
online.jobs(source), online.gangs(source), online.jobGrade(source, job), online.gangGrade(source, gang)Appartenances ; un grade vaut null hors membre.mêmes noms
online.dutyJob(source), online.onDutyIn(source, jobs), online.onDutyFor(job), online.countOnDuty(jobs)Service.online.dutyJob
online.jobMembers(job), online.gangMembers(gang)Ensembles de membres en direct (copiez-les avant un await).
online.allows(source, rule: AccessRule): booleanSi le joueur peut utiliser un lieu.
notify(source, text, kind = "info", duration?)Une carte de notification sur l’écran de ce joueur.notify(source, text, kind?, duration?)
playersNear(source, radius), playersNearEntity(entity, radius)Joueurs autour, depuis la portée OneSync (jusqu’à environ 424 m).mêmes noms
nearestPlayerTo(source, metres, filter?): number | nullL’autre joueur le plus proche.nearestPlayerTo
coordsOf(source), entityCoords(entity), isNear(source, point, metres)Positions.
vehicleOf(source, { driver? }): numberLe véhicule où le joueur est assis (0 à pied).
new PlayerMap({ onDrop? })Une Map qui se vide quand un joueur se déconnecte.
new Cooldowns(), new KeyedCooldowns(): ready, start, take(key, ms), left, clearDélais par joueur, ou par n’importe quelle clé (id de personnage, porte).
new SourceLock(): run(source, busy, task), releaseUne action à la fois par joueur sur plusieurs callbacks.
new RateLimit(count, windowMs): take(source), release(source)Une limite de rafale par joueur.RateLimit.new(count, windowMs)
new KeyWatchers(): watch(source, key), stop, of(key), keyOf(source)Les joueurs qui reçoivent les deltas d’une clé (un écran ouvert).

Via AI Core

UtilitaireRôleLua
inventory.addItem(inv, item, count = 1, metadata?, slot?), removeItem, getItemCount, hasItem, canCarryItem, getItems, clearInventory, registerStash, openInventory, registerUsableItem, getItemDefinitionObjets via l’inventaire actif.inventory (mêmes noms)
vehicleKeys.give(source, vehicle, purpose = "temporary"), remove, hasClés via le système de clés actif.vehicleKeys
phone.number, sourceOf, hasPhone, mail, message, notifyLe téléphone du joueur.phone
dispatch.alert(alert): booleanUne alerte police via le système d’alerte actif.dispatch.alert
prison.jail(source, minutes, by = 0), release, timeLeftPeines de prison.prison
world.getWeather(), setWeather(type), getTime(), setTime(hour, minute = 0), setBlackout(on), freezeTime(on)Heure et météo du script météo en place.world
medical.revive(source), heal, isDead, provider()Le script de mort en place.
appearance.get(charId): Promise<CharacterAppearance | null>, provider()L’apparence enregistrée d’un personnage.appearance.get (attend), provider
money.transfer(from, to, amount, reason?, fee?): booleanDeux comptes en une transaction.
buckets.acquire(tag), buckets.release(id)Routing buckets, libérés quand la ressource s’arrête.
characters.setOfflinePosition(charId, { x, y, z, heading? })Le point d’apparition d’un personnage enregistré.
definitions.job(name), definitions.gang(name)Définitions de métiers et de gangs, en cache jusqu’à ce que le panneau les change.
isPrimeTime(job?): booleanHeures de pointe d’un métier.
aiLog(channel, message, options?), aiLogChannels(channels)Logs via ai-core.aiLog

Véhicules et entités

UtilitaireRôleLua
spawnVehicle({ model, coords, asker | type, plate?, fuel?, keysTo?, purpose?, driver?, seats?, props?, setup?, locked?, bucket?, persistent?, bags? }): Promise<number | null>Un véhicule serveur avec plaque, carburant, clés, apparence, sièges et bucket en un appel.spawnVehicle (attend)
vehicleType(model, asker): Promise<string | null>Le type d’apparition d’un modèle, null si le jeu n’a pas ce véhicule.
randomPlate(prefix?): stringUne plaque comme celles du jeu.
nearestVehicleTo(source, metres, filter?), nearestVehicleAt(point, metres, filter?)Le véhicule le plus proche (parcourt tous les véhicules : limitez la fréquence de l’action).nearestVehicleTo
entityFromNet(netId, type?), pedFromNet(netId), vehicleFromNet(netId)Une entité vivante depuis le net id d’un client, ou 0.vehicleFromNet
vehicleNearPlayer(source, netId, { metres = 5, driver? }): numberLe véhicule, quand le joueur est près de lui.vehicleNearPlayer
TypeScript
const vehicle = await spawnVehicle({
  model: "taxi",
  coords: { x: 895.4, y: -179.3, z: 74.7, w: 238 },
  asker: source,
  keysTo: source,
  purpose: "job",
  driver: source,
});

Commandes, panneau, données

UtilitaireRôleLua
addCommand(name | [name, ...aliases], { help, params, restricted }, (source, args, raw) => ...)Une commande : paramètres analysés, vérifiée par ACE, listée dans le panneau.addCommand
new AdminPanel(schema): get, onChange, view, records, onAction, ruleLe stockage du panneau d’un script : schéma, validation, sauvegarde, deltas.
new DataFile(resource, name, log)Contenu du panneau dans data/*.json avec des écritures atomiques.
createDatabaseTables(resource, file): Promise<void>Installe sql/main.sql.
new WriteQueue(onError): push(label, task), idle()Écritures en base l’une après l’autre.
new AreaStream({ event, view, cellSize?, range?, chunk?, alsoTo?, extra? })Objets du monde diffusés aux joueurs autour : un instantané, puis seulement les changements.
EntityState, PlayerState, GlobalKey, GlobalGroup (avec set)State bags ; les classes serveur écrivent.
TypeScript
addCommand(
  "heal",
  {
    help: t("CMD_HEAL"),
    params: [{ name: "id", type: "playerId", optional: true }],
    restricted: true,
  },
  (source, args) => medical.heal(args.id ?? source),
);

Sur cette page