EffectAddイベント ~エフェクトを検知する~ [Script API]

EffectAddイベントはエンティティにエフェクト(鈍足や毒など)が付いた時に発火するイベントです。このイベントを使えばエフェクトが付いたタイミングで好きな処理を挟むことができます。

EffectAddイベントの使い方

EffectAddイベントはEffectAddEventSignalsubscribeメソッドを呼び出し、コールバックを指定することで使う(購読する)ことができます。

購読の仕方は以下の通り。

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クラスです。

関連クラス

関連クラスは次の通りです。

クラス名概要リファレンス
EffectAddEventSignalエンティティにエフェクトが付与された時の
コールバックを管理するクラス
公式リファレンス
EffectAddEventエフェクトが付与されたタイミングの情報を含むクラス公式リファレンス
Effect付与されたエフェクトに関する情報を含むクラス公式リファレンス

サンプルコード

EffectAddイベントのサンプルコードを紹介します。

すべてのプレイヤーに付与されたエフェクトを通知する

EffectAddEventeffectプロパティを参照することでエフェクトの詳細を知ることができます。

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プロパティのdisplayNamedurationamplifierで知ることができます。

注意点としては、EffectAddEventクラスのentityプロパティはプレイヤー以外のエンティティを含むことです。

プレイヤー以外のエンティティはnameプロパティを持たないので、entity.nameundefinedになります。

これを避けるために、サンプルコードではentity.nameundefinedだった場合にエンティティのタイプ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クラスの使い方について解説していきました。

特定のエフェクトをかけた時だけ何か処理をする、特定のエフェクトは禁止するなど、いろいろ応用してみてください。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です