[Mod作成]ワールドへコレクションアイテムを配置し、コレクションする

Mod作成

内容

今回の内容は、XのDMにて「こういうの作れないか」とありがたいことにご要望頂いた内容に対して実際に作ってみようのコーナーです。

基礎的な事を書き超えた後若干燃え尽きていたのでこういう要望頂けるのはありがたいですね。
今後も何かXのリプライなりDMなり、(使えるのか不明ですが)ここのコメント機能なんかでこういうの作れますか?的なのが来たら随時できそうならやっていこうと思います。

お品書き

今回のフェーズは以下の通りです。

  • ワールドに設置するブロックの作成
  • コレクション品として登録する側の用意
  • 配置したブロックを拾ったときのアイテムの作成
  • ワールドに配置

上記4工程で進めていきます。

ワールドに設置するブロックの作成

まず、設置するブロックを作成します。
今回の実践では見た目で分かりやすくするために、ブロックの見た目を「プレイヤー自販機」に変えています。適宜自分の好きなモデルへ変えてください。
(ブロックの見た目の変更は、blocks.xml内を(<property name=”Model” value=)で検索掛けると色々使われているモデルの情報が出てくるので、value値をコピーしてそのまま下記の部分に書き換えてください

[blocks.xml]
    <append xpath="blocks">
        <block name="RSM_CollectionBlock_1">
            <property name="Extends" value="rock01"/>
            <property name="CreativeMode" value="Dev"/>
            <property name="TintColor" value="FF0000"/>
            <property name="Model" value="@:Entities/LootContainers/mailBox_01Prefab.prefab"/>
        <property name="CanPickup" value="true" param1="RSM_CollectionItem_1"/>
    </append>

これで1ブロック分となります。今回はコレクションとして7つ用意するので、後7個分もコピペしてちょちょっと変えて作ります。

[blocks.xml]
    <append xpath="blocks">
        <block name="RSM_CollectionBlock_1">
            <property name="Extends" value="rock01"/>
            <property name="CreativeMode" value="Dev"/>
            <property name="TintColor" value="FF0000"/>
            <property name="Model" value="@:Entities/LootContainers/mailBox_01Prefab.prefab"/>
            <property name="CanPickup" value="true" param1="RSM_CollectionItem_1"/>
        </block>
        <block name="RSM_CollectionBlock_2">
            <property name="Extends" value="rock01"/>
            <property name="CreativeMode" value="Dev"/>
            <property name="TintColor" value="00FF00"/>
            <property name="Model" value="@:Entities/LootContainers/mailBox_01Prefab.prefab"/>
            <property name="CanPickup" value="true" param1="RSM_CollectionItem_2"/>
        </block>
        <block name="RSM_CollectionBlock_3">
            <property name="Extends" value="rock01"/>
            <property name="CreativeMode" value="Dev"/>
            <property name="TintColor" value="0000FF"/>
            <property name="Model" value="@:Entities/LootContainers/mailBox_01Prefab.prefab"/>
            <property name="CanPickup" value="true" param1="RSM_CollectionItem_3"/>
        </block>
        <block name="RSM_CollectionBlock_4">
            <property name="Extends" value="rock01"/>
            <property name="CreativeMode" value="Dev"/>
            <property name="TintColor" value="FFFF00"/>
            <property name="Model" value="@:Entities/LootContainers/mailBox_01Prefab.prefab"/>
            <property name="CanPickup" value="true" param1="RSM_CollectionItem_4"/>
        </block>
        <block name="RSM_CollectionBlock_5">
            <property name="Extends" value="rock01"/>
            <property name="CreativeMode" value="Dev"/>
            <property name="TintColor" value="00FFFF"/>
            <property name="Model" value="@:Entities/LootContainers/mailBox_01Prefab.prefab"/>
            <property name="CanPickup" value="true" param1="RSM_CollectionItem_5"/>
        </block>
        <block name="RSM_CollectionBlock_6">
            <property name="Extends" value="rock01"/>
            <property name="CreativeMode" value="Dev"/>
            <property name="TintColor" value="FF00FF"/>
            <property name="Model" value="@:Entities/LootContainers/mailBox_01Prefab.prefab"/>
            <property name="CanPickup" value="true" param1="RSM_CollectionItem_6"/>
        </block>
        <block name="RSM_CollectionBlock_7">
            <property name="Extends" value="rock01"/>
            <property name="CreativeMode" value="Dev"/>
            <property name="TintColor" value="FFFFFF"/>
            <property name="Model" value="@:Entities/LootContainers/mailBox_01Prefab.prefab"/>
            <property name="CanPickup" value="true" param1="RSM_CollectionItem_7"/>
        </block>
    </append>

取得アイテム名と、ブロック名を変えて増やしました。


各プロパティがどういう意味なのかを、以下に軽く説明します。

Property: Extends

Extendsは、別のXmlを引き継いで(継承)使用する という意味があります。

今回の例では、「rock01」というブロックを引き継いで新規ブロックを作成しています。
(rock01 は、どういうブロックかというと、その辺に落ちている拾える小石です)

1からすべて書くのは手間なので基本的に元となったブロックを使いまわすことが多いです。

Property: CreativeMode

この項目は、クリエイティブモードで表示させるかどうかを設定できます。
valueの設定値は以下の通り

  • Dev: クリエイティブメニュー(開発モードON)で表示可能
  • Player:クリエイティブメニューでデフォルトで表示可能
  • None:クリエイティブメニューで表示なし

特に支障がなければ「Player」でも問題ありません。

※クリエイティブメニューとは、クリエイティブ状態で(U)キー押下で表示されるメニューです

TintColor

モデルの色を指定できます。
ただし、できないブロックが結構多いので出来たらラッキーです。

Property: Model

モデルは、ブロックの見た目に使用するアセットデータへのパスを指定します。

大抵のブロックに記述されているので、気に入った見た目のブロックの名前を調べてそのブロックに適用されているデータをコピペして使う事が多いです。

Property: CanPickup

このプロパティの「value」を「true」で設定すると、そのブロックを拾えるようになります。
拾った際に取得するアイテムは、「param1」に設定します。

今回は、次項で作成するコレクションへの登録用アイテムの名前を適用しています。

コレクション品として登録する側の用意

次に、コレクションブックの受け入れ先を作成します。

追加する先は、書籍の欄に追加します。

今回は「コレクション」という名前で登録していきます。
(名前等は好きに変えられるのでまずは例の通りに作ります)

[progression.xml]

    <append xpath="progression/skills">
    	<book_group name="skillRSMCollection" parent="attBooks" name_key="skillRSMCollection" desc_key="skillRSMCollectionDesc" long_desc_key="skillRSMCollectionLongDesc" icon="ui_game_symbol_treasure"><effect_group/></book_group>
    </append>

まずは、側を作ります。画像で言うの部分です。
パークや書籍に関しては、正直詳しい説明よりも、こういうテンプレートを使って作る と認識した方が変に混乱することもないので一旦上記をコピペしてみてください。

次に、②の部分を作ります。(長いです)

[progression.xml]
    <append xpath="progression/perks">
        <book name="perkRSMbookCollectionItem1" parent="skillRSMCollection" max_level="1" base_skill_point_cost="0" desc_key="perkRSMbookCollectionItem1Desc" long_desc_key="perkRSMbookCollectionItem1LongDesc">
            <effect_group>
                <!-- 攻撃力1%増加 -->
                <passive_effect name="EntityDamage" operation="perc_add" value="0.01"/>
            </effect_group>
        </book>
        <book name="perkRSMbookCollectionItem2" parent="skillRSMCollection" max_level="1" base_skill_point_cost="0" desc_key="perkRSMbookCollectionItem2Desc" long_desc_key="perkRSMbookCollectionItem2LongDesc">
            <effect_group>
                <!-- 攻撃力1%増加 -->
                <passive_effect name="EntityDamage" operation="perc_add" value="0.01"/>
            </effect_group>
        </book>
        <book name="perkRSMbookCollectionItem3" parent="skillRSMCollection" max_level="1" base_skill_point_cost="0" desc_key="perkRSMbookCollectionItem3Desc" long_desc_key="perkRSMbookCollectionItem3LongDesc">
            <effect_group>
                <!-- 攻撃力1%増加 -->
                <passive_effect name="EntityDamage" operation="perc_add" value="0.01"/>
            </effect_group>
        </book>
        <book name="perkRSMbookCollectionItem4" parent="skillRSMCollection" max_level="1" base_skill_point_cost="0" desc_key="perkRSMbookCollectionItem4Desc" long_desc_key="perkRSMbookCollectionItem4LongDesc">
            <effect_group>
                <!-- 攻撃力1%増加 -->
                <passive_effect name="EntityDamage" operation="perc_add" value="0.01"/>
            </effect_group>
        </book>
        <book name="perkRSMbookCollectionItem5" parent="skillRSMCollection" max_level="1" base_skill_point_cost="0" desc_key="perkRSMbookCollectionItem5Desc" long_desc_key="perkRSMbookCollectionItem5LongDesc">
            <effect_group>
                <!-- 攻撃力1%増加 -->
                <passive_effect name="EntityDamage" operation="perc_add" value="0.01"/>
            </effect_group>
        </book>
        <book name="perkRSMbookCollectionItem6" parent="skillRSMCollection" max_level="1" base_skill_point_cost="0" desc_key="perkRSMbookCollectionItem6Desc" long_desc_key="perkRSMbookCollectionItem6LongDesc">
            <effect_group>
                <!-- 攻撃力1%増加 -->
                <passive_effect name="EntityDamage" operation="perc_add" value="0.01"/>
            </effect_group>
        </book>
        <book name="perkRSMbookCollectionItem7" parent="skillRSMCollection" max_level="1" base_skill_point_cost="0" desc_key="perkRSMbookCollectionItem7Desc" long_desc_key="perkRSMbookCollectionItem7LongDesc">
            <effect_group>
                <!-- 攻撃力1%増加 -->
                <passive_effect name="EntityDamage" operation="perc_add" value="0.01"/>
            </effect_group>
        </book>
        <book name="perkRSMbookCollectionItemComplete" parent="skillRSMCollection" max_level="1" base_skill_point_cost="0" desc_key="perkRSMbookCollectionItemCompleteDesc" long_desc_key="perkRSMbookCollectionItemCompleteLongDesc">
            <effect_group>
                <!-- 攻撃力10%増加 -->
                <passive_effect name="EntityDamage" operation="perc_add" value="0.1"/>
            </effect_group>
        </book>
    </append>

1つ1つは短く書きましたが、1~7(+コンプ報酬分)あるのでかさばっています。
内役としては、各コレクション1つ取得する度に攻撃力が+1%されます。
そしてコンプリートすると追加で攻撃力が+10%されます。

bookタグについては、いくつか説明できる属性があるので簡潔に説明すると

  • parent: ①で作成した「book_group」タグの「name」属性を指定します。
  • max_level: 基本的に書籍の場合はレベルという概念はなく、読んだか読んでないかでしかない為、ここは1固定で問題ないです。
    本以外のパーク等の場合は、そのまま最大レベルを指定することができます。
  • base_skill_point_cost: ここも書籍の場合は0固定です。パーク等の場合レベルを1つ上げるのに必要なポイントを指定します。

次に、各ブロックの説明をします。

  • ①:skillRSMCollection
  • ②:「book_group」タグの「icon」属性に指定されたアイコン画像
  • ③:skillRSMCollectionDesc
  • ④:perkRSMbookCollectionItem(1~7,Complete)LongDesc
  • ⑤:perkRSMbookCollectionItem(1~7,Complete)Desc
[Localization.txt]
Key,English,Japanese
skillRSMCollection,Collections,コレクション
skillRSMCollectionDesc,Collections Desc,各地に散らばったコレクションです。
skillRSMCollectionLongDesc,Collections Long Desc,各地に散らばったコレクションを集めよう!
perkRSMbookCollectionItem1,Collection1,コレクション1
perkRSMbookCollectionItem2,Collection2,コレクション2
perkRSMbookCollectionItem3,Collection3,コレクション3
perkRSMbookCollectionItem4,Collection4,コレクション4
perkRSMbookCollectionItem5,Collection5,コレクション5
perkRSMbookCollectionItem6,Collection6,コレクション6
perkRSMbookCollectionItem7,Collection7,コレクション7
perkRSMbookCollectionItemComplete,CollectionComplete,コレクションコンプリート
perkRSMbookCollectionItem1Desc,Collection1,コレクション1です
perkRSMbookCollectionItem2Desc,Collection2,コレクション2です
perkRSMbookCollectionItem3Desc,Collection3,コレクション3です
perkRSMbookCollectionItem4Desc,Collection4,コレクション4です
perkRSMbookCollectionItem5Desc,Collection5,コレクション5です
perkRSMbookCollectionItem6Desc,Collection6,コレクション6です
perkRSMbookCollectionItem7Desc,Collection7,コレクション7です
perkRSMbookCollectionItemCompleteDesc,CollectionComplete,コレクションコンプリートしたよ
perkRSMbookCollectionItem1LongDesc,Collection1,コレクション1の説明文です。\n長いです
perkRSMbookCollectionItem2LongDesc,Collection2,コレクション2の説明文です。\n長いです
perkRSMbookCollectionItem3LongDesc,Collection3,コレクション3の説明文です。\n長いです
perkRSMbookCollectionItem4LongDesc,Collection4,コレクション4の説明文です。\n長いです
perkRSMbookCollectionItem5LongDesc,Collection5,コレクション5の説明文です。\n長いです
perkRSMbookCollectionItem6LongDesc,Collection6,コレクション6の説明文です。\n長いです
perkRSMbookCollectionItem7LongDesc,Collection7,コレクション7の説明文です。\n長いです
perkRSMbookCollectionItemCompleteLongDesc,CollectionComplete,コレクションコンプリートしました。\n長いです

だいぶ長くなりましたが、上記が今回のコレクション関係で使用した文字列一覧です。
内容を書き換える際は、上記の日本語の部分を好きな文字に入れ替えてください。

配置したブロックを拾ったときのアイテムの作成

次に、ブロックを拾った際に手元に入るアイテムを作成します。
このアイテムは、使用することで前項で作成したコレクションへ登録するためのアイテムとなります。

    <append xpath="items">
        <item name="RSM_CollectionItem_1">
            <property name="Extends" value="schematicMaster"/>
            <property name="CustomIcon" value="bookFiremansAlmanacHeat"/>
            <property name="CustomIconTint" value="FF0000"/>
            <property name="DescriptionKey" value="RSM_CollectionItem_1Desc"/>
            <effect_group tiered="false">
                <!-- ※1 -->
                <requirement name="ProgressionLevel" progression_name="perkRSMbookCollectionItem1" operation="Equals" value="0"/>
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItem1" level="-1"/>

                <!-- ※2 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItemComplete" level="-1">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>

                <!-- ※3 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="PlaySound" sound="read_skillbook_final" play_in_head="true">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>
            </effect_group>
        </item>
    </append>

ちょっと長いですが、基本的に中身は「schematicMaster」のものをコピペしてきて書き換えているだけです。
以下、※部分について大雑把にどういう処理かだけ記述します。
(ぶっちゃけ筆者もそういうものとしてコピペでしか使ったことないです)

※1
コレクションの1つ目を取得したことにする処理

※2
コレクションが1~7全て読んでいた場合、コンプリート報酬をアクティベートする処理

※3
コンプリートしていた場合、コンプリート音(デーーーーーン)を鳴らす処理

こちらのアイテムが追加されました。
このアイテムを使用すると、先ほど作ったコレクションの1つ目が埋まります。

このアイテムを、残りの2~6分複製して作成します。

    <append xpath="items">
        <item name="RSM_CollectionItem_1">
            <property name="Extends" value="schematicMaster"/>
            <property name="CustomIcon" value="bookFiremansAlmanacHeat"/>
            <property name="CustomIconTint" value="FF0000"/>
            <property name="DescriptionKey" value="RSM_CollectionItem_1Desc"/>
            <effect_group tiered="false">
                <!-- ※1 -->
                <requirement name="ProgressionLevel" progression_name="perkRSMbookCollectionItem1" operation="Equals" value="0"/>
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItem1" level="-1"/>

                <!-- ※2 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItemComplete" level="-1">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>

                <!-- ※3 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="PlaySound" sound="read_skillbook_final" play_in_head="true">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>
            </effect_group>
        </item>
        <item name="RSM_CollectionItem_2">
            <property name="Extends" value="schematicMaster"/>
            <property name="CustomIcon" value="bookFiremansAlmanacHeat"/>
            <property name="CustomIconTint" value="00FF00"/>
            <property name="DescriptionKey" value="RSM_CollectionItem_2Desc"/>
            <effect_group tiered="false">
                <!-- ※1 -->
                <requirement name="ProgressionLevel" progression_name="perkRSMbookCollectionItem2" operation="Equals" value="0"/>
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItem2" level="-1"/>

                <!-- ※2 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItemComplete" level="-1">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>

                <!-- ※3 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="PlaySound" sound="read_skillbook_final" play_in_head="true">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>
            </effect_group>
        </item>
        <item name="RSM_CollectionItem_3">
            <property name="Extends" value="schematicMaster"/>
            <property name="CustomIcon" value="bookFiremansAlmanacHeat"/>
            <property name="CustomIconTint" value="0000FF"/>
            <property name="DescriptionKey" value="RSM_CollectionItem_3Desc"/>
            <effect_group tiered="false">
                <!-- ※1 -->
                <requirement name="ProgressionLevel" progression_name="perkRSMbookCollectionItem3" operation="Equals" value="0"/>
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItem3" level="-1"/>

                <!-- ※2 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItemComplete" level="-1">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>

                <!-- ※3 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="PlaySound" sound="read_skillbook_final" play_in_head="true">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>
            </effect_group>
        </item>
        <item name="RSM_CollectionItem_4">
            <property name="Extends" value="schematicMaster"/>
            <property name="CustomIcon" value="bookFiremansAlmanacHeat"/>
            <property name="CustomIconTint" value="FFFF00"/>
            <property name="DescriptionKey" value="RSM_CollectionItem_4Desc"/>
            <effect_group tiered="false">
                <!-- ※1 -->
                <requirement name="ProgressionLevel" progression_name="perkRSMbookCollectionItem4" operation="Equals" value="0"/>
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItem4" level="-1"/>

                <!-- ※2 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItemComplete" level="-1">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>

                <!-- ※3 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="PlaySound" sound="read_skillbook_final" play_in_head="true">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>
            </effect_group>
        </item>
        <item name="RSM_CollectionItem_5">
            <property name="Extends" value="schematicMaster"/>
            <property name="CustomIcon" value="bookFiremansAlmanacHeat"/>
            <property name="CustomIconTint" value="00FFFF"/>
            <property name="DescriptionKey" value="RSM_CollectionItem_5Desc"/>
            <effect_group tiered="false">
                <!-- ※1 -->
                <requirement name="ProgressionLevel" progression_name="perkRSMbookCollectionItem5" operation="Equals" value="0"/>
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItem5" level="-1"/>

                <!-- ※2 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItemComplete" level="-1">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>

                <!-- ※3 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="PlaySound" sound="read_skillbook_final" play_in_head="true">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>
            </effect_group>
        </item>
        <item name="RSM_CollectionItem_6">
            <property name="Extends" value="schematicMaster"/>
            <property name="CustomIcon" value="bookFiremansAlmanacHeat"/>
            <property name="CustomIconTint" value="FF00FF"/>
            <property name="DescriptionKey" value="RSM_CollectionItem_6Desc"/>
            <effect_group tiered="false">
                <!-- ※1 -->
                <requirement name="ProgressionLevel" progression_name="perkRSMbookCollectionItem6" operation="Equals" value="0"/>
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItem6" level="-1"/>

                <!-- ※2 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItemComplete" level="-1">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>

                <!-- ※3 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="PlaySound" sound="read_skillbook_final" play_in_head="true">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>
            </effect_group>
        </item>
        <item name="RSM_CollectionItem_7">
            <property name="Extends" value="schematicMaster"/>
            <property name="CustomIcon" value="bookFiremansAlmanacHeat"/>
            <property name="CustomIconTint" value="FFFFFF"/>
            <property name="DescriptionKey" value="RSM_CollectionItem_7Desc"/>
            <effect_group tiered="false">
                <!-- ※1 -->
                <requirement name="ProgressionLevel" progression_name="perkRSMbookCollectionItem7" operation="Equals" value="0"/>
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItem7" level="-1"/>

                <!-- ※2 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="SetProgressionLevel" progression_name="perkRSMbookCollectionItemComplete" level="-1">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>

                <!-- ※3 -->
                <triggered_effect trigger="onSelfPrimaryActionEnd" action="PlaySound" sound="read_skillbook_final" play_in_head="true">
                    <requirement name="PerksUnlocked" skill_name="skillRSMCollection" operation="GTE" value="7"/>
                </triggered_effect>
            </effect_group>
        </item>
    </append>
RSM_CollectionItem_1,Collection1,コレクション1
RSM_CollectionItem_2,Collection2,コレクション2
RSM_CollectionItem_3,Collection3,コレクション3
RSM_CollectionItem_4,Collection4,コレクション4
RSM_CollectionItem_5,Collection5,コレクション5
RSM_CollectionItem_6,Collection6,コレクション6
RSM_CollectionItem_7,Collection7,コレクション7
RSM_CollectionItem_1Desc,Collection1 Register,コレクション1を登録します。
RSM_CollectionItem_2Desc,Collection2 Register,コレクション2を登録します。
RSM_CollectionItem_3Desc,Collection3 Register,コレクション3を登録します。
RSM_CollectionItem_4Desc,Collection4 Register,コレクション4を登録します。
RSM_CollectionItem_5Desc,Collection5 Register,コレクション5を登録します。
RSM_CollectionItem_6Desc,Collection6 Register,コレクション6を登録します。
RSM_CollectionItem_7Desc,Collection7 Register,コレクション7を登録します。


これらをすべて使うと、コンプリートまで開放されます。

ワールドに設置

ここまでできれば、あとはワールドに設置するだけとなりました。

こちらも、なんとなく「ここに書けばワールドに配置されるんだなぁ」ぐらいで思って貰えれば問題ありません。
(詳しく知りたい場合は、中身を解析してみてください)

    <!-- 森林 -->
    <append xpath="worldgeneration/biomes/biome[@name='pine_forest']/decorations">
            <decoration type="block" blockname="RSM_CollectionBlock_1" prob="0.01" rotatemax="7"/>
            <decoration type="block" blockname="RSM_CollectionBlock_2" prob="0.01" rotatemax="7"/>
            <decoration type="block" blockname="RSM_CollectionBlock_3" prob="0.01" rotatemax="7"/>
            <decoration type="block" blockname="RSM_CollectionBlock_4" prob="0.01" rotatemax="7"/>
            <decoration type="block" blockname="RSM_CollectionBlock_5" prob="0.01" rotatemax="7"/>
            <decoration type="block" blockname="RSM_CollectionBlock_6" prob="0.01" rotatemax="7"/>
            <decoration type="block" blockname="RSM_CollectionBlock_7" prob="0.01" rotatemax="7"/>
    </append>
    <!-- 砂漠 -->
    <append xpath="worldgeneration/biomes/biome[@name='desert']/decorations"></append>
    <!-- 焼け森 -->
    <append xpath="worldgeneration/biomes/biome[@name='burnt_forest']/decorations"></append>
    <!-- 雪山 -->
    <append xpath="worldgeneration/biomes/biome[@name='snow']/decorations"></append>
    <!-- 荒野 -->
    <append xpath="worldgeneration/biomes/biome[@name='wasteland']/decorations"></append>

今回はテストなので分かりやすく設置されやすく値を盛っています。
使用する際は価を調整してください。

今回は「decoration」タグがメインとなっているので、その属性について軽く説明します。

  • type: どういうものを配置するか。基本はblockでOK
    (block以外だと、prefabを指定することもできます)
  • blockname:設置するブロックの名称
  • prob:設置される確率
    注意しないといけないのが、ここに設定された値は最終的に同じdecorations内に指定されているprobを合算して、その数値の割合がこのブロックの設置確率となります。
  • rotatemax: 回転の種類。今回は7方向に回転します。

probについてはおそらく追加で解説が必要と思うので、以下の例を使って紹介します。

<decorations>
    <decoration type="block" blockname="block1" prob="1" />
    <decoration type="block" blockname="block2" prob="2" />
    <decoration type="block" blockname="block3" prob="3" />
    <decoration type="block" blockname="block4" prob="4" />
    <decoration type="block" blockname="block5" prob="5" />
</decorations>

上記のように設定されているとします。
この場合、合計のprobは、「1+2+3+4+5 = 15」となります。

この合計値から、各ブロックの割合を用いて出現率が算出されます。
上記の例だと

  • block1: 1 / 15 = 0.06 = 6%
  • block2: 2 / 15 = 0.13 = 13%
  • block3: 3 / 15 = 0.2 = 20%
  • block4: 4 / 15 = 0.26 = 26%
  • block5: 5 / 15 = 0.33 = 33%

大体上記のような確率になります(少数を省いているので合計100%になりませんが近似値です)

完成

上記の工程をすべて終えてModletとして導入してみましょう。

導入後、ワールドを生成しなおして森林を探してみると、こんな場所が見つかるはずです。

拾うと各種コレクション開放アイテムが手に入るようになり、機能として完成しました。

余白

今回は、要望頂いた内容に関して実際に作ってみて解説しました。
ぶっちゃけ紹介ネタに困っていたのでこういうのいただけるのは非常にありがたいです。

普段いじらないbiomes.xmlとかも触ることによって色々仕様も知れるしで一石二鳥ですね。

コメント