AI Core
API-ReferenzLib für Lua

Nur-Lua-Helfer

aiLib.playerData, aiLib.online, aiLib.isAdmin und die Tabelle aiLib.menu: die aiLib-Funktionen, deren Lua-Form sich von der TypeScript-Lib unterscheidet.

Die meisten aiLib-Funktionen sind der Lua-Zwilling einer TypeScript-Funktion und werden daneben dokumentiert, mit einem Lua-Tab (siehe Jede aiLib-Funktion). Die auf dieser Seite haben in Lua einen anderen Namen, eine andere Form oder ein anderes Verhalten, daher werden sie hier dokumentiert.

Client: Spielerdaten

aiLib.playerData.get

Der letzte Wert, den ai-core für einen Schlüssel der Daten des lokalen Spielers gesendet hat. Wenn seit dem Start deiner Ressource nichts angekommen ist, fragt es ai-core einmal (GetPlayerData) und behält die Antwort.

Seite: Client · Wartet: nein

Lua
local value = aiLib.playerData.get(key)

TypeScript: dieselben Daten über getPlayerData(key) (siehe Mitgliedschaft und Spielerdaten).

Parameter

Prop

Type

Rückgabewert

Der Wert: eine Tabelle für character, money ({ cash = 500, bank = 5000 }), jobs, job, gangs und metadata; ein String oder nil für duty und activeGang. nil, solange kein Charakter geladen ist oder ai-core nicht läuft.

Beispiel

client.lua
RegisterCommand('cash', function()
    local money = aiLib.playerData.get('money') or {}
    aiLib.notify(('Cash: $%s'):format(aiLib.numbers.groupDigits(money.cash or 0)), 'info')
end, false)

aiLib.playerData.onChange

Führt jedes Mal eine Funktion aus, wenn ai-core einen neuen Wert eines Schlüssels für den lokalen Spieler schickt (ein Jobwechsel, Geld, Dienstantritt). Für money und metadata sendet ai-core nur die geänderten Einträge; aiLib führt sie zusammen, sodass dein Handler immer die ganze Tabelle bekommt.

Seite: Client · Wartet: nein

Lua
aiLib.playerData.onChange(key, function(value) end)

TypeScript: onPlayerData(key, handler) (siehe Mitgliedschaft und Spielerdaten).

Parameter

Prop

Type

Rückgabewert

Nichts. Es gibt keine Möglichkeit, den Handler zu entfernen; er verschwindet mit deiner Ressource.

Beispiel

client.lua
aiLib.playerData.onChange('duty', function(job)
    if job == 'police' then
        aiLib.notify('You are now on duty', 'success')
    end
end)

Server: Online-Spieler

aiLib.online liest geladene Spieler über die Exports von ai-core, ein Export-Aufruf pro Lesezugriff. Es ist für Abfragen gedacht, wenn eine Aktion passiert (ein Befehl, ein Callback), nicht für jeden Tick. Das TypeScript-online hält einen lokalen Spiegel mit mehr Lesern und anderen Rückgabeformen (siehe Spieler).

aiLib.online.character

Der geladene Charakter eines Spielers.

Seite: Server · Wartet: nein

Lua
local character = aiLib.online.character(src)

Parameter

Prop

Type

Rückgabewert

Eine CharacterInfo-Tabelle (id, citizenid, firstname, lastname, birthdate, sex, nationality...), oder nil, wenn der Spieler keinen Charakter geladen hat.

Beispiel

server.lua
aiLib.addCommand('whoami', { help = 'Shows your character id' }, function(source)
    local character = aiLib.online.character(source)
    if not character then return end
    aiLib.notify(source, ('Character #%d (%s)'):format(character.id, character.citizenid), 'info')
end)

aiLib.online.name

"Vorname Nachname" des Charakters, sonst der FiveM-Name des Spielers.

Seite: Server · Wartet: nein

Lua
local name = aiLib.online.name(src, fallback)

TypeScript: online.name(source, { fallback }) nimmt eine Optionstabelle statt eines Booleans.

Parameter

Prop

Type

Rückgabewert

string: der Charaktername, sonst der FiveM-Name (oder "" bei fallback = false oder wenn der Spieler weg ist).

Beispiel

server.lua
print(('%s opened the shop'):format(aiLib.online.name(source)))

aiLib.online.jobs

Jeder Job eines Spielers, im Dienst oder nicht.

Seite: Server · Wartet: nein

Lua
local jobs = aiLib.online.jobs(src)

TypeScript: online.jobs(source) gibt nur die Job-Namen zurück; Lua gibt die Mitgliedschaftstabellen zurück.

Parameter

Prop

Type

Rückgabewert

Eine Liste von JobMembership-Tabellen ({ job = 'police', grade = 2 }). Eine leere Liste, wenn der Spieler keinen hat oder keinen Charakter.

Beispiel

server.lua
for _, membership in ipairs(aiLib.online.jobs(source)) do
    print(membership.job, membership.grade)
end

aiLib.online.gangs

Jede Gang eines Spielers.

Seite: Server · Wartet: nein

Lua
local gangs = aiLib.online.gangs(src)

TypeScript: online.gangs(source) gibt nur die Gang-Namen zurück.

Parameter

Prop

Type

Rückgabewert

Eine Liste von GangMembership-Tabellen ({ gang = 'ballas', grade = 0 }), oder eine leere Liste.

Beispiel

server.lua
local inAGang = #aiLib.online.gangs(source) > 0

aiLib.online.jobGrade

Der Rang eines Spielers in einem Job.

Seite: Server · Wartet: nein

Lua
local grade = aiLib.online.jobGrade(src, job)

Parameter

Prop

Type

Rückgabewert

integer (0 = der niedrigste Rang), oder nil, wenn der Spieler nicht in diesem Job ist.

Beispiel

server.lua
local grade = aiLib.online.jobGrade(source, 'police')
if not grade or grade < 2 then return aiLib.fail('NOT_ALLOWED') end

aiLib.online.gangGrade

Der Rang eines Spielers in einer Gang.

Seite: Server · Wartet: nein

Lua
local grade = aiLib.online.gangGrade(src, gang)

Parameter

Prop

Type

Rückgabewert

integer, oder nil, wenn der Spieler nicht in dieser Gang ist.

Beispiel

server.lua
local isBoss = (aiLib.online.gangGrade(source, 'ballas') or -1) >= 3

aiLib.online.dutyJob

Der Job, für den ein Spieler im Dienst ist.

Seite: Server · Wartet: nein

Lua
local job = aiLib.online.dutyJob(src)

Parameter

Prop

Type

Rückgabewert

Der Jobname, oder nil, wenn außer Dienst.

Beispiel

server.lua
if aiLib.online.dutyJob(source) ~= 'police' then return aiLib.fail('NOT_ON_DUTY') end

aiLib.online.sources

Die Server-IDs aller Spieler mit geladenem Charakter.

Seite: Server · Wartet: nein

Lua
local players = aiLib.online.sources()

Rückgabewert

Eine Liste von Server-IDs (leer, wenn niemand geladen ist oder ai-core nicht läuft).

Beispiel

server.lua
for _, src in ipairs(aiLib.online.sources()) do
    if aiLib.online.dutyJob(src) == 'police' then
        aiLib.notify(src, 'Robbery in progress', 'warning')
    end
end

Jeder Aufruf ist ein Export-Aufruf an ai-core. Lies in einer Schleife über alle Spieler, was du brauchst, einmal pro Spieler, und führe es nie in jedem Frame aus. Für „wie viele sind im Dienst“ lies stattdessen den Global State ai:duty:<job> (GlobalState['ai:duty:police']).

Server: Berechtigungen

aiLib.isAdmin

Ob ein Spieler ein ai-core-Admin ist (ACE ai.admin) oder die ACE hat, die du angibst.

Seite: Server · Wartet: nein

Lua
local allowed = aiLib.isAdmin(src, ace)

TypeScript: isAdmin(ace?) ist stattdessen ein Guard für onClientCallback / onClientEvent (siehe Client-Eingaben). In Lua sicherst du einen Callback mit seiner Option ace ab, oder du rufst aiLib.isAdmin selbst auf.

Parameter

Prop

Type

Rückgabewert

true, wenn der Spieler die ACE hat, sonst false.

Beispiel

server.lua
RegisterCommand('fixall', function(source)
    if not aiLib.isAdmin(source) then return end
    -- Arbeit nur für Admins hier
end, false)

Client: die Menü-Tabelle

aiLib.menu

Die Dialoge liegen in einer Tabelle. Die Namen auf oberster Ebene sind dieselben Funktionen, für kurze Aufrufe behalten:

Auf aiLib.menuDasselbe wieWartetAntwortet
menu.show(request, listeners?)(nur hier)jaDie id des gewählten Eintrags, '__back' für das Zurück eines Untermenüs, oder nil, wenn geschlossen.
menu.input(request)aiLib.input(request)jaEine Tabelle der Werte nach Feld-name, oder nil, wenn geschlossen.
menu.itemPicker(request)aiLib.itemPicker(request)jaEine Liste von { name, count }, oder nil. Nur Admin-Werkzeuge.
menu.skillCheck(difficulty, keys?)aiLib.skillCheck(difficulty, keys?)jatrue, wenn jede Stufe getroffen wurde.
menu.lockpick(options?)aiLib.lockpick(options?)ja'opened', 'broken' oder 'cancelled'.

Die Anfrageformen sind MenuRequest, InputRequest, ItemPickerRequest und SkillDifficulty. Jede Option und jeder Listener ist bei den TypeScript-Zwillingen unter Gemeinsame UI dokumentiert.

client.lua
RegisterCommand('fine', function()
    local values = aiLib.input({
        title = 'Write a fine',
        confirm = 'Send',
        fields = {
            { name = 'amount', label = 'Amount', type = 'number', min = 1, max = 10000 },
            { name = 'reason', label = 'Reason', type = 'text', maxLength = 80 },
        },
    })
    if values then aiLib.callAction('mypolice:fine', { values.amount, values.reason }, { fallback = 'FINE_FAILED' }) end
end, false)

Auf dieser Seite