【統合版アドオン】part-2│ScriptAPIで世界のイベントを自在にコントロールする方法

スポンサーリンク

初めに

どうも餅わらびすとです。この記事では究極の機能、ScriptAPI(gametestとも言う)でのイベントの購読について解説します。

これが使えるとかなり便利。自由にチャットを操作出来たり、ブロックの破壊をキャンセル出来たり。
「まずScriptAPIについて知らない」、という方はこちらの、「【統合版アドオン】part-1│究極の機能、ScriptAPIを徹底解説!」で基本的な使い方を解説しているので、見ていない方は見てください。
ここでは、リンクの記事の内容を理解していることを前提にしているので、記事を見た後に来るのを推奨します。

この記事が役に立つものになれば嬉しいです。

~今回の説明に使用させて頂いたサイト~
https://jaylydev.github.io/scriptapi-docs/#documentation

イベント購読の登録

イベントは、このようにして購読できます。

import { world } from "@minecraft/server";

world./*beforeEventsかafterEvents*/./*登録したいイベント*/.subscribe((/*変数名*/) => {...});

worldに入っている、(beforeEvents or afterEvents) というプロパティの中にある、登録したいイベントのプロパティにある、subscribeというメソッドを実行する、という流れです。

前の記事をクリアした方なら途中までは分かると思いますが、恐らくソッドの部分で疑問が出る人が多いと思うので解説します。

subscribeメソッド

リファレンスによると、subscribeの説明はこのようになっています(itemUseイベントの場合)。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-25-173059.png

まず始めに、メソッドに入る値について書かれていますね。ここは前回でも説明しました、入る値はcallbackのようです(関数)。
次に、callbackの説明を見ると、

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-25-174319.png

とあります。関数のカッコには仮引数が入るんでしたね。これでargは仮引数ということが分かりました。
そして、次の説明をみると、

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-25-182354.png

と書かれています。これは、argにはItemUseAfterEventというクラスのインスタンスが入るよってことです。
そしてそのインスタンスにはそれぞれplayerやらblockやら色々プロパティが入ってて、そこから色々出来るって話なんです。

beforeEventsの話

イベントの種類には、afterEventsだけでなくbeforeEventsなるものもあります。
これは、ずばり「起きたイベントをキャンセル」することができるんです!すごない?

しっくり来ていない人もいると思うので具体的に説明すると、チャットをキャンセル、アイテムの使用をキャンセル、みたいなことが可能になります!

ついでに、イベントから取得できる情報も正確さが増したりも。エラー何も出てないのに何でできないんっていうやつは経験的には2割ぐらいbeforeにして解決する感じ。

そのキャンセルというのは、大抵beforeのEventのcancelプロパティにtrueを代入することで出来ます。

例 :

import { world } from "@minecraft/server";

world.beforeEvents.chatSend.subscribe(ev => {
ev.cancel = true;
});

便利なbeforeEventsですが、1つ注意があります。それは、
     cancel以外のプロパティは基本、変更系の処理は実行できない
ということです。
変更系とは、entityで言うとaddTagなどです。

これは、systemの機能で遅延することで回避できます。

例 :

import { world, system } from "@minecraft/server";

world.beforeEvents.chatSend.subscribe(ev => {
ev.cancel = true;

//system.runで遅延した例
system.run(() => {
ev.sender.sendMessage("runでメッセージをキャンセルしました");
});

//system.runTimeoutで遅延した例
system.runTimeout(() => {
ev.sender.sendMessage("runTimeoutでメッセージをキャンセルしました");
});
});

最後に

ここまで読んでくださりありがとうございました!役に立ったと思ってもらえたら嬉しいです。

なにか質問があるときはこちらのディスコードから受け付けています。初心者も大歓迎!答えられない時は答えられないですがそこまで高度でなければおそらく。

それでは良いアドオンライフを!

※投稿記事に含まれるファイルやリンクにより発生した被害についてクラフターズコロニーは責任を取りません
投稿通報

コメント

コメント通報