<?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%2Fja</id>
	<title>Modding/ja - 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%2Fja"/>
	<link rel="alternate" type="text/html" href="https://wiki.shroudforge.net/index.php?title=Modding/ja&amp;action=history"/>
	<updated>2026-11-07T23:13:37Z</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/ja&amp;diff=2627&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/ja&amp;diff=2627&amp;oldid=prev"/>
		<updated>2026-11-07T01:35:20Z</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;
Lua ランタイムを使って、メインメニューの状態と選択中のローカルキャラクター名を読み取ります。どちらのクエリも Modloader と同じネイティブデータを使用し、ワールドへのアクセスは必要ありません。&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;
== 前提条件 ==&lt;br /&gt;
&lt;br /&gt;
Mod を有効にし、&amp;lt;code&amp;gt;mod.json&amp;lt;/code&amp;gt; で &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;
クライアント向けのこれらのクエリでは、&amp;lt;code&amp;gt;extended.mod.json&amp;lt;/code&amp;gt; の &amp;lt;code&amp;gt;targets&amp;lt;/code&amp;gt; を &amp;lt;code&amp;gt;&amp;amp;#91;&amp;quot;client&amp;quot;&amp;amp;#93;&amp;lt;/code&amp;gt; に設定します。&amp;lt;code&amp;gt;on_load&amp;lt;/code&amp;gt; や &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; は Mod のランタイムが起動したことを示しますが、ワールドへの参加は確認しません。どちらのクエリにも実行プロファイルは必要ありません。ワールドを操作するその他の機能には、それぞれ別の要件があります。&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;
== メインメニューを検出する ==&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;
! 戻り値 !! 意味&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;true, nil&amp;lt;/code&amp;gt; || キャラクター、ワールド、サーバーの選択を含むメインメニューが確認されました。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;false, nil&amp;lt;/code&amp;gt; || ゲームの別の元の状態が検証されました。&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;nil, reason&amp;lt;/code&amp;gt; || 状態が不明、変化中、またはクエリを利用できません。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;in_menu == true&amp;lt;/code&amp;gt; または &amp;lt;code&amp;gt;in_menu == false&amp;lt;/code&amp;gt; を明示的に確認してください。&amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; は確定した状態ではありません。&amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; だけでも、読み取り可能なワールドがあるとは限りません。必要な操作は別途確認します。例: &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;
== キャラクター名を読み取る ==&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; はローカルクライアントのメインメニューで選択されたキャラクター名を UTF-8 文字列で返します。&amp;lt;code&amp;gt;Ikiju 育樹&amp;lt;/code&amp;gt; のような Unicode 文字も保持されます。&amp;lt;code&amp;gt;nil, reason&amp;lt;/code&amp;gt; は、名前がまだ取得できない、またはアクセスできない、許可されていないことを示します。&lt;br /&gt;
&lt;br /&gt;
フォールバック名は Mod が独自に選びます。API はデフォルト名を挿入せず、Modloader の手動選択名も使用しません。この値はリモートプレイヤーを識別するものではなく、SteamID や Steam の表示名でもありません。Dedicated Server にはローカルクライアントのキャラクター名はありません。&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;
== 共有キャッシュ ==&lt;br /&gt;
&lt;br /&gt;
Lua と Modloader は同じネイティブキャッシュを読み取ります。既存のランタイム tick がメニュー状態を更新します。既存のメニュー連携は、最初に選択可能になったときと、選択または名前のメタデータが変化したときに名前を取得します。Lua クエリは別の検出処理を開始せず、ログも読み取りません。&lt;br /&gt;
&lt;br /&gt;
最後に正常取得した名前は、ワールド参加後もキャッシュに残ります。そのためキャッシュに名前があってもメニューが開いているとは限りません。&amp;lt;code&amp;gt;runtime.has(&amp;quot;runtime.is_main_menu&amp;quot;)&amp;lt;/code&amp;gt; と &amp;lt;code&amp;gt;runtime.has(&amp;quot;runtime.player.name&amp;quot;)&amp;lt;/code&amp;gt; は、それぞれのクエリが利用可能かを示します。&amp;lt;code&amp;gt;runtime.status(...)&amp;lt;/code&amp;gt; も理由を返します。&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;
== &amp;lt;code&amp;gt;src/mod.lua&amp;lt;/code&amp;gt; の例 ==&lt;br /&gt;
&lt;br /&gt;
この例ではロード時と、その後 500 ms ごとにキャッシュを読み取ります。フォールバック名を選び、変更があった場合だけログに記録します。&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>