LexoNETDocs
Docs 0.6.0Anmelden
Architektur und API

Scripts erweitern und anbinden

Diese Seite richtet sich an Entwickler, die eigene Ressourcen an lexo_core oder die LexoNET Bridge anbinden. Verbindliche Regeln für Leistung, Sicherheit und Aufbau stehen im Script-Standard.

#Aufbau einer Ressource

  • fx_version 'cerulean', lua54, OneSync.
  • Offen und anpassbar: config.lua, locales/*.json, server/adapters/*.lua, bei der Bridge hooks.lua. Die übrige Logik ist über Cfx.re-Escrow geschützt.
  • Texte als JSON in locales/de.json und locales/en.json, beide vollständig.
  • Exports und Events tragen den Ressourcennamen als Präfix.

#Exports von lexo_core (Server)

Lua
exports.lexo_core:IsOnDuty(source, job)
exports.lexo_core:SetDuty(source, true)
exports.lexo_core:IsCuffed(source)
exports.lexo_core:SetCuffed(source, false)
exports.lexo_core:GetPlayer(source)
exports.lexo_core:GetSource(identifier)
exports.lexo_core:RemoveBank(source, amount, reason)
exports.lexo_core:SocietyDeposit(job, amount)
exports.lexo_core:Notify(source, text, type)

Ereignisse (Server): lexo_core:playerLoaded (source, identifier) und lexo_core:playerDropped (source).

Beispiel: eine eigene Aktion nur für Polizisten im Dienst.

Lua
lib.callback.register('meine_ressource:aktion', function(source)
    if not exports.lexo_core:IsOnDuty(source, 'police') then return false end
    -- Aktion ausführen
    return true
end)

#Framework-Adapter

Der Zugriff auf ESX liegt gekapselt in server/adapters/esx.lua. Ein weiteres Framework bindest du über einen eigenen Adapter mit denselben Funktionen an und setzt Config.Framework.

#LexoNET Bridge

Die Bridge läuft nur auf dem Server. Ereignisse landen zuerst in der Tabelle lexo_bridge_outbox und werden gelöscht, sobald LexoNET sie bestätigt. Fällt LexoNET aus, geht nichts verloren.

server.cfg
set lexonet_url "https://lexonet.de"
set lexonet_key "lx_live_..."
ensure lexo_bridge

Den Schlüssel immer mit set, nie mit setr, damit er nicht an Clients geht.

#Exports

Lua
exports.lexo_bridge:Send('meinmodul.ereignis', { identifier = id, wert = 1 })
exports.lexo_bridge:OnCommand('meinbefehl', function(data) return true, 'ok' end)
exports.lexo_bridge:VehicleUpsert({ plate = 'LX 123', owner = id, model = hash })
exports.lexo_bridge:Identifier(source)
  • Eigene Ereignistypen tragen ein Präfix je Modul, zum Beispiel police. oder medic..
  • Befehls-Handler dürfen nicht warten. Längere Arbeit in einem eigenen Thread (CreateThread) erledigen und sofort true oder false, 'grund' zurückgeben.

#Konsole

  • lexo_status: Verbindung und Größe der Outbox
  • lexo_syncvehicles: einmaliger Abgleich aller Fahrzeuge aus owned_vehicles

#Anpassungen in hooks.lua

  • Hooks.phone(src): Telefonnummer, Standard lb-phone
  • Hooks.notify(src, message): Benachrichtigung, Standard ox_lib
  • Hooks.societyDeposit(job, amount): Gutschrift auf das Firmenkonto, Standard society_<job>

#Einstellungen

EinstellungStandardBedeutung
Config.FrameworkesxAdapter
Config.FlushInterval2000 msSenden der Ereignisse
Config.BatchSize50Ereignisse je Anfrage
Config.PollInterval3000 msAbfrage von Befehlen
Config.VehicleTableowned_vehiclesQuelle für den Fahrzeug-Abgleich, false = aus

#Game API

Schnittstelle zwischen Bridge und LexoNET (alle Verbindungen gehen vom Spielserver aus):

EndpunktZweck
POST /api/v1/game/eventsEreignisse an LexoNET, bis 50 je Anfrage, Antwort { "accepted": [ids] }
GET /api/v1/game/commandsoffene Befehle abholen
POST /api/v1/game/commands/ackBefehle quittieren (ok, result)
POST /api/v1/game/sync/vehiclesFahrzeuge in Paketen zu 200, final: true im letzten

Authentifizierung: Authorization: Bearer <key>, nur HTTPS. Bei 401/403 pausiert die Bridge 60 Sekunden, bei 429 und Störungen verdoppelt sie die Wartezeit bis 60 Sekunden.

Vorhandene Ereignisse: server.started, citizen.online, citizen.offline, job.changed, vehicle.upsert, duty.started, duty.ended, job.staff, police.fine, police.jail, police.release, police.jail_failed.

Vorhandene Befehle: notify, fine, jail, unjail.

#Vor einem Release

  • resmon 1 im Leerlauf und bei Nutzung messen, Werte im Changelog festhalten.
  • Alle Callbacks auf Typ, Wertebereich, Job, Rang, Dienst, Abstand und Rate-Limit prüfen.
  • Neue Einstellungen mit Standardwert, alte bleiben gültig.
  • Locales Deutsch und Englisch vollständig.