public TalentReader(ISquareReader reader, int cTalent, PlayerReader playerReader, TalentDB talentDB)
        {
            this.reader  = reader;
            this.cTalent = cTalent;

            this.playerReader = playerReader;
            this.talentDB     = talentDB;
        }
        public AddonReader(ILogger logger, DataConfig dataConfig, AreaDB areaDb, IAddonDataProvider addonDataProvider)
        {
            this.logger            = logger;
            this.addonDataProvider = addonDataProvider;

            this.squareReader = new SquareReader(this);

            this.CreatureHistory = new CreatureHistory(squareReader, 64, 65, 66, 67);

            this.ItemDb     = new ItemDB(logger, dataConfig);
            this.CreatureDb = new CreatureDB(logger, dataConfig);
            this.spellDb    = new SpellDB(logger, dataConfig);
            this.talentDB   = new TalentDB(logger, dataConfig, spellDb);

            this.EquipmentReader = new EquipmentReader(squareReader, 24, 25);
            this.BagReader       = new BagReader(squareReader, ItemDb, EquipmentReader, 20, 21, 22, 23);

            this.ActionBarCostReader = new ActionBarCostReader(squareReader, 36);

            this.GossipReader = new GossipReader(squareReader, 37);

            this.SpellBookReader = new SpellBookReader(squareReader, 71, spellDb);

            this.PlayerReader = new PlayerReader(squareReader);
            this.LevelTracker = new LevelTracker(PlayerReader);

            this.TalentReader = new TalentReader(squareReader, 72, PlayerReader, talentDB);

            this.AreaDb         = areaDb;
            this.WorldMapAreaDb = new WorldMapAreaDB(logger, dataConfig);

            UpdateLatencys = new CircularBuffer <double>(10);

            UIMapId.Changed += (object obj, EventArgs e) =>
            {
                this.AreaDb.Update(WorldMapAreaDb.GetAreaId(UIMapId.Value));
                ZoneChanged?.Invoke(this, EventArgs.Empty);
            };

            GlobalTime.Changed += (object obj, EventArgs e) =>
            {
                UpdateLatencys.Put((DateTime.Now - GlobalTime.LastChanged).TotalMilliseconds);
                AvgUpdateLatency = 0;
                for (int i = 0; i < UpdateLatencys.Size; i++)
                {
                    AvgUpdateLatency += UpdateLatencys.PeekAt(i);
                }
                AvgUpdateLatency /= UpdateLatencys.Size;
            };
        }