Modlet

Last-modified: 2021-04-07 (水) 01:11:03

Modletとは

Modletとは、ゲームファイル本体を上書きしない小さなModのことです。
Alpha17から導入されました。
(Modletの仕組みが導入される前は、Mod製作者たちはゲームファイル自体を編集して配布していたため、競合やゲームバージョンのアップデートで問題が起きやすくなっていました。Modletはゲームファイル本体を直接書き換えたりしないため、そういった問題が起きにくくなっています)

Modletの導入方法

基本的に、Modsフォルダに任意のModletを放り込むだけで導入できます。
すでにセーブデータがある環境に導入する場合は、導入前に必ずバックアップをとってください。
Mod Launcher を利用する場合は、ManageModletsからModletを管理することができます(プロジェクト別管理のようなことも可能です)。

Modletの詳細

形式は公式・非公式の物が存在し、簡便さや自由度の違いからすみ分けされています。
ここでは広く使われている公式の方法を紹介します。

 

Modletの形式

公式基準のModletは、7 days to dieのホームディレクトリ直下のModsディレクトリに、それぞれ固有のフォルダ名で保存され、その中には必ずModInfo.xmlが入っています。

Mods/MyMod/ModInfo.xml
Mods/YourMod/ModInfo.xml

ModInfo.xml

以下の内容で作るか、fileここからダウンロードして入れましょう。
NameはそれぞれのModlet固有である必要があり、同じものは無視されます。

~展開~

折り畳み

<?xml version="1.0" encoding="UTF-8" ?>
<xml>
	<ModInfo>
		<Name value="test" />
		<Description value="test dayo" />
		<Author value="Yamada Taro" />
		<Version value="1.0.0" />
	</ModInfo>
</xml>
 

公式の方法で可能なことは、Config内のXMLの操作と一部Assetの追加です。
Assetは7 days to dieのホームディレクトリ以下なら場所を問いませんが、XMLの操作はModletフォルダ内のConfigsに、変更するXMLと同じ名前で入っています。

Mods/MyMod/Configs/items.xml
Mods/MyMod/Configs/XUi/windows.xml
 

XMLの操作

以下の8個の操作でXMLを変更することができます。

a18からLocalizationが変更できるようになりました。

  • append 子要素の後尾に追加
  • prepend 子要素の先頭に追加
  • insertAfter その要素の一つ後として追加
  • insertBefore その要素の一つ前として追加
  • remove その要素を消す
  • set 今ある要素/属性の代わりに設定(存在しない属性を足すことはできません)
  • setattribute 属性を追加
  • removeattribute 属性を削除(a18から使用可)

~append~

append折り畳み
元XML

<items>
  <item name="1"/>
</items>

XML操作XML

<configs>
  <append xpath="/items">
    <item name="2"/>
  </append>
</configs>

出力XML

<items>
  <item name="1"/>
    <item name="2"/>
</items>

~prepend~

prepend折り畳み
元XML

<items>
  <item name="1"/>
</items>

XML操作XML

<configs>
  <prepend xpath="/items">
    <item name="2"/>
  </prepend>
</configs>

出力XML

<items>
    <item name="2"/>
  <item name="1"/>
</items>

~insertAfter~

insertAfter折り畳み
元XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="B" value="5"/>
  </item>
</items>

XML操作XML

<configs>
  <insertAfter xpath="/items/item[@name='1']/property[@name='A']
    <property name="C" value="7"/>
  </insertAfter>
</configs>

 ※itemが1つしか無い場合、又は全てのitemに適用する場合は[@name='1']を省略できます。
  詳細はXPathの項を参照。

出力XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="C" value="7"/>
    <property name="B" value="5"/>
  </item>
</items>

~insertBefore~

insertBefore折り畳み
元XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="B" value="5"/>
  </item>
</items>

XML操作XML

<configs>
  <insertBefore xpath="/items/item[@name='1']/property[@name='B']
    <property name="C" value="7"/>
  </insertBefore>
</configs>

 ※itemが1つしか無い場合、又は全てのitemに適用する場合は[@name='1']を省略できます。
  詳細はXPathの項を参照。

出力XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="C" value="7"/>
    <property name="B" value="5"/>
  </item>
</items>

~remove~

remove折り畳み
元XML

<items>
  <item name="1"/>
  <item name="2"/>
</items>

XML操作XML

<configs>
  <remove xpath="/items/item[@name='1']"/>
</configs>

出力XML

<items>
  <item name="2"/>
</items>

~set~要素の置き換え

set(要素の置き換え)折り畳み
元XML

<items>
  <item name="1"/>
</items>

XML操作XML

<configs>
  <set xpath="/items">
    <item name="2"/>
  </set>
</configs>

出力XML

<items>
     <item name="2"/>
</items>

~set~属性の置き換え

set(属性の置き換え)折り畳み
元XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="B" value="5"/>
  </item>
</items>

XML操作XML

<configs>
  <set xpath="/items/item[@name='1']/property[@name='B']/@value"> 10 </set>
</configs>

 ※itemが1つしか無い場合、又は全てのitemに適用する場合は[@name='1']を省略できます。
  同様に、全てのpropertyに適用する場合は[@name='B']を省略できます。
  詳細はXPathの項を参照。

出力XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="B" value="10"/>
  </item>
</items>

~setattribute~

setattribute折り畳み
元XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="B" value="5"/>
  </item>
</items>

XML操作XML

<configs>
  <setattribute xpath="/items/item[@name='1']/property[@name='B']" name="condition"> walk </setattribute>
</configs>

 ※itemが1つしか無い場合、又は全てのitemに適用する場合は[@name='1']を省略できます。
  同様に、全てのpropertyに適用する場合は[@name='B']を省略できます。
  詳細はXPathの項を参照。

出力XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="B" value="5" condition="walk"/>
  </item>
</items>

~removeattribute~

removeattribute折り畳み
元XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="B" value="5" condition="walk"/>
  </item>
</items>

XML操作XML

<configs>
  <removeattribute xpath="/items/item[@name='1']/property[@name='B']/@condition"/>
</configs>

 ※itemが1つしか無い場合、又は全てのitemに適用する場合は[@name='1']を省略できます。
  同様に、全てのpropertyに適用する場合は[@name='B']を省略できます。
  詳細はXPathの項を参照。

出力XML

<items>
  <item name="1">
    <property name="A" value="3"/>
    <property name="B" value="5"/>
  </item>
</items>

操作を行う場所は、XPathで指定します。

 

XPath

XPathはXML内のとある位置を指し示す世界標準の方法です。
専門的な言葉を使えば、XMLをツリーとみなしてルートからたどるパスです。

基本

基本的に<>で囲まれたテキストの初めに来る、要素名を/(スラッシュ)で区切ってたどっていきます。

<items>
  <item name="meleeToolStoneAxe"/>
</items>

上の例で<item name="meleeToolStoneAxe"/>を指定する場合は、/items/itemでたどることができます。

 

ただし、次のような場合、/items/itemをたどると2個のitem両方が指定されます。

<items>
  <item name="meleeToolStoneAxe"/>
  <item name="meleeToolFireaxeIron"/>
</items>

要素名だけでたどれない時は、条件で絞り込むことができます。
条件は[]のカッコで囲みます。単純な例は、[1]のような数字で、何番目か指定する方法です。
例えば、/items/item[1]<item name="meleeToolStoneAxe"/>を指定できます。

ただし、この方法では新しいアイテムが追加されたり、順番が変わるだけで動かなくなります。

<items>
  <item name="meleeClubWood"/>
  <item name="meleeToolStoneAxe"/>
  <item name="meleeToolFireaxeIron"/>
</items>

この場合、<item name="meleeClubWood"/>の方が指定されてしまいます。

 

代わりに、属性を使った条件の方がうまくいくことが多いでしょう。
XPathでは属性の名前には@を付けて、@nameというように書きます。
/items/item[@name='meleeToolStoneAxe']と書けば、一通りに指定することができます。

 

条件で使える関数

last()
今の要素の中で最後の要素の番号を返します。
[last()]とすれば、一番最後の要素を指定できます。
starts-with(s1,s2)
文字列s1が文字列s2で始まる場合、真になります。
[starts-with(@name,'meleeTool')]とすれば、nameがmeleeToolで始まる要素を指定できます。
contains(s1,s2)
文字列s1が文字列s2を含む場合、真になります。
[contains(@name,'Iron')]とすれば、nameにIronを含む要素を指定できます。
position()
要素の番号を返します。
[position() &lt; 3]とすれば、3番目より後の要素を指定でき、
[position() &gt; 3]とすれば、3番目より前の要素を指定できます。
(&lt;は<の、&gt;は>のxml用の書き換えです。)
string-length(str)
文字列strの文字数を返します。
[string-length(@id)=1]とすれば、idが一桁の要素を指定できます。
substring(str,num)
文字列strの中で、num文字目から先の文字列を返します。
[substring(@name,string-length(@name) - string-length('Radiated') +1) = 'Radiated']とすれば、nameがRadiatedで終わる要素を指定できます。
(ends-withの代わり)
and
前の条件と後ろの条件が両方正しい場合真になります。
[starts-with(@name,'melee') and contains(@name,'Iron')]とすれば、nameがmeleeで始まって、Ironを含む要素を指定できます。
ただし、[starts-with(@name,'melee')][contains(@name,'Iron')]のように、2重に条件を使うことでも同じように指定できます。
or
前の条件と後ろの条件のどちらかが正しい場合真になります。
[starts-with(@name,'melee') or starts-with(@name,'gun')]とすれば、nameがmeleeかgunで始まる要素を指定できます。
not(条件)
条件を反転します。
[starts-with(@name,'gun') and not(ends-with(@name,'Admin'))]とすれば、nameがgunで始まり、終わりがAdminではない要素を指定できます。
 

省略

*
名前に関係なく要素を指定します。
名前を指定しても意味がない時や、複数の経路を同時にたどる時に使えます。
//
/の代わりに使うと、その要素直下だけでなく、それ以下の全ての要素の中から探します。
 

ローカライゼーション

a18のローカライゼーションの操作はModletフォルダ内のConfigsに、Localization.txtという名前で入っています。

Mods/MyMod/Configs/Localization.txt
 

このファイルはテキストファイルで、カンマで区切るcsv形式で書かれています。
テキストとは言え、UTF-8を使っていますので、UTF-8の使えるテキストエディタ等で編集する必要があります。

 

作成する場合は、まずオリジナルのLocalization.txtの1行目をコピーし、2行目以降に追加したい内容を記述します。

 

1行目はアイテムの分類や各種言語の項目名が入っています。
それにのっとり説明を追加していきます、
1行が大変長いですが、Keyには内部名を英語で記述、englishより前までは、オリジナルファイルの記述を参考にします。
※内部名とは、Items.xmlやBlocks.xml等で記述した名前です

 

englishから後は各言語による記述になります。
途中で改行を入れることはできません。
※説明文の表示時に改行を入れたい場合は、改行したい位置に\nを入れます。
※説明文の表示にカンマを含む場合は、その言語の部分の文全てをダブルクォーテーションで囲む必要があります。

 

内容はアイテム名やアイテムの説明文、クエストの説明文になります。
アイテムの説明文のKeyは、アイテム名のKeyの後ろにDescを付けます。しかし、items.xml内で当該アイテムに DescriptionKey プロパティを特別に設定した場合はこの限りではありません。

 

各言語の部分はenglish以外は省略でき、その場合は英語の記述が引用されます。
カンマは省略できません。

 

詳しくはオリジナルのLocalization.txtを参考にしてください。

アイテムアイコン

詳しくは、アイコン追加

Asset

余談

Modletとは、ゲームに変更を加えるMODと、小さい○○という意味をもつ接尾辞-letを合わせた造語です。
必要最小限の変更で済み、同じXMLを異なるMOD同士が同時に書き換えることができることから、Forumメンバーによってこのような呼称が広まりました。

リンク

https://7daystodie.com/forums/showthread.php?93816-XPath-Modding-Explanation-Thread
https://7daystodie.com/forums/showthread.php?99279-XPath-Error-Checking
https://7daystodie.com/forums/showthread.php?97419-Vanilla-Asset-Bundle-Loading-Hooks
http://www.edankert.com/xpathfunctions.html