レッドストーンなしで遅延を作ろう#3 〜プレイヤーの経験値〜【第7回応用コマンド講座】

どうも、執筆担当のとれんさーです。前回は、防具立ての角度を利用した遅延コマンドをご紹介しましたね。まだ読んでいない方はぜひご覧ください。

前回の記事はこちら!

そんな遅延コマンドシリーズも今回で最後…と思いきや!
次回、スコアボードを利用した遅延コマンドをご紹介することになりました!!
1.7にて追加された/scoreboardコマンド。それを使った遅延コマンドも、次回第8回にてご紹介しますよ。

第8回応用コマンド講座はこちら!

さて今回も、レッドストーン回路を使わずに遅延を生み出す機構を紹介していきます。今回もよろしくお願いします!


レッドストーンなしで遅延を作る⁈

全4回

#1 〜mobのHPを利用する〜

上のリンクからぜひお読みください!

#2 〜アマスタの回転を利用する〜

上のリンクからぜひお読みください!

#3 〜プレイヤーの経験値を利用する〜

この記事です

#4 〜プレイヤーのスコアを利用する〜

上のリンクからぜひお読みください!


#3 〜プレイヤーの経験値を利用する〜

経験値を使うメリット・デメリット

今回はプレイヤーの経験値を使った遅延コマンドを紹介していきます。
まずは、今回のメリットデメリットの説明から。

メリット

  • マルチプレイに完全に対応している
  • 遅延時間の設定・調整が簡単にできる
  • 遅延時間が直感的で分かりやすい

デメリット

  • 経験値システムを他の用途に使えなくなってしまう
  • 遅延時間をプレイヤーに見せないようにすることができない

mobのHPや防具立ての角度を利用した時に比べて、完全にそれぞれのプレイヤーごとに遅延時間が管理されるため、マルチプレイに対応させた時に不具合が起こることがありません。
しかし経験値システムを使うことにより、その他の用途で経験値を利用できず、それぞれのプレイヤーにもクールタイムが分かりやすくなってしまったりもします。

プレイヤーの経験値の利用方法

今回の遅延コマンドは、実は利用方法は一つには限られません。というのも、経験値はHPや角度と違い限界値を自由に設定できるからです。
限界値によっては挙動を変えたり遅延時間を自由に調節したりできるのですが、今回は限界値を設けないという形のものを紹介します(といってもMinecraftのシステム上の経験値レベルの上限はありますが)。ここでは解説しませんが、限界値の経験値レベルを1にして作ることもできますよ。

また、今回の遅延コマンドでもあらかじめコマンド構文で遅延させたい時間に見合った数値を1つ指定する必要があります。その数値の詳しい算出方法や何故そうなるかの説明などは、あとで具体的な活用方法をご紹介するときに説明しましょう。

具体的な活用例

もうおなじみの展開となりますが、今回も具体例を用いて解説をしていきましょう!

活用例もおなじみのものです。前回までと同様に、

釣竿を使うと5m先にスケルトンがスポーンし、一定時間使えなくなる

という例を用います。皆さんも実際に作ってみて、それぞれの遅延コマンドの比較をしてみてもいいかもしれませんよ。
ちなみにこの例の釣竿を使ったプレイヤーの5m先にスケルトンを出すというコマンドは、第2回応用コマンド講座で紹介しています。こちらも併せてぜひお読みくださいね。

第2回応用コマンド講座はこちら!

先ほどの利用方法の説明の際に、「1つ数値の指定が必要」と書きました。ここではとりあえずAとおくことにしましょう。
具体的な数値は、後ほど説明と一緒に紹介します。

ではコマンドを見ていきます。今回は今までの2つの遅延コマンド機構と比べ、コマンドブロック数は5つと少なめです。

①/xp 1l @a[lm=1]
経験値レベルが1以上のプレイヤーに経験値レベルを1与える

このあとのコマンドでプレイヤーに経験値レベル1を一度だけ与えるので、そのコマンドが実行された後に実行されていくコマンドですね。次は、

②/execute @e[type=fishing_hook] ~~~ execute @p ~~~ execute @s[l=0] ~~~ summon skeleton ^^^5
釣り針から一番近いプレイヤーの経験値レベルが0以下の自身の5m先にスケルトンを出す

さて、不思議な言葉が出てしまいました。「『釣り針から一番近いプレイヤーの経験値レベルが0以下の自身』ってなんだよ!」とお思いの方がほとんどだと思います。
これ実は、『釣り針から一番近いプレイヤーが経験値レベル0以下のときの、そのプレイヤー自身』という言葉に置き換えられるんです。つまり、このコマンドは 釣竿を振ったプレイヤーの経験値レベルが0だった場合にのみそのプレイヤーの5m先にスケルトンを出すコマンド なんです。

この内容、今回のうちにしっかり説明するのは難しいため、別の記事にて詳しく解説していきます。とても重要な内容ですので、ぜひお読みください。

execute重ねがけ解説の記事はこちら!

更新をお待ちください。

次のコマンドです。

③/execute @e[type=fishing_hook] ~~~ execute @p ~~~ xp 1l @s[l=0]
釣り針から一番近いプレイヤーの経験値レベルが0以下の自身に経験値レベルを1与える

こちらも②と同様の言葉が入っていますが、つまりこのコマンドは 釣竿を振ったプレイヤーの経験値レベルが0だった場合にのみそのプレイヤーに経験値レベルを1与えるコマンド となります。
そして次、

④/xp -100000l @a[lm=A]
経験値レベルがA以上のプレイヤーの経験値レベルを100000剥奪する

というコマンドになります。このコマンドで、経験値レベルがAになったときにプレイヤーの経験値を0にします。ちなみに、ここで剥奪する経験値レベル(上では「100000」)は、Aよりも大きく2147483648(Minecraftシステム上の経験値レベルの最大の数値)以下の数になっていればどんな数でも構いません。
そして最後に、

⑤/kill @e[type=fishing_hook]
釣り針をkill

となります。

Aの値について

さてここまでコマンド構文をざっと紹介していきました。次にAの数値についての説明をしていきます。

まずは、設定したい遅延時間、クールタイムを決めてください。今回の遅延コマンドも、前回同様0.05秒単位でクールタイムを設定することができます。3秒や20秒、1.5秒でも0.75秒でも、3分、10分などもクールタイムとして設定できますよ。
設定したいクールタイムを決めたら、そのクールタイムの秒数に20をかけてください。「〜分」の数字に20をかけても意味はありません。しっかり秒数に直してから20をかけましょう。それが、④のコマンドで出てくるAの数値となります。つまりA=20×クールタイムの秒数ということです。

このとき、Aの数値は小数を含まないものになっている必要があります。Aの数値はセレクタのlm引数の数値として使用されるものですが、この引数には整数値しか使えず、小数を含む数値を使うことはできません
もし計算してAの数値が1.5などのように小数を含むものになってしまった場合、

  • 計算を間違えているか
  • 0.05秒単位でクールタイムを設定していないか

のどちらかが考えられます。修正しないと正常に動作しませんので、正しい数値になるようにしましょう。

ところで、なぜクールタイムの秒数に20をかけるとAの数値になるかというと、反復のコマンドブロックのコマンドがが1秒間に実行される回数が20回だからです。

反復とそのチェーンのコマンドブロックは1tickに1回、つまり1秒に20回コマンドを実行します。その中で①のコマンドが、経験値レベルが1以上のプレイヤーに1回実行につきレベルを1、1秒間にレベルを20与えていきます。つまり、経験値レベルが20たまるごとに1秒がカウントできるということなんです。
よって、クールタイムの秒数に1秒あたりの経験値レベルのたまる量である20をかければ、クールタイムが経過したときにたまる経験値量Aを求められるというわけです。

終わりに

はい、今回の解説はこれで以上となります。前回に引き続き今回も、比較的長い解説になってしまいましたね。皆さんしっかり理解はできましたでしょうか?
プレイヤーの経験値を利用すると、比較的作りやすく動作がかなり安定する遅延コマンドを作ることができます。デメリットはもちろんありますが、皆さんもぜひ活用してくださいね!
分からないところやコマンド内容についての疑問点などありましたら、ぜひコメントでお寄せくださいね。

さて、この遅延コマンドシリーズも次回が最終回となります(まだ他にもあれば随時更新はするかと思いますが)。ぜひ他の遅延コマンド機構も見てくださいね!
それではまた第8回でお会いしましょう。


前回↓

次回↓