public JobResourceResult GetJobResources()
        {
            JobResources      structure = this._memoryHandler.Structures.JobResources;
            JobResourceResult result    = new JobResourceResult();

            if (!this.CanGetJobResources() || !this._memoryHandler.IsAttached)
            {
                return(result);
            }

            IntPtr resourcePtr = this._memoryHandler.Scanner.Locations[Signatures.JOBRESOURCES_KEY];

            if (resourcePtr == IntPtr.Zero)
            {
                return(result);
            }

            IntPtr jobResourcesAddress = new IntPtr(this._memoryHandler.GetInt64(resourcePtr));

            if (jobResourcesAddress == IntPtr.Zero)
            {
                return(result);
            }

            byte[] jobResourcesMap = this._memoryHandler.BufferPool.Rent(this._memoryHandler.Structures.JobResources.SourceSize);

            result.JobResourcesContainer = new JobResourcesContainer();

            try {
                this._memoryHandler.GetByteArray(jobResourcesAddress, jobResourcesMap);

                result.JobResourcesContainer.Astrologian = this._jobResourceResolver.ResolveAstrologianFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Bard        = this._jobResourceResolver.ResolveBardFromBytes(jobResourcesMap);
                result.JobResourcesContainer.BlackMage   = this._jobResourceResolver.ResolveBlackMageFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Dancer      = this._jobResourceResolver.ResolveDancerFromBytes(jobResourcesMap);
                result.JobResourcesContainer.DarkKnight  = this._jobResourceResolver.ResolveDarkKnightFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Dragoon     = this._jobResourceResolver.ResolveDragoonFromBytes(jobResourcesMap);
                result.JobResourcesContainer.GunBreaker  = this._jobResourceResolver.ResolveGunBreakerFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Machinist   = this._jobResourceResolver.ResolveMachinistFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Monk        = this._jobResourceResolver.ResolveMonkFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Ninja       = this._jobResourceResolver.ResolveNinjaFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Paladin     = this._jobResourceResolver.ResolvePaladinFromBytes(jobResourcesMap);
                result.JobResourcesContainer.RedMage     = this._jobResourceResolver.ResolveRedMageFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Samurai     = this._jobResourceResolver.ResolveSamuraiFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Scholar     = this._jobResourceResolver.ResolveScholarFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Summoner    = this._jobResourceResolver.ResolveSummonerFromBytes(jobResourcesMap);
                result.JobResourcesContainer.Warrior     = this._jobResourceResolver.ResolveWarriorFromBytes(jobResourcesMap);
                result.JobResourcesContainer.WhiteMage   = this._jobResourceResolver.ResolveWhiteMageFromBytes(jobResourcesMap);
            }
            catch (Exception ex) {
                this._memoryHandler.RaiseException(Logger, ex);
            }
            finally {
                this._memoryHandler.BufferPool.Return(jobResourcesMap);
            }

            return(result);
        }
        private void ScanTimerElapsed(object sender, ElapsedEventArgs e)
        {
            if (this._isScanning)
            {
                return;
            }

            this._scanTimer.Interval = Settings.Default.JobResourceWorkerTiming;

            this._isScanning = true;

            JobResourceResult result = this._memoryHandler.Reader.GetJobResources();

            EventHost.Instance.RaiseNewJobResourcesContainerEvent(this._memoryHandler, result.JobResourcesContainer);

            this._isScanning = false;
        }