package tc.oc.commons.bukkit.event; import org.bukkit.Physical; import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.event.Cancellable; import org.bukkit.event.EntityAction; import org.bukkit.event.Event; import javax.annotation.Nullable; public abstract class GeneralizingEvent extends ExtendedCancellable implements Cancellable, Physical, EntityAction { protected boolean propagateCancel = true; @Nullable protected final Event cause; public GeneralizingEvent(@Nullable Event cause) { super(); this.cause = cause; } @Nullable public Event getCause() { return this.cause; } @Override public World getWorld() { return cause instanceof Physical ? ((Physical) cause).getWorld() : null; } @Override public Entity getActor() { return cause instanceof EntityAction ? ((EntityAction) cause).getActor() : null; } @Override public void setCancelled(boolean cancel) { super.setCancelled(cancel); if(this.propagateCancel && this.cause instanceof Cancellable) { ((Cancellable) this.cause).setCancelled(cancel); } } /** * Set whether or not cancelling (or un-cancelling) this generalized event * automatically cancels its wrapped cause event. This is enabled by default. */ public void setPropagateCancel(boolean yes) { this.propagateCancel = yes; } }