Пример #1
0
        ////////////////

        /// <summary>
        /// Triggers all of a given hook. A `validatorKey` must be provided matching the `validator`'s key (loosely
        /// guards against mis-triggering hooks).
        /// </summary>
        /// <typeparam name="T">Hook's argument type.</typeparam>
        /// <param name="validator">Validator used to identify the hook and validate what can trigger it.</param>
        /// <param name="validatorKey">A key that must match the `validator`'s own key.</param>
        /// <param name="args">Arguments passed to each hook. Must match the `validator`'s expected generic type.</param>
        public static void TriggerHook <T>(CustomLoadHookValidator <T> validator, object validatorKey, T args)
        {
            var  mymod = ModHelpersMod.Instance;
            Type argType = typeof(T);
            bool isValidated, isEach;

            if (mymod.LoadHooks == null)
            {
                throw new ModHelpersException("Custom hooks not loaded.");
            }
            if (validatorKey == null)
            {
                throw new ModHelpersException("No validation key specified.");
            }
            if (validator.ValidatorKey != validatorKey)
            {
                throw new ModHelpersException("Validation failed.");
            }
            if (args == null)
            {
                throw new ModHelpersException("Invalid argument type: Expected "
                                              + argType.Name + ", found `null`");
            }
            if (argType != args.GetType() && !args.GetType().IsSubclassOf(argType))
            {
                throw new ModHelpersException("Invalid argument type: Expected "
                                              + argType.Name + ", found "
                                              + args.GetType().Name);
            }

            lock (validator.MyLock) {
                mymod.CustomLoadHooks.HookConditionsMet.Add(validator);
                mymod.CustomLoadHooks.HookArgs[validator] = args;
                isValidated = mymod.CustomLoadHooks.Hooks.ContainsKey(validator);
            }

            if (isValidated)
            {
                IList <Func <object, bool> > funcList;
                int count;

                lock (validator.MyLock) {
                    funcList = mymod.CustomLoadHooks.Hooks[validator];
                    count    = funcList.Count;
                }

                for (int i = 0; i < funcList.Count; i++)
                {
                    lock (validator.MyLock) {
                        isEach = funcList[i](args);
                    }

                    if (!isEach)
                    {
                        funcList.RemoveAt(i);
                        i--;
                    }
                }
            }
        }
Пример #2
0
        /// <summary>
        /// Counts the total number of hooks of a given validator.
        /// </summary>
        /// <typeparam name="T">Hook's argument type.</typeparam>
        /// <param name="validator">Hook's argument type.</param>
        /// <returns></returns>
        public static int CountHooks <T>(CustomLoadHookValidator <T> validator)
        {
            var mymod = ModHelpersMod.Instance;

            lock ( validator ) {
                if (!mymod.CustomLoadHooks.Hooks.ContainsKey(validator))
                {
                    return(0);
                }
                return(mymod.CustomLoadHooks.Hooks.Count);
            }
        }
Пример #3
0
        /// <summary>
        /// Untriggers all of a given hook, allowing for reuse. A `validatorKey` must be provided matching the
        /// `validator`'s key (loosely guards against mis-triggering hooks).
        /// </summary>
        /// <typeparam name="T">Hook's argument type.</typeparam>
        /// <param name="validator">Validator used to identify the hook and validate what can trigger it.</param>
        /// <param name="validatorKey">A key that must match the `validator`'s own key.</param>
        public static void UntriggerHook <T>(CustomLoadHookValidator <T> validator, object validatorKey)
        {
            var mymod = ModHelpersMod.Instance;

            if (validator.ValidatorKey != validatorKey)
            {
                throw new ModHelpersException("Validation failed.");
            }

            lock ( validator ) {
                mymod.CustomLoadHooks.HookConditionsMet.Remove(validator);
                mymod.CustomLoadHooks.HookArgs.Remove(validator);
            }
        }
Пример #4
0
        ////////////////

        /// <summary>
        /// Add a custom hook.
        /// </summary>
        /// <typeparam name="T">Hook's argument type.</typeparam>
        /// <param name="validator">Validator used to identify the hook and validate what can trigger it.</param>
        /// <param name="func">The hook. Accepts an object containing its arguments (type validated). Returns `true`
        /// if it's meant to be repeatably called (when the conditions clear up and then later come to pass).</param>
        public static void AddHook <T>(CustomLoadHookValidator <T> validator, Func <T, bool> func)
        {
            var  mymod = ModHelpersMod.Instance;
            bool conditionsMet;
            Type argType = typeof(T);
            T    args;

            lock ( validator ) {
                conditionsMet = mymod.CustomLoadHooks.HookConditionsMet.Contains(validator);
            }

            if (conditionsMet)
            {
                lock ( validator ) {
                    args = (T)mymod.CustomLoadHooks.HookArgs[validator];
                }

                if (args != null)
                {
                    if (argType != args.GetType())
                    {
                        throw new ModHelpersException("Invalid argument type: Expected "
                                                      + argType.Name + ", found "
                                                      + args.GetType().Name);
                    }
                }
                else
                {
                    throw new ModHelpersException("Invalid argument type: " + argType.Name + " expected, found `null`");
                }

                if (!func(args))
                {
                    return;
                }
            }

            lock ( validator ) {
                if (!mymod.CustomLoadHooks.Hooks.ContainsKey(validator))
                {
                    mymod.CustomLoadHooks.Hooks[validator] = new List <Func <object, bool> >();
                }

                mymod.CustomLoadHooks.Hooks[validator].Add(arg => func((T)arg));
            }
        }
Пример #5
0
        ////////////////

        /// <summary>
        /// Tests if conditions are met for a given hook type (by its validator).
        /// </summary>
        /// <typeparam name="T">Hook's argument type.</typeparam>
        /// <param name="validator"></param>
        /// <returns></returns>
        public static bool AreConditionsMet <T>(CustomLoadHookValidator <T> validator)
        {
            lock ( validator ) {
                return(ModHelpersMod.Instance.CustomLoadHooks.HookConditionsMet.Contains(validator));
            }
        }
Пример #6
0
 /// <summary>
 /// Triggers all of a given hook. A `validatorKey` must be provided matching the `validator`'s key (loosely
 /// guards against mis-triggering hooks).
 /// </summary>
 /// <param name="validator">Validator used to identify the hook and validate what can trigger it.</param>
 /// <param name="validatorKey">A key that must match the `validator`'s own key.</param>
 public static void TriggerHook(CustomLoadHookValidator <object> validator, object validatorKey)
 {
     CustomLoadHooks.TriggerHook <object>(validator, validatorKey, new object());
 }