public void PaintWorld(WorldLayer layer)
        {
            var shrines = Hud.Game.Shrines.Where(x => !x.IsDisabled && !x.IsOperated && x.DisplayOnOverlay && (x.Type != ShrineType.HealingWell) && (x.Type != ShrineType.PoolOfReflection));

            foreach (var actor in shrines)
            {
                switch (actor.SnoActor.Sno)
                {
                case (ActorSnoEnum)225025:
                case (ActorSnoEnum)176074:
                    BlessedShrineDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && BlessedSpeak != "")
                    {
                        if (BlessedSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(BlessedSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)225262:
                case (ActorSnoEnum)176075:
                    EnlightenedShrineDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && EnlightenedSpeak != "")
                    {
                        if (EnlightenedSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(EnlightenedSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)225263:
                case (ActorSnoEnum)176076:
                    FortuneShrineDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && FortuneSpeak != "")
                    {
                        if (FortuneSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(FortuneSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)225266:
                case (ActorSnoEnum)176077:
                    FrenziedShrineDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && FrenziedSpeak != "")
                    {
                        if (FrenziedSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(FrenziedSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)260342:
                case (ActorSnoEnum)260346:
                    FleetingShrineDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && FleetingSpeak != "")
                    {
                        if (FleetingSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(FleetingSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)260343:
                case (ActorSnoEnum)260347:
                    EmpoweredShrineDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && EmpoweredSpeak != "")
                    {
                        if (EmpoweredSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(EmpoweredSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)434409:
                case (ActorSnoEnum)269349:
                    BanditShrineDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && BanditSpeak != "")
                    {
                        if (BanditSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(BanditSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)330695:
                    PowerPylonDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && PowerSpeak != "")
                    {
                        if (PowerSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(PowerSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)330696:
                case (ActorSnoEnum)398654:
                    ConduitPylonDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && ConduitSpeak != "")
                    {
                        if (ConduitSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(ConduitSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)330697:
                    ChannelingPylonDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && ChannelingSpeak != "")
                    {
                        if (ChannelingSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(ChannelingSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)330698:
                    ShieldPylonDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && ShieldSpeak != "")
                    {
                        if (ShieldSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(ShieldSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;

                case (ActorSnoEnum)330699:
                    SpeedPylonDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                    if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && SpeedSpeak != "")
                    {
                        if (SpeedSpeak == "默认")
                        {
                            Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                        }
                        else
                        {
                            Hud.Sound.Speak(SpeedSpeak);
                        }
                        actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                    }
                    break;
                }
            }


            var healingWells = Hud.Game.Shrines.Where(x => !x.IsDisabled && !x.IsOperated && x.DisplayOnOverlay && (x.Type == ShrineType.HealingWell));

            foreach (var actor in healingWells)
            {
                HealingWellDecorator.ToggleDecorators <GroundLabelDecorator>(!actor.IsOnScreen); // do not display ground labels when the actor is on the screen
                HealingWellDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && HealingSpeak != "")
                {
                    if (HealingSpeak == "默认")
                    {
                        Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                    }
                    else
                    {
                        Hud.Sound.Speak(HealingSpeak);
                    }
                    actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                }
            }

            var poolOfReflections = Hud.Game.Shrines.Where(x => !x.IsDisabled && !x.IsOperated && x.DisplayOnOverlay && (x.Type == ShrineType.PoolOfReflection));

            foreach (var actor in poolOfReflections)
            {
                PoolOfReflectionDecorator.ToggleDecorators <GroundLabelDecorator>(!actor.IsOnScreen); // do not display ground labels when the actor is on the screen
                PoolOfReflectionDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
                if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && PoolSpeak != "")
                {
                    if (PoolSpeak == "默认")
                    {
                        Hud.Sound.Speak(actor.SnoActor.NameLocalized);
                    }
                    else
                    {
                        Hud.Sound.Speak(PoolSpeak);
                    }
                    actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                }
            }

            var riftPylonSpawnPoints = Hud.Game.Actors.Where(x => x.SnoActor.Sno == ActorSnoEnum._markerlocation_tieredriftpylon);

            foreach (var actor in riftPylonSpawnPoints)
            {
                PossibleRiftPylonDecorator.Paint(layer, actor, actor.FloorCoordinate, "??塔");
                if (EnableSpeak && (actor.LastSpeak == null) && Hud.Sound.LastSpeak.TimerTest(2000) && PossibleRiftPylonSpeak != "")
                {
                    Hud.Sound.Speak(PossibleRiftPylonSpeak);
                    actor.LastSpeak = Hud.Time.CreateAndStartWatch();
                }
            }
        }
        public void PaintWorld(WorldLayer layer)
        {
            foreach (var marker in Hud.Game.Markers)
            {
                if (Hud.Game.Shrines.Any(x => x.IsShrine && x.FloorCoordinate.XYDistanceTo(marker.FloorCoordinate) <= 2))
                {
                    continue;
                }

                var decorator = marker.IsUsed
                    ? UsedMarkerDecorator
                    : GenericMarkerDecorator;

                if (!marker.IsUsed)
                {
                    if (marker.IsPylon)
                    {
                        decorator = PylonDecorator;
                    }
                    else if (marker.IsPoolOfReflection)
                    {
                        decorator = PoolOfReflectionDecorator;
                    }
                    else if (marker.IsHealingWell)
                    {
                        decorator = HealingWellDecorator;
                    }
                }

                var texture = Hud.Texture.GetTexture(marker.TextureSno, marker.TextureFrameIndex);

                foreach (var deco in decorator.GetDecorators <MapTextureDecorator>())
                {
                    deco.Texture = texture;
                }

                foreach (var deco in decorator.GetDecorators <MapLabelDecorator>())
                {
                    deco.RadiusOffset = texture != null ? 20 : 10;
                }

                decorator.ToggleDecorators <MapShapeDecorator>(texture == null);

                var groundLabelVisible = true;
                if (TooFarMarkerRange != null && marker.FloorCoordinate.XYDistanceTo(Hud.Game.Me.FloorCoordinate) > TooFarMarkerRange.Value)
                {
                    groundLabelVisible = false;
                }

                if (marker.FloorCoordinate.IsOnScreen())
                {
                    groundLabelVisible = false;
                }

                decorator.ToggleDecorators <GroundLabelDecorator>(groundLabelVisible); // do not display ground labels when the actor is on the screen

                var mapLabelVisible = !marker.IsHealingWell && !marker.IsShrine && !marker.IsPoolOfReflection && !marker.IsPylon;
                decorator.ToggleDecorators <MapLabelDecorator>(mapLabelVisible);

                decorator.Paint(layer, null, marker.FloorCoordinate, marker.Name);
            }

            var shrines = Hud.Game.Shrines.Where(x => !x.IsDisabled && !x.IsOperated && x.IsShrine);

            foreach (var actor in shrines)
            {
                ShrineDecorator.ToggleDecorators <GroundLabelDecorator>(!actor.IsOnScreen); // do not display ground labels when the actor is on the screen
                ShrineDecorator.Paint(layer, actor, actor.FloorCoordinate, actor.SnoActor.NameLocalized);
            }

            if (Hud.Game.SpecialArea == SpecialArea.GreaterRift)
            {
                var riftPylonSpawnPoints = Hud.Game.Actors.Where(x => x.SnoActor.Sno == ActorSnoEnum._markerlocation_tieredriftpylon);
                foreach (var actor in riftPylonSpawnPoints)
                {
                    PossibleRiftPylonDecorator.Paint(layer, actor, actor.FloorCoordinate, "pylon?");
                }
            }
        }