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
クラスの使い方について解説していきました。
特定のエフェクトをかけた時だけ何か処理をする、特定のエフェクトは禁止するなど、いろいろ応用してみてください。