Zur Anleitung

Dokumentation 9.6.24

Server-Integration

Exports nur aus vertrauenswürdigem Server-Code aufrufen. Clients dürfen Ausnahmen, Admin-Status oder Belohnungen nicht selbst wählen.

Nur lesendes Beispiel#

Das Beispiel prüft den Admin-Status und vergibt keine Rechte. Export und ID-Format im installierten Paket prüfen.

local playerId = 12
local isAdmin = exports['tosun-ac']:isAdmin(playerId)

Vor Ausnahmen validieren#

Serverseitige Sitzung, Spieler, Position, Rechte und Dauer prüfen. Ausnahme-Exports niemals über ungeprüfte RegisterNetEvent-Handler verfügbar machen. Die Cfx-Sicherheitsanleitung beachten.

Offizielle Cfx-Anleitung lesen

Teleport-Hinweis#

Jedes Serverskript, das einen Spieler versetzt (Haus, Garage, Gefängnis, Krankenhaus, Job), sollte MarkTeleport direkt vor dem Teleport aufrufen. Es benötigt keine Vertrauensliste und lockert nur kurz die Bewegungs- und Sichtbarkeitsprüfungen; Waffen-, Geld- und Injection-Schutz bleiben aktiv. Sobald alle teleportierenden Skripte den Hinweis senden, können Sie die v16-Teleportstrafe in den Anticheat-Einstellungen auf Kick setzen.

exports['tosun-ac']:MarkTeleport(source, 8000)
SetEntityCoords(GetPlayerPed(source), x, y, z)

Vertrauenswürdige Ressourcen#

Exports, die Spieler freistellen, Rechte vergeben oder Massenaktionen ausführen (SetExempt, addAdmin, whitelistPlayer u. a.), akzeptieren nur vertrauenswürdige Ressourcen. Ein abgelehnter Aufruf wird einmal mit der hinzuzufügenden Zeile in der Konsole ausgegeben. Pflegen Sie die Liste in der server.cfg, damit Anticheat-Updates sie nicht überschreiben. Der Konsolenbefehl tosunac_integration zeigt die vertrauenswürdige Liste und die letzten abgelehnten Aufrufe.

set tosun_ac_trusted_resources "my-housing,my-clothing"

Waffen außerhalb des Inventars#

Skripte, die Waffen vergeben, ohne sie ins Inventar zu legen, etwa Arenen, Paintball oder Menüs, sollten beim Vergeben AllowWeapon aufrufen. Sonst protokolliert die Waffen- und Inventarprüfung aus 9.4.0 sie als gespawnte Waffe. Übergeben Sie einen Waffennamen oder ein Sternchen für alle Waffen; die maximale Dauer beträgt 1 Stunde. Addon-Waffen, die der Anticheat nicht kennt, tragen Sie in der Konfiguration unter extraWeapons ein.

exports['tosun-ac']:AllowWeapon(source, "WEAPON_PISTOL", 600000)

Autorität im Servercode behalten#

TOSUN-AC-EXPORTS.md des Pakets beschreibt die Exports. Groß-/Kleinschreibung zählt. Befreiungszeiten sind Millisekunden; AddWhitelist und WhitelistArea verwenden Sekunden. tosun-ac vor abhängigen Skripten starten; einen gestoppten Schutz nicht still überspringen. Ein erfolgreicher Aufruf prüft nicht Ihre Jobregeln.

SetExempt und AllowWeapon benötigen eine vertrauenswürdige Serverressource. Nur geprüfte Ressourcen ergänzen und vorhandene Listeneinträge erhalten. tosunac_integration zeigt Ablehnungen. Ohne Whitelist-Erzwingung laufen Aufrufe im Auditmodus durch; dies nicht als dauerhafte Lösung verwenden.

set tosun_ac_trusted_resources "my-clothing,my-arena"

# Serverkonsole:
tosunac_integration

Teleport unmittelbar vorher melden#

Spieler, serverseitiges Ziel, Berechtigung und aktive Tätigkeit prüfen. MarkTeleport direkt vor dem Versetzen aufrufen. src und destination stammen aus dem bestehenden geprüften Serverablauf, nicht frei wählbaren Clientdaten. Das Fragment ist kein fertiges Netzwerk-Event.

Keine Vertrauensliste nötig. Kurzzeitige Lockerung für Bewegung und zugehörige Sichtbarkeit/Godmode/Kamera; Waffen, Geld, Eventmissbrauch und Injection bleiben geprüft. Bei den Standardeinstellungen gelten für Ressourcen außerhalb der Vertrauensliste: maximal 15 Sekunden je Aufruf und 180 Sekunden je Spieler in zehn Minuten. Verlängerungen verbrauchen Budget; nicht jeden Tick erneut aufrufen.

-- Innerhalb eines bereits geprüften Serverablaufs:
local ok = exports["tosun-ac"]:MarkTeleport(src, 8000, "house_enter")
if ok then
    SetEntityCoords(GetPlayerPed(src), destination.x, destination.y, destination.z)
end

Eine Skriptwaffe gezielt erlauben#

Bei Arena oder Paintball ohne Inventareintrag die aktive Serversitzung prüfen, dann AllowWeapon aus der trusted Ressource aufrufen. Einen Namen und nötige kurze Dauer wählen. Es lockert nur Waffenbesitz samt Schadenspfad, nicht die ganze AC.

Maximal eine Stunde; Stern nur bei Bedarf aller Waffen. SetExempt ist eine vollständige trusted Ausnahme bis fünf Minuten. BypassDetection ignoriert detectionKey und gewährt eine volle Ausnahme bis eine Minute, keine einzelne Prüfung.

Die temporäre source-ID eines getrennten Spielers nicht später für Belohnung oder Ausnahme verwenden. Beim sensiblen Aufruf die aktuelle Serversitzung prüfen. Auch trusted Skripte müssen Rechte und Ziel selbst validieren.

  • Autorisierte Aktion funktioniert; Dauer endet.
  • Client kann weder anderen Spieler noch Zeit, Waffe oder Ziel wählen.
  • Untrusted Aufruf liefert false mit Warnung.
  • Nach Neustart Status und normale Aktionen erneut prüfen.
-- my-arena: vertrauenswürdige Ressource, geprüfte Sitzung
local allowed = exports["tosun-ac"]:AllowWeapon(src, "WEAPON_PISTOL", 60000)
-- Waffe nur im geprüften Arenaablauf vergeben.

Temporäre Ausnahmen mit der richtigen Server-API beenden#

Serverseitiges SetExempt nimmt src, Millisekunden und Grund; clientseitiges SetExempt nimmt state, Millisekunden und Grund. Die Signaturen sind nicht austauschbar. Eine Clientausnahme verleiht keine serverseitige Befugnis. In einem vertrauenswürdigen Serverablauf entfernt SetPlayerExempt mit state false die temporäre Spielerausnahme. Koordinieren Sie überlappende Aktivitäten: Der Zustand gilt spielerweit und ist kein separat verwaltetes Token pro Resource. Das Entfernen kann eine andere Aktivität betreffen. Mitarbeiter- oder Panelausnahmen können IsExemptFromPunish anschließend weiterhin wahr halten. Bevorzugen Sie MarkTeleport oder AllowWeapon, wenn deren enger Umfang genügt.

  1. Beenden oder verwerfen Sie die autorisierte Aktivität mit einem aktuell validierten Spieler und entfernen Sie nicht mehr benötigte Ausnahmen.
  2. Testen Sie Abbruch, Trennung und normalen Abschluss; verlängern Sie volle Ausnahmen nicht fortlaufend in einer Hintergrundschleife.
  3. Prüfen Sie mit normalen Spielern, ob verbleibender Schutz von Mitarbeitern, Panel-Whitelist oder einer anderen Aktivität stammt.
-- Trusted server resource; src belongs to an authorised workflow.
-- Clear the temporary exemption when that workflow finishes or is cancelled.
local cleared = exports["tosun-ac"]:SetPlayerExempt(src, false, 0, "menu_finished")

Bei Hilfsdateien Ergebnisse bewusst behandeln#

Die Bridge-Hilfsdateien gehören ins Manifest Ihrer Resource und ersetzen keine Rechteprüfung. TosunAC.IsAvailable prüft, ob das AC läuft; TosunAC.IsTrusted prüft das Vertrauen des Aufrufers. PlayerExempt liefert ok und mode: full ist eine vertrauenswürdige volle Ausnahme, soft nur begrenzte Bewegungs- und Sichtbarkeitsentlastung. Ein wahres Ergebnis bedeutet nicht automatisch volle Immunität. Benötigt eine Aktivität den vollen Umfang, definieren Sie deren Abbruch oder Ablehnung bei soft, statt unter anderem Schutz still weiterzulaufen. PlayerExemptOff entfernt die temporäre volle Ausnahme über die Server-API.

  1. Laden Sie die Serverhilfe vor dem Skript, das TosunAC verwendet; erhalten Sie andere Manifestabhängigkeiten.
  2. Prüfen Sie ok und mode beim Aktivitätsstart; protokollieren Sie nur Resource, Grund und nicht geheimes Ergebnis.
  3. Behandeln Sie gestopptes AC und abgelehnte Aufrufe ausdrücklich; untersuchen Sie Startreihenfolge oder Vertrauen vor Wiederholungen.
-- Add these lines to your own resource manifest:
client_script "@tosun-ac/bridge/tosun_ac_client.lua"
server_script "@tosun-ac/bridge/tosun_ac_server.lua"

Lesende Exports zur Diagnose statt als Urteil nutzen#

GetStatus liefert eine kleine Laufzeitübersicht samt konfiguriertem Framework und Spielerzahl, keine umfassende Integrationsprüfung. GetIntegrationStatus beschreibt den aufrufenden Resource-Kontext, nicht alle Skripte. IsMovementExempt und IsExemptFromPunish beantworten unterschiedliche Fragen. GetDetections ist ein historischer Name: gelesen werden Banns des Spielers aus ts_anticheat, nicht sämtliche aktuellen Erkennungsprotokolle. Leere Ergebnisse beweisen keinen sauberen Spieler. Rufen Sie datenbankgestützte oder breite Spielerabfragen gezielt statt jeden Tick auf. Nutzen Sie Rückgaben für ihren dokumentierten Zweck und vermeiden Sie Zugangsdaten oder unnötige personenbezogene Angaben in öffentlichen Debugausgaben.

  1. Notieren Sie bei Problemen aufrufende Resource und die genaue Status- oder Ausnahmeabfrage.
  2. Vergleichen Sie erwarteten Umfang und Ergebnis eines bekannten Ablaufs, bevor Sie Sanktionen ändern.
  3. Prüfen Sie nach Updates die installierte TOSUN-AC-EXPORTS.md, insbesondere alte Namen und Server-/Clientargumente.

Verzögerte Bewegungen an Spieler- und Resource-Lebensdauer binden#

Braucht ein Hauseintritt eine kurze Verzögerung, genügt das Speichern der source-Nummer nicht. Nach dem Verbindungsabbruch kann ein neuer Spieler dieselbe Nummer erhalten. Der server.lua-Ausschnitt ist eine lokale Funktion für einen bereits autorisierten Serverablauf, kein vom Client erreichbares Netzwerkereignis. Das Ziel muss vom Server geprüft sein. Ein eindeutiges Lua-Objekt in pending verbindet die verzögerte Bewegung mit diesem Ablauf. Beim Verlassen wird der Eintrag entfernt; findet der Timer nicht mehr dasselbe Objekt, tut er nichts. Ein neuer Spieler mit der alten source erhält die frühere Bewegung nicht.

Das Beispiel entfernt wartende Einträge, wenn tosun-ac stoppt oder die eigene Resource beendet wird. Nach der Verzögerung prüft es Resource-Zustand, Anwesenheit und Ped erneut. pcall fängt Exportfehler ab; eine Bewegung erfolgt nur, wenn MarkTeleport true liefert. Diese Prüfungen gewähren weder Hauseigentum noch Jobrollen oder Zielberechtigungen: Das muss vor dem Aufruf geprüft werden. Der Code meldet nur eine Bewegung und hebt keine vollständigen Ausnahmen auf oder Berechtigungen anderer Scripts um. Testen Sie Abbruch während der Wartezeit, AC-Stopp und normalen Eintritt getrennt. Eine Dauerschleife oder ein Timer über alle Spieler ist unnötig; es gibt eine Verzögerung pro gestartetem Ablauf.

-- server.lua: call only from an already authorised server workflow.
-- destination is a server-validated location, never raw client input.
local pending = {}

local function scheduleValidatedMove(src, destination)
    src = tonumber(src)
    if not src or not GetPlayerName(src) then return false end
    if GetResourceState("tosun-ac") ~= "started" then return false end
    local ticket = {}
    local target = {x = destination.x, y = destination.y, z = destination.z}
    pending[src] = ticket
    SetTimeout(1500, function()
        if pending[src] ~= ticket then return end
        pending[src] = nil
        if not GetPlayerName(src) then return end
        if GetResourceState("tosun-ac") ~= "started" then return end
        local ped = GetPlayerPed(src)
        if not ped or ped == 0 then return end
        local called, allowed = pcall(function()
            return exports["tosun-ac"]:MarkTeleport(src, 8000, "house_delayed_entry")
        end)
        if called and allowed == true then
            SetEntityCoords(ped, target.x, target.y, target.z)
        end
    end)
    return true -- Scheduled, not yet moved.
end

AddEventHandler("playerDropped", function() pending[source] = nil end)
AddEventHandler("onResourceStop", function(name)
    if name == GetCurrentResourceName() or name == "tosun-ac" then
        pending = {}
    end
end)

Vertrauen innerhalb der integrierenden Resource prüfen#

Legen Sie diese Diagnose nach einer Änderung der Vertrauensliste in der Resource ab, die später den Export aufruft. Der Befehl funktioniert ausschließlich in der Serverkonsole; Spieleraufrufe werden wegen src ungleich null ignoriert. Führen Sie my-resource-ac-check einmal aus. GetIntegrationStatus liefert den Namen der aufrufenden Resource sowie trusted und enforcing. Ein true aus einer anderen Resource beweist deshalb nicht, dass Ihr Kleidungs- oder Arenascript vertrauenswürdig ist. GetStatus bietet eine kleine Laufzeitübersicht einschließlich Version und konfiguriertem Framework, keine Prüfung sämtlicher Integrationen.

Auch bei erfolgreichem pcall muss der Rückgabewert eine Tabelle sein. Ein Aufruffehler ist etwas anderes als false; melden Sie die Konfiguration nicht als geprüft, wenn der Export nicht aufgerufen werden konnte. Vergleichen Sie bei trusted=false und enforcing=true den Aufrufernamen mit der geprüften Vertrauensliste. enforcing=false kann eine Audit-Einstellung sein und belegt keine sichere Einschränkung aller sensiblen Vorgänge. Die Ausgabe enthält nur Resource, Version, Framework und zwei boolesche Werte, keine Spielerkennungen oder Schlüssel. Führen Sie sie nicht jeden Tick aus. Prüfen Sie nach Updates normale und erwartete Ablehnungspfade separat; eine lesende Diagnose garantiert keine Autorisierung für Straf-Exports.

-- Place in the integrating resource's server.lua.
RegisterCommand("my-resource-ac-check", function(src)
    if src ~= 0 then return end -- Server console only.
    if GetResourceState("tosun-ac") ~= "started" then
        print("[integration] tosun-ac is not started")
        return
    end
    local okTrust, trust = pcall(function()
        return exports["tosun-ac"]:GetIntegrationStatus()
    end)
    local okStatus, status = pcall(function()
        return exports["tosun-ac"]:GetStatus()
    end)
    if not okTrust or type(trust) ~= "table"
        or not okStatus or type(status) ~= "table" then
        print("[integration] status query failed")
        return
    end
    print(("[integration] resource=%s version=%s framework=%s trusted=%s enforcing=%s")
        :format(GetCurrentResourceName(), tostring(status.version),
            tostring(status.framework), tostring(trust.trusted), tostring(trust.enforcing)))
end, false)

Eigene Events mit Serverprüfung registrieren#

RegisterSafeEvent im Serverscript verwenden. Der Eventname muss mit dem Namen der aufrufenden Resource beginnen. Der Validator muss nach Prüfung von Spieler, Auftrag, Position, Gegenständen und Rechten auf dem Server exakt true liefern. Ein Client-Schlüssel ist keine Berechtigung. Abgeschlossene Aufträge für eine Belohnung nur einmal verbrauchen.

Clientexport TriggerSafeServerEvent verwenden. sent bestätigt nur das Senden, keine Zahlung oder Belohnung. queued_until_key wartet höchstens 30 Sekunden; eine volle Warteschlange lehnt neue Aufrufe ab. Wirtschaftliche Aktionen nicht automatisch wiederholen. Nach einem AC-Neustart erneut registrieren.

Bestehende rohe RegisterNetEvent-Handler entfernen und migrieren. Tosun AC kann fremde Resource-Handler nicht abbrechen; ein alter sensibler Handler bleibt ein Umgehungsweg. Legacy-Handler mit :safe nur serverseitig über AddEventHandler registrieren.

-- my-job/server.lua: own server-owned job state and framework adapter.
local activeJobs = {}
local function registerActions()
    if GetResourceState("tosun-ac") ~= "started" then return end
    local ok, reason = exports["tosun-ac"]:RegisterSafeEvent("my-job:finish",
        function(src)
            local job = activeJobs[src]
            return job ~= nil and job.completed == true
            -- Also verify server-owned position, role and inventory as required.
        end,
        function(src)
            local job = activeJobs[src]
            if not job then return end
            activeJobs[src] = nil -- consume before any yielding reward operation
            -- Give the server-owned reward through your validated framework adapter.
        end, {rateLimit=5, windowMs=10000, maxArgs=0})
    if not ok then print("[my-job] SafeEvent: " .. tostring(reason)) end
end
AddEventHandler("onResourceStart", function(name)
    if name == GetCurrentResourceName() or name == "tosun-ac" then registerActions() end
end)
AddEventHandler("playerDropped", function() activeJobs[source] = nil end)

-- my-job/client.lua:
local sent, state = exports["tosun-ac"]:TriggerSafeServerEvent("my-job:finish")
-- Read state; implement a separate application acknowledgement if needed.

Den aufrufenden Resource-Namen exakt konfigurieren#

Tragen Sie set tosun_ac_trusted_resources "my-housing,my-clothing" in server.cfg ein und behalten Sie andere bereits geprüfte Namen. Verwenden Sie den Resource-/Ordnernamen, keinen Anzeigenamen, Spieler oder Discord-Rang. Hier gilt set, nicht setr. Lassen Sie ts.EnforceExportCallerWhitelist = true aktiv. Vertrauen erlaubt sensible Exports, prüft aber weder Hausbesitz noch Inventar, Beruf oder Zielspieler. Führen Sie die Diagnose in der tatsächlich aufrufenden Resource aus und prüfen Sie trusted=true und enforcing=true.

set tosun_ac_trusted_resources "my-housing,my-clothing"

# txAdmin server console:
tosunac_integration

-- In the invoking integration resource server script:
local status = exports["tosun-ac"]:GetIntegrationStatus()
print(status.resource, status.trusted, status.enforcing)

Fünf Listen mit unterschiedlichen Aufgaben#

Die Resource-Vertrauensliste erlaubt sensible Server-Exports. Die Spieler-Whitelist schützt einen Spieler. Eine Fake-Trigger-Whitelist schaltet nur eine Falle ab und autorisiert kein Spielereignis. ts.ProtectedEvents ist der ältere Transport mit Sitzungsschlüssel; die ausgelieferte Vorgabe enthält test:event. Die Resource-Baseline speichert geprüfte Dateien für Integritätskontrollen. Ein Eintrag überträgt sich nicht auf andere Listen. Tragen Sie nicht alle gefundenen Framework-Events in ProtectedEvents oder als Fallen ein.

Vollständiger Server-Export-Katalog dieses Pakets#

Die Namen und Argumentdeklarationen werden aus dem tatsächlichen Server-Quellinventar dieses Pakets erzeugt. Dies ist eine Referenz, kein nacheinander auszuführendes Skript. Beachten Sie Groß-/Kleinschreibung und Server-/Client-Seite. Auch interne Diagnosen, Scanner und Transporthelfer sind enthalten; ähnlich benannte Funktionen sind keine automatische Berechtigung für Geschäftsaktionen. Prüfen Sie vor Änderungen den Vertrag und die Rückgabewerte.

-- tosun-ac / server
-- AddWhitelist(target, durationSec)
-- AllowWeapon(src, weapon, ms)
-- BanPlayerExt(playerId, reason)
-- BypassDetection(playerId, detectionKey, durationMs)
-- ClearArea(playerId, areaName)
-- ForensicLinksOf(license)
-- GetCloudThreatScore(src)
-- GetDetections(playerId, limit)
-- GetIntegrationStatus()
-- GetNearbyPlayers(playerId, radius)
-- GetPlayerInfo(playerId)
-- GetPlayerShieldData(src)
-- GetServerAuthorityStatus()
-- GetStatus()
-- IsExemptFromPunish(src)
-- IsInArea(playerId, areaName)
-- IsMovementExempt(src)
-- IsPlayerProtected(playerId)
-- IsWhitelisted(playerId)
-- KickPlayer(playerId, reason)
-- MarkTeleport(src, ms, reason)
-- NoteCloudViolation(src, reason, punishment)
-- OpenScanCache(sealed)
-- PauseAllDetections(durationMs)
-- PausePlayerDetections(playerId, durationMs)
-- RateLimit(src, key, max, windowMs)
-- RegisterSafeEvent(eventName, validator, handler, options)
-- RemoveWhitelist(target)
-- RequestShieldScreenshot(src)
-- ScanPolicyFingerprint(moduleFile, policy)
-- ScanResourceSnapshot(name, expected, callback)
-- SealScanCache(raw)
-- SetExempt(playerId, durationMs, reason)
-- SetPlayerExempt(playerId, state, durationMs, reason)
-- WhitelistArea(playerId, areaName, durationSec)
-- acV2Challenge(build, license, fp, version)
-- acV2Fingerprint()
-- acV2Integrity(raw)
-- acV2VerifyResponse(raw, build, license, fp, version, nonce, httpCode)
-- addAdmin(playerId)
-- addCheatSignature(pattern, signatureName, severity)
-- addSignatureEscrowSkip(resourceName, note)
-- addSignatureException(resourceName, filePath, signatureName, note)
-- applyTimeWithFramework(h, m)
-- applyWeatherWithFramework(weather)
-- approveResource(resourceName, approvedBy)
-- ban(playerId, reason)
-- batchDetection(playerName, license, steam, discord, ip, dtype, reason, punishment, banID, screenshot, configKey)
-- batchLog(message, playerId, playerName)
-- batchWebhook(url, payload)
-- blockResource(resourceName, reason)
-- centralHandshake()
-- centralPoll()
-- centralStatus()
-- checkIpReputation(ip)
-- cipherHasSession(src)
-- cipherIssueKey(src)
-- cipherVerify(src, payload, signature)
-- clearInventory(src)
-- crashGuardInspect(v)
-- crashGuardReject(src, p)
-- emergencyLockdown(reason)
-- fakeTriggerTrap(eventName, typ)
-- fakeTriggerWhitelist(eventName)
-- freezePlayer(src, freeze)
-- getAdminType(playerId)
-- getBanInfo(banID)
-- getBans(limit, offset)
-- getBaseline()
-- getBatchStats()
-- getCleanupStats()
-- getConfig(configType)
-- getInfectedFiles()
-- getOnlinePlayers()
-- getPlayerLocale(src)
-- getResources()
-- getRuntimeStats()
-- getSourceKey()
-- getStats()
-- getSuspicious()
-- giveWeapon(src, weapon, ammo)
-- healAll()
-- invalidateSignatureCache()
-- isAdmin(playerId)
-- isAdminMenuAllowed(playerId)
-- isPlayerFrozen(src)
-- isPlayerMuted(src)
-- isQuarantined(src)
-- isStaffPlayer(playerId)
-- issueEventKey(src)
-- licenseStatus()
-- lockdownStatus()
-- massFreeze(state)
-- mutePlayer(src, durationSec, reason, actor)
-- offlineBan(data, reason)
-- offlineBanByLicense(...)
-- phoneNotify(targetSrc, title, body, opts)
-- phoneNotifyAdmins(title, body, opts)
-- punish(playerId, reason, image, config, punish)
-- quarantine(src, reason, sec)
-- quarantineList()
-- refreshPanelPermissions()
-- refreshPanelWhitelist()
-- releaseQuarantine(src)
-- reloadSignatureExceptions()
-- reloadSignatureScanCaches()
-- removeAdmin(playerId)
-- removeSignatureEscrowSkip(idOrName)
-- removeSignatureException(id)
-- removeWhitelist(playerId)
-- reportInfection(resource, file, sigs, severity, callback)
-- rescanResources()
-- runCleanup()
-- scanAllResources()
-- scanSingleResource(name)
-- screenCapture(src, requestedBy)
-- setLockdown(state, reason)
-- setPlayerArmor(src, armor)
-- setPlayerHealth(src, hp)
-- setPlayerLocale(src, lang)
-- setSpeedLimit(kmh)
-- slayPlayer(src)
-- spectatePlayer(adminSrc, targetSrc)
-- stripWeapons(src)
-- translate(key, ...)
-- translateForPlayer(src, key, ...)
-- tsAutoSetup()
-- tsBackdoorScanStatus()
-- tsLicenseRecheck()
-- tsScanBackdoors(callback)
-- tsScanEvents()
-- tsSignatureScanStatus()
-- unban(banID)
-- unmutePlayer(src)
-- v6ScreenWatchLatest(serverId)
-- v6ScreenWatchPoll(rid)
-- v6ScreenWatchRequest(serverId, mode, requestedBy, panelUrl, forceBase64)
-- v9StreamHasSession(serverId)
-- warnPlayer(src, reason, actor)
-- webBridgeApplyInventory(src, action, itemName, count, slot)
-- webBridgeApplyMoney(src, moneyType, amount, action)
-- webBridgeFindByCitizen(cid)
-- webBridgeFindByLicense(license)
-- webBridgeGrantAdmin(src)
-- webBridgeRevokeAdmin(src)
-- whitelistPlayer(playerId, duration)

-- tosun-ac-guardian / server
-- guardianAlive()
-- guardianHold(reason,seconds)

-- tosun_render / server
-- GetStatus()

Client-Exports und begrenzte lokale Schonfrist#

Client SetExempt erhält Zustand, Millisekunden und Grund; Server SetExempt erhält Spieler-source, Millisekunden und Grund. Client PauseDetections gewährt dieselbe begrenzte Schonfrist für Aussehen, Bewegung und Kamera, keine allgemeine Pause. Lokale Aufrufe teilen 240 Sekunden Verlängerungsbudget pro zehn Minuten und höchstens 32 Gründe. IsExempt(config) benötigt den genauen Prüfungsnamen; IsExempt() betrifft nur verifizierte Mitarbeiter oder volle/pausierte Server-Freigaben. Waffen-, Event-, Injection- und unbekannte Prüfungen bleiben aktiv. Behandeln Sie false ohne Wiederholung pro Frame.

-- tosun-ac / client
-- GetExemptions()
-- IsExempt(config)
-- IsPlayerAdmin()
-- NativeGuardThreat()
-- NativeGuardToken()
-- PauseDetections(durationMs)
-- SetExempt(state, durationMs, reason)
-- SetSpawned(state)
-- ShieldCaptureForBan(callback)
-- ShieldFlushBanVideo(callback)
-- TriggerSafeServerEvent(eventName, ...)
-- getConfig()
-- getV12Tolerance(key, default)
-- incNetRequest()
-- incScreenshotEvent()
-- shieldHook(hookType, detailJson)

Private Zustände und Rückgaben richtig verstehen#

TosunAcState ist intern in der AC-Resource; andere Resources verwenden die dokumentierten Exports. setExempt, setPause und setMovement liefern Booleans und begrenzen Freigaben auf fünf Minuten. Eine fehlgeschlagene Nachricht speichert keine neue Erhöhung; Widerruf oder Kürzung bleiben privat gespeichert, auch bei false. Volle, Pause- und Bewegungsfreigaben sind unabhängig. setStaff schreibt nur einen Kompatibilitätsspiegel und verleiht keine Admin-Autorität. isExemptFromBag/isPausedFromBag lesen verifizierte private Freigaben, keine beschreibbaren Player-Bags. Erfolg beweist weder Zustellung an alle Clients noch eine Pause sämtlicher Server-Prüfungen.

-- Internal AC server API; external resources use guarded exports.
-- TosunAcState.setExempt(id, active, ms) -> boolean
-- TosunAcState.setPause(id, ms) -> boolean
-- TosunAcState.setMovement(id, ms) -> boolean
-- TosunAcState.remaining(id, kind) -> remaining milliseconds
-- TosunAcState.setStaff(id, staff) -> compatibility mirror only
-- AddWhitelist(target, durationSec): seconds
-- WhitelistArea(playerId, areaName, durationSec): seconds
-- IsInArea: named record lookup, not a coordinate/permission check
-- WhitelistArea grants broad client relief, not one chosen detector.
-- BypassDetection: detectionKey is ignored; full exemption, <=60000ms
-- Client: IsExempt("ts.antiFreeCam") -> scoped camera grace
-- Client: IsExempt() -> verified staff/full/pause only

Event-Namen sind ein Katalog, keine Autorisierung#

Dieser Quellkatalog listet feste AC-Protokollereignisse nach Registrierungsseite. Berechnete Namen und sämtliche Events eigener Resources können fehlen. Wiederholen Sie interne Schlüssel-, Straf-, Konfigurations- oder Menüereignisse nicht manuell. Die Erkennung findet Namen und Transportrichtung, keine Eigentums- oder Belohnungsberechtigung. Verwenden Sie für sensible Aktionen validierte RegisterSafeEvent-Abläufe. Panel-Schutz und ac_protected_events speisen Fake-Trigger-/Honeypot-Regeln, keine Validatoren. Lassen Sie EventScanner.autoProtect=false bei der Einrichtung.

-- tosun-ac/client/AddEventHandler
-- CEventShockingGunshotFired
-- baseevents:onPlayerDied
-- baseevents:onPlayerKilled
-- esx:onPlayerDeath
-- esx_ambulancejob:revive
-- esx_basicneeds:onRevive
-- gameEventTriggered
-- hospital:client:Revive
-- hospital:client:SetDeathState
-- hospital:client:SetLaststand
-- hospital:client:isDead
-- onClientResourceStart
-- onClientResourceStop
-- playerSpawned
-- qb-ambulancejob:client:RevivePlayer
-- qb-medical:client:OnDeath
-- qb-medical:client:OnRevive
-- tosun-ac:nui:pushToolState
-- tosun-ac:uploadTokenUpdated
-- ts_anticheat:adminStateChanged
-- ts_anticheat:adminStatus
-- ts_anticheat:bridge:capture
-- ts_anticheat:bridge:clearInventory
-- ts_anticheat:bridge:freeze
-- ts_anticheat:bridge:giveWeapon
-- ts_anticheat:bridge:heal
-- ts_anticheat:bridge:mute
-- ts_anticheat:bridge:revive
-- ts_anticheat:bridge:setArmor
-- ts_anticheat:bridge:setHealth
-- ts_anticheat:bridge:slay
-- ts_anticheat:bridge:speedLimit
-- ts_anticheat:bridge:stripWeapons
-- ts_anticheat:bridge:teleport
-- ts_anticheat:bridge:time
-- ts_anticheat:bridge:warning
-- ts_anticheat:bridge:weather
-- ts_anticheat:checkTaze
-- ts_anticheat:cipher:assigned
-- ts_anticheat:cipher:request_refresh
-- ts_anticheat:clearDone
-- ts_anticheat:configUpdated
-- ts_anticheat:detectclient
-- ts_anticheat:internal:receiveKey
-- ts_anticheat:internal:trapsChanged
-- ts_anticheat:isAdmin
-- ts_anticheat:joinBundle
-- ts_anticheat:liveSSRequest
-- ts_anticheat:newDetection
-- ts_anticheat:openAdminMenu
-- ts_anticheat:openAdminMenuAuthorized
-- ts_anticheat:panelBroadcast
-- ts_anticheat:panelHeal
-- ts_anticheat:panelRevive
-- ts_anticheat:panelTime
-- ts_anticheat:panelWeather
-- ts_anticheat:promptOpenMenu
-- ts_anticheat:receiveKey
-- ts_anticheat:receiveLiveSS
-- ts_anticheat:receiveLiveVideo
-- ts_anticheat:receivePlayerCount
-- ts_anticheat:receiveScreenshot
-- ts_anticheat:requestCoords
-- ts_anticheat:resourceGuardSync
-- ts_anticheat:shield:requestScreenshot
-- ts_anticheat:shield:uploadConfig
-- ts_anticheat:startVideoLiveStream
-- ts_anticheat:startVideoLiveWeb
-- ts_anticheat:startVideoRecording
-- ts_anticheat:stopVideoLiveStream
-- ts_anticheat:stopVideoLiveWeb
-- ts_anticheat:stopVideoRecording
-- ts_anticheat:syncBanList
-- ts_anticheat:syncConfig
-- ts_anticheat:syncIdentifiers
-- ts_anticheat:syncLogs
-- ts_anticheat:syncPlayers
-- ts_anticheat:takeScreenshot
-- ts_anticheat:unbanDone
-- ts_anticheat:webPanelScreenshot

-- tosun-ac/client/RegisterNUICallback
-- Armour
-- DeleteAll
-- DeleteObjects
-- DeletePeds
-- DeleteVehicles
-- GetPlayerIdentifiers
-- Health
-- addLog
-- armourPlayer
-- banPlayer
-- bringAll
-- bringPlayer
-- cancelAnimation
-- clearNearbyObjects
-- clearNearbyPeds
-- clearNearbyVehicles
-- devtoolsdetected
-- exit
-- freezeAll
-- freezePlayerToggle
-- getBans
-- getLogs
-- getPlayerCount
-- getPlayers
-- giveWeaponPlayer
-- healAll
-- healPlayer
-- isInVehicle
-- kickPlayer
-- liveWatchStart
-- liveWatchStop
-- nuiDependencyMissing
-- nuiWatermark
-- repair
-- returnOCRResult
-- reviveAll
-- revivePlayer
-- screenshotPlayer
-- selfRevive
-- setHealthPlayer
-- setTime
-- setWeather
-- shield_devtools
-- shield_heartbeat
-- shield_heartbeat_fail
-- shield_screenshot
-- shield_tokens
-- shield_video_final
-- shield_video_segment
-- slayPlayer
-- spawnVehicle
-- spectatePlayer
-- stopSpectate
-- stripWeaponsPlayer
-- toggleESP
-- toggleFreecam
-- toggleGodmode
-- toggleInvisible
-- toggleNoclip
-- tosunRenderResult
-- tpToPlayer
-- unbanPlayer
-- verifyModel
-- videoLiveSegmentResult
-- videoRecordingResult
-- videoRecordingStartResult
-- warnPlayerNUI

-- tosun-ac/client/RegisterNetEvent
-- QBCore:Client:OnPlayerLoaded
-- QBCore:Client:OnPlayerUnload
-- esx:onPlayerDeath
-- esx:onPlayerLogout
-- esx:playerLoaded
-- esx_ambulancejob:revive
-- esx_basicneeds:onRevive
-- hospital:client:Revive
-- hospital:client:SetDeathState
-- hospital:client:SetLaststand
-- hospital:client:isDead
-- qb-ambulancejob:client:RevivePlayer
-- qb-medical:client:OnDeath
-- qb-medical:client:OnRevive
-- qbx_core:client:playerLoggedIn
-- qbx_multicharacter:client:chooseChar
-- ts_anticheat:adminStateChanged
-- ts_anticheat:adminStatus
-- ts_anticheat:bridge:capture
-- ts_anticheat:bridge:clearInventory
-- ts_anticheat:bridge:freeze
-- ts_anticheat:bridge:giveWeapon
-- ts_anticheat:bridge:heal
-- ts_anticheat:bridge:mute
-- ts_anticheat:bridge:revive
-- ts_anticheat:bridge:setArmor
-- ts_anticheat:bridge:setHealth
-- ts_anticheat:bridge:slay
-- ts_anticheat:bridge:speedLimit
-- ts_anticheat:bridge:stripWeapons
-- ts_anticheat:bridge:teleport
-- ts_anticheat:bridge:time
-- ts_anticheat:bridge:warning
-- ts_anticheat:bridge:weather
-- ts_anticheat:checkTaze
-- ts_anticheat:cipher:assigned
-- ts_anticheat:cipher:request_refresh
-- ts_anticheat:clearDone
-- ts_anticheat:detectclient
-- ts_anticheat:isAdmin
-- ts_anticheat:joinBundle
-- ts_anticheat:liveSSRequest
-- ts_anticheat:newDetection
-- ts_anticheat:openAdminMenu
-- ts_anticheat:openAdminMenuAuthorized
-- ts_anticheat:panelBroadcast
-- ts_anticheat:panelHeal
-- ts_anticheat:panelRevive
-- ts_anticheat:panelTime
-- ts_anticheat:panelWeather
-- ts_anticheat:promptOpenMenu
-- ts_anticheat:receiveEventKey
-- ts_anticheat:receiveKey
-- ts_anticheat:receiveLiveSS
-- ts_anticheat:receiveLiveVideo
-- ts_anticheat:receivePlayerCount
-- ts_anticheat:receiveScreenshot
-- ts_anticheat:requestCoords
-- ts_anticheat:resourceGuardSync
-- ts_anticheat:shield:requestScreenshot
-- ts_anticheat:shield:uploadConfig
-- ts_anticheat:startVideoLiveStream
-- ts_anticheat:startVideoLiveWeb
-- ts_anticheat:startVideoRecording
-- ts_anticheat:stopVideoLiveStream
-- ts_anticheat:stopVideoLiveWeb
-- ts_anticheat:stopVideoRecording
-- ts_anticheat:syncBanList
-- ts_anticheat:syncConfig
-- ts_anticheat:syncIdentifiers
-- ts_anticheat:syncLogs
-- ts_anticheat:syncPlayers
-- ts_anticheat:takeScreenshot
-- ts_anticheat:unbanDone
-- ts_anticheat:uploadToken
-- ts_anticheat:webPanelScreenshot

-- tosun-ac/server/AddEventHandler
-- QBCore:Server:OnPlayerLoaded
-- QBCore:Server:PlayerLoaded
-- chatMessage
-- clearPedTasksEvent
-- entityControlEvent
-- entityCreated
-- entityCreating
-- esx:playerLoaded
-- eventTriggered
-- explosionEvent
-- fireEvent
-- giveWeaponEvent
-- onResourceStart
-- onResourceStop
-- onServerResourceStart
-- playerConnecting
-- playerDropped
-- playerJoining
-- ptFxEvent
-- qbx_core:server:playerLoaded
-- rconCommand
-- removeAllWeaponsEvent
-- removeWeaponEvent
-- requestControlEvent
-- respawnPlayerPedEvent
-- startProjectileEvent
-- tosun-ac:nuiPermissionRefreshed
-- tosun-ac:panel:characterReady
-- tosun-ac:server:detection
-- tosun-ac:server:logResourceActivity
-- tosun-ac:server:nuiWatermark
-- tosun-ac:server:signedDetection
-- tosun-ac:settingsReloaded
-- ts_anticheat:GetPlayerIdentifiers
-- ts_anticheat:addAdmin_internal
-- ts_anticheat:addLog
-- ts_anticheat:adminDelEntity
-- ts_anticheat:banCommitted
-- ts_anticheat:banPlayer
-- ts_anticheat:banRelay
-- ts_anticheat:bridge:freeze
-- ts_anticheat:bringAllPlayers
-- ts_anticheat:bringPlayer
-- ts_anticheat:cipher:detection
-- ts_anticheat:cipher:request
-- ts_anticheat:clearTasks
-- ts_anticheat:client:scriptsReady
-- ts_anticheat:configUpdated
-- ts_anticheat:deleteObjects
-- ts_anticheat:deletePeds
-- ts_anticheat:deleteVehicles
-- ts_anticheat:freezeAllPlayers
-- ts_anticheat:getBanList
-- ts_anticheat:getLogs
-- ts_anticheat:getPlayerCount
-- ts_anticheat:getPlayers
-- ts_anticheat:healAllPlayers
-- ts_anticheat:internal:pushResourceGuard
-- ts_anticheat:internal:suspicious
-- ts_anticheat:kickPlayer
-- ts_anticheat:liveSSResult
-- ts_anticheat:liveWatchStart
-- ts_anticheat:liveWatchStop
-- ts_anticheat:logAdminMenu
-- ts_anticheat:newLog
-- ts_anticheat:playerBanned
-- ts_anticheat:requestAdminStatus
-- ts_anticheat:requestEventKey
-- ts_anticheat:requestKey
-- ts_anticheat:requestOpenAdminMenu
-- ts_anticheat:returnCoords
-- ts_anticheat:reviveAllPlayers
-- ts_anticheat:screenshotPlayer
-- ts_anticheat:screenshotResult
-- ts_anticheat:server:<computed suffix> [template only; not a runnable exact event]
-- ts_anticheat:server:checkIsAdmin
-- ts_anticheat:server:clientXkzuqBwmTjN7Gab4QzuN9QYZJ1WxxU
-- ts_anticheat:server:requestJoinHandshake
-- ts_anticheat:server:requestResourceGuard
-- ts_anticheat:server:requestSyncData
-- ts_anticheat:server:tazed
-- ts_anticheat:serverClear
-- ts_anticheat:setInvisible
-- ts_anticheat:setTime
-- ts_anticheat:setWeather
-- ts_anticheat:shield:ban_video_saved
-- ts_anticheat:spawnVehicle
-- ts_anticheat:targetArmour
-- ts_anticheat:targetFreeze
-- ts_anticheat:targetGiveWeapon
-- ts_anticheat:targetHeal
-- ts_anticheat:targetRevive
-- ts_anticheat:targetSetHealth
-- ts_anticheat:targetSlay
-- ts_anticheat:targetStripWeapons
-- ts_anticheat:targetWarn
-- ts_anticheat:tpToPlayer
-- ts_anticheat:unbanPlayer
-- ts_anticheat:v10:exec
-- ts_anticheat:v6:detection
-- ts_anticheat:v6:screenshotResult
-- ts_anticheat:verifyModel
-- ts_anticheat:videoResult
-- vehicleComponentControlEvent
-- weaponDamageEvent

-- tosun-ac/server/RegisterNetEvent
-- tosun-ac:panel:characterReady
-- tosun-ac:server:detection
-- tosun-ac:server:logResourceActivity
-- tosun-ac:server:nuiWatermark
-- tosun-guard:acMissing
-- tosun-guard:hello
-- tosun-guard:tick
-- tosun:nativeGuard:status
-- ts_anticheat:GetPlayerIdentifiers
-- ts_anticheat:addLog
-- ts_anticheat:adminDelEntity
-- ts_anticheat:banPlayer
-- ts_anticheat:banRelay
-- ts_anticheat:bridge:freeze
-- ts_anticheat:bringAllPlayers
-- ts_anticheat:bringPlayer
-- ts_anticheat:cipher:detection
-- ts_anticheat:cipher:request
-- ts_anticheat:client:scriptsReady
-- ts_anticheat:deleteObjects
-- ts_anticheat:deletePeds
-- ts_anticheat:deleteVehicles
-- ts_anticheat:freezeAllPlayers
-- ts_anticheat:getBanList
-- ts_anticheat:getLogs
-- ts_anticheat:getPlayerCount
-- ts_anticheat:getPlayers
-- ts_anticheat:healAllPlayers
-- ts_anticheat:kickPlayer
-- ts_anticheat:liveSSResult
-- ts_anticheat:liveWatchStart
-- ts_anticheat:liveWatchStop
-- ts_anticheat:logAdminMenu
-- ts_anticheat:requestAdminStatus
-- ts_anticheat:requestEventKey
-- ts_anticheat:requestKey
-- ts_anticheat:requestOpenAdminMenu
-- ts_anticheat:returnCoords
-- ts_anticheat:reviveAllPlayers
-- ts_anticheat:screenshotPlayer
-- ts_anticheat:screenshotResult
-- ts_anticheat:server:checkIsAdmin
-- ts_anticheat:server:clientXkzuqBwmTjN7Gab4QzuN9QYZJ1WxxU
-- ts_anticheat:server:requestJoinHandshake
-- ts_anticheat:server:requestResourceGuard
-- ts_anticheat:server:requestSyncData
-- ts_anticheat:server:tazed
-- ts_anticheat:serverClear
-- ts_anticheat:setInvisible
-- ts_anticheat:setTime
-- ts_anticheat:setWeather
-- ts_anticheat:shield:banVideo
-- ts_anticheat:shield:heartbeat_fail
-- ts_anticheat:shield:requestUploadConfig
-- ts_anticheat:shield:screenshot
-- ts_anticheat:shield:tokens
-- ts_anticheat:spawnVehicle
-- ts_anticheat:targetArmour
-- ts_anticheat:targetFreeze
-- ts_anticheat:targetGiveWeapon
-- ts_anticheat:targetHeal
-- ts_anticheat:targetRevive
-- ts_anticheat:targetSetHealth
-- ts_anticheat:targetSlay
-- ts_anticheat:targetStripWeapons
-- ts_anticheat:targetWarn
-- ts_anticheat:tpToPlayer
-- ts_anticheat:unbanPlayer
-- ts_anticheat:v10:exec
-- ts_anticheat:v6:detection
-- ts_anticheat:v6:screenshotResult
-- ts_anticheat:verifyModel
-- ts_anticheat:videoResult

-- tosun-ac/server/RegisterServerEvent
-- ts_anticheat:clearTasks

-- tosun-ac/shared/AddEventHandler
-- onClientResourceStart
-- onResourceStop
-- playerDropped
-- ts_anticheat:locale:reload
-- ts_anticheat:locale:setSelf
-- ts_anticheat:locale:sync

-- tosun-ac/shared/RegisterNetEvent
-- ts_anticheat:locale:setSelf
-- ts_anticheat:locale:sync

-- tosun-ac-guardian/server/AddEventHandler
-- onResourceStart
-- onResourceStop

-- tosun_render/server/AddEventHandler
-- onResourceStart

-- tosun-ac/client / RegisterCommand
-- stopspectate
-- tsdelaimed
-- tsfreecam
-- tsmenu
-- unspectate

-- tosun-ac/server / RegisterCommand
-- ac_cleanup
-- acfreeze
-- acping
-- acstats
-- acunfreeze
-- acwarn
-- capture
-- clearinv
-- emergency
-- giveweapon
-- massfreeze
-- mute
-- setarmor
-- sethp
-- speedlimit
-- stripweapons
-- tosunac_backdoorscan
-- tosunac_db_check
-- tosunac_db_status
-- tosunac_doctor
-- tosunac_eventscan
-- tosunac_integration
-- tosunac_license_status
-- tosunac_setup
-- ts
-- ts_adminsync
-- ts_broadcast
-- ts_capture
-- ts_clearinv
-- ts_emergency
-- ts_freeze
-- ts_giveweapon
-- ts_healall
-- ts_kickall
-- ts_lockdown
-- ts_massfreeze
-- ts_modping
-- ts_mute
-- ts_players
-- ts_revive
-- ts_setarmor
-- ts_sethp
-- ts_settime
-- ts_setweather
-- ts_slay
-- ts_speedlimit
-- ts_stripweapons
-- ts_tphere
-- ts_tpto
-- ts_unfreeze
-- ts_unmute
-- ts_v9_help
-- ts_warn
-- ts_warnings
-- unmute

-- tosun-ac/shared / RegisterCommand
-- ts_setlang

-- tosun-ac-guardian/server / RegisterCommand
-- tosunac_guardian_pause
-- tosunac_guardian_resume
-- tosunac_guardian_status

-- tosun_render/server / RegisterCommand
-- tosun_render_status

SafeEvent-Neustarts, Warteschlange und Fehler#

RegisterSafeEvent verlangt einen mit dem Resource-Namen beginnenden Event-Namen, Validator und Handler. Der Validator muss nach Prüfung aktueller Server-Daten exakt true liefern. Entfernen Sie den alten rohen Netzwerkhandler; AC kann fremde unabhängige Handler nicht abbrechen. Registrieren Sie nach Neustart der eigenen Resource oder tosun-ac erneut. Client-Status: sent, queued_until_key, queue_full, invalid_event_or_arguments, resource_stopping. sent ist Versand, keine Belohnungsquittung. Die Warteschlange hält höchstens 32 Aufrufe für 30 Sekunden. Handlerfehler werden nicht automatisch wiederholt oder bestätigt. Nutzen Sie separate Quittungen und idempotente Server-Aktionen; Geld/Items niemals automatisch wiederholen.

-- Client TriggerSafeServerEvent results:
-- true,  "sent"
-- false, "queued_until_key"
-- false, "queue_full"
-- false, "invalid_event_or_arguments"
-- false, "resource_stopping"

-- Server RegisterSafeEvent results:
-- true, "registered"
-- false + server_resource_required / use_own_resource_prefix
-- false + invalid_callbacks_or_options / already_registered / registration_capacity

-- Server log may say: application handler failed.
-- No automatic replay; implement an application receipt.

Eingereihter Bericht ist noch keine bestätigte Speicherung#

reportInfection(resource, file, sigs, severity[, callback]) liefert true nur für eine eingereihte DB-Operation. Optionaler callback höchstens einmal: success, affectedRows; Erfolg verlangt eine positive ganze Zeilenzahl. Bei ausbleibender Driver-Antwort gibt es keine Abschlussgarantie. Resource 1–190 Bytes aus Buchstaben/Ziffern/_.-, file 1–500 Bytes, severity 1–50 Buchstaben/Ziffern/_- (Standard warning). sigs ist nichtleerer Text oder dichte Liste mit 1–32 Texten, zusammen höchstens 255 Bytes. NUL/CR/LF werden abgewiesen. Ungültige Daten, fehlender/ablehnender Driver oder synchroner Fehler liefern false. Unklaren Abschluss nicht automatisch wiederholen.

-- A reviewed server reporting workflow; fictional non-secret labels.
-- resource: 1..190 bytes, letters/digits/underscore/dot/hyphen
-- file: 1..500 bytes; signatures joined: 1..255 bytes
-- severity: 1..50 bytes, letters/digits/underscore/hyphen (no dot)
local queued = exports["tosun-ac"]:reportInfection(
    "my-housing", "server.lua", {"reviewed_pattern"}, "warning",
    function(success, affectedRows)
        print(success and "[scan] report saved" or "[scan] report not confirmed")
    end)
-- queued=true is dispatch only; it is not the completion callback.
-- Do not automatically retry an operation with an uncertain outcome.