事前説明
こんにちは、さば2号です。
ScriptAPIを使った簡単なアドオンの作り方を解説していきます。
今回は「チャットを送信したとき」「ダメージを受けた/与えたとき」「ブロックを壊した/置いたとき」などのイベントについてを解説していきます。
事前準備、アドオンフォルダの作成、manifestの書き方は前回の解説をご覧ください。
【統合版】ScriptAPIでアドオンを作ってみよう #1 ダメージメッセージ
注意事項
・この記事は2024/03/26時点のものです。
・投稿者は素人です。間違えることがあります。
2種類のイベント
ScriptAPIには大きく分けて2種類のイベントがあります。
BeforeEventsとAfterEventsの2つです。
WorldBeforeEvents Class
WorldAfterEvents Class
同じアクションで起動するイベントでも、BeforeとAfterで少し違いがあります。
・取得できるプロパティの違い。
・アクションのキャンセルができるか否か。
・ゲームに変更を加える操作ができるか否か。
例: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 開発初心者コミュニティ
参考にしたサイト
マイクラの泉
コメント