更新日:
1. 鍵のアイテムを作る
/give @s tripwire_hook[custom_data={key:1b},custom_name="金庫の鍵"]
トリップワイヤーフックを鍵として使う例です。custom_data に入れた key:1b が「本物の鍵」の目印になります。名前だけで判定すると金床で同じ名前を付けたアイテムでも開いてしまうので、目印は custom_data に入れます。1.21.4以前は名前を custom_name='"金庫の鍵"' のように書きます。
2. ドアと目印を置く
鉄のドアを置き、ドアの下のブロックの位置に目印(marker)を置きます。鉄のドアの下の段に立って、次のコマンドを実行します。
/summon marker ~ ~-1 ~ {Tags:["keydoor"]}
この目印の場所に、あとでレッドストーンブロックを置いたり消したりしてドアを開け閉めします。ドアの下のブロックは、ふつうの石などにしておきます。
3. 鍵を持っている人を調べる(くり返し)
/tag @a remove near_key
/execute at @e[type=marker,tag=keydoor] as @a[distance=..3] if items entity @s weapon.* *[custom_data~{key:1b}] run tag @s add near_key
1行目をくり返しコマンドブロック(常時実行)に入れ、2行目をチェーンでつなげます。毎回いったんタグを外してから、ドアから3マス以内で鍵を手に持っている人にだけ near_key タグを付けます。weapon.* は利き手ともう片方の手の両方、* はどのアイテムでも、custom_data~{key:1b} は「key:1b が入っているもの」という意味です。
4. ドアを開け閉めする(くり返し)
/execute at @e[type=marker,tag=keydoor] if entity @a[tag=near_key,distance=..3] run setblock ~ ~ ~ redstone_block
/execute at @e[type=marker,tag=keydoor] unless entity @a[tag=near_key,distance=..3] run setblock ~ ~ ~ stone
3の後ろにチェーンでつなげます。鍵を持った人が近くにいる間はドアの下がレッドストーンブロックになってドアが開き、いなくなると石に戻ってドアが閉まります。目印を置いたドアごとに動くので、鍵付きドアをいくつも作れます。
5. 1回使うと消える鍵にする
/execute at @e[type=marker,tag=keydoor] as @a[tag=near_key,distance=..3] run clear @s tripwire_hook[custom_data~{key:1b}] 1
4の2行目(閉める行)を消し、代わりにこの行を4の1行目の後ろにチェーンでつなげます。ドアは一度開くと開いたままになり、使った鍵は1つ消えます。もう一度閉めるときは、目印の場所を /execute at @e[tag=keydoor] run setblock ~ ~ ~ stone で石に戻します。
6. 鍵の種類を分ける
ドアごとに別の鍵にしたいときは、目印と鍵の両方に番号を付けます。たとえば鍵を custom_data={key:2b}、目印のタグを keydoor2 にして、3と4のコマンドの数とタグを入れかえたものを、もう1組作ります。
7. 鍵なしの自動ドアにする
execute at @e[type=marker,tag=keydoor] if entity @a[distance=..3] run setblock ~ ~ ~ redstone_block
execute at @e[type=marker,tag=keydoor] unless entity @a[distance=..3] run setblock ~ ~ ~ stone
だれでも近づくだけで開く自動ドアにするなら、3のタグの行はいらず、4の2行から tag=near_key, を消した形になります。統合版では目印に marker が使えないので、座標を直接書いて execute if entity @a[x=10,y=64,z=10,r=3] run setblock 10 63 10 redstone_block のように、distance の代わりに r を使います。
うまくいかないときの確認ポイント
- ドアが開かない:目印がドアの真下のブロックの位置にあるか、
/execute at @e[tag=keydoor] run particle flame ~ ~1 ~で場所を確認します。 - 鍵を持っても反応しない:鍵を1のコマンドで出し直し、
custom_dataが付いているか確認します。 - ドアを開けたまま通れない:近づく距離
distance=..3を大きくします。 - 統合版で作りたい:統合版には if items がないので、セレクターの
hasitemという条件で、手に持っているアイテムを調べます。
よくある質問
ドアの代わりに壁を消せますか?
setblock の代わりに fill で壁の部分を air にし、閉めるときに元のブロックで埋め直せば、壁が開くしかけにできます。
鍵を持っている人だけを中に入れたいのですが?
ドアの代わりに、鍵を持っていない人を部屋の外に tp で戻すしくみにすると、ドアの後ろについて入ることもできなくなります。
木のドアでも使えますか?
木のドアは手で開けられるので、鍵の意味がなくなります。鉄のドアか鉄のトラップドアを使います。