Jump to content
Toggle menu
  • 3 articles
  • 22 files
  • 3 users
  • 2.5K edits
Shroudforge
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Modding

From Shroudforge
This page is a translated version of the page Modding and the translation is 100% complete.


Modding



Lies den Hauptmenüzustand und den ausgewählten lokalen Charakternamen mit der Lua-Runtime. Beide Abfragen nutzen dieselben nativen Daten wie der Modloader und benötigen keinen Weltzugriff.

Voraussetzungen

Aktiviere die Mod und deklariere in mod.json die Berechtigung runtime:

{
  "capabilities": ["runtime"]
}

Setze für diese Client-Abfragen in extended.mod.json das Feld targets auf ["client"]. Verwende die Funktionen in aktiven Laufzeit-Callbacks wie on_load und on_update. runtime.phase == "ingame" bezeichnet die gestartete Mod-Laufzeit und bestätigt keinen Weltbeitritt. Für diese beiden Abfragen ist kein Ausführungsprofil nötig. Andere Weltoperationen behalten ihre eigenen Voraussetzungen.

Hauptmenü erkennen

local in_menu, reason = runtime.is_main_menu()
Rückgabe Bedeutung
true, nil Das Hauptmenü einschließlich Charakter-, Welt- und Serverauswahl wurde bestätigt.
false, nil Ein anderer ursprünglicher Spielzustand wurde bestätigt.
nil, reason Der Zustand ist unbekannt, wechselt gerade oder die Abfrage ist nicht verfügbar.

Prüfe ausdrücklich in_menu == true oder in_menu == false. nil ist kein bestätigter Zustand. Auch false bestätigt für sich allein keinen lesbaren Weltzustand. Prüfe dafür die benötigte Operation, zum Beispiel runtime.has("runtime.ecs.read").

Charakternamen lesen

local name, reason = runtime.player.name()
local display_name = name or "Flameborn"

name, nil liefert den im lokalen Hauptmenü ausgewählten Charakternamen als UTF-8-String. Unicode-Zeichen wie in Ikiju 育樹 bleiben erhalten. nil, reason bedeutet, dass noch kein Name vorliegt oder der Zugriff nicht verfügbar beziehungsweise nicht erlaubt ist.

Die Mod bestimmt ihren Ersatznamen selbst. Die API setzt keinen Standardnamen ein und übernimmt nicht die manuelle Namenswahl des Modloaders. Der Wert bezeichnet keinen entfernten Spieler, keine SteamID und keinen Steam-Anzeigenamen. Ein Dedicated Server besitzt keinen lokalen Client-Charakternamen.

Gemeinsamer Cache

Lua und Modloader lesen denselben nativen Cache. Der vorhandene Runtime-Tick aktualisiert den Menüstatus. Die bestehende Menüanbindung erfasst den Namen bei der ersten verfügbaren Auswahl und erneut bei einer geänderten Auswahl oder geänderten Namensmetadaten. Lua-Abfragen starten keine eigene Suche und lesen keine Logs.

Der zuletzt erfolgreich erfasste Name bleibt beim Weltbeitritt im Cache. Ein vorhandener Name bestätigt daher keinen Menüaufenthalt. runtime.has("runtime.is_main_menu") und runtime.has("runtime.player.name") melden die jeweilige Verfügbarkeit. runtime.status(...) ergänzt eine Begründung.

Beispiel für src/mod.lua

Das Beispiel liest den Cache beim Laden und danach alle 500 ms. Es verwendet einen eigenen Ersatznamen und protokolliert nur Änderungen:

runtime.require("runtime.lifecycle")

local previous_message = nil

local function refresh()
    local in_menu = runtime.is_main_menu()
    local name = runtime.player.name()
    local state = "unknown"
    if in_menu == true then
        state = "menu"
    elseif in_menu == false then
        state = "other"
    end

    local message = state .. ": " .. (name or "Flameborn")
    if message ~= previous_message then
        previous_message = message
        shroudforge.log.info(message)
    end
end

return {
    on_load = refresh,
    on_update = function()
        refresh()
    end,
    update_interval_ms = 500,
}