AI Core
Référence de l’APILib : serveur

Argent et banque

money.transfer entre deux comptes, le script bancaire via ai-core, et les factures via le script de facturation qui tourne.

TypeScript
import { money, banking, billing } from "@aicore-fivem/lib/server";

Les changements sur un seul compte d’un joueur (ajouter, retirer, lire un solde) sont des exports d’ai-core (AddMoney, RemoveMoney, GetMoney ; voir Exports serveur d’ai-core). La lib ajoute ce qui demande plus d’un changement de compte, ainsi que les couches banque et facturation.

money

money.transfer

Déplace de l’argent d’un compte vers un autre en une seule transaction de base de données, avec une ligne de registre des deux côtés. Utilisez-la pour tout ce où l’argent ne doit pas apparaître ou disparaître à mi-chemin : payer un autre joueur, un métier qui verse une prime, des frais.

Côté : serveur · Attend : non

Signature
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): boolean

Pas d’équivalent Lua : appelez l’export d’ai-core exports['ai-core']:TransferMoney(from, to, amount, reason, fee).

Paramètres

Prop

Type

Retour

boolean : true quand les deux lignes ont été écrites. false quand un montant n’est pas un nombre entier, qu’un compte manque, que les deux sont identiques, ou que from ne peut pas payer amount plus fee.

Exemple

import { onClientCallback, money, nearestPlayerTo, notify } from "@aicore-fivem/lib/server";
import { fail, oneArg, readInt } from "@aicore-fivem/lib/shared";

onClientCallback("my-cash:give", { args: oneArg((v) => readInt(v, 1, 100_000)), lock: true }, (source, amount) => {
  const target = nearestPlayerTo(source, 2);
  if (target === null) return fail("NOBODY_NEAR");
  if (!money.transfer({ source, account: "cash" }, { source: target, account: "cash" }, amount, "give:cash"))
    return fail("NOT_ENOUGH_CASH");
  notify(target, `You received $${amount}`, "success");
  return { ok: true };
});

banking

banking communique avec le script bancaire via la couche banque d’ai-core. L’argent des métiers lui-même passe toujours par money ou par les exports d’ai-core.

banking.open

Ouvre l’écran du script bancaire pour un joueur.

Côté : serveur · Attend : non

Signature
banking.open(source: number): boolean
Lua
local ok = aiLib.banking.open(source)

Retour true quand l’écran s’ouvre. false quand le script ne peut pas être ouvert de l’extérieur ou qu’aucun ne tourne.

onClientCallback("my-atm:open", (source) => (banking.open(source) ? { ok: true } : fail("BANK_UNAVAILABLE")));

banking.societyBalance

Le solde de société d’un métier, pour l’affichage. En mode de compte core d’ai-core, c’est le compte de métier d’ai-core ; en mode own, celui du script bancaire.

Côté : serveur · Attend : non

Signature
banking.societyBalance(job: string): number | null
Lua
local balance = aiLib.banking.societyBalance(job) -- nombre ou nil

Retour le solde, ou null (Lua nil) quand aucun script ne tourne ou que le script n’en garde pas.

const balance = banking.societyBalance("mechanic") ?? 0;

banking.provider

Côté : serveur · Attend : non

Signature
banking.provider(): string | null
Lua
local name = aiLib.banking.provider()

Retour le script bancaire utilisé par la couche, ou null.

console.log(`banking through ${banking.provider() ?? "nothing"}`);

billing

billing envoie les factures via le script de facturation qui tourne ; sans script, ce sont les factures propres à ai-core (le joueur paie depuis une liste à l’écran, l’argent bouge quand il paie). Les textes sont déjà traduits.

billing.send

Envoie une facture de la part d’un métier (amendes, frais de service) ou d’un joueur.

Côté : serveur · Attend : non

Signature
billing.send(bill: BillRequest): boolean
Lua
local ok = aiLib.billing.send(bill)

BillRequest

Prop

Type

Retour

boolean : true quand elle est envoyée, false quand elle est invalide ou refusée.

Exemple

import { billing, nearestPlayerTo, online } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

function fine(officer: number, amount: number) {
  if (!online.onDutyIn(officer, ["police"])) return fail("NOT_ON_DUTY");
  const target = nearestPlayerTo(officer, 3);
  if (target === null) return fail("NOBODY_NEAR");
  return billing.send({ to: target, amount, label: "Speeding", from: officer, job: "police" })
    ? { ok: true }
    : fail("BILL_FAILED");
}

billing.unpaid

Les factures ouvertes du joueur.

Côté : serveur · Attend : oui (Promise en TypeScript, cède la main (yield) dans le thread en Lua)

Signature
billing.unpaid(source: number): Promise<UnpaidBill[] | null>
Lua
local bills = aiLib.billing.unpaid(source) -- table[] ou nil, à appeler dans un thread

Retour UnpaidBill[] (id, label, amount encore dû, sender), ou null quand le script de facturation ne peut pas les lister.

const bills = await billing.unpaid(source);
const owed = bills?.reduce((sum, bill) => sum + bill.amount, 0) ?? 0;

billing.pay

Le joueur paie l’une de ses factures ouvertes.

Côté : serveur · Attend : non

Signature
billing.pay(source: number, id: string): boolean
Lua
local ok = aiLib.billing.pay(source, id)

Prop

Type

Retour true quand elle est payée. false quand le paiement est refusé (pas assez d’argent, facture inconnue) ou que le script de facturation n’accepte les paiements que dans son propre écran.

if (!billing.pay(source, billId)) return fail("PAY_FAILED");

billing.provider

Côté : serveur · Attend : non

Signature
billing.provider(): string | null
Lua
local name = aiLib.billing.provider()

Retour le script de facturation vers lequel vont les factures, "ai-core" pour les factures propres à ai-core.

if (billing.provider() === "ai-core") console.log("using ai-core's own bills");

Sur cette page