Zum Inhalt

Erweitern

Das Addon ist darauf ausgelegt, dass andere Server und Addons es ohne Änderungen am Addon selbst erweitern.

Lege eine .lua-Datei in lua/tadmin_ext/ (im Addon oder in einem eigenen Addon mit demselben Ordner). Sie wird automatisch geladen:

  • ohne Präfix oder sh_: gemeinsam (Server und Client)
  • sv_: nur Server
  • cl_: nur Client
  • Dateien, die mit _ beginnen, werden übersprungen (_example.lua ist ein Beispiel zum Umbenennen).

Ein Befehl

TAdmin.RegisterCommand{
    name = "hello",
    category = "Spaß",
    help = "Begrüße einen Spieler",
    default = "moderator",              -- niedrigster Rang, der das Recht beim ersten Mal bekommt
    args = {
        { name = "target", type = "player" },
        { name = "text", type = "text", optional = true, default = "Hallo" },
    },
    run = function(ctx, target, text)   -- läuft nur auf dem Server
        ctx:Announce("{A} grüßt {T}: " .. text, { T = target })
    end,
}

Das Recht hello entsteht automatisch, der Befehl erscheint im Menü mit fertigem Formular und im Chat als !hello.

Argumenttypen

Typ Wert
player genau ein Spieler (Immunität wird geprüft)
players ein oder mehrere Spieler (Immunität je Ziel)
steamid SteamID64, auch Offline-Spieler per Name
number Zahl, mit min und max
time Dauer in Minuten (30m, 2h, 7d)
string ein Wort
text der Rest der Eingabe
rank ein Rang
bool ja/nein
choice Auswahl aus choices = { ... }
map vorhandene Karte

Kontext (ctx)

Aufruf Wirkung
ctx.actor der Ausführende (NULL für die Konsole)
ctx:Announce(text, vars) Meldung an alle (je nach notify_mode), {A} Ausführender, {T} Ziel
ctx:Reply(key, vars) private Antwort
ctx:Fail(key, vars) bricht mit Fehlermeldung ab

Weitere Felder der Definition: aliases, perm, immune, playerOnly, silent, noLog.

Rechte und Einstellungen

TAdmin.RegisterPerm("mein.recht", "Beschreibung", "Kategorie", "admin")
TAdmin.RegisterSetting("mein_wert", 10, "number", "Beschreibung", { category = "Mein Addon", min = 0, max = 100 })

TAdmin.HasPerm(ply, "mein.recht")
TAdmin.GetSetting("mein_wert")

Einstellungen erscheinen automatisch im Menü und werden synchronisiert. Typen: bool, number, string, choice.

Eine Menü-Seite

if CLIENT then
    TAdmin.Menu.AddTab{
        id = "mein", title = "Mein Tab", icon = "star", perm = "mein.recht", order = 95,
        html = [[<div class="page-head"><div><h1>Mein Tab</h1></div></div>
                 <div class="card"><div class="card-body" id="inhalt">...</div></div>]],
        js = [[
            TA.request('meindaten', {}, function (d) {
                root.querySelector('#inhalt').textContent = JSON.stringify(d);
            });
        ]],
    }
end

if SERVER then
    TAdmin.Requests.meindaten = {
        perm = "mein.recht",
        run = function(ply, params) return { zeit = os.time() } end,
    }
end

In js stehen die Hilfen der Seite bereit (h(), btn(), toast(), modal(), cmdDialog(name, preset), lua.run(zeile)). Verfügbare Icons: users terminal lock alert flag shield file sliders search x check plus trash refresh pin copy user star chevron left. Die Klassen (card, btn, badge, table, ...) entsprechen dem Web-Panel.

Ereignisse (Hooks)

Hook Wann
TAdmin_Loaded alles geladen
TAdmin_PreCommand(actor, cmd, tokens) vor einem Befehl, false blockiert
TAdmin_PostCommand(actor, cmd, tokens) nach einem Befehl
TAdmin_PlayerBanned(steamid64, minutes, reason, actor) nach einem Ban
TAdmin_PlayerUnbanned(steamid64, actor) nach einem Unban
TAdmin_RankChanged(ply, alt, neu) Rang eines Spielers ändert sich
TAdmin_SettingChanged(key, value) Einstellung geändert
TAdmin_CanChat(ply, text) vor jeder Chatnachricht, false blockiert
TAdmin_ReportCreated(ply, text) neuer Report-Fall
TAdmin_Synced (Client) Ränge und Rechte vom Server empfangen

Weitere Funktionen

TAdmin.AddBan(sid, name, ip, minuten, grund, actor)
TAdmin.BanPlayer(ply, minuten, grund, actor)
TAdmin.AddWarn(sid, name, grund, actor)
TAdmin.SetUserRank(sid, rang, minuten, name)
TAdmin.Log(actor, "aktion", "text")
TAdmin.SendMsg(spieler, { Color(...), "Text" })
TAdmin.Announce(text, von, sekunden, spieler)  -- Server: Ankündigung senden (spieler leer = alle)
TAdmin.ShowAnnouncement(von, text, sekunden)   -- Client: Karte anzeigen

Eigenes Ankündigungs-System

Ankündigungen (!announce und aus dem Panel) lassen sich komplett ersetzen.

Client: eigene Darstellung

-- lua/tadmin_ext/cl_meine_ankuendigung.lua
TAdmin.SetAnnouncer(function(d)       -- d.from, d.text, d.secs, d.label
    MeineBenachrichtigung(d.text, d.secs)
    -- nichts zurückgeben = erledigt, false = Standardkarte zeigen
end)

Alternativ per Hook: hook.Add("TAdmin_ShowAnnouncement", "id", function(d) ... return true end). TAdmin.SetAnnouncer(nil) stellt die Standardkarte wieder her.

Server: eigener Versand

hook.Add("TAdmin_PreAnnounce", "meins", function(text, von, sekunden, spieler)
    MeinNetzwerk(text)
    return true   -- verhindert die Standard-Ankündigung
end)

Aufrufen kannst du die Ankündigung jederzeit mit TAdmin.Announce("Text").

Eigene Sprache

TAdmin.AddLang("fr", { ["ui.tab.players"] = "Joueurs", ... })
TAdmin.SettingDefs.language.choices[#TAdmin.SettingDefs.language.choices + 1] = "fr"

Fehlende Schlüssel fallen auf Englisch zurück.