ども、ハングドです。
ナンバーロックの作り方の後編です。
本解説は二つのパートに分かれています。
今回は解説編です。制作編を既に読まれているという前提で進めますので、未読の方は先に目を通しておきましょう。また、本編はコマンド及びデータパックの基本的知識がある方を対象にしています。
使用するデータパックはこちらからダウンロードできます。なお、本記事を執筆するにあたりいくつか修正しましたので、本日(2021/11/21)の時点で既にダウンロードした方はデータパックを改めてダウンロードして下さい。
仕組み
装置の構造
ナンバーロックの基本的な構造は以下のようになっています。
ここで、赤はワールド内のブロック、青は function、緑は storage、水色は scoreboard を表しています。それでは、それぞれの役割について詳しく見ていきます。
看板
各数字を入力する為のボタンの役割を担います。右クリックされた時に function(lock:code1、code2、code3)を実行します。これはボタン+コマンドブロックで代用出来ます。
プレイヤーの頭
現在入力されているパスコードを表示します。NBTデータを変更することで様々なテクスチャを貼り付けることが出来る為、様々なワールドで装飾として取り入れられています。看板に書かれた文字と比べて大きくて見やすくデザイン性が高いことから、ここでは数字を表示するディスプレイとして利用します。
ボタン
パスコードの確認ボタンです。このボタンが押された時に function(lock:check)を実行し、入力されたパスコードの正誤をチェックします。もちろん看板等でも代用できます。
scoreboard
この装置では unlocked、code1、code2、code3 の四つの値を使用します。unlocked にはナンバーロックの状態が保存されます。ロックが解除されていない時は値が0ですが、解除された場合に1になります。code1、code2、code3 はそれぞれ入力されたパスコードの百の位、十の位、一の位が保存されます。
storage
プレイヤーの頭のテクスチャデータ(ブロックのNBTデータ)を保存します。プレイヤーの頭のNBTデータは非常に長いので予め storage に保存しておき、必要に応じて参照します。このようにすることで、 function 内のコマンドが短くなり可読性が向上します。また、テクスチャを変更する場合にコマンドを一箇所書き換えるだけで済むようになります。
function
scoreboard や storage に保存された情報を元に装置を動かします。それぞれのファイルの中身を見ていきましょう。
<reset.mcfunction>
#スコアをリセット
scoreboard objectives add unlocked dummy
scoreboard objectives add code1 dummy
scoreboard objectives add code2 dummy
scoreboard objectives add code3 dummy
scoreboard players set #lock unlocked 0
scoreboard players set #lock code1 0
scoreboard players set #lock code2 0
scoreboard players set #lock code3 0
scoreboard の作成と値のリセットを行います。
#頭のテクスチャを保存
data merge storage lock:head/0 {...
data merge storage lock:head/1 {...
data merge storage lock:head/2 {...
data merge storage lock:head/3 {...
data merge storage lock:head/4 {...
data merge storage lock:head/5 {...
data merge storage lock:head/6 {...
data merge storage lock:head/7 {...
data merge storage lock:head/8 {...
data merge storage lock:head/9 {...
storage にプレイヤーの頭のテクスチャデータ(ブロックのNBTデータ)を保存します。
#ブロックをリセット
#看板
data merge block <看板1の座標> {...
data merge block <看板2の座標> {...
data merge block <看板3の座標> {...
#プレイヤーの頭
data modify block <頭1の座標> SkullOwner set from storage lock:head/0
data modify block <頭2の座標> SkullOwner set from storage lock:head/0
data modify block <頭3の座標> SkullOwner set from storage lock:head/0
#扉をロック
setblock <赤羊毛の座標> minecraft:air
マップ上の看板、プレイヤーの頭、扉を開ける為のレッドストーンをリセットします。
<code1.mcfunction>
#カウントを1進める
scoreboard players add #lock code1 1
#カウントが10ならば0に戻す
execute if score #lock code1 matches 10.. run scoreboard players set #lock code1 0
scoreboard の code1 を 1 増加させます。もし code1 が 10 の時は 0 に戻します。
#頭のテクスチャを変更
execute if score #lock code1 matches 0 run data modify ...
execute if score #lock code1 matches 1 run data modify ...
execute if score #lock code1 matches 2 run data modify ...
execute if score #lock code1 matches 3 run data modify ...
execute if score #lock code1 matches 4 run data modify ...
execute if score #lock code1 matches 5 run data modify ...
execute if score #lock code1 matches 6 run data modify ...
execute if score #lock code1 matches 7 run data modify ...
execute if score #lock code1 matches 8 run data modify ...
execute if score #lock code1 matches 9 run data modify ...
code1 の値に応じて、storageのデータを用いてプレイヤーの頭のテクスチャを変更します。
code2.mcfunction, code3.mcfunction も同じ構造です。
<check.mcfunction>
#パスコードをチェック
execute if score #lock unlocked matches 0 if score #lock code1 matches <数字1> ...
unlocked の値が0(ロックが解除されていない)かつ code1、code2、code3 があらかじめ設定した値に等しいとき、function(lock:unlocked)を実行します。
<unlock.mcfunction>
scoreboard players set #lock unlocked 1
#扉をアンロック
setblock <赤羊毛の座標> minecraft:redstone_torch
unlocked の値を1にします。また、ロックが解除された時の挙動を指定します。ここでは、解除時に扉が開くようにレッドストーントーチを設置します。
応用例
例①
正しいコードに合わせるとトラップドアが開き、奥のチェストの中を見ることができます。
変更点
・プレイヤーの頭のテクスチャ
reset.mcfunction の
#頭のテクスチャを保存
data merge storage lock:head/0 {{Id:[
I;xxx,xxx,xxx,xxx],Properties:{textures:[{
Value:"
xxx"}]}}
data merge storage lock:head/1 ...
の橙色の部分を変更したいテクスチャのデータに置き換えます。プレイヤーの頭のテクスチャはこちらのサイト 等から探すことができます。
・看板の文字
reset.mcfunction の
#ブロックをリセット
#看板
data merge block <看板1の座標> {Text2:'{
"text":"右クリック","clickEvent":{"action":"run_command","
value":"/execute if score #lock unlocked matches 0 positioned <頭1の座標> run function example:lock/code1"}}'}
data merge block <看板2の座標> ...
の橙色の部分を変更します。"右クリック"を"RIGHT CLICK" にし、文字の色を変更する為に "color":"white" を書き足します。
・トラップドアの挙動
上の画像のようにトラップドアを金庫の扉として使用する場合は、扉の時とは異なりロック解除前にレッドストーントーチを設置し、解除後に撤去する必要があります。従って、unlock.mcfunction を次のように書き換えます。
scoreboard players set #lock unlocked 1
#扉をアンロック
setblock <赤羊毛の座標>
minecraft:air
また逆に reset.mcfunction の minecraft:air を minecraft:redstone_torch に書き換えます。
例②
脱出マップで実際に採用したナンバーロックです。正しいパスコードを入力すると梯子が降りてきます。
変更点
・パスコードの桁を増加
パスコードをこれまでより一桁多い4桁にしています。変更箇所が多いので詳細は省きますが、 code4.mcfunction のファイルを作り、reset.mcfunction、check.mcfunction を修正します。コマンドを一から書く必要はなく code1 ~ code3 のものを流用すればよいので、そこまで難しくはないと思います。
まとめ
さて、二回にわたってナンバーロックの作り方を解説しましたが、いかがだったでしょうか?今回の装置は色々と応用が利きやすいと思いますので、是非ご自身のマップに取り入れてみて下さい。感想をお待ちしております。