hogepiyo

かつてはマイクラのModを作っていたがひざに矢を受けた

CancelableなEvent

概要

Eventにはそのクラス自体にCancelableアノテーションが付与されているものがある. たとえば

@Cancelable
public class AttackEntityEvent extends PlayerEvent {
...
}

CancelableなEventではsetCanceled(bool)が呼べる. このsetCanceled()というのは, このEvent自体のキャンセルではなく, このEventを呼び出すメソッドの, Event以降の処理をキャンセルする.

AttackEntityEventはEntityPlayer.attackTargetEntityWithCurrentItem()の最初に呼ばれる. したがってこのEventでsetCanceled(true)をすると, attackTargetEntityWithCurrentItem()の処理がキャンセルされる. つまりCancelableなEventで割り込みに成功したときは, setCanceled(true)をしないと元の処理が実行されてしまう.

実例

新しい矢を追加したとしよう. その矢をバニラの弓で撃てるようにするにはArrowNockEventやArrowLooseEventを実装する必要がある. この2つのEventで新しい矢を発射させる処理のあとにsetCanceled(true)しないと, ItemBowの通常の処理も実行されて, バニラの矢も一緒に発射されてしまうのだ.