【Spigot】Bukkitプラグインの作り方講座 - ダメージの制御
今回はEventシステムを使って、エンティティのダメージを制御します。
エンティティのダメージを制御する
@EventHandler
public void onEntityDamage(EntityDamageEvent e) {
double damage = e.getDamage();
e.setDamage(damage * 2);
}
いきなりコードです。
上のコードではEntityDamageEventを使用しています。
EntityDamageEventはエンティティがダメージを受けた時に発動するイベントです。
上のコードではエンティティが受けるダメージを二倍にしています。
ダメージを受けるエンティティを取得するには、e.getEntity()
でEntityインターフェースを返します。
ダメージが関係していますが、返すのはLivingEntityインターフェースではないので注意して下さい。
エンティティの種類を取得するには、
Entity entity = e.getEntity();
EntityType type = entity.getType();
又は、e.getEntityType()
でEntityType型を返します。
当然ですがこのイベントでダメージを受けるエンティティはプレイヤーも含まれます。
先程のコードではプレイヤーも二倍のダメージを受けてしまいます。
プレイヤーを除外するには以下のようなコードになります。
@EventHandler
public void onEntityDamage(EntityDamageEvent e) {
double damage = e.getDamage();
EntityType type = e.getEntityType();
if (type != EntityType.PLAYER) {
e.setDamage(damage * 2);
}
}
また前回同様、多くのイベントでイベントのキャンセルをすることが出来ます。
これを使用してプレイヤーが攻撃を受けないようにする事もできます。
if (type == EntityType.PLAYER) {
e.setCancelled(true);
}
このイベントは攻撃する側がどんなものであっても発動します。
攻撃する側をエンティティに限定したい場合は、EntityDamageByEntityEventを使うと良いです。
逆にエンティティ以外に限定したい場合は、EntityDamageByBlockEventを使います。
EntityDamageEventで、攻撃するものが何なのか調べたい場合は、e.getCause()
を使用します。
EntityDamageByEntityEventの場合は、e.getDamager()
を使って攻撃したエンティティを取得できます。
EntityDamageByBlockEntityではサボテンに刺された時や、奈落に落ちた時などに発生します。
サボテンの場合など、e.getDamager()
でブロックを取得できますが、
奈落などの場合は対象のブロックがない場合があるので注意が必要です。