public void DrawIconSkill(float x, float y, float width, float height, IPlayerSkill skill, int index = 1)
        {
            Hud.Texture.GetTexture(skill.SnoPower.NormalIconTextureId).Draw(x, y, width, height, Opacity);
            if (skill.Buff != null)             // 465839
            {
                Hud.Texture.BuffFrameTexture.Draw(x, y, width, height, Opacity);

                double remaining = 0d;          double elapsed = 0d;
                if (skill.CooldownFinishTick > Hud.Game.CurrentGameTick)
                {
                    remaining = (skill.CooldownFinishTick - Hud.Game.CurrentGameTick) / 60.0d;
                    elapsed   = (Hud.Game.CurrentGameTick - skill.CooldownStartTick) / 60.0d;
                    DrawTimeLeftClock(new RectangleF(x, y, width, height), elapsed, remaining);
                    layout = FontWhite.GetTextLayout(remaining.ToString((remaining < 1)? "F1":"F0"));
                }
                else
                {
                    layout = FontWhite.GetTextLayout(" 🞴 ");
                }
                FontWhite.DrawText(layout, x + ((width - (float)Math.Ceiling(layout.Metrics.Width)) / 1.40f), y + ((height - (float)Math.Ceiling(layout.Metrics.Height)) / 1.1f));

                double timeleft = skill.Buff.TimeLeftSeconds[index];
                if (timeleft > 0)
                {
                    layout = FontTimeLeft.GetTextLayout(timeleft.ToString((timeleft < 1)? "F1" : "F0"));
                    FontTimeLeft.DrawText(layout, x + ((width - (float)Math.Ceiling(layout.Metrics.Width)) / 6.0f), y + ((height - (float)Math.Ceiling(layout.Metrics.Height)) / 14.0f));
                }
            }
            else
            {
                Hud.Texture.DebuffFrameTexture.Draw(x, y, width, height, Opacity);
            }
        }
 public void DrawIconBuff(float x, float y, float width, float height, uint idtexture, int stacks, double timeleft, double elapsed, double timeleft2 = 0)
 {
     Hud.Texture.GetTexture(idtexture).Draw(x, y, width, height, Opacity);
     Hud.Texture.BuffFrameTexture.Draw(x, y, width, height, Opacity);
     if (timeleft > 0)
     {
         DrawTimeLeftClock(new RectangleF(x, y, width, height), elapsed, timeleft);
         layout = FontTimeLeft.GetTextLayout(timeleft.ToString((timeleft < 1)? "F1" : "F0"));
         FontTimeLeft.DrawText(layout, x + ((width - (float)Math.Ceiling(layout.Metrics.Width)) / 6.0f), y + ((height - (float)Math.Ceiling(layout.Metrics.Height)) / 14.0f));
         if (timeleft2 > 0)
         {
             layout = FontTimeLeft2.GetTextLayout(timeleft2.ToString((timeleft2 < 1)? "F1" : "F0"));
             FontTimeLeft2.DrawText(layout, x + ((width - (float)Math.Ceiling(layout.Metrics.Width)) / 5.0f), y + ((height - (float)Math.Ceiling(layout.Metrics.Height)) / 1.1f));
         }
     }
     layout = FontStacks.GetTextLayout(stacks.ToString());
     (stacks == 0?FontStacksRed:FontStacks).DrawText(layout, x + ((width - (float)Math.Ceiling(layout.Metrics.Width)) / 1.15f), y + ((height - (float)Math.Ceiling(layout.Metrics.Height)) / 1.05f));
 }
        public void PaintTopInGame(ClipState clipState)
        {
            if (clipState != ClipState.BeforeClip)
            {
                return;
            }
            if (!Hud.Game.IsInGame)
            {
                return;
            }
            if (OnlyGR && !Hud.Game.Me.InGreaterRift)
            {
                return;
            }

            var players = Hud.Game.Players.Where(p => p.IsMe?ShowMe:(ShowOthers && p.HasValidActor)).OrderBy(p => p.PortraitIndex);

            if (players.Count() == 0)
            {
                return;
            }

            var y = Hud.Window.Size.Height * Ypor;

            foreach (var player in players)
            {
                var x = Hud.Window.Size.Width * Xpor;
                if (player.HeroClassDefinition.HeroClass == HeroClass.Necromancer)
                {
                    IPlayerSkill skill = player.Powers.UsedNecromancerPowers.SkeletalMage;                      // 462089
                    if ((skill != null) && (skill?.Rune == 1))
                    {
                        if (!Singularity)
                        {
                            continue;
                        }

                        {                          // Simple bloque
                            if (ShowNames)
                            {
                                layout = FontNames.GetTextLayout(player.BattleTagAbovePortrait); FontNames.DrawText(layout, x + 1, y); y += layout.Metrics.Height + 1;
                            }
                            if (skill.Buff != null)
                            {
                                var stacks = ((skill.Buff.IconCounts[6] == 1) && (skill.Buff.TimeLeftSeconds[5] == 0))? 0:skill.Buff.IconCounts[6];
                                if (stacks == 0)
                                {
                                    DrawIconBuff(x, y, SizeIconWidth, SizeIconHeight, skill.SnoPower.NormalIconTextureId, 0, 0, 0);
                                }
                                else
                                {
                                    DrawIconBuff(x, y, SizeIconWidth, SizeIconHeight, skill.SnoPower.NormalIconTextureId, stacks, skill.Buff.TimeLeftSeconds[5], skill.Buff.TimeElapsedSeconds[5], skill.Buff.TimeLeftSeconds[6]);
                                }
                            }
                            else
                            {
                                Hud.Texture.GetTexture(skill.SnoPower.NormalIconTextureId).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                Hud.Texture.DebuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            }
                            x += SizeIconWidth;
                        }

                        skill = player.Powers.UsedNecromancerPowers.BoneArmor;                          // 466857
                        if (skill != null)
                        {
                            if (skill.Buff != null)
                            {
                                DrawIconBuff(x, y, SizeIconWidth, SizeIconHeight, skill.SnoPower.NormalIconTextureId, skill.Buff.IconCounts[0], skill.Buff.TimeLeftSeconds[0], skill.Buff.TimeElapsedSeconds[0]);
                            }
                            else
                            {
                                Hud.Texture.GetTexture(skill.SnoPower.NormalIconTextureId).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                Hud.Texture.DebuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            }
                            x += SizeIconWidth;
                        }

                        skill = player.Powers.UsedNecromancerPowers.Simulacrum;                         // 465350
                        if (skill != null)
                        {
                            DrawIconSkill(x, y, SizeIconWidth, SizeIconHeight, skill, 1);                               // index 1 , para averiguar el timeleft
                            x += SizeIconWidth;
                        }

                        skill = player.Powers.UsedNecromancerPowers.LandOfTheDead;                         // 465839
                        if (skill != null)
                        {
                            DrawIconSkill(x, y, SizeIconWidth, SizeIconHeight, skill, 0);                               // index 0
                            // x += SizeIconWidth;  // Si seguimos añadiendo más..
                        }
                    }
                    else if (player.Powers.BuffIsActive(476587))
                    {
                        if (!Nayr)
                        {
                            continue;
                        }

                        {                               // Simple bloque
                            if (ShowNames)
                            {
                                layout = FontNames.GetTextLayout(player.BattleTagAbovePortrait); FontNames.DrawText(layout, x + 1, y); y += layout.Metrics.Height + 1;
                            }
                            var c = player.Powers.GetBuff(476587).IconCounts[7];
                            if (c > 0)
                            {
                                int j = 7; double timeleft = 0; double timeleft2 = 15;
                                for (var i = 1; i < 7; i++)
                                {
                                    var t = player.Powers.GetBuff(476587).TimeLeftSeconds[i];
                                    if (t > 0)
                                    {
                                        if (t > timeleft)
                                        {
                                            j = i; timeleft = t;
                                        }
                                        if (t < timeleft2)
                                        {
                                            timeleft2 = t;
                                        }
                                    }
                                }
                                DrawIconBuff(x, y, SizeIconWidth, SizeIconHeight, 2831437924, c, player.Powers.GetBuff(476587).TimeLeftSeconds[j], player.Powers.GetBuff(476587).TimeElapsedSeconds[j], (c > 1)?timeleft2:0);
                            }
                            else
                            {
                                DrawIconBuff(x, y, SizeIconWidth, SizeIconHeight, 2831437924, 0, 0, 0);
                            }
                            x += SizeIconWidth;
                        }

                        skill = player.Powers.UsedNecromancerPowers.BoneArmor; // 466857
                        if (skill != null)                                     // 466857
                        {
                            if (skill.Buff != null)
                            {
                                DrawIconBuff(x, y, SizeIconWidth, SizeIconHeight, skill.SnoPower.NormalIconTextureId, skill.Buff.IconCounts[0], skill.Buff.TimeLeftSeconds[0], skill.Buff.TimeElapsedSeconds[0]);
                            }
                            else
                            {
                                Hud.Texture.GetTexture(skill.SnoPower.NormalIconTextureId).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                Hud.Texture.DebuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            }
                            x += SizeIconWidth;
                        }

                        if (player.Powers.BuffIsActive(475251))
                        {
                            Hud.Texture.InventoryLegendaryBackgroundLarge.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            Hud.Texture.GetItemTexture(Hud.Sno.SnoItems.P65_Unique_Scythe2H_02).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            if (Math.Abs(Hud.Game.CurrentGameTick - Ticks0) > 20)
                            {
                                Count0 = Hud.Game.AliveMonsters.Where(m => m.FloorCoordinate.XYDistanceTo(player.FloorCoordinate) <= 25).Count();
                                Ticks0 = Hud.Game.CurrentGameTick;
                            }
                            layout = FontTimeLeft.GetTextLayout(Count0.ToString());
                            FontStacks.DrawText(layout, x + ((SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 2.0f), y + ((SizeIconHeight - (float)Math.Ceiling(layout.Metrics.Height)) / 2.0f));
                            x += SizeIconWidth;
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
                else if (player.HeroClassDefinition.HeroClass == HeroClass.WitchDoctor)
                {
                    IPlayerSkill skill = player.Powers.UsedWitchDoctorPowers.SpiritBarrage;                     // 108506
                    if ((skill != null) && (skill.Rune == 2 || player.Powers.BuffIsActive(484270)))
                    {
                        if (!SpiritBarrage)
                        {
                            continue;
                        }

                        {                               // Simple bloque
                            if (ShowNames)
                            {
                                layout = FontNames.GetTextLayout(player.BattleTagAbovePortrait); FontNames.DrawText(layout, x + 1, y); y += layout.Metrics.Height + 1;
                            }
                            var actors = Hud.Game.Actors.Where(a => a.SnoActor.Sno == ActorSnoEnum._wd_spiritbarragerune_aoe_ghostmodel && (a.SummonerAcdDynamicId == player.SummonerId));
                            Hud.Texture.GetTexture(skill.SnoPower.NormalIconTextureId).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);                              // TextureId 1117784160
                            int total = actors.Count();
                            if (total > 0)
                            {
                                foreach (var a in actors)
                                {
                                    if (!Phantasms.ContainsKey(a.AnnId))
                                    {
                                        Phantasms[a.AnnId] = a.CreatedAtInGameTick;
                                    }
                                }
                                actors = actors.OrderByDescending(a => Phantasms[a.AnnId]);
                                Hud.Texture.BuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                var c = 0;
                                foreach (var actor in actors)
                                {
                                    if (++c > 3)
                                    {
                                        break;
                                    }
                                    var t = (player.Powers.BuffIsActive(484270)?10:5) - (Hud.Game.CurrentGameTick - Phantasms[actor.AnnId]) / 60f;
                                    if (t <= 0)
                                    {
                                        var layout = FontExpl.GetTextLayout("🞴");
                                        FontExpl.DrawText(layout, x + ((SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 8.0f), y + (layout.Metrics.Height * 0.56f * (c - 1)));
                                    }
                                    else
                                    {
                                        FontDefault = (t > SBWarning)? FontCounter:FontLimit;
                                        var layout = FontDefault.GetTextLayout(String.Format("{0:0}", (int)(t + 0.90)));                                           // Redondeará a X si es menor  a X.10
                                        FontDefault.DrawText(layout, x + ((SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 7.0f), y + (layout.Metrics.Height * 0.85f * (c - 1)));
                                    }
                                }
                            }
                            else
                            {
                                Hud.Texture.BuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            }
                            layout = FontStacks.GetTextLayout(total.ToString());
                            (total == 0?FontStacksRed:FontStacks).DrawText(layout, x + ((SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 1.15f), y + ((SizeIconHeight - (float)Math.Ceiling(layout.Metrics.Height)) / 1.05f));
                            layout = FontAS.GetTextLayout(player.Offense.AttackSpeed.ToString("F2", CultureInfo.InvariantCulture));
                            FontAS.DrawText(layout, x + ((SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 1.15f), y + ((SizeIconHeight - (float)Math.Ceiling(layout.Metrics.Height)) / 7.0f));
                            x += SizeIconWidth;
                        }

                        skill = player.Powers.UsedWitchDoctorPowers.SoulHarvest;
                        if (skill != null)
                        {
                            if (skill.Buff != null)                             // 67616
                            {
                                DrawIconBuff(x, y, SizeIconWidth, SizeIconHeight, skill.SnoPower.NormalIconTextureId, skill.Buff.IconCounts[0], skill.Buff.TimeLeftSeconds[0], skill.Buff.TimeElapsedSeconds[0]);
                            }
                            else
                            {
                                Hud.Texture.GetTexture(skill.SnoPower.NormalIconTextureId).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);                                  // skill.SnoPower.NormalIconTextureId = 2196086897
                                Hud.Texture.DebuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            }
                            x += SizeIconWidth;
                        }
                        if (ShowLocust)
                        {
                            skill = player.Powers.UsedWitchDoctorPowers.LocustSwarm;
                            if (skill != null)
                            {
                                Hud.Texture.GetTexture(skill.SnoPower.NormalIconTextureId).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                Hud.Texture.BuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                var m   = Hud.Game.AliveMonsters.Where(a => a.FloorCoordinate.XYDistanceTo(player.FloorCoordinate) <= 40);
                                var mLc = m.Where(a => a.Locust).Count();
                                if (mLc > 0)
                                {
                                    var mc  = m.Count();
                                    var e   = m.Where(a => (a.Rarity == ActorRarity.Champion || a.Rarity == ActorRarity.Rare || a.Rarity == ActorRarity.Boss) && (a.SummonerAcdDynamicId == 0));
                                    var ec  = e.Count();
                                    var eLc = e.Where(a => a.Locust).Count();
                                    if (mc > ec)
                                    {
                                        layout = FontLocust.GetTextLayout(mLc.ToString() + "|" + mc.ToString());
                                        FontLocust.DrawText(layout, x + ((SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 2.0f), y + ((SizeIconHeight - (float)Math.Ceiling(layout.Metrics.Height)) / 6.0f));
                                    }
                                    if (ec > 0)
                                    {
                                        layout = FontLocust.GetTextLayout(eLc.ToString() + "|" + ec.ToString());
                                        FontLocust.DrawText(layout, x + ((SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 2.0f), y + ((SizeIconHeight - (float)Math.Ceiling(layout.Metrics.Height)) / 1.20f));
                                    }
                                }
                                x += SizeIconWidth;
                            }
                        }
                        if (ShowBigBadVoodoo)
                        {
                            skill = player.Powers.UsedWitchDoctorPowers.BigBadVoodoo;
                            if (skill != null)
                            {
                                DrawIconSkill(x, y, SizeIconWidth, SizeIconHeight, skill, 4);                                   // index 4 , para averiguar el timeleft
                                x += SizeIconWidth;
                            }
                        }

                        if (player.Powers.UsedPassives.Any(p => p.Sno == Hud.Sno.SnoPowers.WitchDoctor_Passive_GruesomeFeast.Sno))                         // 208594
                        {
                            IBuff buff = player.Powers.GetBuff(208594);
                            if (buff != null)                              // Hud.Sno.SnoPowers.WitchDoctor_Passive_GruesomeFeast.NormalIconTextureId  = 1591242582
                            {
                                DrawIconBuff(x, y, SizeIconWidth, SizeIconHeight, 1591242582, buff.IconCounts[1], buff.TimeLeftSeconds[1], buff.TimeElapsedSeconds[1]);
                            }
                            else
                            {
                                Hud.Texture.GetTexture(1591242582).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                Hud.Texture.DebuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            }
                            x += SizeIconWidth;
                            if (ShowGlobes)
                            {
                                var n = Hud.Game.Actors.Where(a => a.SnoActor.Kind == ActorKind.HealthGlobe).Count();
                                if (n > 0)
                                {
                                    layout = FontWhite.GetTextLayout(n.ToString());
                                    var w = (n < 10)? layout.Metrics.Width + 1:(layout.Metrics.Width / 2 + 2);
                                    BrushRed.DrawEllipse(x + SizeIconWidth / 2, y + SizeIconHeight / 2, w, w);
                                    FontWhite.DrawText(layout, x + (SizeIconWidth - layout.Metrics.Width) / 2, y + (SizeIconHeight - layout.Metrics.Height) / 2 - 1);
                                }
                            }
                        }
                    }
                    else
                    {
                        continue;
                    }
                }
                else
                {
                    continue;
                }

                x = Hud.Window.Size.Width * Xpor;      y += SizeIconHeight;
                if (ShowCoe && (player.Powers.GetBuff(Hud.Sno.SnoPowers.ConventionOfElements.Sno) != null))                  // 430674
                {
                    var BuffCoE = player.Powers.GetBuff(430674);
                    var HeroBonusElements = AllBonusElements[player.HeroClassDefinition.HeroClass];
                    var j = HeroBonusElements.Count;        var ActiveElement = -1; var BestElement = -1;  double MaxBonus = -1;    bool UniqueBestElement = false;
                    for (var k = j - 1; k > -1; k--)
                    {
                        var index = HeroBonusElements[k];
                        if (BuffCoE.IconCounts[index] > 0)
                        {
                            ActiveElement = index;
                        }

                        var bonus = player.Offense.ElementalDamageBonus[IndexToBonus[index]];
                        if (bonus > MaxBonus)
                        {
                            MaxBonus          = bonus;
                            BestElement       = index;
                            UniqueBestElement = true;
                        }
                        else if (bonus == MaxBonus)
                        {
                            UniqueBestElement = false;
                        }
                    }
                    if ((ActiveElement != -1) && (BestElement != -1))
                    {
                        for (var l = 0; l < j; l++)
                        {
                            if (HeroBonusElements[j - 1] != BestElement)
                            {
                                HeroBonusElements.Insert(0, HeroBonusElements[j - 1]);
                                HeroBonusElements.RemoveAt(j);
                            }
                            else
                            {
                                break;
                            }
                        }
                        y += ProgressBarWidth;
                        foreach (var index in HeroBonusElements)
                        {
                            Hud.Texture.GetTexture(BuffCoE.SnoPower.Icons[index].TextureId).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            DrawTimeLeftClock(new RectangleF(x, y, SizeIconWidth, SizeIconHeight), BuffCoE.TimeElapsedSeconds[index], BuffCoE.TimeLeftSeconds[index]);

                            double s = 0;
                            if (UniqueBestElement)
                            {
                                if (index == ActiveElement)
                                {
                                    s = BuffCoE.TimeLeftSeconds[index];
                                    if (index == BestElement)
                                    {
                                        FontDefault = FontGreen; BrushDefault = BrushGreen;
                                    }
                                    else
                                    {
                                        FontDefault = FontGray;
                                    }
                                    Hud.Texture.BuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                }
                                else
                                {
                                    if (index == BestElement)
                                    {
                                        s = (j - HeroBonusElements.IndexOf(ActiveElement) - 1) * 4 - BuffCoE.TimeElapsedSeconds[ActiveElement];
                                        if (s > ((j - 1) * 2))
                                        {
                                            FontDefault = FontOrange;  BrushDefault = BrushOrange;
                                        }
                                        else
                                        {
                                            FontDefault = FontYellow; BrushDefault = BrushYellow;
                                        }
                                    }
                                    (InactiveRedFrame?Hud.Texture.DebuffFrameTexture:Hud.Texture.BuffFrameTexture).Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                                }
                            }
                            else
                            {
                                if (player.Offense.ElementalDamageBonus[IndexToBonus[index]] == player.Offense.HighestElementalDamageBonus)
                                {
                                    layout = FontBlue.GetTextLayout((player.Offense.HighestElementalDamageBonus * 100).ToString());
                                    FontBlue.DrawText(layout, x + (SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 1.15f, y + (SizeIconHeight - (float)Math.Ceiling(layout.Metrics.Height)) / 1.07f);
                                }
                                s            = BuffCoE.TimeLeftSeconds[index];
                                BrushDefault = BrushBlue;       FontDefault = FontWhite;
                                Hud.Texture.BuffFrameTexture.Draw(x, y, SizeIconWidth, SizeIconHeight, Opacity);
                            }

                            if (s > 0)
                            {
                                //layout = FontDefault.GetTextLayout(s.ToString( (s < 1)? "F1" : "F0") );
                                layout = FontDefault.GetTextLayout((s < 1)? s.ToString("F1") : String.Format("{0:0}", (int)(s + 0.80)));                                   // Redondeará a X si es menor  a X.20
                                FontDefault.DrawText(layout, x + ((SizeIconWidth - (float)Math.Ceiling(layout.Metrics.Width)) / 2.0f), y + ((SizeIconHeight - (float)Math.Ceiling(layout.Metrics.Height)) / 2.0f));
                            }
                            x += SizeIconWidth;
                        }
                        BrushBlack.DrawRectangle(x, y, -SizeIconWidth * j, -ProgressBarWidth);
                        var t = (float)(SizeIconWidth * (j - HeroBonusElements.IndexOf(ActiveElement) - BuffCoE.TimeElapsedSeconds[ActiveElement] / 4));
                        if (t > 0)
                        {
                            BrushDefault.DrawRectangle(x, y, -t, -ProgressBarWidth);
                        }
                        y = y + SizeIconHeight;
                    }
                }
                y += SizeIconHeight * (ShowNames?0.1f:0.4f);
            }
        }