【統合版】ScriptAPIでアドオンを作ろう #3 様々なイベントを知ろう

スポンサーリンク

事前説明

こんにちは、さば2号です。
ScriptAPIを使った簡単なアドオンの作り方を解説していきます。

今回は「チャットを送信したとき」「ダメージを受けた/与えたとき」「ブロックを壊した/置いたとき」などのイベントについてを解説していきます。

事前準備、アドオンフォルダの作成、manifestの書き方は前回の解説をご覧ください。
【統合版】ScriptAPIでアドオンを作ってみよう #1 ダメージメッセージ

注意事項

・この記事は2024/03/26時点のものです。
・投稿者は素人です。間違えることがあります。

2種類のイベント

ScriptAPIには大きく分けて2種類のイベントがあります。
BeforeEventsAfterEventsの2つです。

WorldBeforeEvents Class
WorldAfterEvents Class

同じアクションで起動するイベントでも、BeforeAfterで少し違いがあります。
・取得できるプロパティの違い。
・アクションのキャンセルができるか否か。
・ゲームに変更を加える操作ができるか否か。

例:playerBreakBlock
トリガーアクション:プレイヤーがブロックを破壊したとき
Beforeの場合:ブロック破壊をキャンセルできる。
afterの場合:ブロック破壊をキャンセルできない。使用後のアイテム(ピッケルなど)を取得できる。

BeforeEvents

BeforeEventsはトリガーとなるアクションが発生するに起動します。
そのためほとんどのイベントで、そのアクションのキャンセルができます

例えば、ChatSendBeforeEventはチャットの送信前に起動し、その送信をキャンセルできます。
PlayerBreakBlockBeforeEventではブロックの破壊をキャンセルできます。

またゲームの状態を変更する操作ができないことに注意しましょう。
例:dimension.spawnEntity(), player.runCommand(), container.setItem() など…

実行しようとするとエラーが発生します。
[Scripting][error]-ReferenceError: Native function [Entity::runCommand] does not have required privileges. at <anonymous> (main.js:12)

実行したい場合はその処理をsystem.run()system.runTimeout()で遅延させましょう。

// world, system をインポート
import { world, system } from "@minecraft/server";

// チャットの送信前に起動する
world.beforeEvents.chatSend.subscribe(ev => {
    const player = ev.sender;

    // ゲームに変更を加える操作なのでエラーとなる。
    // player.runCommand("say test1");

    // 遅延して実行する
    system.run(() => {
        // 実行できる
        player.runCommand("say test2");

        // ただし遅延後はキャンセル機能は使えない
        ev.cancel = true;
    });
});

AfterEvents

AFterEventsはトリガーとなるアクションが発生したに起動します。
そのためBeforeではできたアクションのキャンセルはできません。

キャンセルを行わない場合は、こちらを使いましょう。

よく使うイベント一覧

リファレンス
WorldBeforeEvents Class
WorldAfterEvents Class

chatSend
●チャットを送信すると起動。
・送信者やチャット内容を取得できる。
・キャンセル可能。

itemUse
●アイテムを使用(長押しタップor右クリ)すると起動。
・使用者や使用アイテムを取得できる。
・キャンセル可能。

playerInteractWithBlock
●プレイヤーがブロックを触ると起動。
・使用者や使用アイテム、触れたブロックを取得できる。
・キャンセル可能(チェストの開閉や、ブロックの設置)。

playerBreakBlock
●プレイヤーがブロックを破壊すると起動。
・使用者や使用アイテム、破壊ブロックを取得できる。
・キャンセル可能。

playerBlockPlace
●プレイヤーがブロックを設置すると起動。
・使用者や使用アイテム、設置ブロックを取得できる。
・キャンセル可能。

playerInteractWithEntity
●プレイヤーがエンティティに触れると起動。
・使用者や使用アイテム、触れたエンティティを取得できる。
・キャンセル可能。

entityHurt (afterのみ)
●エンティティがダメージを受けると起動。
・ダメージを受けた/与えたエンティティ、ダメージ量などを取得できる。

playerSpawn (afterのみ)
●プレイヤーがスポーン(リスポーンも含む)すると起動。
・プレイヤーを取得でき、スポーンかリスポーンかどうかも分かる。
・似たイベントでplayerJoinもあるが、こちらの方が便利。

playerLeave
●プレイヤーが退出する前に起動。
・Beforeではプレイヤーを取得できる。

worldInitialize
●ワールド上でスクリプトが初期化時に起動。
・初期化処理で使うことがある。

【番外編】
system.runInterval()
・指定した一定ティックごとに動作する。
・常時実行する処理で使う。
これを利用したアドオンは別で解説します。

参考URL

公式リファレンス
minecraft/server Module | Microsoft Learn

ディスコードサーバー
Script API 開発初心者コミュニティ

参考にしたサイト
マイクラの泉

備忘録ブログ
さば2号のgametest(scriptAPI)備忘録

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

コメント

コメント通報