/// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="settings"></param>
        public static void AddGlobalHandler <T>(string GUID, CustomExpSettings setting) where T : CustomExpHandlerBase, new()
        {
            var type = typeof(T);

            if (type.IsAbstract)
            {
                throw new ArgumentException("You can't use base handler class directly, Use derived class instead.");
            }

            if (IsTypeRegistered(type, out var exception))
            {
                throw exception;
            }

            if (IsGUIDRegistered(GUID, out exception))
            {
                throw exception;
            }

            _GlobalHandlers.Add(new HandlerTypeContainer()
            {
                BaseType = type,
                Setting  = setting,
                GUID     = GUID
            });

            //Sort Global Handlers to make sure it have same execution order for each player
            _GlobalHandlers.OrderBy(x => x.GUID);

            Logger.Verbose("Global Handler Added: {0}", type.Name);
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="typeID"></param>
        /// <param name="setting"></param>
        public static void AddHandler <T>(byte typeID, CustomExpSettings setting) where T : CustomExpHandlerBase, new()
        {
            var type = typeof(T);

            if (type.IsAbstract)
            {
                throw new ArgumentException("You can't use base handler class directly, Use derived class instead.");
            }

            if (Enum.IsDefined(typeof(eWardenObjectiveType), typeID))
            {
                throw new ArgumentException($"typeID: {typeID} is already defined inside default eWardenObjectiveType");
            }

            if (IsTypeRegistered(type, out var exception))
            {
                throw exception;
            }

            if (_Handlers.ContainsKey(typeID))
            {
                var dupType = _Handlers[typeID].GetType();
                throw new ArgumentException($"typeID: {typeID} is already defined by other plugin\nInfo:\n\t- Name: {dupType.Name}\n- Assembly: {dupType.Assembly.FullName}");
            }

            _Handlers.Add(typeID, new HandlerTypeContainer()
            {
                BaseType = type,
                Setting  = setting
            });

            Logger.Verbose("Handler Added: {0} (TypeID: {1})", type.Name, typeID);
        }