Argent et banque
money.transfer entre deux comptes, le script bancaire via ai-core, et les factures via le script de facturation qui tourne.
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
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanPas 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
banking.open(source: number): booleanlocal 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
banking.societyBalance(job: string): number | nulllocal balance = aiLib.banking.societyBalance(job) -- nombre ou nilRetour 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
banking.provider(): string | nulllocal 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
billing.send(bill: BillRequest): booleanlocal 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)
billing.unpaid(source: number): Promise<UnpaidBill[] | null>local bills = aiLib.billing.unpaid(source) -- table[] ou nil, à appeler dans un threadRetour 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
billing.pay(source: number, id: string): booleanlocal 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
billing.provider(): string | nulllocal 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");Véhicules
spawnVehicle, vehicleType, randomPlate, véhicules les plus proches, entités depuis les net ids du client, vehicleKeys, carburant et garages.
Métiers et services
Alertes police, prison, dossiers MDT, médecins, réanimation et soins, stress, faim et soif, définitions des métiers et des gangs, heures de pointe.