この記事はhttps://qiita.com/advent-calendar/2024/mccmd シリーズ2、13日目の記事です。
はじめに
初めまして!sonichitsuiiです。
今回の記事では、初心者が行き詰まりやすい、右クリック検知について色々と試行錯誤したので、その結果をまとめようと思います。
方法
まず、右クリック検知の多くに使われているのがニンジン付きの棒を利用した方法です。
この方法が一番簡単で扱いやすいのでよく使われています。
# 先に実行しておいてね
scoreboard objectives add hoge minecraft.used:minecraft.carrot_on_a_stick
# 人参棒の使用を検知
execute as @a[scores={hoge=1..}] at @s run summon tnt ~ ~ ~
# スコアリセット
scoreboard players set @a[scores={hoge=1..}] hoge 0
こんな感じですね。summon tnt ~ ~ ~
の部分は好きに変えてください。
見たとおり、これだけでできるのでとても簡単です。
ガバガバですが、長押しも一応検知出来なくもないです。
他にも、特定の場所への右クリックと左クリックを検知する方法にinteractionエンティティを利用した方法や村人を利用した方法がありますが、ここでは省きます。
次は長押し検知の方法を紹介します。
主に使われていたのは、弓を使った方法です。
{
"criteria": {
"use_bow": {
"trigger": "minecraft:using_item",
"conditions": {
"player": {
"slots": {
"weapon.mainhand": {
"items": "minecraft:bow",
"components": {
"minecraft:custom_data": {
"custom_item": 1
}
}
}
}
}
}
}
},
"rewards": {
"function": "hoge:main"
}
}
このファイルは、custom_data
コンポーネントのcustom_item=1
の弓を使用中、関数hoge:main
が実行される進捗です。hoge:main
には、この進捗を削除するコマンドを書いてください。これで、長押しすると毎tick実行されるようになります。
そして、押し終わりも検知したいですね。
scoreboard objectives add use_bow minecraft.used:minecraft.bow
これで押し終わるとこのスコアボードに1が足されます。これを利用して、長押しと押し終わりを検知できるのです。
しかし、この方法には
・弓なのでインベントリに矢が必要
・音と矢が消えるまでに一瞬かかる
という問題点があります。
ですが、上記の問題点を解決できる方法があります。
それが、consumeableを利用する方法です。
consumeable
とは、食べ物やポーションに記述されているコンポーネントです。
食べるのにかかる時間をすっごく長くして、食べるアニメーションと食べる時の音とパーティクルも消せば、長押しを検知できるアイテムの完成です。
これを進捗で検知しましょう。
{
"criteria": {
"a": {
"trigger": "minecraft:using_item",
"conditions": {
"player": {
"slots": {
"weapon.mainhand": {
"components": {
"minecraft:custom_data": {
"custom_item": 1
}
}
}
}
}
}
}
},
"rewards": {
"function": "hoge:main"
}
}
さっきと同様、hoge:main
でこの進捗を消すコマンドを書いておいてください。
これで右クリックをしている間実行される関数の完成です。
押し終わりは実行が途切れたことなどで検知してください。私の使用している例を挙げておきます。
# 進捗消去
advancement revoke @s only sorcery:using_wand
# スタート
tag @s add Click.Check
tag @s add Click.Right
# 押し終わるとClick.Checkが消えるので検知が可能
execute as @a at @s if entity @s[tag=Click.Right,tag=!Click.Check] run summon tnt ~ ~ ~
execute as @a at @s if entity @s[tag=Click.Right,tag=!Click.Check] run scoreboard players set @s Click.Right 0
# 長押し中はスコア増加
execute as @a at @s if entity @s[tag=H.Click.Check] run scoreboard players add @s Click.Right 1
# タグ消去
tag @s remove Click.Check
こんな感じですね。先ほどと同様、summon tnt ~ ~ ~
の部分は好きなコマンドに変えてもらって大丈夫です。
おわりに
いかがでしたか?
consumeable
は死ぬほど万能なので、是非使ってください!
あと、この記事に乗っているコマンドもすべて好きに使ってください。
皆さんのコマンド制作の参考になれば幸いです。
それでは!