AI Core
API-ReferenzAI Core: Server-Exports

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, NaN oder 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 den reason, 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

Signature
GetMoney(src: number, account: string): number | null
Lua
local balance = exports['ai-core']:GetMoney(source, 'bank') -- Zahl oder nil

Parameter

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

Signature
AddMoney(src: number, account: string, amount: number, reason?: string): boolean
Lua
local 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

Signature
RemoveMoney(src: number, account: string, amount: number, reason?: string): boolean
Lua
local 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

Signature
SetMoney(src: number, account: string, amount: number, reason?: string): boolean
Lua
local 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)

Signature
GetSharedMoney(ownerType: "job" | "gang", ownerId: string, account: string): number | null
Lua
local balance = exports['ai-core']:GetSharedMoney('job', 'police', 'bank') -- Zahl oder nil

Parameter

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

Signature
AddSharedMoney(
  ownerType: "job" | "gang",
  ownerId: string,
  account: string,
  amount: number,
  reason?: string,
): boolean
Lua
local 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

Signature
RemoveSharedMoney(
  ownerType: "job" | "gang",
  ownerId: string,
  account: string,
  amount: number,
  reason?: string,
): boolean
Lua
local 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

Signature
TransferMoney(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): boolean
Lua
local 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

Signature
GetAccountTypes(): Record<string, AccountTypeDefinition>
Lua
local types = exports['ai-core']:GetAccountTypes() -- Tabelle mit Kontonamen als Schlüssel

Parameter

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 };
});

Auf dieser Seite