AI Core
API-Referenz

Lib: Server

@aicore-fivem/lib/server - jeder Server-Helfer mit seiner Signatur und dem Lua-Gegenstück auf aiLib, wo es eines gibt.

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

Der Server-Einstieg exportiert auch die /fivem-Helfer weiter: siehe Lib: shared und fivem. Die letzte Spalte nennt das Lua-Gegenstück auf aiLib (Lib für Lua).

Client-Eingaben

Jede Client-Anfrage geht durch das Gate: Prüfung auf echten Spieler, Ratenlimit, Guards, ein Argument-Parser, optional ein Aufruf zur Zeit.

HelferWasLua
onClientCallback(name, handler, options?) / onClientCallback(name, { args, guards?, rate?, lock? }, handler)Beantwortet triggerServerCallback; args macht aus rohen Werten geprüfte (null lehnt ab).onClientCallback (Optionen rate, lock, ace)
onClientEvent(name, handler, options?) / onClientEvent(name, { args, ... }, handler)Ein Net-Event von einem Client, durch dasselbe Gate.onClientEvent
triggerClientCallback(name, source, args = [], timeoutMs?): Promise<unknown>Fragt einen Client (dort onServerCallback).triggerClientCallback
isAdmin(ace?), hasCharacter(), near(point | (source) => point, metres)Guards für guards: [...].isAdmin(source, ace?)
eventSource(): numberDer Spieler, der das Event gesendet hat (vor dem ersten await lesen).
isOnline(source): booleanOb der Spieler verbunden ist.
progressFor(source, { label, duration, anim?, scenario?, face?, allowVehicle?, canCancel?, freeze?, disable?, minRatio? }): Promise<boolean>Eine zeitgesteuerte Aktion, die der Server prüft: der Balken von ai-lib auf dem Client des Spielers, nur true, wenn er dort abgelaufen ist und hier genug Zeit vergangen ist.progressFor (wartet)
minigameFor(source, { game, difficulty?, rounds?, keys?, pins?, picks?, minMs? }): Promise<"won" | "lost" | "broken">Ein Skill-Check oder Schlossknacken, das ein Server-Ablauf braucht; ein Sieg schneller als minMs zählt als verloren.minigameFor (wartet)
new PendingActions({ minRatio? }): start(source, data, ms), take(source, token), peek, cancelDialoge, auf die der Server wartet: ein Token, freigegeben beim Verlassen.
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 })

Spieler

HelferWasLua
onCharacter({ loaded(source, character), unloaded(source, charId, reason) })Laden und Entladen von Charakteren; spielt auch Charaktere nach, die vor einem Neustart geladen waren.onCharacter
online.sources(), online.character(source), online.charId(source), online.name(source, { fallback? })Geladene Spieler, gespiegelt aus den Events von ai-core.online.sources, character, name(src, fallback)
online.jobs(source), online.gangs(source), online.jobGrade(source, job), online.gangGrade(source, gang)Mitgliedschaften; ein Rang ist null, wenn kein Mitglied.gleiche Namen
online.dutyJob(source), online.onDutyIn(source, jobs), online.onDutyFor(job), online.countOnDuty(jobs)Dienst.online.dutyJob
online.jobMembers(job), online.gangMembers(gang)Live-Mitgliedermengen (vor einem await kopieren).
online.allows(source, rule: AccessRule): booleanOb der Spieler einen Ort nutzen darf.
notify(source, text, kind = "info", duration?)Eine Benachrichtigungskarte auf dem Bildschirm dieses Spielers.notify(source, text, kind?, duration?)
playersNear(source, radius), playersNearEntity(entity, radius)Spieler in der Nähe, aus dem OneSync-Scope (bis etwa 424 m).gleiche Namen
nearestPlayerTo(source, metres, filter?): number | nullDer nächste andere Spieler.nearestPlayerTo
coordsOf(source), entityCoords(entity), isNear(source, point, metres)Positionen.
vehicleOf(source, { driver? }): numberDas Fahrzeug, in dem der Spieler sitzt (0 zu Fuß).
new PlayerMap({ onDrop? })Eine Map, die sich leert, wenn ein Spieler geht.
new Cooldowns(), new KeyedCooldowns(): ready, start, take(key, ms), left, clearCooldowns pro Spieler oder pro beliebigem Schlüssel (Charakter-ID, Tür).
new SourceLock(): run(source, busy, task), releaseEine Aktion zur Zeit pro Spieler über mehrere Callbacks hinweg.
new RateLimit(count, windowMs): take(source), release(source)Ein Burst-Limit pro Spieler.RateLimit.new(count, windowMs)
new KeyWatchers(): watch(source, key), stop, of(key), keyOf(source)Spieler, die die Deltas eines Schlüssels bekommen (ein offener Bildschirm).

Über AI Core

HelferWasLua
inventory.addItem(inv, item, count = 1, metadata?, slot?), removeItem, getItemCount, hasItem, canCarryItem, getItems, clearInventory, registerStash, openInventory, registerUsableItem, getItemDefinitionItems über das aktive Inventar.inventory (gleiche Namen)
vehicleKeys.give(source, vehicle, purpose = "temporary"), remove, hasSchlüssel über das aktive Schlüsselsystem.vehicleKeys
phone.number, sourceOf, hasPhone, mail, message, notifyDas Handy des Spielers.phone
dispatch.alert(alert): booleanEin Polizeialarm über das aktive Alarmsystem.dispatch.alert
prison.jail(source, minutes, by = 0), release, timeLeftHaftstrafen.prison
world.getWeather(), setWeather(type), getTime(), setTime(hour, minute = 0), setBlackout(on), freezeTime(on)Zeit und Wetter des laufenden Wetterskripts.world
medical.revive(source), heal, isDead, provider()Das laufende Todesskript.
appearance.get(charId): Promise<CharacterAppearance | null>, provider()Das gespeicherte Aussehen eines Charakters.appearance.get (wartet), provider
money.transfer(from, to, amount, reason?, fee?): booleanZwei Konten in einer Transaktion.
buckets.acquire(tag), buckets.release(id)Routing-Buckets, freigegeben, wenn die Ressource stoppt.
characters.setOfflinePosition(charId, { x, y, z, heading? })Der Spawnpunkt eines gespeicherten Charakters.
definitions.job(name), definitions.gang(name)Job- und Gang-Definitionen, gecacht, bis das Panel sie ändert.
isPrimeTime(job?): booleanPrime Time eines Jobs.
aiLog(channel, message, options?), aiLogChannels(channels)Logs über ai-core.aiLog

Fahrzeuge und Entities

HelferWasLua
spawnVehicle({ model, coords, asker | type, plate?, fuel?, keysTo?, purpose?, driver?, seats?, props?, setup?, locked?, bucket?, persistent?, bags? }): Promise<number | null>Ein Server-Fahrzeug mit Kennzeichen, Sprit, Schlüsseln, Aussehen, Sitzen und Bucket in einem Aufruf.spawnVehicle (wartet)
vehicleType(model, asker): Promise<string | null>Der Spawn-Typ eines Modells, null, wenn das Spiel kein solches Fahrzeug hat.
randomPlate(prefix?): stringEin spielähnliches Kennzeichen.
nearestVehicleTo(source, metres, filter?), nearestVehicleAt(point, metres, filter?)Das nächste Fahrzeug (geht jedes Fahrzeug durch: die Aktion ratenbegrenzen).nearestVehicleTo
entityFromNet(netId, type?), pedFromNet(netId), vehicleFromNet(netId)Eine lebende Entity aus der Net-ID eines Clients, oder 0.vehicleFromNet
vehicleNearPlayer(source, netId, { metres = 5, driver? }): numberDas Fahrzeug, wenn der Spieler in seiner Nähe ist.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,
});

Befehle, Panel, Daten

HelferWasLua
addCommand(name | [name, ...aliases], { help, params, restricted }, (source, args, raw) => ...)Ein Befehl: geparste Parameter, per ACE geprüft, im Panel gelistet.addCommand
new AdminPanel(schema): get, onChange, view, records, onAction, ruleDer Panel-Speicher eines Skripts: Schema, Validierung, Speichern, Deltas.
new DataFile(resource, name, log)Panel-Inhalt in data/*.json mit atomaren Schreibvorgängen.
createDatabaseTables(resource, file): Promise<void>Installiert sql/main.sql.
new WriteQueue(onError): push(label, task), idle()Datenbank-Schreibvorgänge nacheinander.
new AreaStream({ event, view, cellSize?, range?, chunk?, alsoTo?, extra? })Weltobjekte, die zu den Spielern in der Nähe gestreamt werden: ein Snapshot, dann nur Änderungen.
EntityState, PlayerState, GlobalKey, GlobalGroup (mit set)State Bags; die Server-Klassen schreiben.
TypeScript
addCommand(
  "heal",
  {
    help: t("CMD_HEAL"),
    params: [{ name: "id", type: "playerId", optional: true }],
    restricted: true,
  },
  (source, args) => medical.heal(args.id ?? source),
);

Auf dieser Seite