Kituneike_siro どうも!
その機能欲しいですよね。
でも残念ながら、現状アイテムとmobの追加機能はデータパックにはありません。
逆に言うと、それが自由に可能なMODがいかに強いかがよく分かりますね。
ただ、一応工夫して疑似的に実装することは不可能ではありません。
せっかくなので簡単な工夫例を説明しますね。
mobの工夫例
ゾンビorスケルトンの装備をカスタマイズする!
これらのmobは比較的装備が自由にできます。
これはデータパック以前の創作マップで一番使われている手法でしょう。
強化mobや亜種を作る一番簡単な方法ですね。
summon minecraft:zombie ~ ~ ~ {HandItems:[{id:"minecraft:iron_axe",Count:0b},{}]}
これは鉄の斧を持ったゾンビを召喚するコマンドです。
summon minecraft:skeleton ~ ~ ~ {ArmorItems:[{},{},{id:"minecraft:diamond_chestplate",Count:0b},{}]}
これはダイヤのチェストプレートを装備したスケルトンを召喚するコマンドです。
詳細はエンティティのNBTタグでHandItemsやArmorItemsを調べてみてください。
Minecraft Japan Wiki は完全な最新情報ではありませんが一番分かりやすいと思います。
フライシェンでは頭にスイカブロックを装備した敵なんかが現れてましたね。
頭に関してはブロックもOKだったはずです(ドロッパーなんか顔っぽい)。
とにかく、外観を変えて別のmobと思わせることで代用しているというイメージですね。
ジョッキーにする!
チキンジョッキーみたいなものはコマンドで自由に作ることができます。
summon minecraft:spider ~ ~ ~ {Passengers:[{id:"minecraft:creeper"}]}
こうするとクリーパーを背負ったクモが召喚されます。
まあ、これだけだと単に風変りなだけなんで、装備やエフェクトを追加することが多いです。
summon minecraft:spider ~ ~ ~ {ActiveEffects:[{Id:14b,Amplifier:0b,Duration:1000000,ShowParticles:false}],Passengers:{{id:"minecraft:creeper",ActiveEffects:[{Id:14b,Amplifier:0b,Duration:1000000,ShowParticles:false}]}}}
こうするとかなり凶悪なmobができますね。
両方透明化しているので、クモの目だけしか見えない…。
単なる透明クモだと思って戦っていると自爆でドカン…。
耐火能力を付けてブレイズの上に矢を放つストレイを乗せるのも結構エグいかもしれません。
これは組み合わせで工夫するパターンですね。
エンティティにタグを付与する!
意外と忘れられがちなのですが、エンティティには「タグ」というものを付けることができます。
summon minecraft:zombie ~ ~ ~ {Tags:["mytag_wizard"]}
summon minecraft:creeper ~ ~ ~ {Tags:["mytag_wizard"]}
こうすると召喚されるゾンビやクリーパーには "mytag_wizard" というエンティティタグが付きます。
そして以下のようにすると "mytag_wizard" のタグを持つエンティティだけを選んでコマンドを実行できます。
execute as @e[tag=mytag_wizard] run function mydatapack:power_up
こういう風にすれば "mytag_wizard" を持つエンティティが
「周囲のプレイヤー以外のmobをパワーアップさせる魔法を使う」
というような仕組みをデータパックで実装することも夢ではありません。
何しろ特定のタグを持つmobに絞って自由にコマンド実行出来ちゃうので!
このような手法は配布マップのボスなどに使われたものと同様の考え方だと思います。
上記2つと組み合わせるとさらに効果的ですね。ちょっと大変ですけど。
アイテムの工夫例
AttributeModifiers を利用して性能をカスタム!
これはかなり有名な仕組みです。
AttributeModifiers は本来持つアイテムの性能に+αするNBTタグです。
give @s minecraft:diamond_chestplate{display:{Name:'{"text":"Gravity Chestplate"}'},AttributeModifiers:[{AttributeName:"generic.knockbackResistance",Name:"generic.knockbackResistance",Amount:1,Operation:0,UUIDLeast:739773,UUIDMost:893769,Slot:"chest"}]} 1
これだとノックバックを全部ブロックしてくれます。まさに対エンドラの鎧ですね。
詳細は「Minecraft AttributeModifiers」で検索すると良い解説ページがゴロゴロ出てきます。
ただ、便利な仕組みなんですが、記述がかなり複雑です。
実際使うときはMCStackerを利用することをお勧めします!
独自の名称を書き込んだアイテムを作る!
残念なことに、エンティティにはエンティティタグがあるのですが、
アイテムには同様のアイテムタグというものは存在しません。
ただ、Name(アイテムの名前)やLore(アイテムの説明文)については
何とコマンドである程度判別することができます!
【Nameの例】
give @s enchanted_book{display:{Name:"{\"text\":\"Magic Book\"}"}} 1
このコマンドで「Magic Book」という名前のエンチャントの本が手に入ります。
execute as @s[nbt={SelectedItem:{tag:{display:{Name:"{\"text\":\"Magic Book\"}"}}}}] run function mydatapack:magic
これで「Magic Book」という名前のアイテムをメインハンドに持っている時に mydatapack:magic が発動します。
【Loreの例】
give @s iron_sword{display:{Lore:["{\"text\":\"mydatapack:poison\"}"]}} 1
このコマンドで「mydatapack:poison」という説明文の鉄の剣が手に入ります。
execute as @s[nbt={SelectedItem:{tag:{display:{Lore:["{\"text\":\"mydatapack:poison\"}"]}}}}] run function mydatapack:poison_magic
これで「mydatapack:poison」という説明文のアイテムをメインハンドに持っているときに mydatapack:poison_magic が発動します。
流石にアイテムの外観をオリジナルデザインにすることはできませんが、
このようにして独自のアイテムを疑似的に生み出すことは可能です。
一見Nameの方が分かりやすいですが、Loreの方が強力です。
理由は以下のようなことができるからです。
【取得】
#毒+鈍足魔法の本
give @s enchanted_book{display:{Lore:["{\"text\":\"mydatapack:poison\"}","{\"text\":\"mydatapack:slowness\"}"]}} 1
【実行】
#毒魔法発動
execute as @s[nbt={SelectedItem:{tag:{display:{Lore:["{\"text\":\"mydatapack:poison\"}"]}}}}] run function mydatapack:poison_magic
#鈍足魔法発動
execute as @s[nbt={SelectedItem:{tag:{display:{Lore:["{\"text\":\"mydatapack:slowness\"}"]}}}}] run function mydatapack:slowness_magic
これで毒魔法と移動速度低下魔法が同時に発動できる魔法の本というのも実装可能です。
Loreは複数行書いてもOKな上にどの行に書いていても感知できるのが長所です!
短所は「NameやLoreの記述がバージョン毎に異なる」点ですね…。
ここでの記述例は1.15なので、対応がそれより低いバージョンでは要注意です。
このように工夫していけば疑似的に独自のmobやアイテムを実装することは不可能ではありません。
まあ、正直な所「もっと楽に実装できるようになって欲しい…」ってのが本音ですが。
最後に、上記の方法で生み出した要素をどのようにワールドに埋め込むかという話をしますね。
独自のmobをワールドに自然スポーンさせたい!
これはデータパックの醍醐味ですね。固定配置では配布マップっぽくなってしまうので。
簡単に解決するならmobを差し替えるのが一番です。
例えばゾンビソルジャーを作ってワールドに自然スポーンさせたい場合、
毎ティックでエンティティタグを全く持たないゾンビが存在するかチェックします。
【function minecraft:tick】
#エンティティタグを持たないゾンビ全てに function mydatapack:summon_zombie_soldier を実行
execute as @e[type=zombie,tag=] run function mydatapack:summon_zombie_soldier
そのようなゾンビがいた場合、そのゾンビの位置にゾンビソルジャーを召喚して、元のゾンビはその場で破壊!
【function mydatapack:summon_zombie_soldier】
#ゾンビソルジャー召喚(タグのないゾンビがチェック対象なのでTags指定必須!)
execute at @s run summon minecraft:zombie ~ ~ ~ {Tags:["mytag_zombie_soldier"],...}
#元のゾンビを破壊
kill @s
「あれ?これじゃ全てのゾンビがゾンビソルジャーになってしまうのでは?」
その通りです。ゾンビソルジャーをレアスポーンにする場合はもう一工夫必要です。
1.15で追加されたpredicateを使うと簡単な確率を実装できます。
predicateはloot_tableで利用されていた条件判定をコマンドなどでも流用できる仕組みです。
mobのアイテムドロップは簡単な確率判定が行われていたので、
predicateで流用すればコマンド上で確率判定ができるというわけなんですよ。
【20%の確率で成功 (datapacks/mydatapack/data/mydatapacks/predicate/020percent.json)】
{
"condition": "minecraft:random_chance",
"chance": 0.20
}
この「020percent」というpredicateは以下のようにして確率判定ができます。
execute if predicate mydatapack:020percent run ...
これを利用すると先ほどのコードは以下のようにすることができそうです。
【function minecraft:tick】
#エンティティタグを持たないゾンビ全てに function mydatapack:initialize_zombie を実行
execute as @e[type=zombie,tag=] run function mydatapack:initialize_zombie
【function mydatapack:initialize_zombie】
#まずはエンティティタグを付けておく(エンティティタグを持たないゾンビを毎ティックに全チェックしてしまうから)
tag @s add mytag_zombie
#20%の確率でゾンビソルジャー召喚処理
execute if predicate mydatapack:020percent run function mydatapack:summon_zombie_soldier
【function mydatapack:summon_zombie_soldier】
#ゾンビソルジャー召喚(タグのないゾンビがチェック対象なのでTags指定必須!)
execute at @s run summon minecraft:zombie ~ ~ ~ {Tags:["mytag_zombie_soldier"],...}
#元のゾンビを破壊
kill @s
どうでしょう?これで20%の確率でレアスポーンするゾンビソルジャーが実装できるはずです。
独自のアイテムをワールドに埋め込むには?
これは現在loot_tableが一番簡単です。
要するにmobのドロップやチェストを弄ってそこから入手するようにするわけですね。
【1.15での記述例】
loot_tableはバージョンが上がる毎に記述が変化しているので、
対応バージョンに適した記述を調べることをお勧めします。
"type": "minecraft:chest",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "minecraft:enchanted_book",
"functions": [
{
"function": "minecraft:set_name",
"name": {"text":"Magic Book"}
},
{
"function": "minecraft:set_lore",
"lore": [{"text":"mydatapack:poison"},{"text":"mydatapack:slowness"}]
}
]
}
]
}
]
}
データパックにはカスタムレシピもあるのですが、
残念ながら何の追加効果も持たないアイテムしか生み出せないので、
今回の独自のアイテムを対象にすることは不可能です。
後は何らかの方法でコマンドを誘発させる事ができればgiveやlootコマンドから入手できます。
ただ、どうやって誘発させるかは本当に人それぞれなので、
文章量もすごいことになっていることもあるので、今回はちょっと割愛しますね。
こんな感じでどうでしょうか?
まとめると
「mobやアイテムの追加はできない」
「でも先人たちの知恵を総動員すれば工夫次第で疑似的に何とかなりそう」
と言った具合です!
コマンド表記に誤植などあったらすみません。よろしくお願いします!