AI Core
Referencia de la APILib: servidor

Dinero y banca

money.transfer entre dos cuentas, el script de banca a través de ai-core y las facturas a través del script de facturación que funcione.

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

Los cambios en una sola cuenta de un jugador (añadir, quitar, leer un saldo) son exports de ai-core (AddMoney, RemoveMoney, GetMoney; consulta exports de servidor de ai-core). La lib añade lo que necesita más de un cambio de cuenta, y las capas de banca y facturación.

money

money.transfer

Mueve dinero de una cuenta a otra en una sola transacción de base de datos, con una fila de registro contable en ambos lados. Úsalo para todo aquello en que el dinero no deba aparecer ni desaparecer a medias: pagar a otro jugador, un trabajo que paga una prima, una comisión.

Lado: Servidor · Espera: no

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

Sin equivalente en Lua: llama al export de ai-core exports['ai-core']:TransferMoney(from, to, amount, reason, fee).

Parámetros

Prop

Type

Devuelve

boolean: true cuando se escribieron ambas filas. false cuando una cantidad no es un número entero, falta una cuenta, ambas son la misma, o from no puede pagar amount más fee.

Ejemplo

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 habla con el script de banca a través de la capa de banca de ai-core. El dinero de los trabajos en sí siempre se mueve mediante money o los exports de ai-core.

banking.open

Abre la pantalla del script de banca para un jugador.

Lado: Servidor · Espera: no

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

Devuelve true cuando se abrió. false cuando el script no puede abrirse desde fuera o no hay ninguno en marcha.

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

banking.societyBalance

El saldo de la sociedad de un trabajo, para mostrarlo. En el modo de cuenta core de ai-core es la cuenta del trabajo de ai-core; en el modo own, la del propio script de banca.

Lado: Servidor · Espera: no

Firma
banking.societyBalance(job: string): number | null
Lua
local balance = aiLib.banking.societyBalance(job) -- number o nil

Devuelve el saldo, o null (nil en Lua) cuando no hay ninguno en marcha o el script no lleva ninguno.

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

banking.provider

Lado: Servidor · Espera: no

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

Devuelve el script de banca que usa la capa, o null.

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

billing

billing envía facturas a través del script de facturación que funcione; sin ninguno, las facturas propias de ai-core (el jugador paga desde una lista en pantalla y el dinero se mueve cuando paga). Los textos ya están traducidos.

billing.send

Envía una factura desde un trabajo (multas, tarifas de servicio) o desde un jugador.

Lado: Servidor · Espera: no

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

BillRequest

Prop

Type

Devuelve

boolean: true cuando se envió, false cuando no es válida o se rechazó.

Ejemplo

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

Las facturas abiertas del jugador.

Lado: Servidor · Espera: sí (Promise en TypeScript, cede el hilo en Lua)

Firma
billing.unpaid(source: number): Promise<UnpaidBill[] | null>
Lua
local bills = aiLib.billing.unpaid(source) -- table[] o nil, llamar dentro de un hilo

Devuelve UnpaidBill[] (id, label, amount aún adeudado, sender), o null cuando el script de facturación no puede listarlas.

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

billing.pay

El jugador paga una de sus facturas abiertas.

Lado: Servidor · Espera: no

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

Prop

Type

Devuelve true cuando se pagó. false cuando se rechazó (no hay suficiente dinero, factura desconocida) o el script de facturación solo acepta pagos en su propia pantalla.

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

billing.provider

Lado: Servidor · Espera: no

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

Devuelve el script de facturación al que van las facturas, "ai-core" para las facturas propias de ai-core.

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

En esta página