예제 #1
0
        /// <summary>
        ///     Enumarable for dispatching all events on a eventIdentifier
        /// </summary>
        /// <typeparam name="T">The ForgeEventArgument Type</typeparam>
        /// <param name="eventIdentifier">The eventIdentifier</param>
        /// <param name="sender">The event sender object</param>
        /// <param name="args">The ForgeEventArguments</param>
        /// <returns>
        ///     <see cref="DispatchEvents"/>
        /// </returns>
        public IEnumerable DispatchEvent <T>(string eventIdentifier, object sender, HammerEventArgs <T> args)
        {
            if (!_eventList.ContainsKey(eventIdentifier))
            {
                yield break;
            }

            foreach (Event @event in _eventList[eventIdentifier])
            {
                if (@event.GetType() != typeof(Event <T>))
                {
                    throw new ForgeCritical(Language.ForgeCriticalInvalidEventTypeInList + eventIdentifier);
                }

                Event <T> iEvent = (Event <T>)@event;

                if (iEvent.EventType == args.ArgumentType)
                {
                    yield return(iEvent.Execute(sender, args));
                }
                else
                {
                    throw new ForgeCritical(Language.ForgeCriticalArgumentTypeDoesNotEqualEventType);
                }
            }
        }
예제 #2
0
        /// <summary>
        ///     Fires all events on the eventIdentifier
        /// </summary>
        /// <typeparam name="T">The ForgeEventArgs type and eventType</typeparam>
        /// <param name="eventIdentifier">The eventIdentifier</param>
        /// <param name="sender">The sender object</param>
        /// <param name="args">
        ///     The ForgeEventArgs.
        ///     These will be passed to the eventHandler and used during execution.
        /// </param>
        /// <returns>
        ///     The event results.
        ///     <example>
        ///         For example if you register an event to calculate movement speed and fire all movement speed event those events can increase or decrease the final movement speed number.
        ///         Below is a code example of creating and registering an event for movementSpeed
        ///         <code>
        ///             //We first create a property which uses the Hammer event System to calculate it's value.
        ///             public float MoveSpeed
        ///             {
        ///                 get
        ///                 {
        ///                     return Hammer.DispatchEvents<float>("MOVEMENTSPEED", object, new HammerEventArgs<float>(moveSpeed));
        ///                 }
        ///             }
        ///
        ///             private moveSpeed = 5;
        ///
        ///             //Now we register an event to add 5 movement speed for 5 seconds.
        ///             Event<float> speedEvent = new Event<float>("EVENT_IDENTIFIER", object); //Identifier is used to remove the speed Event. The object should be the same as the object used in the DispactEvents function.
        ///             speedEvent.ForgeEvent += (obj, args) => args.EventItem + 5; //We create the handler function which adds 5 to the ForgeEventArguments.
        ///
        ///             AftershockState.Hammer.RegisterEventForSeconds("MOVEMENTSPEED", speedEvent, 5); //Registers the newly created speed event for 5 seconds
        ///         </code>
        ///         After using this code the event results will result in having +5 added to it for 5 seconds.
        ///     </example>
        /// </returns>
        public T DispatchEvents <T>(string eventIdentifier, object sender, HammerEventArgs <T> args)
        {
            foreach (T result in DispatchEvent(eventIdentifier, sender, args))
            {
                args.EventItem = result;
            }

            return(args.EventItem);
        }