【JEコマンド講習会】第14回、綿毛で空にフワ―っと浮かぶ仕掛けを考える【マインクラフト】

スポンサーリンク

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

(・∀・)ノ

今回はリクエスト(?)で、「基礎から学ぶタンポポ講座」と称して、綿毛で空を飛ぶ仕掛けを考えてみたいと思います。

意味わからんサムネはいつものこと

タンポポの綿毛を持って、つむじ風に乗る

今回はこのような仕掛けを作ってみましょう。まずは仕様を整理してみます。

  1. タンポポの綿毛(にみたてた小麦の種)を右手に持つ
  2. 1の状態で、つむじ風に(みたてたマーカーに)近づくとフワ―っと浮かび上がる
  3. 頂点まで浮くと、ジワジワと下降
  4. 30秒で綿毛の効果が切れて落下

このようにしてみましょう。今回は初めてマーカーというエンティティをつむじ風に使ってみようと思います。

マーカーをざっくり

マーカーは1.17でひっそりと追加された、実体を持たないエンティティです。RPGマップや、デタパでの使用を目的に追加されました。細かいことは置いといて、ゲーム画面に描画されることがないので非常に軽いです。

自身が存在することで、他のエンティティの行動に影響を与えない点として扱われます。マーカーのいる位置にブロックを置けるし、殴ることもできず、F3 + I も機能しません。使い方を間違えなければ超便利。

間違いが起こるであろう問題は、目視で探せない(F3 + B でも表示されない)し、スペクテイターでも見えないこと。どこに置いたか忘れたらバグのもとになるってことです。メモ必須な!

磨かれた閃緑岩の上にマーカーがありますが、ヒットボックスも表示されません。

実際に仕掛けを作る その1 シングル用、タグだけで簡単管理

まずはシングルを前提とした簡単な方法。タグだけで管理するので混乱しにくいと思われー。

前準備

今回はタワー2つだけでできます。

  • 左がメインでループするタワーで、リピートにしておきましょう。計6つ並べます。動力の有無はお好みで。
  • 右のタワーは、上昇後の緩やかな落下用です。1.5秒程度の遅延がちょうどよかったので、リピーター4つで遅延させてます。その辺は良いように。
  • 右の閃緑岩の位置にマーカーを設置、パーティクルを使って上昇気流のような演出をしておきます。

使うコマンド

では、使うコマンドです。

give @p minecraft:wheat_seeds{ItemName:Watage,display:{Lore:['{"italic":false,"color":"white","text":"これを持ってつむじ風に"}','{"italic":false,"color":"white","text":"触れるとフライアウェイ!!"}'],Name:'{"italic":false,"color":"red","text":"綿毛のような何か"}'}}
summon marker 210 75 -1056 {Tags:[Whirl_Wind]}

前準備用

execute at @a as @e[type=minecraft:marker,tag=Whirl_Wind,distance=..16] at @s run tp @s ~ ~ ~ ~-15 ~
execute at @a as @e[type=minecraft:marker,tag=Whirl_Wind,distance=..16] at @s run particle minecraft:instant_effect ^ ^1 ^1 0.1 0.3 0.1 0 10
execute as @a[nbt={SelectedItem:{tag:{ItemName:Watage}}},tag=!Lev] at @s if entity @e[type=minecraft:marker,tag=Whirl_Wind,distance=..1] run tag @s add Lev
effect give @a[tag=Lev] levitation 1 20 true
execute if entity @a[tag=Lev] run setblock 208 74 -1059 redstone_block
execute as @a[nbt=!{SelectedItem:{tag:{ItemName:Watage}}}] run effect clear @s levitation

メインループ用

effect give @a[tag=Lev] levitation 30 254 true
tag @a[tag=Lev] remove Lev
setblock 208 74 -1059 air

遅延用

今回はこれくらいでできます。

1つ目、前準備

give @p minecraft:wheat_seeds{ItemName:Watage,display:{Lore:['{"italic":false,"color":"white","text":"これを持ってつむじ風に"}','{"italic":false,"color":"white","text":"触れるとフライアウェイ!!"}'],Name:'{"italic":false,"color":"red","text":"綿毛のような何か"}'}}
summon marker 210 75 -1056 {Tags:[Whirl_Wind]}

綿毛をプレイヤーに与える give 、マーカーを任意の位置に召喚するsummon 。ここまできたらもう解説いらないよね。

2つ目、メインループ用

execute at @a as @e[type=minecraft:marker,tag=Whirl_Wind,distance=..16] at @s run tp @s ~ ~ ~ ~-15 ~
execute at @a as @e[type=minecraft:marker,tag=Whirl_Wind,distance=..16] at @s run particle minecraft:instant_effect ^ ^1 ^1 0.1 0.3 0.1 0 10
execute as @a[nbt={SelectedItem:{tag:{ItemName:Watage}}},tag=!Lev] at @s if entity @e[type=minecraft:marker,tag=Whirl_Wind,distance=..1] run tag @s add Lev
effect give @a[tag=Lev] levitation 1 20 true
execute if entity @a[tag=Lev] run setblock 208 74 -1059 redstone_block
execute as @a[nbt=!{SelectedItem:{tag:{ItemName:Watage}}}] run effect clear @s levitation

メインで毎tick実行されるコマンド群です。

  • 1,2行目、つむじ風用のマーカーをクルクル回してパーティクルを発生させています。あえて、対象をプレイヤーの周囲16マスのみにすることで、不必要な検索を抑えます。
  • 3行目、綿毛を持ったプレイヤーの周囲1マスいないにつむじ風がいた場合、Levタグを与えます
  • 4行目、Levタグ保有者に浮遊エフェクトを与えます。補足が必要なので後述
  • 5行目、Levタグ保有者がいた場合、2つ目のタワーにバトンタッチ
  • 6行目、綿毛を持っていない場合、浮遊を消します。他にも影響が出るので、タグで管理した方がいいかもしれない。

3つ目、遅延用

effect give @a[tag=Lev] levitation 30 254 true
tag @a[tag=Lev] remove Lev
setblock 208 74 -1059 air

リピーターで遅延させて、ジワジワと落下する浮遊を与えてます。もう、ここまでやってきてる皆には解説することないんだよね。

エフェクトに関する補足

effect コマンドは

effect give <対象> <エフェクト名> <秒数> <強さ> <モヨモヨの表示有無>

となってましたね。この「強さ」の部分がちょっと特殊で面白いので補足。

この部分の値は 0~255 までの256段階をとることが可能です。0~127までは正の方向に強くなります。128~255までは負の方向に強くなります。何も効果を受けていない状態を 0 とすると、255が ‐1 相当となり、128が ‐129 相当になります。逆になってるので注意。

試しに、

effect give @s levitation 10 0 true
effect give @s levitation 10 127 true
effect give @s levitation 10 128 true
effect give @s levitation 10 255 true

を順に実行してみましょう。255だと落ちないのが面白いよね。

実際に仕掛けを作る その2 マルチでも大丈夫用

その1はマルチに向いていません。シングルで、且つ用途が限られた環境が前提だと問題ないですが、マルチでワチャッとなるとバグります。その辺を考慮して、その2ではスコアボードとタグを使い、プレイヤーをきちんと区別します。

前準備

こちらは1つのタワーにします。

なのでこれだけ。13個ですね。リピートコマブロの動力の有無はもちろんお好みで。

使うコマンド

まずは全体の把握をば

give @p minecraft:wheat_seeds{ItemName:Watage,display:{Lore:['{"italic":false,"color":"white","text":"これを持ってつむじ風に"}','{"italic":false,"color":"white","text":"触れるとフライアウェイ!!"}'],Name:'{"italic":false,"color":"red","text":"綿毛のような何か"}'}}
summon marker 210 75 -1056 {Tags:[Whirl_Wind]}
scoreboard objectives add Lev_Timer dummy

前準備用

execute at @a as @e[type=minecraft:marker,tag=Whirl_Wind,distance=..16] at @s run tp @s ~ ~ ~ ~-15 ~
execute at @a as @e[type=minecraft:marker,tag=Whirl_Wind,distance=..16] at @s run particle minecraft:instant_effect ^ ^1 ^1 0.1 0.3 0.1 0 10
execute as @a[nbt={SelectedItem:{tag:{ItemName:Watage}}},tag=!Lev] at @s if entity @e[type=minecraft:marker,tag=Whirl_Wind,distance=..1] run tag @s add Lev
effect clear @a[nbt=!{SelectedItem:{tag:{ItemName:Watage}}},tag=Lev_Post] levitation
tag @a[nbt=!{SelectedItem:{tag:{ItemName:Watage}}},tag=Lev_Post] remove Lev_Post
scoreboard players add @a[tag=Lev] Lev_Timer 1
effect give @a[scores={Lev_Timer=1}] levitation 1 20 true
effect give @a[scores={Lev_Timer=30..}] levitation 30 254 true
tag @a[scores={Lev_Timer=30..}] add Lev_Post
tag @a[scores={Lev_Timer=30..}] remove Lev
scoreboard players reset @a[scores={Lev_Timer=30..}] Lev_Timer
tag @a[tag=Lev_Post,nbt={OnGround:1b}] remove Lev_Post

メインループ用

こちらの方法ではスコアボードを使って、ひとまとめでやってみようと思います。

1つ目、前準備

give @p minecraft:wheat_seeds{ItemName:Watage,display:{Lore:['{"italic":false,"color":"white","text":"これを持ってつむじ風に"}','{"italic":false,"color":"white","text":"触れるとフライアウェイ!!"}'],Name:'{"italic":false,"color":"red","text":"綿毛のような何か"}'}}
summon marker 210 75 -1056 {Tags:[Whirl_Wind]}
scoreboard objectives add Lev_Timer dummy

基本は前の方法と同じですが、各プレイヤーをキッチリ識別するために、スコアボードを1つ用意しておきます。

2つ目、メインループ用

execute at @a as @e[type=minecraft:marker,tag=Whirl_Wind,distance=..16] at @s run tp @s ~ ~ ~ ~-15 ~
execute at @a as @e[type=minecraft:marker,tag=Whirl_Wind,distance=..16] at @s run particle minecraft:instant_effect ^ ^1 ^1 0.1 0.3 0.1 0 10
execute as @a[nbt={SelectedItem:{tag:{ItemName:Watage}}},tag=!Lev] at @s if entity @e[type=minecraft:marker,tag=Whirl_Wind,distance=..1] run tag @s add Lev
effect clear @a[nbt=!{SelectedItem:{tag:{ItemName:Watage}}},tag=Lev_Post] levitation
tag @a[nbt=!{SelectedItem:{tag:{ItemName:Watage}}},tag=Lev_Post] remove Lev_Post
scoreboard players add @a[tag=Lev] Lev_Timer 1
effect give @a[scores={Lev_Timer=1}] levitation 1 20 true
effect give @a[scores={Lev_Timer=30..}] levitation 30 254 true
tag @a[scores={Lev_Timer=30..}] add Lev_Post
tag @a[scores={Lev_Timer=30..}] remove Lev
scoreboard players reset @a[scores={Lev_Timer=30..}] Lev_Timer
tag @a[tag=Lev_Post,nbt={OnGround:1b}] remove Lev_Post

できるだけ厳密にプレーヤーを識別するようにしてみてます。ポイントは、綿毛で飛んだ場合のみ、綿毛を手放すと浮遊を消すことと、マルチでワチャッとなっても上昇高さがかわらないようにスコアボードを使うことです。

  • 1,2行目、マーカをつむじ風に見立てる演出は同じなので割愛
  • 3行目、こちらも各プレイヤーがつむじ風に近づいた場合タグを付ける処理で、前と同じです。
  • 4行目、後で出てきますが、 Lev_Post タグはジワジワ落ちている間だけ付くタグです。Lev_Post タグがあり、綿毛を持っていない場合(ジワジワ落ちてる最中に綿毛を手放したら)浮遊を消します。
  • 5行目、綿毛を手放したらLev_Post タグを消してますね。
  • 6行目、ここからは上昇する時の処理です。さっきの Lev タグが付いたプレイヤーの Lev_Timer に1を加算します。
  • 7行目、 Lev_Timer が1の時だけ、一気に上昇するレベル(25)の浮遊を1秒付けます。
  • 8行目、Lev_Timer が 30 以上になったらジワジワ落ちるレベル(254)の浮遊を30秒付けます。
  • 9行目、Lev_Timer が 30 以上になったら、さっき出た Lev_Post タグを付けます。ジワジワ落下してるよってタグです。
  • 10行目、Lev_Timer が 30 以上になったら、Lev タグを消します。
  • 11行目、Lev_Timer が 30 以上になったら、リセットします。
  • 12行目、Lev_Post タグがあるプレイヤーが着地したら(OnGround:1b で接地してるか)Lev_Post タグを消します。

Lev_Post いる?って思うかもしれませんが、ないと浮遊状態の判断が難しいですね。

まとめ

今回は2通り作ってみました。コマンドで作る仕掛けって幾通りでもできるので面白いと思います。他の方法がないか考えてみてくれよな。

それではこの辺で、お帰りの際はお気を付けて~(・∀・)ノシ

コメント