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

どうも、執筆担当のとれんさーです。前回は、プレイヤーの経験値を利用した遅延コマンドを紹介していきました。まだ読んでいない方は、こちらもぜひお読みくださいね。

前回の記事はこちら!

さて、前回まで計3回続いてきた遅延コマンドシリーズも、今回で最後の紹介となります。今回も、レッドストーン回路を使わずに遅延を生み出す機構をご紹介します。ぜひ最後まで読んでいってくださいね!


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

全4回

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

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

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

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

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

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

#4 〜スコアボードのスコアを利用する〜

この記事です


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

スコアを使うメリット・デメリット

今回はMinecraft ver.1.7にて本実装されたスコアボードを使った遅延コマンドをご紹介していきます。「スコアボードについてあまりよく知らないよ」という方は、当サイト初級コマンド講座よりこちらのページをお読みになってからだと、今回の機構の仕組みをよく理解できるはずです。こちらも合わせてお読みくださいね。

/scoreboardコマンドについての解説はこちら!


さて宣伝もさせて頂いたところで、今回の遅延コマンドのメリットデメリットをご説明しましょう。

メリット

  • マルチプレイに完全に対応している
  • 遅延時間の設定・調整が簡単にできる
  • 遅延時間を、直感的で分かりやすくすることも完全に見えないようにすることも可能
  • 実質遅延時間に上限がない

デメリット

  • 機構作成の難易度が少し高い

と、ここまで過去3回の遅延コマンドシリーズを読んでくださった方はお気づきかもしれません。このプレイヤーのスコアを利用した遅延コマンドは、他3つの遅延コマンドのメリットほぼ全て兼ね備えています複雑な/scoreboardコマンドを使用しているため「簡単に作れる」というメリットはこの遅延コマンドに当てはまりませんが、それ以外は全てこの遅延コマンドに当てはまります。

プレイヤーのスコアの利用方法

今回の遅延コマンドでも前回,前々回同様、あらかじめコマンド構文で遅延させたい時間に見合った数値を1つ設定する必要があります。その数値についての詳しい解説は、具体的な活用方法の最後にしていきますよ。

具体的な活用例

今回も今回とて具体例を用いた解説をしていきます。活用例も前回までの3回と同様ですね。

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

このような例を用います。
この例の釣竿を使ったプレイヤーの5m先にスケルトンを出すというコマンドは、第2回応用コマンド講座にて詳しく解説していますよ。こちらを読んでおくと混乱は少ないかもしれません。

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

利用方法の説明の際に、「1つ数値の指定が必要」と書きました。ここではとりあえずAとおいておきます。Aについての説明などは後ほどしますので、今はこう認識しておいてください。

ではコマンドを見ていきましょう。今回は準備として、スコアボードを作成するコマンドと、プレイヤー全員をそのスコアボード上に追加するコマンドの2つがまず必要です。それぞれ見ていきましょう。

①/scoreboard objectives add skeleton_timer dummy
skeleton_timerという名前のダミーのスコアボードを作成する

まずはこちら、上記の通り専用のスコアボードを作成するコマンドです。このコマンドはコマンドブロックで実行する必要はありません。チャット欄や衝撃コマンドブロックで1回実行してください。
skeleton_timer」の部分は好きな名前に変更しても構いませんが、その場合はこれ以降のコマンドもその名前に変更するようにしてくださいね。

②/scoreboard players add @a skeleton_timer 0
skeleton_timerというスコアボード上のプレイヤー全員のスコアに0を追加する

専用スコアボード上にプレイヤー全員を追加するコマンドです。反復コマンドブロックで常時実行しておくことで、マルチワールドに新しく入ってきたプレイヤーも遅延コマンドを使用することができます。

それでは、ここからは本システムのコマンドです。準備のコマンドを除けば、本システムはこれまでの遅延コマンドと比べ、コマンドブロックの数が4つと一番少ないです。その代わり、スコアボードを扱うため多少コマンド構文は複雑です。

まずは1つ目。

①/execute @e[type=fishing_hook] ~~~ execute @p ~~~ execute @s[scores={skeleton_timer=0}] ~~~ summon skeleton ^^^5
釣り針から一番近いプレイヤーのskeleton_timerというスコアボード上のスコアが0である自身の5m先にスケルトンを出す

前回と似たような、不思議な使われ方をしている言葉がありますね。『釣り針から一番近いプレイヤーのskeleton_timerというスコアボード上のスコアが0である自身』という一見意味の分からない説明ですが、どういう意味なのでしょうか?
この言葉、実は『釣り針から一番近いプレイヤーskeleton_timerというスコアボード上でスコア0のときの、そのプレイヤー自身』と置き換えられます。
つまり、このコマンドは 釣竿を振ったプレイヤーの専用スコアボード上のスコアが0だった場合にのみ、そのプレイヤーの5m先にスケルトンを出すコマンド と言えるのです。

と少し複雑なお話をしてしまいましたが、このコマンド構文内の「execute @p ~~~」という部分のようなexecuteの重ねがけの使い方に関しては、また別の記事にて解説していきますよ。こちらもぜひ読んでみてくださいね。

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

更新をお待ちください。

1つ目から複雑な内容になってしまいましたが、2つ目も最後以外は同じ内容になっています。

②/execute @e[type=fishing_hook] ~~~ execute @p ~~~ scoreboard players set @s[scores={skeleton_timer=0}] skeleton_timer A
釣り針から一番近いプレイヤーのskeleton_timerというスコアボード上のスコアが0である自身のskeleton_timer上のスコアをAにする

非常に回りくどく分かりにくい説明文が下に書かれていますが、つまりは 釣竿を振ったプレイヤーの専用スコアボード上のスコアが0だった場合にのみ、 そのスコアを決められた値にするコマンド ということです。

ここまではかなり複雑なコマンドでしたが、3つ目からは分かりやすいコマンドとなっています。

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

とても単純なコマンドで、ものすごく安心しますね。そして最後のコマンドです。

④/scoreboard players remove @a[scores={skeleton_timer=1..}] skeleton_timer 1
skeleton_timerというスコアボード上のスコアが1以上の全てのプレイヤーの、skeleton_timer上のスコアを1剥奪する

専用スコアボード上のスコアが1以上のときに、毎tick1ずつそのスコアを減らしていくコマンドですね。
[scores={〜〜〜=1..}]」の「..(ドット)」の位置や打つ数を間違えないように!

Aの値について

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

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

このとき、Aの数値は小数を含まないものになっている必要があります。Aの数値は/scoreboardコマンド内でスコアを剥奪する量を示すものですが、この構文には整数値しか使えず、小数を含む数値を使うことはできません
もし計算してAの数値が1.5などのように小数を含むものになってしまった場合、

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

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

終わりに

今回の解説は以上となります。スコアボードという少し複雑な要素を使った機構でしたが、しっかりと理解していただけたでしょうか?

実はこの遅延コマンド、当講座記事ネタ考案担当のけいさんがまだスコアボードについて完全には使いこなせていなかった頃に考えていただいたものとなっています。そのため、確認はしていますが不具合などがもしかしたらあるかもしれません。もしそういうことがあれば、ぜひコメント欄にてご指摘いただけると嬉しいです。よろしくお願いします。
また分からないことがある場合なども、ぜひコメント欄へ質問してくださいね!

それではまた第9回でお会いしましょう。


前回↓

次回↓
更新をお待ちください。