<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Java on dnyrのブログ</title>
    <link>https://blog.dnyr.org/tags/java/</link>
    <description>Recent content in Java on dnyrのブログ</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja-jp</language>
    
    
    
    <lastBuildDate>Mon, 28 Sep 2026 08:58:58 +0900</lastBuildDate><atom:link href="https://blog.dnyr.org/tags/java/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>【Minecraft 26.3】mod専用の情報をプレイヤーに持たせる</title>
      <link>https://blog.dnyr.org/posts/mc26-3-player-data-attachment/</link>
      <pubDate>Mon, 28 Sep 2026 08:58:58 +0900</pubDate>
      
      
      
      <guid>https://blog.dnyr.org/posts/mc26-3-player-data-attachment/</guid>
      <description>&lt;p&gt;この記事はMinecraftVer 26.3 NeoForgeに対応しています。&lt;/p&gt;
&lt;p&gt;お疲れ様です。dnyrです。最近、マインクラフトのMod製作に奮闘しています。
Mod界隈はAIに否定的な意見も多いので多くの人に遊んでもらうべくAIを使用せずに作成しています。自分でここまでいろいろ考えたり調べたりするのは久々な気もしますが、楽しいもんですね&lt;/p&gt;
&lt;p&gt;というのは前置きで、タイトルの通りなのですが「プレイヤーにMod用の情報を持たせたい」という状況になることが多々ありますので、その方法をここにメモします。&lt;/p&gt;



&lt;h2&gt;クラスを作成する&lt;/h2&gt;

&lt;p&gt;まずはクラスを作成します。必須ではないですがある程度汎用的に利用できたほうが良い内容なので用意しましょう。小さなプロジェクトであればクラス化する必要はないと思います。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ModAttachment
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;…というクラスを作成しました。&lt;/p&gt;



&lt;h2&gt;変数を用意する&lt;/h2&gt;

&lt;p&gt;下記のような変数を用意します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; DeferredRegister&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;AttachmentType&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&amp;gt;&amp;gt;&lt;/span&gt; ATTACHMENT_TYPE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		DeferredRegister.&lt;span style=&#34;color:#a6e22e&#34;&gt;create&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			NeoForgeRegistries.&lt;span style=&#34;color:#a6e22e&#34;&gt;ATTACHMENT_TYPES&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			SampleMod.&lt;span style=&#34;color:#a6e22e&#34;&gt;MODID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;レジストリへの登録を管理するオブジェクトになります。&lt;code&gt;DeferredRegister.create()&lt;/code&gt;の第一引数には登録対象となるレジストリ型を指定します。第二引数にはMODIDを指定します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;static&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;final&lt;/span&gt; Supplier&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;AttachmentType&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;SampleData&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; SAMPLE_DATA &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		ATTACHMENT_TYPE.&lt;span style=&#34;color:#a6e22e&#34;&gt;register&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sample_data&amp;#34;&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;			() &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; AttachmentType.&lt;span style=&#34;color:#a6e22e&#34;&gt;builder&lt;/span&gt;(SampleData::&lt;span style=&#34;color:#66d9ef&#34;&gt;new&lt;/span&gt;).&lt;span style=&#34;color:#a6e22e&#34;&gt;build&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SampleDataを保持する&lt;code&gt;AttachmentType&lt;/code&gt;を&lt;code&gt;sample_data&lt;/code&gt;というIDで登録します。
&lt;code&gt;SAMPLE_DATA&lt;/code&gt;には、登録したAttachmentType&lt;!-- raw HTML omitted --&gt;を取得するためのSupplierが入ります。
&lt;code&gt;Supplier&amp;lt;T&amp;gt;&lt;/code&gt;は、&lt;code&gt;get()&lt;/code&gt;を呼ぶことでT型のオブジェクトを取得できる仕組みです。今回であれば&lt;code&gt;SAMPLE_DATA.get()&lt;/code&gt;で&lt;code&gt;AttachmentType&amp;lt;SampleData&amp;gt;&lt;/code&gt;を取得できます。&lt;/p&gt;



&lt;h2&gt;アタッチされるタイミング&lt;/h2&gt;

&lt;p&gt;じゃあここで登録したものはいつアタッチされるの？という話ですが、登録したAttachmentTypeのデータには&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;player.&lt;span style=&#34;color:#a6e22e&#34;&gt;getData&lt;/span&gt;(ModAttachment.&lt;span style=&#34;color:#a6e22e&#34;&gt;SAMPLE_DATA&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でアクセス可能です。&lt;/p&gt;
&lt;p&gt;この際、まだデータがアタッチされていなければSampleData::newが呼ばれて生成・アタッチされます。すでにアタッチされていれば、そのデータをそのまま取得します&lt;/p&gt;



&lt;h2&gt;Supplierについて&lt;/h2&gt;

&lt;p&gt;聞きなれない単語だったので念のため調べました。
&lt;code&gt;Supplier&lt;/code&gt;では&lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt;をgetすることができます。&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>