生き物にエフェクトがついているかどうかを判定する

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 プロパティ(イベント)を使用すると良さそうですね~

たくのろじぃ

本プロジェクトの企画・運営担当。ChatGPTといっしょにWebサイトを立ち上げ、マイクラプログラミングに関する記事を執筆中。趣味は温泉旅行とプログラミング。