見出し画像

レイスの「ディメンションリフト」をMinecraftで再現してみよう

こんにちは。
山梨大学Minecraftサークルのちべたんです。
今回はAPEXに登場するレジェンド、レイスの「ディメンションリフト」をMinecraft上に再現していこうと思います。
なお今回紹介するコマンドはバージョン1.20にて動作確認済みです。

まずは実物を見ていただいたほうが分かりやすいかと思います。
https://youtu.be/TbpvYvm8MpI

・使用するコマンド

今回使用したコマンドは主に
・execute
・scoreboard
・tag
で、他にtp、summon、give、particleなども使用しています。
この記事はなるべく分かりやすく、かつコピペだけで作れるよう心掛けていますが、以上のコマンドの基本構文などが分かるとより一層理解が深まるかと思います。

参考:各種コマンドの解説(過去記事)

では実際にどんなコマンドで動いているのか解説していきます。

・スポーンエッグの作成

give @p minecraft:shulker_spawn_egg{display:{Name:'[{"text":"ディメンションリフト","color":"yellow","bold":true,"obfuscated":false}]',Lore:['[{"text":"2地点間をポータルで連結する","color":"dark_gray"}]']},EntityTag:{NoGravity:1b,Silent:1b,NoAI:1b,Tags:["chibelift"],Invisible:true}} 1

今回はスポーンエッグを使ってモブをスポーンさせることでポータルを出現させます。
使用しているのはシュルカーのスポーンエッグで、理由は単純にレイスの色に近かったからです。

アイテム名と説明文

後半はアイテム名と説明文を追加しています。
またタグによって通常のモブシュルカーと区別をするため、タグをつけています(今回は"chibelift")。
なお末尾の数字が配布する個数を表しています。ちなみにサバイバル/アドベンチャーモードで使用する際はポータルを1つ設置するとスポーンエッグも1個消費してしまうため、アイテム化するのであれば2個ずつ配布するとよいでしょう。

次に各種処理の部分。

長いので4系統に分けています

その前にスコアボードを2つ追加しておきます。

scoreboard objectives add chibelift11 dummy
scoreboard objectives add chibelift12 dummy

名前はお好みで(ただし以降のスコアボードの引用部分も変える必要あり)。

・ポータル出現&タイマー管理【リピート】

1系統目です。シュルカーをスポーンさせてからポータルを出現させ、出現から1分後に消去系統を動作させるという一連の動作を指定しています。
前提知識として、今回はタグ「chibelift」をシュルカーに、「chibelift1~3」を防具立てに付与しています。

execute at @e[tag=chibelift] if entity @e[tag=chibelift2] run summon minecraft:armor_stand ~ ~1 ~ {Tags:[chibelift3],Invisible:true}
execute at @e[tag=chibelift] if entity @e[tag=chibelift1] run summon minecraft:armor_stand ~ ~1 ~ {Tags:[chibelift2],Invisible:true}
execute at @e[tag=chibelift] unless entity @e[tag=chibelift1] run summon minecraft:armor_stand ~ ~1 ~ {Tags:[chibelift1],Invisible:true}

最初の3つは3通りの場合分けをしてシュルカーの位置にタグ付き防具立てを出現させています。
①ポータル(防具立て)が既に2つ存在している場合
→"chibelift3"を召喚
②ポータル(防具立て)が1つだけ存在している場合
→"chibelift2"を召喚
③ポータル(防具立て)が存在していない場合
→"chibelift1"を召喚
ちなみに実際ポータルとして運用される際は、chibelift1とchibelift2の間を行き来するという構造になります。chibelift3は消去系統のコマンドブロックによって一瞬で消滅させられます。可哀想に。

kill @e[tag=chibelift]

シュルカ―をkillしておきます。

execute if entity @e[tag=chibelift3] run setblock ○○ ○○ ○○ minecraft:redstone_block
execute if score $lift chibelift11 matches 1200 run setblock ○○ ○○ ○○ minecraft:redstone_block

この2つは、executeの部分がポータルを消去する際の条件を示しています。
この条件を満たすと後半のsetblockコマンドが走って消去系統が動くというわけです。条件について詳しくは「ポータルを消去」の項にて。
注意点として、setblockコマンドの座標指定の部分を消去系統のコマンドブロックが走る座標にするのを忘れずに。

具体的にはこの画像の金ブロックの1つ上の座標になります。

また最後のコマンドに$マークがありますが、この部分は本来@aなどのセレクターやユーザーIDを記す場所です。実はここ、ワールドに存在しない架空の人物のIDを示してもいいため、今回は「$lift」くんをご指名しました。ちなみに$を入れている理由ですが、ユーザーIDには$を含めることができないため、万が一liftという物好きなIDの人がワールドに入ってきても誤作動を起こさないようにするためです。

・ポータルの挙動【リピート】

次。これが一番長い。頑張りましょう。

execute as @e[tag=chibelift1] at @s run tag @a[distance=0.5..] remove chibelift01
execute as @e[tag=chibelift1] at @s run tag @a[distance=..0.5] add chibelift01

今回のポータルは、ポータルの半径0.5ブロック以内にいるとポータルに吸い込まれる仕様になっています。
ポータルに近づいたプレイヤーに"chibelift01"というタグを付与しています。
そしてなぜこのような回りくどいことをしているかというと、こうしないと無限ポータル地獄に入ってしまうからです。
というのも、ポータルに近づくともう一方のポータルにテレポートする、という挙動をさせると、例えばchibelift1に近づくとchibelift2にテレポートされますが、この瞬間プレイヤーはchibelift2の近くにいるため、即座にchibelift1へと強制送還させられるのです。そしてこれは無限ループとなります。
私は開発中5回くらい無限ポータル編を味わいました。

scoreboard players set @a[tag=!chibelift01,tag=!chibelift02] chibelift11 -1

ここでは、2つのポータルのどちらにも近づいていない人のスコアボードを-1に設定しています。

scoreboard players add @a[tag=chibelift01] chibelift11 1
scoreboard players add @a[tag=chibelift01] chibelift12 1

逆にポータルに近づいているプレイヤー(=タグ"chibelift01"を持っているプレイヤー)のスコアボードを増やします。

execute as @e[tag=chibelift2] at @s if entity @e[tag=chibelift1] run tp @a[scores={chibelift11=0}] ~ ~ ~

そして初期値-1に設定されているスコアボードが加算されて0になったプレイヤーをもう一方のポータルにテレポートする、という仕組みです。
(正確にはもう一方のポータルが招き入れているのですが)

execute as @e[tag=chibelift2] at @s run tag @a[distance=0.5..] remove chibelift02
execute as @e[tag=chibelift2] at @s run tag @a[distance=..0.5] add chibelift02
scoreboard players set @a[tag=!chibelift01,tag=!chibelift02] chibelift12 -1
scoreboard players add @a[tag=chibelift02] chibelift11 1
scoreboard players add @a[tag=chibelift02] chibelift12 1
execute as @e[tag=chibelift1] at @s if entity @e[tag=chibelift2] run tp @a[scores={chibelift12=0}] ~ ~ ~

そして以下ここまではchibelift2側で同じ処理をしているだけです。やっていることは先ほどと同じでスコアボード名とタグ名が変わっているだけなので説明は省略します。

scoreboard players add @a[tag=chibelift11] chibelift11 1
scoreboard players add @a[tag=chibelift12] chibelift12 1

この2つが無限ポータル編を阻止しています。

execute if entity @e[tag=chibelift1] run scoreboard players add $lift chibelift11 1

これはポータルのタイマー。出現系統の最後のコマンドで寿命を設定していますが、ここでtick数を数えています。

・ポータルの演出【リピート】

execute at @e[tag=chibelift1] run particle minecraft:portal ~ ~1 ~ 0.2 0.4 0.2 0.001 15 force @a
execute at @e[tag=chibelift2] run particle minecraft:portal ~ ~1 ~ 0.2 0.4 0.2 0.001 15 force @a

この2つは見栄えの問題です。
パーティクルを使用してそれっぽい感じを演出しています。今回使用しているのはportal。ネザーポータルの周りに出ているアレですね。大きさ、範囲、数を調整できるので、良い感じに装飾してあげましょう。ちなみに数は多くしすぎると鯖が落ちます(1敗)。

・ポータルの消去【インパルス】

ここはポータルをリセットするためのコマンド群です。
使用するタイミングは
・1つ目のポータル出現から1分経ったとき
・ワールドに3つ目のポータルが出現したとき
になります。ここはインパルスになるので要注意。

1つ下のブロックを消去するコマンド

インパルスのコマンドブロックを使用する際、起動に使うレッドストーンブロックが置きっぱなしになると2回目以降上手く動作しなくなってしまうため、レッドストーンブロックが置かれる1つ上のところにこのようなコマンドブロックを置いておくとよいでしょう。

kill @e[tag=chibelift1]
kill @e[tag=chibelift2]
scoreboard players reset @e chibelift11
scoreboard players reset @e chibelift12
tag @a remove chibelift01
tag @a remove chibelift02
scoreboard players reset $lift chibelift11
scoreboard players reset $lift chibelift12
execute at @e[tag=chibelift3] run summon minecraft:armor_stand ~ ~1 ~ {Tags:[chibelift1],Invisible:true}
kill @e[tag=chibelift3]

やっていることはポータルの元になっている防具立てをキルして各種タグ、スコアボードをリセットするだけです。
下2つに関しては3つ目のポータルが出現した際の処理になります。

・できないこと

気づいた方もおられるかと思いますが、この方式は実は欠点があります。
1つ目は複数人が同時に使用できないこと。
というのもこれ、誰がシュルカ―をスポーンさせたかを把握してないので同時に使用すると混線してしまいます。レイスは複数人いてはいけないのです。
2つ目は瞬間移動していること。
実際のディメンションリフトってレイスが動いた軌跡をなぞるようにして動きますがそれがありません。
そして3つ目は空中に設置できないこと。
スポーンエッグを使用している特性上仕方ありません。また壁に向かって設置しても、防具立てが重力を受ける仕様になっているため、地面に落下してきてしまいます。
ただしいずれも技術的に不可能ではないと思います。気が向いたらより実際の仕様に近いバージョンも作ってみたいですね。

それではまた次回。

この記事が気に入ったらサポートをしてみませんか?