はじめに
今回のコードはここで記述した環境でのデバックができていません。
もしかしたらコードが動作しない場合がございます。
その時はコメントでもしてください。。。
プレイヤーの近くの特定のブロックの個数
# block: iron block の iron block を変えれば別のブロックにできます。
options:
block: iron block
on join:
loop blocks in radius 1000 around player:
loop-block is {@block}
add loop-block to {_block::*}
broadcast "%size of {_block::*}%
解説の前に
options:の説明・・・1回もしてないかも・・・
ということでそれは後で投稿しますが簡単に言えばPluginのコンフィグみたいなものだと考えてください。
詳細は執筆中
今回は鉄ブロックを特定のブロックとしていますが変えたい人はコード中にも書いてるように block: iron block の iron block を変えれば別のブロックに変更可能です。
解説
それではon joinイベント内の解説です。
まあ、当たり前ですがon joinはサーバーに入ったらというイベントです。
次にloop blocks in radius 1000 around player:ですがこれはループ文です。
ここの解説はloop blocksでブロックをループするというものです。
私の場合、loop blocks単体で使ったことがないのでちょっとわからないのですが、サーバー内のブロックすべてをループするようになるかと思われます。
ですが、Skriptは有能なので重たい処理でサーバーが耐えられないとSkript側が判断するとループを止めてくれるそうです。(whileの場合)
なのでこのloop blocksでも同様なのではと考えています。
話が逸れましたがそのブロックがどんなブロックなのかっていうのはloop内で書いたら便利(その理由はページの一番下で説明)なので
in radius 1000 around player:を付けることで「プレイヤーを中心に半径1000ブロック内のブロックをループする」というものになります。
そしてloop-block is {@block}でループしたブロックが鉄ブロック({@block})であるというコードです。
add loop-block to {_block::*}は一時的変数である{_block::*}にloop-blockを追加するというコードです。
もちろんループの特性上、条件(プレイヤーを中心として半径1000ブロック)の中で鉄ブロックでなかった場合は次のブロックを確認するようになってます。
これでループが終わったときにbroadcastで{_block::*}のサイズを表示します。
ここで表示された内容がプレイヤーの近くの特定のブロックの個数となります。
なぜloop内で書いたら便利なのか・・・
では、一度サンプルのコードを2つ書いてみます。
ですが、あくまで説明用のものなので正常に動作するのかはわかりません。
on join:
loop blocks:
loop-block in radius 1000 around player
loop-block is stone
add loop-block to {_block::*}
broadcast "%size of {_block::*}%"
on join:
loop blocks in radius 1000 around player:
loop-block is stone
add loop-block to {_block::*}
broadcast "%size of {_block::*}%"
この違いがわかりますでしょうか?
前者はマップにあるほぼ無限と言っていいほどのブロックを1つ1つ確認してプレイヤーを中心に半径1000ブロック内でなければ次のブロックへ半径1000ブロック内であれば、石であるかの確認をし、石でなければ次のブロックへ石であればリスト変数に追加というものです。
後者はプレイヤーを中心に半径1000ブロック内のブロックを1つ1つ確認して石でなければ次のブロックへ石であればリスト変数に追加するというものです。
前者と後者の違いは分かりやすく言えば、本屋にある大量の本の中からAという本を探すのと、本屋のAのジャンルが置いてあるコーナーからAを探すという違いです。
もちろん、実際はもっと大きな話なのですが・・・
loopに関してはできるだけ処理が軽い方法でやるのが一番だと思いますが・・・
次はコチラ
前はコチラ