MC CommanderMinecraft非公式コマンド支援

鍵を持っている人だけ通れるドアをコマンドで作る方法

決まった鍵のアイテムを手に持ってドアに近づくと、鉄のドアが自動で開くしくみを作ります。脱出ゲームやアスレチックの扉に使えます。Java版(1.20.5以降)の書き方で説明します。

ドアアイテム判定Java版

giveコマンドを作る

更新日:

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 を使います。

うまくいかないときの確認ポイント

よくある質問

ドアの代わりに壁を消せますか?

setblock の代わりに fill で壁の部分を air にし、閉めるときに元のブロックで埋め直せば、壁が開くしかけにできます。

鍵を持っている人だけを中に入れたいのですが?

ドアの代わりに、鍵を持っていない人を部屋の外に tp で戻すしくみにすると、ドアの後ろについて入ることもできなくなります。

木のドアでも使えますか?

木のドアは手で開けられるので、鍵の意味がなくなります。鉄のドアか鉄のトラップドアを使います。

関連ページ

脱出ゲームの作り方鍵・ヒント・タイマーを作ります。アイテムを持つと効果が出るコマンド

if items の使い方です。

カスタムアイテムの作り方

鍵のアイテムを作るときに。

アドベンチャーモードで壊せる・置けるブロックを決める

脱出ゲームの準備に。

右クリックで発動するアイテムの作り方

鍵を使う動きを付けるときに。

コマンド辞典

基本構文とコマンド別の使い方を確認できます。