/// <summary>
        /// Defines a game object event.
        /// </summary>
        /// <typeparam name="T">The type of the event arguments.</typeparam>
        /// <param name="name">The name.</param>
        /// <param name="category">The category.</param>
        /// <param name="description">The description.</param>
        /// <param name="defaultEventArgs">
        /// The default event arguments that are used when the event is raised without custom event
        /// arguments.
        /// </param>
        /// <returns>The event metadata.</returns>
        /// <remarks>
        /// Game object events must be defined using this method before they can be used. Events are
        /// identified by name and type. If an event with the given <paramref name="name"/> and type
        /// <typeparamref name="T"/> has already been defined, the metadata of the existing event is
        /// returned and the other parameters (<paramref name="category"/>,
        /// <paramref name="description"/> and <paramref name="defaultEventArgs"/>) are ignored!
        /// </remarks>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="name"/> is <see langword="null"/>.
        /// </exception>
        /// <exception cref="ArgumentException">
        /// <paramref name="name"/> must not be an empty string.
        /// </exception>
        public static GameEventMetadata <T> CreateEvent <T>(string name, string category, string description, T defaultEventArgs) where T : EventArgs
        {
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (name.Length == 0)
            {
                throw new ArgumentException("Name must not be an empty string.", "name");
            }

            GameEventMetadata <T> metadata;

            if (GameEventMetadata <T> .Events.TryGet(name, out metadata))
            {
                // Nothing to do - event was already defined.
                return(metadata);
            }

            Debug.Assert(NextEventId == EventMetadata.Count);

            // Create and add new metadata.
            metadata = new GameEventMetadata <T>(name, NextEventId)
            {
                Category         = category,
                Description      = description,
                DefaultEventArgs = defaultEventArgs,
            };

            EventMetadata.Add(metadata);
            NextEventId++;

            return(metadata);
        }
Example #2
0
        //--------------------------------------------------------------
        #region Creation and Cleanup
        //--------------------------------------------------------------

        /// <summary>
        /// Initializes a new instance of the <see cref="GameEvent{T}"/> struct.
        /// </summary>
        /// <param name="owner">The game object that owns this event.</param>
        /// <param name="metadata">The metadata.</param>
        internal GameEvent(GameObject owner, GameEventMetadata <T> metadata)
        {
            Debug.Assert(owner != null, "Owner must not be null.");
            Debug.Assert(metadata != null, "Metadata must not be null.");

            _owner    = owner;
            _metadata = metadata;
        }
        /// <summary>
        /// Gets the event for the given metadata.
        /// </summary>
        /// <typeparam name="T">The type of the property value.</typeparam>
        /// <param name="metadata">The metadata of the property.</param>
        /// <returns>The property</returns>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="metadata"/> is <see langword="null"/>.
        /// </exception>
        public GameEvent <T> Get <T>(GameEventMetadata <T> metadata) where T : EventArgs
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }

            return(new GameEvent <T>(Owner, metadata));
        }
        /// <summary>
        /// Adds an event for the given metadata.
        /// </summary>
        /// <typeparam name="T">The type of the event arguments.</typeparam>
        /// <param name="metadata">The metadata of the event.</param>
        /// <exception cref="ArgumentNullException">
        /// <paramref name="metadata"/> is <see langword="null"/>.
        /// </exception>
        public void Add <T>(GameEventMetadata <T> metadata) where T : EventArgs
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }

            Add <T>(metadata.Id);
        }
        public bool Remove <T>(string name) where T : EventArgs
        {
            GameEventMetadata <T> metadata = GetMetadataChecked <T>(name);

            return(Remove(metadata.Id));
        }
        public void Add <T>(string name) where T : EventArgs
        {
            GameEventMetadata <T> metadata = GetMetadataChecked <T>(name);

            Add <T>(metadata.Id);
        }