初めに
どうも餅わらびすとです。この記事では究極の機能、ScriptAPI(gametestとも言う)でのイベントの購読について解説します。
これが使えるとかなり便利。自由にチャットを操作出来たり、ブロックの破壊をキャンセル出来たり。
「まずScriptAPIについて知らない」、という方はこちらの、「【統合版アドオン】part-1│究極の機能、ScriptAPIを徹底解説!」で基本的な使い方を解説しているので、見ていない方は見てください。
ここでは、リンクの記事の内容を理解していることを前提にしているので、記事を見た後に来るのを推奨します。
この記事が役に立つものになれば嬉しいです。
~今回の説明に使用させて頂いたサイト~
・https://jaylydev.github.io/scriptapi-docs/#documentation
~前回~
・https://minecraft-mcworld.com/68139/
イベント購読の登録
イベントは、このようにして購読できます。
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](https://minecraft-mcworld.com/wp-content/uploads/%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](https://minecraft-mcworld.com/wp-content/uploads/%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](https://minecraft-mcworld.com/wp-content/uploads/%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なるものもあります。
これは、ずばり「起きたイベントをキャンセル」することができるんです!すごいですよね?
しっくり来ていない人もいると思うので具体的に説明すると、チャットをキャンセル、アイテムの使用をキャンセル、みたいなことが可能になります。
そのキャンセルというのは、大抵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でメッセージをキャンセルしました");
});
});
最後に
ここまで読んでくださりありがとうございました!役に立ったと思ってもらえたら嬉しいです。
なにか質問があるときはこちらのディスコードサーバーから受け付けています。どんな人も大歓迎!一応ここでも受け付けますが内容が複雑になると判断した質問はサーバーでしか受け付けません。
それでは良いアドオンライフを!
コメント
自分用メモ
part1 究極の機能、ScriptAPIを徹底解説!
https://minecraft-mcworld.com/68139/
part3 カスタムUI
https://minecraft-mcworld.com/70459/