EffectAddイベントはエンティティにエフェクト(鈍足や毒など)が付いた時に発火するイベントです。このイベントを使えばエフェクトが付いたタイミングで好きな処理を挟むことができます。
EffectAddイベントの使い方
EffectAddイベントはEffectAddEventSignalのsubscribeメソッドを呼び出し、コールバックを指定することで使う(購読する)ことができます。
購読の仕方は以下の通り。
import { world } from "@minecraft/server";
/**
* EffectAddイベントの処理
* @param {import("@minecraft/server").EffectAddEvent} effectAddEvent
*/
const effectAddHandler = effectAddEvent => {
// 処理内容をここに記載
}
// effectAddイベントにeffectAddHandlerコールバックを追加(監視)
world.events.effectAdd.subscribe(effectAddHandler);
// effectAddイベントからeffectAddHandlerコールバックを除去(監視の解除)
world.events.effectAdd.unsubscribe(effectAddHandler);コールバックの引数はEffectAddEventクラスです。
関連クラス
関連クラスは次の通りです。
サンプルコード
EffectAddイベントのサンプルコードを紹介します。
すべてのプレイヤーに付与されたエフェクトを通知する
EffectAddEventのeffectプロパティを参照することでエフェクトの詳細を知ることができます。
import { world } from "@minecraft/server";
world.events.effectAdd.subscribe(effectAddEvent => {
const { entity, effect } = effectAddEvent;
entity.runCommandAsync(`say ${entity.name ?? entity.typeId}にエフェクトが付与されました。`);
entity.runCommandAsync(`say エフェクト: ${effect.displayName}`);
entity.runCommandAsync(`say 持続時間: ${effect.duration}`);
entity.runCommandAsync(`say レベル(amplifier): ${effect.amplifier}`);
});エフェクトをかけられたエンティティがsayコマンドでエフェクトの中身をメッセージとして伝えています。
エフェクトの名前、持続時間、レベルはそれぞれEffectAddEventクラスのeffectプロパティのdisplayName、duration、amplifierで知ることができます。
注意点としては、EffectAddEventクラスのentityプロパティはプレイヤー以外のエンティティを含むことです。
プレイヤー以外のエンティティはnameプロパティを持たないので、entity.nameがundefinedになります。
これを避けるために、サンプルコードではentity.nameがundefinedだった場合にエンティティのタイプIDであるentity.typeIdを表示するようにしています。
すべてのエフェクトをキャンセルする
プレイヤーにエフェクトがかからないように制限してみましょう。
import { world } from "@minecraft/server";
world.events.effectAdd.subscribe(effectAddEvent => {
const { entity, effect } = effectAddEvent;
if (entity.typeId !== "minecraft:player") { return; }
entity.runCommandAsync(`effect @s clear`);
entity.runCommandAsync(`say エフェクトが付与されましたがキャンセルしました`);
entity.runCommandAsync(`say キャンセルしたエフェクト: ${effect.displayName}`);
});エンティティのタイプIDを見て、プレイヤーだった場合にプレイヤー自身がeffect @s clearコマンドを発行してエフェクトをキャンセルしています。
まとめ
この記事ではEffectAddイベントの購読方法と、EffectAddEventクラスの使い方について解説していきました。
特定のエフェクトをかけた時だけ何か処理をする、特定のエフェクトは禁止するなど、いろいろ応用してみてください。

