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.
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
money.transfer(from: MoneyRef, to: MoneyRef, amount: number, reason?: string, fee?: number): booleanSin 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
banking.open(source: number): booleanlocal 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
banking.societyBalance(job: string): number | nulllocal balance = aiLib.banking.societyBalance(job) -- number o nilDevuelve 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
banking.provider(): string | nulllocal 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
billing.send(bill: BillRequest): booleanlocal 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)
billing.unpaid(source: number): Promise<UnpaidBill[] | null>local bills = aiLib.billing.unpaid(source) -- table[] o nil, llamar dentro de un hiloDevuelve 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
billing.pay(source: number, id: string): booleanlocal 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
billing.provider(): string | nulllocal 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");Vehículos
spawnVehicle, vehicleType, randomPlate, vehículos más cercanos, entidades a partir de net ids del cliente, vehicleKeys, combustible y garajes.
Trabajos y servicios
Alertas policiales, prisión, registros del MDT, médicos, revivir y curar, estrés, hambre y sed, definiciones de trabajos y bandas, horas punta.