    001    package net.minecraftforge.event;
    002
    003
    004    /**
    005     * Base Event class that all other events are derived from
    006     */
    007    public class Event
    008    {
    009        public enum Result
    010        {
    011            DENY,
    012            DEFAULT,
    013            ALLOW
    014        }
    015
    016        private boolean isCanceled = false;
    017        private final boolean isCancelable;
    018        private static ListenerList listeners = new ListenerList();
    019
    020        public Event()
    021        {
    022            setup();
    023            Class cls = this.getClass();
    024            boolean found = false;
    025            while (cls != Event.class)
    026            {
    027                if (cls.isAnnotationPresent(Cancelable.class))
    028                {
    029                    found = true;
    030                    break;
    031                }
    032                cls = cls.getSuperclass();
    033            }
    034            isCancelable = found;
    035        }
    036
    037        /**
    038         * Determine if this function is cancelable at all.
    039         * @return If access to setCanceled should be allowed
    040         */
    041        public boolean isCancelable()
    042        {
    043            return isCancelable;
    044        }
    045
    046        /**
    047         * Determine if this event is canceled and should stop executing.
    048         * @return The current canceled state
    049         */
    050        public boolean isCanceled()
    051        {
    052            return isCanceled;
    053        }
    054
    055        /**
    056         * Sets the state of this event, not all events are cancelable, and any attempt to
    057         * cancel a event that can't be will result in a IllegalArgumentException.
    058         *
    059         * The functionality of setting the canceled state is defined on a per-event bases.
    060         *
    061         * @param cancel The new canceled value
    062         */
    063        public void setCanceled(boolean cancel)
    064        {
    065            if (!isCancelable())
    066            {
    067                throw new IllegalArgumentException("Attempted to cancel a uncancelable event");
    068            }
    069            isCanceled = cancel;
    070        }
    071
    072        /**
    073         * Called by the base constructor, this is used by ASM generated
    074         * event classes to setup various functionality such as the listener's list.
    075         */
    076        protected void setup()
    077        {
    078        }
    079
    080        /**
    081         * Returns a ListenerList object that contains all listeners
    082         * that are registered to this event.
    083         *
    084         * @return Listener List
    085         */
    086        public ListenerList getListenerList()
    087        {
    088            return listeners;
    089        }
    090    }