Geld und Konten
Die Kontostände eines Spielers sowie Job- und Gang-Konten lesen und ändern, Geld in einer Transaktion zwischen zwei Konten bewegen, die Kontotypen lesen.
Jeder Charakter hat einen Kontostand pro Kontotyp. Die Typen kommen aus der Liste Accounts (Konten) im Admin-Panel; ein neuer Server hat cash, bank, black_money und crypto. Jeder Job und jede Gang hat außerdem ein Konto jedes Typs (das Firmengeld), das leer beginnt.
So funktioniert Geld in ai-core:
- Beträge sind ganze Zahlen (Dollar, keine Cents). Ein Bruch,
NaNoder eine Zahl außerhalb des sicheren Ganzzahlbereichs von JavaScript wird abgelehnt. - Eine Änderung gilt sofort im Speicher und wird innerhalb von etwa 50 ms in die Datenbank geschrieben, zusammen mit einer Buchungszeile (
ai_core_transactions). Die Buchung speichert denreason, den du übergibst; ohne ihn speichert sie den Namen der aufrufenden Ressource. - Ein Kontostand kann nicht unter 0 fallen, es sei denn, bei seinem Kontotyp ist Can go below zero (darf unter null fallen) im Panel aktiv.
- Jede Änderung eines Spielerkontos löst das Server-Event
ai-core:moneyChanged (src, account, balance, delta, reason)aus und erreicht das eigene Spiel des Spielers. Siehe Events und Zustand.
GetMoney
Der Kontostand eines Spielers in einem Konto.
Seite: Server · Wartet: nein · Lib: keine
GetMoney(src: number, account: string): number | nulllocal balance = exports['ai-core']:GetMoney(source, 'bank') -- Zahl oder nilParameter
Prop
Type
Rückgabe
number | null: der Kontostand. null, wenn der Spieler keinen geladenen Charakter hat oder der Kontotyp nicht existiert.
Beispiel
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
Fügt dem Konto eines Spielers Geld hinzu. Nutze es für Belohnungen, Gehälter, die dein Skript zahlt, oder Verkaufserlöse.
Seite: Server · Wartet: nein · Lib: keine
AddMoney(src: number, account: string, amount: number, reason?: string): booleanlocal ok = exports['ai-core']:AddMoney(source, 'cash', 250, 'fishing_sale')Parameter
Prop
Type
Rückgabe
boolean: true, wenn das Geld hinzugefügt wurde. false, wenn der Spieler keinen geladenen Charakter hat, der Kontotyp nicht existiert oder amount keine ganze Zahl über 0 ist.
Beispiel
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 };
});Um Geld von einem Konto auf ein anderes zu bewegen (ein Spieler bezahlt einen Job, eine Banküberweisung), nutze TransferMoney, kein Paar aus RemoveMoney + AddMoney: Eine Überweisung ist eine Datenbanktransaktion, ein Paar sind zwei getrennte Änderungen.
RemoveMoney
Nimmt Geld vom Konto eines Spielers. Nutze es, um für etwas zu kassieren.
Seite: Server · Wartet: nein · Lib: keine
RemoveMoney(src: number, account: string, amount: number, reason?: string): booleanlocal paid = exports['ai-core']:RemoveMoney(source, 'bank', 500, 'license_fee')Parameter
Prop
Type
Rückgabe
boolean: true, wenn das Geld genommen wurde. false, wenn der Kontostand zu niedrig ist (und der Kontotyp keine negativen Stände erlaubt), der Spieler keinen geladenen Charakter hat, der Kontotyp nicht existiert oder amount keine ganze Zahl über 0 ist. Bei false hat sich nichts geändert.
Beispiel
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 };
});Prüfe, was fehlschlagen kann, bevor du das Geld nimmst (Platz im Inventar, Vorrat), oder gib das Geld mit AddMoney zurück, wenn der nächste Schritt fehlschlägt.
SetMoney
Setzt den Kontostand eines Spielers auf einen exakten Wert. Nutze es für Admin-Werkzeuge; Spielfunktionen sollten hinzufügen und abziehen.
Seite: Server · Wartet: nein · Lib: keine
SetMoney(src: number, account: string, amount: number, reason?: string): booleanlocal ok = exports['ai-core']:SetMoney(source, 'cash', 0, 'admin_reset')Parameter
Prop
Type
Rückgabe
boolean: true, wenn der Kontostand jetzt amount ist (auch wenn er es schon war). false, wenn der Spieler keinen geladenen Charakter hat, der Kontotyp nicht existiert, amount keine ganze Zahl ist oder unter 0 liegt bei einem Konto, das das nicht erlaubt.
Beispiel
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
Der Kontostand eines Job- oder Gang-Kontos (Firmengeld).
Seite: Server · Wartet: nein · Lib: keine (banking.societyBalance fragt die Bank-Ebene, die stattdessen ein Bank-Skript lesen kann)
GetSharedMoney(ownerType: "job" | "gang", ownerId: string, account: string): number | nulllocal balance = exports['ai-core']:GetSharedMoney('job', 'police', 'bank') -- Zahl oder nilParameter
Prop
Type
Rückgabe
number | null: der Kontostand. null, wenn der Job, die Gang oder der Kontotyp nicht existiert (oder seine Konten noch nicht geladen sind).
Beispiel
import { onClientCallback, online, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Ein Chefmenü zeigt das Geld des Jobs; nur Mitglieder des Jobs dürfen fragen.
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 };
});Wenn die Panel-Einstellung Job and gang accounts auf The script's own accounts steht, liegen die bank-Konten von Jobs und Gangs in diesem Skript: Dieser Export liest dann den Kontostand des Skripts. Siehe Bank.
AddSharedMoney
Fügt dem Konto eines Jobs oder einer Gang Geld hinzu.
Seite: Server · Wartet: nein · Lib: keine
AddSharedMoney(
ownerType: "job" | "gang",
ownerId: string,
account: string,
amount: number,
reason?: string,
): booleanlocal ok = exports['ai-core']:AddSharedMoney('job', 'mechanic', 'bank', 300, 'repair_fee')Parameter
Prop
Type
Rückgabe
boolean: true, wenn das Geld hinzugefügt wurde. false, wenn der Job, die Gang oder das Konto nicht existiert oder amount keine ganze Zahl über 0 ist.
Beispiel
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
/** Ein Verkauf an einen NPC-Kunden geht auf das Konto des Restaurants. */
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`);
}Wenn ein Spieler den Job bezahlt, nutze TransferMoney vom Konto des Spielers auf das des Jobs: eine Transaktion, beide Buchungszeilen.
RemoveSharedMoney
Nimmt Geld vom Konto eines Jobs oder einer Gang.
Seite: Server · Wartet: nein · Lib: keine
RemoveSharedMoney(
ownerType: "job" | "gang",
ownerId: string,
account: string,
amount: number,
reason?: string,
): booleanlocal ok = exports['ai-core']:RemoveSharedMoney('job', 'police', 'bank', 2000, 'equipment')Parameter
Prop
Type
Rückgabe
boolean: true, wenn das Geld genommen wurde. false, wenn der Kontostand zu niedrig ist (und negative Stände nicht erlaubt sind), der Job, die Gang oder das Konto nicht existiert oder amount keine ganze Zahl über 0 ist.
Beispiel
import { onClientCallback, online, resourceExport } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Ein Job bestellt Vorräte von seinem eigenen Konto.
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
Bewegt Geld von einem Konto auf ein anderes in einer Datenbanktransaktion mit beiden Buchungszeilen. Jede Seite kann das Konto eines geladenen Spielers oder das Konto eines Jobs oder einer Gang sein. Nutze es für jede Zahlung zwischen zwei Konten: ein Spieler bezahlt ein Geschäft, eine Banküberweisung, eine Einzahlung auf das Firmenkonto.
Seite: Server · Wartet: nein · 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)Parameter
Prop
Type
MoneyRef ist { source, account } für das Konto eines geladenen Spielers oder { owner, id, account } für das Konto eines Jobs oder einer Gang. Siehe MoneyRef.
Rückgabe
boolean: true, wenn from amount + fee gezahlt und to amount erhalten hat. false, wenn ein Konto fehlt (Spieler nicht geladen, unbekannter Job, unbekannter Kontotyp), beide Seiten dasselbe Konto sind, from amount + fee nicht zahlen kann, amount keine ganze Zahl über 0 ist oder fee keine ganze Zahl von 0 oder mehr ist. Bei false hat sich nichts geändert.
Beispiel
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
import { fail, readInt } from "@aicore-fivem/lib/shared";
const core = resourceExport("ai-core");
// Eine Einzahlung am Geldautomaten auf das Konto der eigenen Gang, mit 2 % Gebühr.
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");
},
);Beide Seiten lösen ihre übliche Änderung aus (die Seite eines Spielers löst ai-core:moneyChanged aus). Zwei Spieler können die beiden Seiten sein: { source: a, account: "bank" } an { source: b, account: "bank" }.
GetAccountTypes
Jeder Kontotyp aus der Liste Accounts des Panels, mit seinem Label, dem Startbetrag und ob er negativ werden darf. Nutze es, um ein Kontenmenü aufzubauen oder einen Namen zu prüfen.
Seite: Server · Wartet: nein · Lib: keine
GetAccountTypes(): Record<string, AccountTypeDefinition>local types = exports['ai-core']:GetAccountTypes() -- Tabelle mit Kontonamen als SchlüsselParameter
Keine.
Rückgabe
Record<string, AccountTypeDefinition>: eine Kopie mit Kontonamen als Schlüssel (cash, bank...). Jeder Wert hat label (wird Spielern angezeigt), start (was ein neuer Charakter bekommt) und allowNegative. Siehe AccountTypeDefinition.
Beispiel
import { onClientCallback, resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
// Der Geldbörsen-Bildschirm listet jedes Konto mit Label und Kontostand.
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 };
});Charaktere und Spieler
Die Daten und den Charakter eines geladenen Spielers lesen, einen Spieler per Charakter-ID oder Citizen-ID finden, den Charakter wechseln, einen Offline-Charakter versetzen, Spieler in Reichweite.
Jobs und Gangs
Jobs, Gangs, Ränge und Dienst eines Charakters lesen und ändern, Spieler im Dienst zählen, Prime Time, Job- und Gang-Definitionen lesen.