生き物にエフェクトがついているかどうかを判定する
2024/12/20 公開 (2025/01/27 更新)
統合版(教育版)マインクラフトでは Script API を使うと、エンティティにエフェクトが付いているかを確認できるらしい!とのことでやってみた。
プレイヤーがエンティティを叩いたかを検知する
エフェクトがついたかどうかを調べるのに、何を合図にしたらよいかなぁ・・・と。とりあえず、生き物を攻撃したときに発動させてみようと思います。
import { Entity, EntityHitEntityAfterEvent, ScreenDisplay, world } from "@minecraft/server";
world.afterEvents.entityHitEntity.subscribe((event: EntityHitEntityAfterEvent) => {
const targetEntity = event.hitEntity as Entity;
const sourceEntity = event.damagingEntity as Entity;
world.sendMessage(`${sourceEntity.typeId} は ${targetEntity.typeId} を攻撃した!`);
});
エンティティを攻撃したかどうかは afterEvents
プロパティの entityHitEntity
にて検出できます。攻撃された側のエンティティを識別する際には hitEntity
を使用し、攻撃した側を識別する際には damagingEntity
を使用します。
それぞれのプロパティには typeId
プロパティが定義されており、エンティティの種類を得られますね。

叩いたエンティティに対してエフェクトがついているかを検知する
先のセクションの hitEntity
を参照し、getEffects()
メソッドを使用してエフェクトを取得すればOKです。
import { Effect, Entity, EntityHitEntityAfterEvent, world } from "@minecraft/server";
world.afterEvents.entityHitEntity.subscribe((event: EntityHitEntityAfterEvent) => {
const targetEntity = event.hitEntity as Entity;
const effects = targetEntity.getEffects();
world.sendMessage(`${targetEntity.typeId} は`);
effects.forEach((effect: Effect) => {
world.sendMessage(`${effect.typeId}`);
})
world.sendMessage(`のエフェクトがかかっている`);
});

プレイヤーの半径10ブロック以内のエンティティにエフェクトがついているか確認する
ちょい複雑になります。エンティティの探索を EntityQueryOptions
にて作成したクエリを用いて行い、そのエンティティがエフェクトを持っているかどうかを判定します。
ここではエフェクトの有無しか見ていませんが、エフェクトの詳細を確認する場合は前のセクションの書き方をやればいいですね!
import { Entity, EntityHitEntityAfterEvent, EntityQueryOptions, world } from "@minecraft/server";
world.afterEvents.entityHitEntity.subscribe((event: EntityHitEntityAfterEvent) => {
const query: EntityQueryOptions = {
location: event.damagingEntity.location,
maxDistance: 10
};
const entities = world.getDimension("overworld").getEntities(query);
entities.forEach((entity: Entity) => {
const effects = entity.getEffects();
if (effects.length > 0) {
world.sendMessage(`${entity.typeId} はエフェクトがかかっている!`);
}
})
});

という感じで、エフェクトがついているかどうかを判定することができますヨ。
例えば、エフェクトをつけたら課題をクリアするような時などは、エフェクトがついた時をトリガーにする effectAdd
プロパティ(イベント)を使用すると良さそうですね~