Argent et comptes
Lire et modifier les soldes d’un joueur, les comptes de métier et de gang, déplacer de l’argent entre deux comptes en une seule transaction, lire les types de comptes.
Chaque personnage a un solde par type de compte. Les types viennent de la liste Accounts du panneau d’administration ; un nouveau serveur a cash, bank, black_money et crypto. Chaque métier et chaque gang a aussi un compte de chaque type (l’argent de la société), qui démarre vide.
Comment l’argent fonctionne dans ai-core :
- Les montants sont des nombres entiers (dollars, sans centimes). Une fraction,
NaNou un nombre au-delà de la plage d’entiers sûrs de JavaScript est refusé. - Un changement s’applique tout de suite en mémoire et est écrit en base de données en environ 50 ms, avec une ligne de registre (
ai_core_transactions). Le registre stocke lareasonque vous passez ; sans elle, il stocke le nom de la ressource qui a appelé. - Un solde ne peut pas passer sous 0, sauf si son type de compte a Can go below zero (peut passer sous zéro) activé dans le panneau.
- Chaque changement d’un compte de joueur déclenche l’événement serveur
ai-core:moneyChanged (src, account, balance, delta, reason)et atteint le propre jeu du joueur. Voir Événements et état.
GetMoney
Le solde d’un joueur sur un compte.
Côté : Serveur · Attend : non · Lib : aucune
GetMoney(src: number, account: string): number | nulllocal balance = exports['ai-core']:GetMoney(source, 'bank') -- number ou nilParamètres
Prop
Type
Retour
number | null : le solde. null quand le joueur n’a pas de personnage chargé ou que le type de compte n’existe pas.
Exemple
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
onClientCallback("myscript:balance", (source) => {
const bank = core.GetMoney(source, "bank");
if (bank === null) return fail("NO_CHARACTER");
return { ok: true, bank };
});AddMoney
Ajoute de l’argent sur le compte d’un joueur. Utilisez-le pour des récompenses, des salaires que paie votre script ou des revenus de vente.
Côté : Serveur · Attend : non · Lib : aucune
AddMoney(src: number, account: string, amount: number, reason?: string): booleanlocal ok = exports['ai-core']:AddMoney(source, 'cash', 250, 'fishing_sale')Paramètres
Prop
Type
Retour
boolean : true quand l’argent a été ajouté. false quand le joueur n’a pas de personnage chargé, que le type de compte n’existe pas ou que amount n’est pas un nombre entier supérieur à 0.
Exemple
import { onClientCallback, inventory, resourceExport, near } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
const BUYER = { x: -1845.2, y: -1197.4, z: 14.3 };
onClientCallback("myscript:sellFish", { guards: [near(BUYER, 3)], lock: true }, (source) => {
const fish = inventory.getItemCount(source, "fish");
if (fish < 1) return fail("NO_FISH");
if (!inventory.removeItem(source, "fish", fish)) return fail("SELL_FAILED");
core.AddMoney(source, "cash", fish * 25, "fishing_sale");
return { ok: true };
});Pour déplacer de l’argent d’un compte à un autre (un joueur qui paie un métier, un virement bancaire), utilisez TransferMoney, pas une paire RemoveMoney + AddMoney : un virement est une seule transaction en base, une paire est deux changements séparés.
RemoveMoney
Retire de l’argent du compte d’un joueur. Utilisez-le pour faire payer quelque chose.
Côté : Serveur · Attend : non · Lib : aucune
RemoveMoney(src: number, account: string, amount: number, reason?: string): booleanlocal paid = exports['ai-core']:RemoveMoney(source, 'bank', 500, 'license_fee')Paramètres
Prop
Type
Retour
boolean : true quand l’argent a été retiré. false quand le solde est trop bas (et que le type de compte n’autorise pas les soldes négatifs), que le joueur n’a pas de personnage chargé, que le type de compte n’existe pas ou que amount n’est pas un nombre entier supérieur à 0. Avec false, rien n’a changé.
Exemple
import { onClientCallback, inventory, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
const PRICE = 500;
onClientCallback("myscript:buyLicense", { lock: true }, (source) => {
if (!inventory.canCarryItem(source, "driver_license")) return fail("NO_SPACE");
if (!core.RemoveMoney(source, "bank", PRICE, "license_fee")) return fail("NOT_ENOUGH_MONEY");
inventory.addItem(source, "driver_license");
return { ok: true };
});Vérifiez ce qui peut échouer avant de retirer l’argent (place dans l’inventaire, stock), ou rendez l’argent avec AddMoney quand l’étape suivante échoue.
SetMoney
Fixe le solde d’un joueur à une valeur exacte. Utilisez-le pour les outils d’administration ; les fonctionnalités de jeu doivent ajouter et retirer.
Côté : Serveur · Attend : non · Lib : aucune
SetMoney(src: number, account: string, amount: number, reason?: string): booleanlocal ok = exports['ai-core']:SetMoney(source, 'cash', 0, 'admin_reset')Paramètres
Prop
Type
Retour
boolean : true quand le solde vaut maintenant amount (aussi quand c’était déjà le cas). false quand le joueur n’a pas de personnage chargé, que le type de compte n’existe pas, que amount n’est pas un nombre entier ou qu’il est sous 0 sur un compte qui ne l’autorise pas.
Exemple
import { addCommand, resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
addCommand("setcash", {
help: "Sets a player cash",
params: [{ name: "id", type: "playerId" }, { name: "amount", type: "number" }],
restricted: true,
}, (_source, args) => {
console.log(core.SetMoney(args.id, "cash", args.amount, "admin_set") ? "done" : "refused");
});GetSharedMoney
Le solde du compte d’un métier ou d’un gang (argent de la société).
Côté : Serveur · Attend : non · Lib : aucune (banking.societyBalance interroge la couche bancaire, qui peut lire un script bancaire à la place)
GetSharedMoney(ownerType: "job" | "gang", ownerId: string, account: string): number | nulllocal balance = exports['ai-core']:GetSharedMoney('job', 'police', 'bank') -- number ou nilParamètres
Prop
Type
Retour
number | null : le solde. null quand le métier, le gang ou le type de compte n’existe pas (ou que ses comptes ne sont pas encore chargés).
Exemple
import { onClientCallback, online, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Un menu de patron affiche l’argent du métier ; seuls les membres du métier peuvent le demander.
onClientCallback("myscript:societyBalance", (source) => {
const job = online.dutyJob(source);
if (!job) return fail("NOT_ON_DUTY");
return { ok: true, balance: core.GetSharedMoney("job", job, "bank") ?? 0 };
});Quand le réglage Job and gang accounts (comptes de métier et de gang) du panneau vaut The script's own accounts (les propres comptes du script), les comptes bank du métier et du gang vivent dans ce script : cet export lit alors le solde du script. Voir Banque.
AddSharedMoney
Ajoute de l’argent sur le compte d’un métier ou d’un gang.
Côté : Serveur · Attend : non · Lib : aucune
AddSharedMoney(
ownerType: "job" | "gang",
ownerId: string,
account: string,
amount: number,
reason?: string,
): booleanlocal ok = exports['ai-core']:AddSharedMoney('job', 'mechanic', 'bank', 300, 'repair_fee')Paramètres
Prop
Type
Retour
boolean : true quand l’argent a été ajouté. false quand le métier, le gang ou le compte n’existe pas ou que amount n’est pas un nombre entier supérieur à 0.
Exemple
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
/** A sale made by an NPC customer goes into the restaurant's account. */
export function restaurantSale(job: string, price: number): void {
if (!core.AddSharedMoney("job", job, "bank", price, "npc_sale"))
console.log(`job ${job} has no bank account`);
}Quand un joueur paie le métier, utilisez TransferMoney du compte du joueur vers celui du métier : une seule transaction, les deux lignes de registre.
RemoveSharedMoney
Retire de l’argent du compte d’un métier ou d’un gang.
Côté : Serveur · Attend : non · Lib : aucune
RemoveSharedMoney(
ownerType: "job" | "gang",
ownerId: string,
account: string,
amount: number,
reason?: string,
): booleanlocal ok = exports['ai-core']:RemoveSharedMoney('job', 'police', 'bank', 2000, 'equipment')Paramètres
Prop
Type
Retour
boolean : true quand l’argent a été retiré. false quand le solde est trop bas (et que les soldes négatifs ne sont pas autorisés), que le métier, le gang ou le compte n’existe pas ou que amount n’est pas un nombre entier supérieur à 0.
Exemple
import { onClientCallback, online, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Un métier commande des fournitures sur son propre compte.
onClientCallback("myscript:orderSupplies", { lock: true }, (source) => {
const job = online.dutyJob(source);
if (!job) return fail("NOT_ON_DUTY");
if (!core.RemoveSharedMoney("job", job, "bank", 1500, "supplies")) return fail("SOCIETY_NO_MONEY");
return { ok: true };
});TransferMoney
Déplace de l’argent d’un compte à un autre en une seule transaction en base de données avec les deux lignes de registre. Chaque côté peut être le compte d’un joueur chargé ou le compte d’un métier ou d’un gang. Utilisez-le pour chaque paiement entre deux comptes : un joueur qui paie une entreprise, un virement bancaire, un dépôt sur le compte de la société.
Côté : Serveur · Attend : non · Lib : money.transfer
TransferMoney(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanlocal ok = exports['ai-core']:TransferMoney(
{ source = source, account = 'bank' },
{ owner = 'job', id = 'mechanic', account = 'bank' },
750, 'repair', 0)Paramètres
Prop
Type
MoneyRef vaut { source, account } pour le compte d’un joueur chargé, ou { owner, id, account } pour le compte d’un métier ou d’un gang. Voir MoneyRef.
Retour
boolean : true quand from a payé amount + fee et que to a reçu amount. false quand un compte manque (joueur non chargé, métier inconnu, type de compte inconnu), que les deux côtés sont le même compte, que from ne peut pas payer amount + fee, que amount n’est pas un nombre entier supérieur à 0 ou que fee n’est pas un nombre entier de 0 ou plus. Avec false, rien n’a changé.
Exemple
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readInt } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Un dépôt au distributeur sur le compte du propre gang du joueur, avec 2 % de frais.
onClientCallback(
"myscript:gangDeposit",
{ args: ([amount]) => { const n = readInt(amount, 1, 1_000_000); return n === null ? null : [n]; }, lock: true },
(source, amount) => {
const gang = core.GetActiveGang(source);
if (!gang) return fail("NO_GANG");
const fee = Math.ceil(amount * 0.02);
const ok = core.TransferMoney(
{ source, account: "bank" },
{ owner: "gang", id: gang, account: "bank" },
amount, "gang_deposit", fee,
);
return ok ? { ok: true } : fail("NOT_ENOUGH_MONEY");
},
);Les deux côtés déclenchent leur changement habituel (le côté d’un joueur déclenche ai-core:moneyChanged). Deux joueurs peuvent être les deux côtés : { source: a, account: "bank" } vers { source: b, account: "bank" }.
GetAccountTypes
Chaque type de compte de la liste Accounts du panneau, avec son libellé, son montant de départ et s’il peut devenir négatif. Utilisez-le pour construire un menu de comptes ou pour vérifier un nom.
Côté : Serveur · Attend : non · Lib : aucune
GetAccountTypes(): Record<string, AccountTypeDefinition>local types = exports['ai-core']:GetAccountTypes() -- table indexée par nom de compteParamètres
Aucun.
Retour
Record<string, AccountTypeDefinition> : une copie indexée par nom de compte (cash, bank...). Chaque valeur a label (montré aux joueurs), start (ce que reçoit un nouveau personnage) et allowNegative. Voir AccountTypeDefinition.
Exemple
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
// L’écran du portefeuille liste chaque compte avec son libellé et son solde.
onClientCallback("myscript:wallet", (source) => {
const rows = Object.entries(core.GetAccountTypes()).map(([name, type]) => ({
name,
label: type.label,
balance: core.GetMoney(source, name) ?? 0,
}));
return { ok: true, rows };
});Personnages et joueurs
Lire les données et le personnage d’un joueur chargé, trouver un joueur par id de personnage ou citizen id, changer de personnage, déplacer un personnage hors ligne, joueurs à portée.
Métiers et gangs
Lire et modifier les métiers, gangs, grades et le service d’un personnage, compter les joueurs en service, heures de pointe, lire les définitions des métiers et des gangs.