どうも!パイセンです。
今回はクリーパーをぶん投げて爆発させる、手榴弾のようなコマンドを作ってみました。
コマンドブロックはたったの11個で作れるので、ぜひ試してみてください。
バージョンはJava版の1.13以降
まず最初に、このコマンドはJava版の1.13.1で制作しました。
BE(スマホ・switch・win10版等)や、Java版の1.13より古いバージョンでは動作しないので注意です!
完成品はこんな感じ
実際の動作はこんな感じになってます。
爆発しているのはクリーパーなので、地形破壊の有無・爆発範囲・威力も調整可能です!(TNTだと無理なんですよねぇ・・・。)
作り方
まずは作り方だけ紹介します。
解説は次の項目でします!
下準備-スコアの作成
今回のコマンドはscoreboardコマンドをたくさん使うので、スコアの作成をします。Tキーでチャット欄を開き、次のコマンドを全部実行してください。
それぞれのスコアの役割ですが、useRodはニンジン棒の使用の検知、posX,Y,Zはプレイヤーのx,y,z座標、bombPosX,Y,Zは爆弾(=クリーパー)のx,y,z座標に使います。
コマンドブロックを入手する
まずはコマンドブロックがないと始まりませんね!
今回使うのはリピートコマンドブロックとチェーンコマンドブロック。Tキーでチャット欄を開き、次のコマンドを入力して実行してください。
コマンドの全体像
コマブロは全部で11個、下の画像のように設置します。
この時、コマンドブロックの矢印の方向も揃えてください!矢印が向いてある方向にコマンドブロックがないと、ちゃんとコマンドが実行されなくなってしまいます。
コマブロに入力するコマンド一覧
それぞれの番号に合ったコマンドを入力してください。
①・リピート・無条件・動力が必要execute as @e[scores={useRod=1..}] at @s positioned ~ ~0.5 ~ run summon creeper ^ ^ ^1 {ExplosionRadius:3b,Fuse:30,Invulnerable:1,ignited:1b,Tags:["bomb"]}
②・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] store result score @s posX run data get entity @s Pos[0] 100
③・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] store result score @s posY run data get entity @s Pos[1] 100
④・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] store result score @s posZ run data get entity @s Pos[2] 100
⑤・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result score @s bombPosX run data get entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Pos[0] 100
⑥・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result score @s bombPosY run data get entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Pos[1] 100
⑦・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result score @s bombPosZ run data get entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Pos[2] 100
⑧・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Motion[0] double 0.01 run scoreboard players operation @s bombPosX -= @s posX
⑨・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Motion[1] double 0.01 run scoreboard players operation @s bombPosY -= @s posY
⑩・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Motion[2] double 0.01 run scoreboard players operation @s bombPosZ -= @s posZ
⑪・チェーン・無条件・常時実行scoreboard players set @e[scores={useRod=1..}] useRod 0
完成!
全てのコマンドブロックにコマンドを入力し終えたら、青紫のリピートコマンドブロックの隣にレッドストーンブロックを設置しましょう!
レッドストーンブロックを設置したら、『ニンジン付き棒』を持って右クリックを押してみてください!
ちゃんとクリーパーが飛び出ますね!
しかし、右クリックを押すたびにチャット欄に何か表示されてしまいますね。
気になる方は次のコマンドを実行してください。
/gameruleでコマンドブロックによるコマンドの実行結果をチャット欄に流さないようにします。
また、ブロックが破壊されないようにするには次のコマンドを実行してください。
これでMobによるブロック破壊が無くなります。
コマンドの仕組み解説
最後にコマンドの仕組みを解説していきます。ちょっと複雑なので、コマンドの仕組みまでは興味がない方は読み飛ばしちゃってください。
scoreboardコマンドとexecuteコマンド、dataコマンドの使い方が分かってないと理解は難しいと思います・・・。
見たい方は下のボタンをクリック
全体の仕組み
全体の仕組みはこんな感じになっています
↓
useRodの値が1以上のプレイヤーの目の前に爆発寸前のクリーパーを召喚・・・(①)
↓
プレイヤーとクリーパーのX、Y、Z座標の値を取得して、posXやbombPosXなどのスコアに入力する・・・(②~⑦)
↓
クリーパーのx,y,z座標の値からプレイヤーのx,y,z座標の値を引き、その値をクリーパーのMotionという項目に代入して飛ばす・・・(⑧~⑩)
↓
useRodの値が1以上の時、値を0に戻す
1.ニンジン棒を持って右クリックを押すとクリーパーを召喚する
まずは一番最初のクリーパーを召喚するコマンドから見ていきましょう。
①・リピート・無条件・動力が必要execute at @e[scores={useRod=1..}] positioned ~ ~0.5 ~ run summon creeper ^ ^ ^1 {ExplosionRadius:3b,Fuse:30,Invulnerable:1,ignited:1b,Tags:["bomb"]}
これは、useRodが1以上のプレイヤーの目の前に爆発寸前のクリーパーを召喚する、という内容です。
useRodはニンジン付き棒を使った回数ですね。つまり、useRodが1以上のプレイヤーは『ニンジン付き棒を使ったプレイヤー』という意味になります。
/execute コマンドは少し独特で、runの後に別のコマンドをさらに入力することができます。
まずは前半部分の『execute as @e ~ run』まで見てみましょう。
/execute at コマンドを使うことでrun以降のコマンドの実行場所、今回だと『summon』コマンドの実行場所を『useRodが1以上のプレイヤー(@e[scores={useRod=1..}の部分)』にすることができます。
/execute at を使わないとsummonコマンドの実行場所はコマンドブロックが置いてある場所になるので、クリーパーはコマンドブロックが置いてある場所に召喚されてしまいます。なので、atを使って実行場所を指定する必要があるわけですね。
次に『positioned』ですが、これはコマンドの実行場所をズラすコマンドです。今回のコマンドは上の方向へ0.5ブロックだけズラしてますね。
召喚したクリーパーが地面に埋まって飛ばない時があるので、埋まらないように少しだけ召喚場所を上にしています。
そして後半部分の『summon ~』は、クリーパーを召喚するコマンドです。
『^ ^ ^1』は召喚する場所を座標で指定する部分で、『^』を使うとコマンド実行者の見ている方向を基準に指定することができます。『^ ^ ^1』は、見ている方向の1ブロック分先に召喚場所を指定しています。
最後の {ExplosionRadius:3b,Fuse:30,Invulnerable:1,ignited:1b,Tags:["bomb"]} は召喚するクリーパーのデータタグを指定しています。ExplosionRadiusは爆発範囲、Fuseは爆発するまでの時間(1秒=20)、Invulnerableは不死性の有無、ignitedは着火の判定、Tagsは他のクリーパーと区別するためのタグ付けをしています。
ignitedが1のクリーパーは一定時間経ってから爆発し、その時間はFuseで設定することができます。
爆発の範囲・威力を大きくしたい場合はExplosionRadiusの値を大きく、爆発までの時間を変えたい場合はFuseの値を『爆発までの秒数x20』にしましょう。
2~7.プレイヤー、クリーパーの座標を取得する
次は2~7番目の座標を取得するコマンドです。
2~4でプレイヤーのX,Y,Z座標、5~7で召喚したクリーパーのX,Y,Z座標を取得して、posX,Y,Z、bombPosX,Y,Zに代入しています。
この代入した値を使い、クリーパーの飛ぶ方向を決めます。
②・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] store result score @s posX run data get entity @s Pos[0] 100
③・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] store result score @s posY run data get entity @s Pos[1] 100
④・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] store result score @s posZ run data get entity @s Pos[2] 100
⑤・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result score @s bombPosX run data get entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Pos[0] 100
⑥・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result score @s bombPosY run data get entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Pos[1] 100
⑦・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result score @s bombPosZ run data get entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Pos[2] 100
これらも/executeコマンドを使っています。最初の『execute as @e[scores={useRod=1..}]』はコマンドの発動条件を指定するために入力しています。useRodが1以上の時、つまりニンジン棒を使った時ですね。
run以後のコマンドはdataコマンドと言い、データタグ(体力、座標などのステータス)を取得・変更することができます。
『store result score』はrun以後のコマンドの実行結果をスコアに代入することができ、data get で取得した座標の値をposXなどに代入しています。
では、次に取得した座標を使ってクリーパーを飛ばしてみます。
8~10.クリーパーを飛ばす
では、いよいよクリーパーを飛ばしてみます。
先ほど取得したクリーパーのX,Y,Z座標の値から、プレイヤーの座標をそれぞれ引くとプレイヤーからクリーパーの方へ向いた矢印(ベクトル)ができます。
これはほぼプレイヤーの目線の向きと同じで、この値をクリーパーのMotionという値に代入することで、プレイヤーの向いている方向にクリーパーを飛ばすことができます。
⑧・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Motion[0] double 0.01 run scoreboard players operation @s bombPosX -= @s posX
⑨・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Motion[1] double 0.01 run scoreboard players operation @s bombPosY -= @s posY
⑩・チェーン・無条件・常時実行execute as @e[scores={useRod=1..}] at @s store result entity @e[type=creeper,tag=bomb,sort=nearest,limit=1] Motion[2] double 0.01 run scoreboard players operation @s bombPosZ -= @s posZ
最初の『execute as @e[scores={useRod=1..}]』は先ほどと同じくコマンドの発動条件を指定するために入力しています。useRodが1以上の時、つまりニンジン棒を使った時ですね。
まずはrun以後のscoreboardコマンドに注目しましょう。/scoreboard players operationを使って、クリーパーの座標のスコア(bombPos〇)から、プレイヤーの座標のスコア(pos〇)を引いています。これで、bombPos〇はプレイヤーからクリーパーへの矢印(ベクトル)になります。
そして、store result entityを使い、run以後のコマンドの実行結果、つまりbombPos〇の値を『bomb』のタグが付いたクリーパーのMotionに代入しています。
これでクリーパーを飛ばす処理は完了です。
最後にuseRodの値を0にする処理を入れましょう。これが無いと、永遠にクリーパーが飛び続けることになります・・・。
11.useRodの初期化
⑪・チェーン・無条件・常時実行scoreboard players set @e[scores={useRod=1..}] useRod 0
特に説明することはないですね。ただuseRodの値を0にしているだけです。
まとめ
以上、クリーパーを投げ飛ばすコマンドの紹介(とオマケ程度の解説)でした。
正直、解説の方は教え方が下手なのもあるのであんまり役立たないと思います・・・。すみません(だってdataとかexecuteとかの説明1からするとややこしいんだもん・・・)。
ただ、コマンドの数だけで見ればとても簡単で良いと思うので、ぜひこれを参考にして色々作ってみてください!
教えるって難しいんだなあ。