マケプレ、著書等あったりします!!

【JEコマンド講習会】第13回、データパックで魔法でも作ってみようか【マインクラフト】

ようこそぷっこ村へ、ししゃもだよ。

(・∀・)ノ

やってまいりました、コマンド講習会第13回。今回はねぇ、前回コマンドブロックで作ったのとまったく同じ魔法を、データパックで作るとどうなるか?ってのをやってみようと思いまーす。

さぁて、今回は文字ばっかりだし、あっちこっち飛ぶし、どうなることやら楽しみだね!!

教材のダウンロードはこちらから

今回使うデータパックはこちらをクリックしてダウンロードしてね

データパックで魔法を作る

内容は前回と一緒です。なんでリンゴもっとったら雷が出るん?とか思うけど直しません!!あくまで同じモノを作るとどうなるか?を見ていきます。メンドイからじゃねーし。

内容のおさらいですが

  • 使える魔法は2種
  • 魔法使用時MPを10消費
  • MPは徐々に自然回復
  • 魔法を使うには右手に魔法の杖(名前付きニンジン棒)、左手に特定アイテムを持つ

となってます。デタパはあらゆるファイルが連携して動くので、ちょっとゴチャゴチャしますが、ゆっくり見ていけばきっと大丈夫!!(適当)

構成の把握

まずは全体の構成を図で把握しましょう。

上記のようになっています、分かりにくくてサーセン。第4回でどのフォルダやファイルがどのように働いてくれるのか、は解説しているので、ここでは初歩的な部分は省いて必要な部分をもうすこし掘り下げていくようにします。

使うコマンド

まずはいつも通り全体のコマンドを見てみます。

scoreboard objectives add MP dummy
scoreboard objectives add Cool_Timer dummy
scoreboard objectives add Use_Wand minecraft.used:minecraft.carrot_on_a_stick

scoreboard objectives setdisplay sidebar MP
schedule function m_t:functionlib/loop_2s 23t

下準備用

scoreboard players set @s MP 0

初参加時にのみ実行されるやつ

execute as @a[scores={Use_Wand=1..},predicate=m_t:have_m_wand,tag=!Cooldown] run function m_t:magic/determine_magic

scoreboard players reset @a Use_Wand
execute as @a[tag=Cooldown] at @s run function m_t:magic/timer_cooldown

メインでループするやつ

execute if entity @s[scores={MP=..9}] run title @s actionbar {"text":"MPは10以上必要だ!!","color":"#ff0000"}
execute at @s[scores={MP=10..},predicate=m_t:have_apple] run summon lightning_bolt ^ ^ ^5
execute at @s[scores={MP=10..},predicate=m_t:have_firework] run firework_rocket ^ ^1 ^5 {LifeTime:30,FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Flight:2,Explosions:[{Type:1,Flicker:1,Trail:1,Colors:[I;11743532],FadeColors:[I;15435844]}]}}}}
tag @s[scores={MP=10..}] add Cooldown
scoreboard players remove @s[scores={MP=10..}] MP 10

魔法使用時用

scoreboard players add @s Cool_Timer 1
tag @s[scores={Cool_Timer=100..}] remove Cooldown
scoreboard players reset @s[scores={Cool_Timer=100..}] Cool_Timer

クールダウン用

scoreboard players add @a MP 1
schedule function m_t:functionlib/loop_2s 2s

MP自然回復用

1つ目のくくり、下準備

scoreboard objectives add MP dummy
scoreboard objectives add Cool_Timer dummy
scoreboard objectives add Use_Wand minecraft.used:minecraft.carrot_on_a_stick

scoreboard objectives setdisplay sidebar MP
schedule function m_t:functionlib/loop_2s 23t

必要なスコアボードを作成します。このくくりは Magic_Test/data/minecraft/tags/functions/load.json で指定し、ワールド起動時に一度だけ実行されます。

schedule コマンドで 23tick 後に m_t:functionlib/loop_2sを実行します。ループする遅延実行は後々増えた時のために、素数にしとくとええんちゃう?と思ってます。

2つ目のくくり、初参加時にのみ実行されるやつ

scoreboard players set @s MP 0

こちらは実績に絡めて、各プレイヤーが初参加時にのみ実行されます。MPの自然回復に上限を設けたい場合、

scoreboard players add @a[scores={MP=..100}] MP 1

などとしますが、値がない場合は比較の対象外となり、MPが加算されません。なので、一度だけ値を0に設定する必要があります。今回はいらなかったのに作っちゃった、テヘペロ。

3つ目のくくり、メインループ

execute as @a[scores={Use_Wand=1..},predicate=m_t:have_m_wand,tag=!Cooldown] run function m_t:magic/determine_magic

scoreboard players reset @a Use_Wand
execute as @a[tag=Cooldown] run function m_t:magic/timer_cooldown

メインで毎tickループ実行されます。なんと3行だけ。2行でもできなくはないよ。

predicate は第4回で解説しましたので、概要はそちらを参照オナシャス。m_t:have_m_wand の細かい内容は後述しますが、とりあえず右手に魔法の杖を持ってるかって内容になってます。

  • 1行目、ニンジン棒を使用しており、右手に魔法の杖を持っており、Cooldown タグを持たないプレイヤーを実行者として、m_t:magic/determine_magic を実行します。
  • 2行目、Use_Wandをリセットします。ここは m_t:magic/determine_magic に移してもいいかもしれない。
  • 3行目、クールダウンタグのあるプレイヤーを実行者にしてm_t:magic/timer_cooldown を実行します

4つ目のくくり、魔法使用時用

execute if entity @s[scores={MP=..9}] run title @s actionbar {"text":"MPは10以上必要だ!!","color":"#ff0000"}
execute at @s[scores={MP=10..},predicate=m_t:have_apple] run summon lightning_bolt ^ ^ ^5
execute at @s[scores={MP=10..},predicate=m_t:have_firework] run firework_rocket ^ ^1 ^5 {LifeTime:30,FireworksItem:{id:firework_rocket,Count:1,tag:{Fireworks:{Flight:2,Explosions:[{Type:1,Flicker:1,Trail:1,Colors:[I;11743532],FadeColors:[I;15435844]}]}}}}
tag @s[scores={MP=10..}] add Cooldown
scoreboard players remove @s[scores={MP=10..}] MP 10

魔法を使った時に1度実行されます。デタパのいい所が詰まった大事な部分なので詳しく解説します。

  • 1行目、MPが足りなかった時に警告を出します。@s になってますが、ここがデタパの面白い所です。第4回でもやりましたが、デタパはfunctionコマンドで実行者を引き継げるので、メインのセレクタで判定した@a[scores={Use_Wand=1..},predicate=m_t:have_m_wand,tag=!Cooldown]がそのまま引き継がれてます。なのでここでの

    @s[scores={MP=..9}] = @a[scores={Use_Wand=1..},predicate=m_t:have_m_wand,tag=!Cooldown,scores={MP=..9}]

    が成り立ちます。
  • 2行目、左手にリンゴを持っている場合雷が落ちます。predicate=m_t:have_apple は後述
  • 3行目、同上
  • 4行目、Cooldownタグを付けます。
  • 5行目、MPを10減らします。

コマブロメイクの時とは違いMPを魔法ごとに減らすのは超楽ちんで

scoreboard players remove @s[scores={MP=10..},predicate=m_t:have_apple] MP 5
scoreboard players remove @s[scores={MP=10..},predicate=m_t:have_firework] MP 10

とかでできます。タグ要らずでできるので行数は少ないし、見た目はキレイし、いいことづくめだね。設計段階で整えておけばもっとキレイにできたりしますよ。

5つ目のくくり、クールダウン用

scoreboard players add @s Cool_Timer 1
tag @s[scores={Cool_Timer=100..}] remove Cooldown
scoreboard players reset @s[scores={Cool_Timer=100..}] Cool_Timer

こちらはクールダウン用ですね。全体に@s が散りばめられていますが、理屈は4つ目のくくりと同じです。ここでは

@s = @a[tag=Cooldown]

です。

6つ目のくくり、MP自然回復用

scoreboard players add @a MP 1
schedule function m_t:functionlib/loop_2s 2s

こちらはMPを自然回復させるためのコマンド群です。最初の実行は init.mcfunction で実行され、以降 schedule コマンドで2秒ごとに実行されます。

プレディケート & 実績

今回使うプレディケートと実績を見ていきます。

実績

{
  "criteria": {
    "enter": {
      "trigger": "minecraft:location"
    }
  },
  "rewards": {
    "function": "m_t:magic/init_mp"
  }
}

この実績は、2つ目のくくりを実行するためにあります。初参加時に強制的に解除され、rewards にある m_t:magic/init_mp を実行します。実績は解除者が実行者になるので@s が使えますよ。便利!

実績はゲーム内で使われているような、解除して楽しむのものとは別に、コマンドを実行するためのトリガーとして使うこともできます。

プレディケート

{
  "condition": "minecraft:entity_properties",
  "entity": "this",
  "predicate": {
    "equipment": {
      "mainhand": {
        "nbt": "{ItemName:M_Wand}"
      }
    }
  }
}
{
  "condition": "minecraft:entity_properties",
  "entity": "this",
  "predicate": {
    "equipment": {
      "offhand": {
        "items": [
          "minecraft:apple"
        ]
      }
    }
  }
}
{
  "condition": "minecraft:entity_properties",
  "entity": "this",
  "predicate": {
    "equipment": {
      "offhand": {
        "items": [
          "minecraft:firework_rocket"
        ]
      }
    }
  }
}

今回のプレディケートです。ほぼ一緒なのですが、mainhand、offhand、の違いがありますね。そうです、右手か左手か?の違いですね。このように事前に準備しておくことで、セレクタでの predicate= が使えるようになるんですね。フォルダ分けも可能ですよ。

プレディケートはできることがメチャクチャ多いですが、大事なのは「あるの時点での状態を判定するためにある」と覚えておくと、こんなことできるかな?ってのを調べるのに便利じゃないかなと思います。

状態ってのはプレイヤーに限らず、敵とか村人とかでもいけます。天気や時間、装備品や特定のブロックの上に立っているか、など、割と何でも判定できるので、できることの幅が物凄く広がります。

実績、プレディケートは、一気に理解するのは無理なので少しずつ覚えていきましょう。これで一通り完成です!

まとめ

今回 @s の強力さがよく出ている構成になっていると思います。デタパは準備がちょっと大変だけど、後が楽なのでおススメです。

細かく解説を入れなかったファイルがありますが、それらは第4回で解説しています。これなんだっけ?って箇所はそちらを参照してみて下さい。

てなわけで、データパックで魔法を作ってみる、はいかがだったでしょうか?自分なりの魔法を増やしてみたら面白いよねー。それではこの辺で、お帰りの際はお気を付けて―(・∀・)ノシ

コメント