0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

advancementで右クリックを検知する方法

0
Posted at

この記事はMinecraft JavaEdition version1.21.11時点での情報です

概要

早速右クリックを検知する方法について話していきましょう。
実装の方法を手っ取り早く知りたい人は実装の見出しまで読み飛ばしてもらっても構いません。

まぁと言っても方法自体はそんな難しくありません。
componentのconsumableを付けたアイテムを右クリックしたことをadvancementの
using_itemで検知しrewardとしてfunctionを実行させるだけです。

まるで何かの呪文みたいですね。
これだと何が何だか分からない人もいらっしゃるでしょうしそれぞれの用語を解説していきましょう。
すでに知っているという人は全部読み飛ばしてもらっても構いません。

component

マインクラフトのアイテムにはcomponentというものが設定されています。
例えばピッケルなどにはtoolというcomponentが設定されており、道具としてのふるまいを定義しています。

今回使うcomponentはconsumableになります。
consumableはその名の通り消費できるアイテムに付けられるcomponentです。
食べ物やポーションなどですね。
大事なこととしてこのcomponentがついているアイテムは右クリックで使う事が出来るようになります。

これが肝となるわけです。

advancement

advancementはバニラでおなじみの進捗のことです。

進捗が達成される条件の一つとしてusing_itemというものがあります。
これはその名の通りアイテムを使用したことを検知できます。
しかも1tick単位で。
using_itemの達成条件には当然consumableを付けたアイテムの使用も含まれます。

このままでは進捗を達成するだけで何もできないので、advancementのrewardという機能を使います。
rewardはそのまま進捗を達成した報酬です。
そしてこの報酬としてfunctionを実行させることが出来るのでこれを利用して処理をしていきます。

実装

ということでお待ちかねの実装の時間です。
具体的なコードを見ていきましょう。

namespace/advancement/right_click.json
{
  "criteria": {
    "requirement": {
      "trigger": "minecraft:using_item"
    }
  },
  "rewards": {
    "function": "namespace:right_click"
  }
}

まずは適当なデータパックを作って名前空間のフォルダにadvancementというファイルを作りまたその中にright_click.jsonというファイルを作りましょう。
そしてその中身を上のコードブロックのように設定してください。

次にfunctionの方の準備をしていきます。

namespace/function/right_click.mcfunction
say right_click
advancement revoke only namespace:right_click

functionファイルの方は上のように設定してください
これでデータパック側の準備は完了です。

チャット欄で実行
give @s diamond[consumable={consume_seconds:10000,animation:"none"}]

上のコマンドをチャット欄で実行すると、ダイアモンドが手に入るはずです。
そしてそのダイアモンドを右クリックしてみましょう。
チャット欄にright_clickと表示されたら成功です。

これで完成……と言いたいところですがこのままでは右クリックで使用できるアイテムなら何
を使ってもfunctionが実行されてしまいます。
これを防ぐためadvancementに少し手を加えましょう。

namespace/advancement/right_click
{
  "criteria": {
    "requirement": {
      "trigger": "minecraft:using_item",
      "conditions": {
        "player": {
          "equipment": {
            "mainhand": {
              "predicates": {
                "minecraft:custom_data": {
                  "right_click": true
                }
              }
            },
            "offhand": {
              "predicates": {
                "minecraft:custom_data": {
                  "right_click": true
                }
              }
            }
          }
        }
      }
    }
  },
  "rewards": {
    "function": "namespace:right_click"
  }
}

advancementの中身を上のように設定しましょう。
先ほどに比べ少し長くなりましたが、やっていることは簡単で
「メインハンドあるいはオフハンドにcustom_dataの中に{right_click:1b}というタグが含まれ
るアイテムを持っている」という条件を追加しました。

チャット欄で実行
give @s diamond[consumable={consume_seconds:10000,animation:"none"},custom_data={right_click:1b}]

チャット欄で上のコマンドを実行することによって手に入るダイアモンドをクリックすると
先ほどと同じようにチャット欄にright_clickと出るはずです。
またそれ以外のアイテムをクリックしてもright_clickとは出ないはずです。
これで右クリック検知は完成です。

最後に

今回紹介したのはほんとに初歩の初歩なので、実際使うときにはまたちょっとした工夫をした方が良いでしょう。
例えば持っているアイテムの情報をとりたいことも多いのでメインハンドとオフハンドで
処理を分けるとかですね。
まぁこの記事を参考にして各々発展させていただけたら幸いです。
最後の最後に私のおすすめのdiscordのサーバーの宣伝だけしときます。

コマンド覚えたての初心者からマイクラでROM作ってるキチガイ上級者までいろんな人がいます。
コマンドについてもっと知りたい、技術力をもっと磨きたい人はぜひ参加してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?