/*private static void HandleLogin(LoginEventArgs e)
         *      {
         *              if (e == null || e.Mobile == null || !(e.Mobile is PlayerMobile))
         *              {
         *                      return;
         *              }
         *
         *              CheckProgress<LoginConquest>((PlayerMobile)e.Mobile, e);
         *              CheckProgress<AccountAgeConquest>((PlayerMobile)e.Mobile, e.Mobile.Account);
         *      }
         *
         *      private static void HandleLogout(LogoutEventArgs e)
         *      {
         *              if (e != null && e.Mobile != null && e.Mobile is PlayerMobile)
         *              {
         *                      CheckProgress<LogoutConquest>((PlayerMobile)e.Mobile, e);
         *              }
         *      }*/

        public static void HandleMovement(MovementConquestContainer e)
        {
            if (e != null && e.Mobile != null && e.Mobile is PlayerMobile)
            {
                CheckProgress <MoveConquest>((PlayerMobile)e.Mobile, e);
                CheckProgress <LocationConquest>((PlayerMobile)e.Mobile, e);
            }
        }
        public static MovementConquestContainer Create(Mobile mobile, Direction dir)
        {
            MovementConquestContainer args;

            if (m_Pool.Count > 0)
            {
                args = m_Pool.Dequeue();

                args.m_Mobile = mobile;
                args.m_Direction = dir;
                args.m_Blocked = false;
            }
            else
            {
                args = new MovementConquestContainer(mobile, dir);
            }

            return args;
        }
        public static MovementConquestContainer Create(Mobile mobile, Direction dir)
        {
            MovementConquestContainer args;

            if (m_Pool.Count > 0)
            {
                args = m_Pool.Dequeue();

                args.m_Mobile    = mobile;
                args.m_Direction = dir;
                args.m_Blocked   = false;
            }
            else
            {
                args = new MovementConquestContainer(mobile, dir);
            }

            return(args);
        }
        /*private static void HandleLogin(LoginEventArgs e)
		{
			if (e == null || e.Mobile == null || !(e.Mobile is PlayerMobile))
			{
				return;
			}

			CheckProgress<LoginConquest>((PlayerMobile)e.Mobile, e);
			CheckProgress<AccountAgeConquest>((PlayerMobile)e.Mobile, e.Mobile.Account);
		}

		private static void HandleLogout(LogoutEventArgs e)
		{
			if (e != null && e.Mobile != null && e.Mobile is PlayerMobile)
			{
				CheckProgress<LogoutConquest>((PlayerMobile)e.Mobile, e);
			}
		}*/

        public static void HandleMovement(MovementConquestContainer e)
        {
            if (e != null && e.Mobile != null && e.Mobile is PlayerMobile)
            {
                CheckProgress<MoveConquest>((PlayerMobile) e.Mobile, e);
                CheckProgress<LocationConquest>((PlayerMobile) e.Mobile, e);
            }
        }
        protected virtual int GetProgress(ConquestState state, MovementConquestContainer args)
		{
            if (state.User == null)
                return 0;

			if (args == null || args.Blocked)
			{
				return 0;
			}

			if (Map != null && Map != Map.Internal && (args.Mobile.Map == null || args.Mobile.Map != Map))
			{
				_DirectionCache.Remove(args.Mobile);

				if (MapChangeReset)
				{
					return -state.Progress;
				}

				return 0;
			}

			if (!String.IsNullOrWhiteSpace(Region) && (args.Mobile.Region == null || !args.Mobile.Region.IsPartOf(Region)))
			{
				_DirectionCache.Remove(args.Mobile);

				if (RegionChangeReset)
				{
					return -state.Progress;
				}

				return 0;
			}

			bool running = args.Direction.HasFlag(Direction.Running);

			if ((WalkOnly && running) || (RunOnly && !running))
			{
				_DirectionCache.Remove(args.Mobile);

				if (SpeedChangeReset)
				{
					return -state.Progress;
				}

				return 0;
			}

			if (!_DirectionCache.ContainsKey(args.Mobile))
			{
				_DirectionCache.Add(args.Mobile, args.Direction);
			}
			else if ((_DirectionCache[args.Mobile] & Direction.Running) != (args.Direction & Direction.Running))
			{
				if (DirectionChangeReset)
				{
					_DirectionCache.Remove(args.Mobile);
					return -state.Progress;
				}

				_DirectionCache[args.Mobile] = args.Direction;
			}

			return 1;
		}
        protected virtual int GetProgress(ConquestState state, MovementConquestContainer args)
        {
            if (state.User == null)
            {
                return(0);
            }

            if (args == null || args.Blocked)
            {
                return(0);
            }

            if (Map != null && Map != Map.Internal && (args.Mobile.Map == null || args.Mobile.Map != Map))
            {
                _DirectionCache.Remove(args.Mobile);

                if (MapChangeReset)
                {
                    return(-state.Progress);
                }

                return(0);
            }

            if (!String.IsNullOrWhiteSpace(Region) && (args.Mobile.Region == null || !args.Mobile.Region.IsPartOf(Region)))
            {
                _DirectionCache.Remove(args.Mobile);

                if (RegionChangeReset)
                {
                    return(-state.Progress);
                }

                return(0);
            }

            bool running = args.Direction.HasFlag(Direction.Running);

            if ((WalkOnly && running) || (RunOnly && !running))
            {
                _DirectionCache.Remove(args.Mobile);

                if (SpeedChangeReset)
                {
                    return(-state.Progress);
                }

                return(0);
            }

            if (!_DirectionCache.ContainsKey(args.Mobile))
            {
                _DirectionCache.Add(args.Mobile, args.Direction);
            }
            else if ((_DirectionCache[args.Mobile] & Direction.Running) != (args.Direction & Direction.Running))
            {
                if (DirectionChangeReset)
                {
                    _DirectionCache.Remove(args.Mobile);
                    return(-state.Progress);
                }

                _DirectionCache[args.Mobile] = args.Direction;
            }

            return(1);
        }