<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.shroudforge.net/index.php?action=history&amp;feed=atom&amp;title=Modding%2Fde-at</id>
	<title>Modding/de-at - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.shroudforge.net/index.php?action=history&amp;feed=atom&amp;title=Modding%2Fde-at"/>
	<link rel="alternate" type="text/html" href="https://wiki.shroudforge.net/index.php?title=Modding/de-at&amp;action=history"/>
	<updated>2026-11-07T23:13:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://wiki.shroudforge.net/index.php?title=Modding/de-at&amp;diff=2589&amp;oldid=prev</id>
		<title>Bonsaibauer: Importing a new version from external source</title>
		<link rel="alternate" type="text/html" href="https://wiki.shroudforge.net/index.php?title=Modding/de-at&amp;diff=2589&amp;oldid=prev"/>
		<updated>2026-11-07T01:06:33Z</updated>

		<summary type="html">&lt;p&gt;Importing a new version from external source&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ShroudForge Modloader Wiki Post&lt;br /&gt;
title: Modding&lt;br /&gt;
description: Read the main-menu state and selected local character name through the Lua runtime. Both queries use the same native data as the Modloader and require no world access.&lt;br /&gt;
language: en-GB&lt;br /&gt;
picture:ShroudForge-Wiki-modding.svg&lt;br /&gt;
creator: Bonsaibauer&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:ShroudForge-Wiki-modding.svg|thumb|left|600px|Modding]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br style=&amp;quot;clear:both;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Prerequisites&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
&lt;br /&gt;
Aktiviere die Mod und deklariere in &amp;lt;code&amp;gt;mod.json&amp;lt;/code&amp;gt; die Berechtigung &amp;lt;code&amp;gt;runtime&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;capabilities&amp;quot;: [&amp;quot;runtime&amp;quot;]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setze für diese Client-Abfragen in &amp;lt;code&amp;gt;extended.mod.json&amp;lt;/code&amp;gt; das Feld &amp;lt;code&amp;gt;targets&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;&amp;amp;#91;&amp;quot;client&amp;quot;&amp;amp;#93;&amp;lt;/code&amp;gt;. Verwende die Funktionen in aktiven Laufzeit-Callbacks wie &amp;lt;code&amp;gt;on_load&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;on_update&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;runtime.phase == &amp;quot;ingame&amp;quot;&amp;lt;/code&amp;gt; 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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Detect_the_main_menu&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Hauptmenü erkennen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local in_menu, reason = runtime.is_main_menu()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Rückgabe !! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;true, nil&amp;lt;/code&amp;gt; || Das Hauptmenü einschließlich Charakter-, Welt- und Serverauswahl wurde bestätigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;false, nil&amp;lt;/code&amp;gt; || Ein anderer ursprünglicher Spielzustand wurde bestätigt.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nil, reason&amp;lt;/code&amp;gt; || Der Zustand ist unbekannt, wechselt gerade oder die Abfrage ist nicht verfügbar.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Prüfe ausdrücklich &amp;lt;code&amp;gt;in_menu == true&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;in_menu == false&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; ist kein bestätigter Zustand. Auch &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; bestätigt für sich allein keinen lesbaren Weltzustand. Prüfe dafür die benötigte Operation, zum Beispiel &amp;lt;code&amp;gt;runtime.has(&amp;quot;runtime.ecs.read&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Read_the_character_name&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Charakternamen lesen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
local name, reason = runtime.player.name()&lt;br /&gt;
local display_name = name or &amp;quot;Flameborn&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;name, nil&amp;lt;/code&amp;gt; liefert den im lokalen Hauptmenü ausgewählten Charakternamen als UTF-8-String. Unicode-Zeichen wie in &amp;lt;code&amp;gt;Ikiju 育樹&amp;lt;/code&amp;gt; bleiben erhalten. &amp;lt;code&amp;gt;nil, reason&amp;lt;/code&amp;gt; bedeutet, dass noch kein Name vorliegt oder der Zugriff nicht verfügbar beziehungsweise nicht erlaubt ist.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Shared_cache&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Gemeinsamer Cache ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der zuletzt erfolgreich erfasste Name bleibt beim Weltbeitritt im Cache. Ein vorhandener Name bestätigt daher keinen Menüaufenthalt. &amp;lt;code&amp;gt;runtime.has(&amp;quot;runtime.is_main_menu&amp;quot;)&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;runtime.has(&amp;quot;runtime.player.name&amp;quot;)&amp;lt;/code&amp;gt; melden die jeweilige Verfügbarkeit. &amp;lt;code&amp;gt;runtime.status(...)&amp;lt;/code&amp;gt; ergänzt eine Begründung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;Example_for_src/mod.lua&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Beispiel für &amp;lt;code&amp;gt;src/mod.lua&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
Das Beispiel liest den Cache beim Laden und danach alle 500 ms. Es verwendet einen eigenen Ersatznamen und protokolliert nur Änderungen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtime.require(&amp;quot;runtime.lifecycle&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local previous_message = nil&lt;br /&gt;
&lt;br /&gt;
local function refresh()&lt;br /&gt;
    local in_menu = runtime.is_main_menu()&lt;br /&gt;
    local name = runtime.player.name()&lt;br /&gt;
    local state = &amp;quot;unknown&amp;quot;&lt;br /&gt;
    if in_menu == true then&lt;br /&gt;
        state = &amp;quot;menu&amp;quot;&lt;br /&gt;
    elseif in_menu == false then&lt;br /&gt;
        state = &amp;quot;other&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local message = state .. &amp;quot;: &amp;quot; .. (name or &amp;quot;Flameborn&amp;quot;)&lt;br /&gt;
    if message ~= previous_message then&lt;br /&gt;
        previous_message = message&lt;br /&gt;
        shroudforge.log.info(message)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
    on_load = refresh,&lt;br /&gt;
    on_update = function()&lt;br /&gt;
        refresh()&lt;br /&gt;
    end,&lt;br /&gt;
    update_interval_ms = 500,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:guide:Shroudforge]]&lt;/div&gt;</summary>
		<author><name>Bonsaibauer</name></author>
	</entry>
</feed>