AI Core
Referencia de la API

Lib: servidor

@aicore-fivem/lib/server - cada utilidad de servidor con su firma, y su gemela en Lua de aiLib cuando existe.

TypeScript
import { onClientCallback, inventory, online, fail } from "@aicore-fivem/lib/server";

La entrada de servidor también reexporta las utilidades de /fivem: ver Lib: shared y fivem. La última columna nombra la gemela en Lua de aiLib (Lib para Lua).

Entrada del cliente

Cada petición del cliente pasa por la puerta: comprobación de jugador real, límite de frecuencia, guardas, un parser de argumentos y, si se pide, una llamada a la vez.

UtilidadQuéLua
onClientCallback(name, handler, options?) / onClientCallback(name, { args, guards?, rate?, lock? }, handler)Responde a triggerServerCallback; args convierte los valores crudos en valores comprobados (null rechaza).onClientCallback (opciones rate, lock, ace)
onClientEvent(name, handler, options?) / onClientEvent(name, { args, ... }, handler)Un evento de red de un cliente, por la misma puerta.onClientEvent
triggerClientCallback(name, source, args = [], timeoutMs?): Promise<unknown>Pregunta a un cliente (allí onServerCallback).triggerClientCallback
isAdmin(ace?), hasCharacter(), near(point | (source) => point, metres)Guardas para guards: [...].isAdmin(source, ace?)
eventSource(): numberEl jugador que envió el evento (léelo antes del primer await).
isOnline(source): booleanSi el jugador está conectado.
progressFor(source, { label, duration, anim?, scenario?, face?, allowVehicle?, canCancel?, freeze?, disable?, minRatio? }): Promise<boolean>Una acción temporizada que comprueba el servidor: la barra de ai-lib en el cliente del jugador, true solo cuando terminó allí y pasó tiempo suficiente aquí.progressFor (espera)
minigameFor(source, { game, difficulty?, rounds?, keys?, pins?, picks?, minMs? }): Promise<"won" | "lost" | "broken">Una prueba de habilidad o cerradura que necesita un flujo del servidor; una victoria antes de minMs cuenta como derrota.minigameFor (espera)
new PendingActions({ minRatio? }): start(source, data, ms), take(source, token), peek, cancelDiálogos que espera el servidor: un token, liberado al desconectarse.
TypeScript
onClientCallback(
  "repair",
  { args: oneArg(readId), guards: [hasCharacter()], lock: true },
  async (source, netId) => {
    if (!inventory.hasItem(source, "repairkit")) return fail("NO_KIT");
    if (!(await progressFor(source, { label: t("REPAIRING"), duration: 8000 })))
      return fail("CANCELLED");
    inventory.removeItem(source, "repairkit");
    return { ok: true };
  },
);
Lua
aiLib.onClientCallback('repair', function(source, netId)
  if not aiLib.inventory.hasItem(source, 'repairkit') then return aiLib.fail('NO_KIT') end
  if not aiLib.progressFor(source, { label = 'Repairing', duration = 8000 }) then
    return aiLib.fail('CANCELLED')
  end
  aiLib.inventory.removeItem(source, 'repairkit', 1)
  return { ok = true }
end, { lock = true })

Jugadores

UtilidadQuéLua
onCharacter({ loaded(source, character), unloaded(source, charId, reason) })Carga y descarga de personajes; también repite los personajes cargados antes de un reinicio.onCharacter
online.sources(), online.character(source), online.charId(source), online.name(source, { fallback? })Jugadores cargados, reflejados desde los eventos de ai-core.online.sources, character, name(src, fallback)
online.jobs(source), online.gangs(source), online.jobGrade(source, job), online.gangGrade(source, gang)Pertenencias; un rango es null si no es miembro.mismos nombres
online.dutyJob(source), online.onDutyIn(source, jobs), online.onDutyFor(job), online.countOnDuty(jobs)Servicio.online.dutyJob
online.jobMembers(job), online.gangMembers(gang)Conjuntos de miembros en vivo (cópialos antes de un await).
online.allows(source, rule: AccessRule): booleanSi el jugador puede usar un lugar.
notify(source, text, kind = "info", duration?)Una tarjeta de notificación en la pantalla de ese jugador.notify(source, text, kind?, duration?)
playersNear(source, radius), playersNearEntity(entity, radius)Jugadores alrededor, del scope OneSync (hasta unos 424 m).mismos nombres
nearestPlayerTo(source, metres, filter?): number | nullEl otro jugador más cercano.nearestPlayerTo
coordsOf(source), entityCoords(entity), isNear(source, point, metres)Posiciones.
vehicleOf(source, { driver? }): numberEl vehículo en el que está sentado el jugador (0 a pie).
new PlayerMap({ onDrop? })Un Map que se vacía solo cuando un jugador se desconecta.
new Cooldowns(), new KeyedCooldowns(): ready, start, take(key, ms), left, clearTiempos de espera por jugador, o por cualquier clave (id de personaje, puerta).
new SourceLock(): run(source, busy, task), releaseUna acción a la vez por jugador entre varios callbacks.
new RateLimit(count, windowMs): take(source), release(source)Un límite de ráfagas por jugador.RateLimit.new(count, windowMs)
new KeyWatchers(): watch(source, key), stop, of(key), keyOf(source)Jugadores que reciben los deltas de una clave (una pantalla abierta).

A través de AI Core

UtilidadQuéLua
inventory.addItem(inv, item, count = 1, metadata?, slot?), removeItem, getItemCount, hasItem, canCarryItem, getItems, clearInventory, registerStash, openInventory, registerUsableItem, getItemDefinitionObjetos a través del inventario activo.inventory (mismos nombres)
vehicleKeys.give(source, vehicle, purpose = "temporary"), remove, hasLlaves a través del sistema de llaves activo.vehicleKeys
phone.number, sourceOf, hasPhone, mail, message, notifyEl teléfono del jugador.phone
dispatch.alert(alert): booleanUna alerta policial a través del sistema de alertas activo.dispatch.alert
prison.jail(source, minutes, by = 0), release, timeLeftCondenas de cárcel.prison
world.getWeather(), setWeather(type), getTime(), setTime(hour, minute = 0), setBlackout(on), freezeTime(on)Hora y clima del script de clima en marcha.world
medical.revive(source), heal, isDead, provider()El script de muerte en marcha.
appearance.get(charId): Promise<CharacterAppearance | null>, provider()El aspecto guardado de un personaje.appearance.get (espera), provider
money.transfer(from, to, amount, reason?, fee?): booleanDos cuentas en una transacción.
buckets.acquire(tag), buckets.release(id)Routing buckets, liberados cuando el recurso se detiene.
characters.setOfflinePosition(charId, { x, y, z, heading? })El punto de aparición de un personaje guardado.
definitions.job(name), definitions.gang(name)Definiciones de trabajos y bandas, en caché hasta que el panel las cambia.
isPrimeTime(job?): booleanHorario punta de un trabajo.
aiLog(channel, message, options?), aiLogChannels(channels)Logs a través de ai-core.aiLog

Vehículos y entidades

UtilidadQuéLua
spawnVehicle({ model, coords, asker | type, plate?, fuel?, keysTo?, purpose?, driver?, seats?, props?, setup?, locked?, bucket?, persistent?, bags? }): Promise<number | null>Un vehículo del servidor con matrícula, combustible, llaves, aspecto, asientos y bucket en una sola llamada.spawnVehicle (espera)
vehicleType(model, asker): Promise<string | null>El tipo de aparición de un modelo, null si el juego no tiene ese vehículo.
randomPlate(prefix?): stringUna matrícula al estilo del juego.
nearestVehicleTo(source, metres, filter?), nearestVehicleAt(point, metres, filter?)El vehículo más cercano (recorre todos los vehículos: limita la frecuencia de la acción).nearestVehicleTo
entityFromNet(netId, type?), pedFromNet(netId), vehicleFromNet(netId)Una entidad viva a partir del net id de un cliente, o 0.vehicleFromNet
vehicleNearPlayer(source, netId, { metres = 5, driver? }): numberEl vehículo, cuando el jugador está cerca de él.vehicleNearPlayer
TypeScript
const vehicle = await spawnVehicle({
  model: "taxi",
  coords: { x: 895.4, y: -179.3, z: 74.7, w: 238 },
  asker: source,
  keysTo: source,
  purpose: "job",
  driver: source,
});

Comandos, panel, datos

UtilidadQuéLua
addCommand(name | [name, ...aliases], { help, params, restricted }, (source, args, raw) => ...)Un comando: parámetros validados, comprobado con ACE, listado en el panel.addCommand
new AdminPanel(schema): get, onChange, view, records, onAction, ruleEl almacén del panel de un script: esquema, validación, guardado, deltas.
new DataFile(resource, name, log)Contenido del panel en data/*.json con escrituras atómicas.
createDatabaseTables(resource, file): Promise<void>Instala sql/main.sql.
new WriteQueue(onError): push(label, task), idle()Escrituras en la base de datos una tras otra.
new AreaStream({ event, view, cellSize?, range?, chunk?, alsoTo?, extra? })Objetos del mundo transmitidos a los jugadores cercanos: una instantánea, luego solo los cambios.
EntityState, PlayerState, GlobalKey, GlobalGroup (con set)State bags; las clases del servidor escriben.
TypeScript
addCommand(
  "heal",
  {
    help: t("CMD_HEAL"),
    params: [{ name: "id", type: "playerId", optional: true }],
    restricted: true,
  },
  (source, args) => medical.heal(args.id ?? source),
);

En esta página