Exemple #1
0
    internal static (bool shouldBuildConfigUi, bool changedConfig) Draw(Configuration config)
    {
        var shouldBuildConfigUi = true;
        var changed             = false;
        var scale = ImGui.GetIO().FontGlobalScale;

        ImGuiHelpers.ForceNextWindowMainViewport();
        ImGui.SetNextWindowSize(new Vector2(400 * scale, 420 * scale), ImGuiCond.FirstUseEver);
        ImGui.SetNextWindowSizeConstraints(new Vector2(410 * scale, 200 * scale),
                                           new Vector2(float.MaxValue, float.MaxValue));
        if (!ImGui.Begin($"{Plugin.PluginName} Configuration", ref shouldBuildConfigUi,
                         ImGuiWindowFlags.NoCollapse))
        {
            ImGui.End();
            return(shouldBuildConfigUi, changed);
        }

        if (config.FreshInstall)
        {
            DrawFreshInstallNotice(config, scale);
        }

        if (ImGui.BeginTabBar("ConfigTabBar", ImGuiTabBarFlags.NoTooltip))
        {
            changed |= DrawGeneralConfigurationTab(config, scale);
            changed |= DrawFilterTab(config, scale);
            changed |= DrawOnAddonHideTab(config, scale);
            DrawHelpTab();
            ImGui.EndTabBar();
        }

        ImGui.End();
        return(shouldBuildConfigUi, changed);
    }
Exemple #2
0
        private static void DrawFreeCamButton()
        {
            ImGuiHelpers.ForceNextWindowMainViewport();
            var size = new Vector2(50) * ImGuiHelpers.GlobalScale;

            ImGui.SetNextWindowSize(size, ImGuiCond.Always);
            ImGuiHelpers.SetNextWindowPosRelativeMainViewport(new Vector2(ImGuiHelpers.MainViewport.Size.X - size.X, 0), ImGuiCond.Always);
            ImGui.Begin("FreeCam Button", ImGuiWindowFlags.NoBackground | ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoFocusOnAppearing);

            if (ImGui.IsWindowHovered() && ImGui.IsMouseReleased(ImGuiMouseButton.Left))
            {
                FreeCam.Toggle();
            }

            ImGui.End();
        }
        internal static bool DrawConfigUi(Configuration config, DalamudPluginInterface pi,
                                          Action <IPluginConfiguration> save, IReadOnlyCollection <ClassJob> jobs,
                                          IReadOnlyCollection <FFXIVAction> allActions, ref IEnumerator <VibrationPattern.Step?>?patternEnumerator)
        {
            var shouldDrawConfigUi = true;
            var changed            = false;
            var scale = ImGui.GetIO().FontGlobalScale;

            ImGuiHelpers.ForceNextWindowMainViewport();
            ImGui.SetNextWindowSize(new Vector2(575 * scale, 400 * scale), ImGuiCond.FirstUseEver);
            ImGui.SetNextWindowSizeConstraints(new Vector2(350 * scale, 200 * scale),
                                               new Vector2(float.MaxValue, float.MaxValue));
            if (!ImGui.Begin($"{GentleTouch.PluginName} Configuration", ref shouldDrawConfigUi,
                             ImGuiWindowFlags.NoCollapse))
            {
                ImGui.End();
                return(shouldDrawConfigUi);
            }

            if (config.OnboardingStep != Onboarding.Done)
            {
                changed |= DrawRisksWarning(config, ref shouldDrawConfigUi, scale);
                changed |= DrawOnboarding(config, jobs, allActions, scale);
            }

            ImGui.BeginTabBar("ConfigurationTabs", ImGuiTabBarFlags.NoTooltip);
            changed |= DrawGeneralTab(config, scale);
            changed |= DrawPatternTab(config, scale, ref patternEnumerator);
            changed |= DrawTriggerTab(config, pi, scale, jobs, allActions);
            ImGui.EndTabBar();
            ImGui.End();
            if (!changed)
            {
                return(shouldDrawConfigUi);
            }
#if DEBUG
            PluginLog.Verbose("Config changed, saving...");
#endif
            save(config);
            return(shouldDrawConfigUi);
        }
Exemple #4
0
    internal static Vector2 Draw(
        DrawVariables drawVariables,
        Pointers pointers,
        float cameraRotationInRadian,
        Vector2 playerPosition,
        Configuration config
        )
    {
        const ImGuiWindowFlags flags =
            ImGuiWindowFlags.NoDecoration
            | ImGuiWindowFlags.NoMove
            | ImGuiWindowFlags.NoMouseInputs
            | ImGuiWindowFlags.NoFocusOnAppearing
            | ImGuiWindowFlags.NoBackground
            | ImGuiWindowFlags.NoNav
            | ImGuiWindowFlags.NoInputs
            | ImGuiWindowFlags.NoCollapse
            | ImGuiWindowFlags.NoSavedSettings;

        ImGuiHelpers.ForceNextWindowMainViewport();
        ImGuiHelpers.SetNextWindowPosRelativeMainViewport(config.ImGuiCompassPosition, ImGuiCond.Always);
        ImGui.Begin("###ImGuiCompassWindow", flags);

        var cosPlayer = MathF.Cos(cameraRotationInRadian);
        var sinPlayer = MathF.Sin(cameraRotationInRadian);
        // NOTE: Interpret game's camera rotation as
        // 0 => (0,1) (North), PI/2 => (-1,0) (West)  in default coordinate system
        // Games Map coordinate system origin is upper left, with positive Y grow
        var playerForward      = new Vector2(-sinPlayer, cosPlayer);
        var drawList           = ImGui.GetWindowDrawList();
        var backgroundDrawList = ImGui.GetBackgroundDrawList();

        drawList.PushClipRect(drawVariables.DrawListPMin, drawVariables.DrawListPMax);
        backgroundDrawList.PushClipRect(drawVariables.BackgroundDrawListPMin, drawVariables.BackgroundDrawListPMax);

        DrawImGuiCompassBackground(
            drawVariables.BackgroundPMin,
            drawVariables.BackgroundPMax,
            drawVariables.BackgroundLinePMin,
            drawVariables.BackgroundLinePMax,
            drawVariables.BackgroundColourUInt32,
            drawVariables.BackgroundBorderColourUInt32,
            drawVariables.BackgroundLineColourUInt32,
            config
            );
        if (config.ShowInterCardinals)
        {
            DrawInterCardinals(
                playerForward,
                drawVariables.Centre,
                drawVariables.HalfWidth28,
                drawVariables.CompassUnit,
                config.ImGuiCompassCardinalsOffset,
                pointers.NaviMapTextureD3D11ShaderResourceView
                );
        }
        if (config.ShowCardinals)
        {
            DrawCardinals(
                playerForward,
                drawVariables.Centre,
                drawVariables.HalfWidth40,
                drawVariables.HalfWidth28,
                drawVariables.CompassUnit,
                config.ImGuiCompassCardinalsOffset,
                pointers.NaviMapTextureD3D11ShaderResourceView
                );
        }
        if (config.ShowWeatherIcon)
        {
            unsafe {
                DrawWeatherIcon(
                    drawVariables.WeatherIconBorderPMin,
                    drawVariables.WeatherIconBorderPMax,
                    drawVariables.WeatherIconPMin,
                    drawVariables.WeatherIconPMax,
                    pointers.NaviMapTextureD3D11ShaderResourceView,
                    pointers.WeatherIconNode
                    );
            }
        }

        if (config.ShowDistanceToTarget)
        {
            unsafe {
                DrawDistanceToTarget(
                    config.ImGuiCompassDistanceToTargetMouseOverPrio,
                    pointers.TargetSystem,
                    drawVariables.DistanceToTargetScale,
                    drawVariables.DistanceToTargetColourUInt32,
                    drawVariables.DistanceToTargetPMin,
                    config.DistanceToTargetPrefix,
                    config.DistanceToTargetSuffix
                    );
            }
        }

        if (!config.ShowOnlyCardinals)
        {
            unsafe {
                playerPosition = DrawIcons(
                    drawVariables.CurrentScaleOffset,
                    drawVariables.ComponentIconLoopStart,
                    drawVariables.ComponentIconLoopEnd,
                    config.ImGuiCompassCentreMarkerOffset,
                    drawVariables.MaxDistance,
                    drawVariables.CompassUnit,
                    drawVariables.Scale,
                    drawVariables.RotationIconHalfWidth,
                    drawVariables.HalfWidth40,
                    drawVariables.MinScaleFactor,
                    config.ImGuiCompassBackgroundRounding,
                    playerForward,
                    playerPosition,
                    drawVariables.Centre,
                    drawVariables.BackgroundPMin,
                    drawVariables.BackgroundPMax,
                    config.UseAreaMapAsSource,
                    config.ImGuiCompassEnableCenterMarker,
                    config.ImGuiCompassFlipCentreMarker,
                    pointers.CurrentSourceBase,
                    pointers.CurrentMapIconsRootComponentNode,
                    config.FilteredIconIds
                    );
            }
        }

        drawList.PopClipRect();
        backgroundDrawList.PopClipRect();
        ImGui.End();
        return(playerPosition);
    }
Exemple #5
0
        public unsafe void Draw()
        {
            if (!IsVisible || _pluginConfiguration.HideHud ||
                (_pluginConfiguration.HideCombat && !Plugin.Condition[ConditionFlag.InCombat]))
            {
                return;
            }

            var actor           = Plugin.ClientState.LocalPlayer;
            var parameterWidget =
                (AtkUnitBase *)Plugin.GameGui.GetAddonByName("_ParameterWidget", 1);
            var fadeMiddleWidget =
                (AtkUnitBase *)Plugin.GameGui.GetAddonByName("FadeMiddle", 1);

            // Display HUD only if parameter widget is visible and we're not in a fade event
            if (actor == null || parameterWidget == null || fadeMiddleWidget == null || !parameterWidget->IsVisible ||
                fadeMiddleWidget->IsVisible)
            {
                return;
            }

            var viewportSize = ImGui.GetMainViewport().Size;

            ImGuiHelpers.ForceNextWindowMainViewport();
            ImGui.SetNextWindowPos(Vector2.Zero);
            ImGui.SetNextWindowSize(viewportSize);
            if (!ImGui.Begin("Side HUD",
                             ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.AlwaysAutoResize |
                             ImGuiWindowFlags.NoBackground | ImGuiWindowFlags.NoInputs | ImGuiWindowFlags.NoBringToFrontOnFocus))
            {
                return;
            }

            var     hpScale = (float)actor.CurrentHp / actor.MaxHp;
            uint    resourceValue;
            float   resourceScale;
            Vector4 resourceColor;

            if (actor.MaxCp > 0)
            {
                resourceValue = actor.CurrentCp;
                resourceColor = _pluginConfiguration.CpColorAlpha;
                resourceScale = (float)actor.CurrentCp / actor.MaxCp;
            }
            else if (actor.MaxCp > 0)
            {
                resourceValue = actor.CurrentGp;
                resourceColor = _pluginConfiguration.GpColorAlpha;
                resourceScale = (float)actor.CurrentGp / actor.MaxGp;
            }
            else
            {
                resourceValue = actor.CurrentMp;
                resourceColor = _pluginConfiguration.MpColorAlpha;
                resourceScale = (float)actor.CurrentMp / actor.MaxMp;
            }

            float   leftBarScale;
            Vector4 leftBarColor;

            float   rightBarScale;
            Vector4 rightBarColor;

            if (_pluginConfiguration.FlipBars)
            {
                leftBarScale  = resourceScale;
                leftBarColor  = resourceColor;
                rightBarScale = hpScale;
                rightBarColor = _pluginConfiguration.HpColorAlpha;
            }
            else
            {
                rightBarScale = resourceScale;
                rightBarColor = resourceColor;
                leftBarScale  = hpScale;
                leftBarColor  = _pluginConfiguration.HpColorAlpha;
            }

            //ImGui.SetWindowFontScale(2.4f * _pluginConfiguration.FontScale * _pluginConfiguration.Scale);

            var cursorPos = new Vector2(viewportSize.X / 2f + _pluginConfiguration.Offset.X,
                                        viewportSize.Y / 2f + _pluginConfiguration.Offset.Y -
                                        (_pluginConfiguration.BarImage.Height / 2f + 100f) * _pluginConfiguration.Scale);
            var imageWidth = (_pluginConfiguration.BarImage.Width + _pluginConfiguration.BarGap) *
                             _pluginConfiguration.Scale;

            // ImGui.PushFont(_pluginConfiguration.NumberFont);
            // TextExtension.DrawText($"Font Size: {ImGui.GetFont().FontSize} Font Size Scale: {ImGui.GetFont().FontSize * _pluginConfiguration.FontScale * _pluginConfiguration.Scale}", .33f, cursorPos, _pluginConfiguration.HpTextColorAlpha, true, true);
            // ImGui.PopFont();

            // Left bar
            DrawBar(cursorPos, imageWidth, leftBarScale, leftBarColor, false);

            // Right bar
            DrawBar(cursorPos, _pluginConfiguration.BarGap * _pluginConfiguration.Scale, rightBarScale, rightBarColor,
                    true);

            if (Plugin.TargetManager.Target is BattleChara {
                ObjectKind : ObjectKind.Player or ObjectKind.BattleNpc
            } targetActor)
            {
                var drawCast          = false;
                var castScale         = 0f;
                var actionName        = string.Empty;
                var castInterrupted   = false;
                var castInterruptible = false;
                var interruptedText   = string.Empty;

                var targetInfoWidget =
                    (AtkUnitBase *)Plugin.GameGui.GetAddonByName("_TargetInfo", 1);
                var targetInfoCastBarWidget =
                    (AtkUnitBase *)Plugin.GameGui.GetAddonByName("_TargetInfoCastBar", 1);

                if (targetInfoWidget != null && targetInfoWidget->IsVisible && targetInfoWidget->UldManager.NodeList != null)
                {
                    for (var i = 0; i != targetInfoWidget->UldManager.NodeListCount; ++i)
                    {
                        var node = targetInfoWidget->UldManager.NodeList[i];

                        switch (node->NodeID)
                        {
                        case 11:                                 // Interrupted text
                            castInterrupted = node->IsVisible;
                            interruptedText = ((AtkTextNode *)node)->NodeText.GetString();
                            break;

                        case 12:                                 // Action name
                            drawCast   = node->IsVisible;
                            actionName = ((AtkTextNode *)node)->NodeText.GetString();
                            break;

                        case 13:                                 // Action cast image (Used for scale)
                            drawCast  = node->IsVisible;
                            castScale = node->ScaleX;
                            break;

                        case 14:                                 // Interruptible cast image
                            castInterruptible = node->IsVisible;
                            break;
                        }
                    }
                }

                if (targetInfoCastBarWidget != null && targetInfoCastBarWidget->IsVisible && targetInfoCastBarWidget->UldManager.NodeList != null)
                {
                    for (var i = 0; i != targetInfoCastBarWidget->UldManager.NodeListCount; ++i)
                    {
                        var node = targetInfoCastBarWidget->UldManager.NodeList[i];

                        switch (node->NodeID)
                        {
                        case 3:                                 // Interrupted text
                            castInterrupted = node->IsVisible;
                            interruptedText = ((AtkTextNode *)node)->NodeText.GetString();
                            break;

                        case 4:                                 // Action name
                            drawCast   = node->IsVisible;
                            actionName = ((AtkTextNode *)node)->NodeText.GetString();
                            break;

                        case 5:                                 // Action cast image (Used for scale)
                            drawCast  = node->IsVisible;
                            castScale = node->ScaleX;
                            break;

                        case 6:                                 // Interruptible cast image
                            castInterruptible = node->IsVisible;
                            break;
                        }
                    }
                }

                DrawTargetInfo(targetActor, cursorPos, castScale, imageWidth + 50f, actionName, interruptedText,
                               drawCast, castInterrupted, castInterruptible, false);
            }

            if (Plugin.TargetManager.FocusTarget is BattleChara {
                ObjectKind : ObjectKind.Player or ObjectKind.BattleNpc
            } focusTargetActor)
            {
                var drawCast          = false;
                var castScale         = 0f;
                var actionName        = string.Empty;
                var castInterrupted   = false;
                var castInterruptible = false;
                var interruptedText   = string.Empty;

                var focusTargetInfoWidget =
                    (AtkUnitBase *)Plugin.GameGui.GetAddonByName("_FocusTargetInfo", 1);

                if (focusTargetInfoWidget != null && focusTargetInfoWidget->IsVisible && focusTargetInfoWidget->UldManager.NodeList != null)
                {
                    for (var i = 0; i != focusTargetInfoWidget->UldManager.NodeListCount; ++i)
                    {
                        var node = focusTargetInfoWidget->UldManager.NodeList[i];

                        switch (node->NodeID)
                        {
                        case 4:                                 // Interrupted text
                            castInterrupted = node->IsVisible;
                            interruptedText = ((AtkTextNode *)node)->NodeText.GetString();
                            break;

                        case 5:                                 // Action name
                            drawCast   = node->IsVisible;
                            actionName = ((AtkTextNode *)node)->NodeText.GetString();
                            break;

                        case 6:                                 // Action cast image (Used for scale)
                            drawCast  = node->IsVisible;
                            castScale = node->ScaleX;
                            break;

                        case 7:                                 // Interruptible cast image
                            castInterruptible = node->IsVisible;
                            break;
                        }
                    }
                }

                DrawTargetInfo(focusTargetActor, cursorPos, castScale, _pluginConfiguration.BarGap * _pluginConfiguration.Scale + 50f, actionName, interruptedText,
                               drawCast, castInterrupted, castInterruptible, true);
            }

            var cursorY     = ImGui.GetCursorPosY();
            var shieldScale = Math.Min(*(int *)(actor.Address + 0x1997), 100) / 100f;

            // Shield
            DrawCastBar(cursorPos,
                        _pluginConfiguration.FlipCastBar
                                        ? _pluginConfiguration.BarGap * _pluginConfiguration.Scale
                                        : imageWidth, shieldScale, _pluginConfiguration.ShieldColorAlpha, _pluginConfiguration.FlipCastBar,
                        false);

            ImGui.PushFont(_pluginConfiguration.NumberFont);

            // Cast bar

            var castBar = (AddonCastBar *)Plugin.GameGui.GetAddonByName("_CastBar", 1);

            if (castBar != null && castBar->AtkUnitBase.UldManager.NodeList != null &&
                castBar->AtkUnitBase.UldManager.NodeListCount > 11 && castBar->AtkUnitBase.IsVisible)
            {
                var castScale = castBar->CastPercent / 100;
                var castTime  = ((_pluginConfiguration.CastTimeUp ? 0 : castBar->CastTime) -
                                 castBar->CastTime * castScale) / 100;
                var slideCastScale = _pluginConfiguration.SlidecastTime / 10f / castBar->CastTime;
                var castSign       = _pluginConfiguration.CastTimeUp ? "" : "-";
                var castString     = $"{castBar->CastName.GetString()}\n{castSign} {Math.Abs(castTime):F}";
                var castStringSize = TextExtension.CalcTextSize(castString, _pluginConfiguration.FontScale * _pluginConfiguration.Scale);

                var interrupted = false;

                for (var i = 0; i != castBar->AtkUnitBase.UldManager.NodeListCount; ++i)
                {
                    var node = castBar->AtkUnitBase.UldManager.NodeList[i];
                    // ReSharper disable once InvertIf
                    if (node->NodeID == 2 && node->IsVisible)                     // Interrupted text node
                    {
                        interrupted = true;
                        break;
                    }
                }

                if (_pluginConfiguration.FlipCastBar)
                {
                    TextExtension.DrawOutlineText(
                        new Vector2(
                            cursorPos.X - castStringSize.X / 2 -
                            _pluginConfiguration.BarGap * _pluginConfiguration.Scale, cursorPos.Y - castStringSize.Y),
                        _pluginConfiguration.CastTextColorAlpha, _pluginConfiguration.CastTextOutlineColorAlpha,
                        castString, _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);

                    DrawCastBar(cursorPos, imageWidth, castScale,
                                interrupted
                                                        ? _pluginConfiguration.CastInterruptColorAlpha
                                                        : _pluginConfiguration.CastColorAlpha, false, true);

                    // Slidecast
                    if (_pluginConfiguration.ShowSlidecast)
                    {
                        DrawCastBar(cursorPos, imageWidth, slideCastScale, _pluginConfiguration.SlidecastColorAlpha,
                                    false, false);
                    }
                }
                else
                {
                    TextExtension.DrawOutlineText(
                        new Vector2(cursorPos.X + _pluginConfiguration.BarGap * _pluginConfiguration.Scale,
                                    cursorPos.Y - castStringSize.Y), _pluginConfiguration.CastTextColorAlpha,
                        _pluginConfiguration.CastTextOutlineColorAlpha, castString, _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);

                    DrawCastBar(cursorPos, _pluginConfiguration.BarGap * _pluginConfiguration.Scale, castScale,
                                interrupted
                                                        ? _pluginConfiguration.CastInterruptColorAlpha
                                                        : _pluginConfiguration.CastColorAlpha, true, true);

                    // Slidecast
                    if (_pluginConfiguration.ShowSlidecast)
                    {
                        DrawCastBar(cursorPos, _pluginConfiguration.BarGap * _pluginConfiguration.Scale, slideCastScale,
                                    _pluginConfiguration.SlidecastColorAlpha, true, false);
                    }
                }
            }

            if (_pluginConfiguration.ShowPercentage || _pluginConfiguration.ShowNumbers)
            {
                ImGui.SetCursorPos(new Vector2(cursorPos.X, cursorY));

                Vector2 hpTextPos;
                Vector2 resourceTextPos;
                Vector2 hpPercentTextPos;
                Vector2 resourcePercentTextPos;

                var hpPercent       = hpScale * 100f;
                var resourcePercent = resourceScale * 100f;

                var hpText              = $"{actor.CurrentHp}";
                var resourceText        = $"{resourceValue}";
                var hpPercentText       = $"({hpPercent:F0}%)";
                var resourcePercentText = $"({resourcePercent:F0}%)";

                var hpTextSize =
                    TextExtension.CalcTextSize(hpText, _pluginConfiguration.FontScale * _pluginConfiguration.Scale);
                var hpPercentTextSize =
                    TextExtension.CalcTextSize(hpPercentText, _pluginConfiguration.FontScale * _pluginConfiguration.Scale);
                var resourceTextSize =
                    TextExtension.CalcTextSize(resourceText, _pluginConfiguration.FontScale * _pluginConfiguration.Scale);
                var resourcePercentTextSize =
                    TextExtension.CalcTextSize(resourcePercentText, _pluginConfiguration.FontScale * _pluginConfiguration.Scale);

                if (_pluginConfiguration.FlipBars)
                {
                    hpTextPos = new Vector2(cursorPos.X + _pluginConfiguration.BarGap * _pluginConfiguration.Scale,
                                            ImGui.GetCursorPosY());
                    hpPercentTextPos =
                        new Vector2(cursorPos.X + _pluginConfiguration.BarGap * _pluginConfiguration.Scale,
                                    ImGui.GetCursorPosY() + hpTextSize.Y);
                    resourceTextPos =
                        new Vector2(
                            cursorPos.X - resourceTextSize.X - _pluginConfiguration.BarGap * _pluginConfiguration.Scale,
                            ImGui.GetCursorPosY());
                    resourcePercentTextPos =
                        new Vector2(
                            cursorPos.X - resourcePercentTextSize.X -
                            _pluginConfiguration.BarGap * _pluginConfiguration.Scale,
                            ImGui.GetCursorPosY() + resourceTextSize.Y);
                }
                else
                {
                    hpTextPos = new Vector2(
                        cursorPos.X - hpTextSize.X - _pluginConfiguration.BarGap * _pluginConfiguration.Scale, ImGui.GetCursorPosY());
                    hpPercentTextPos = new Vector2(
                        cursorPos.X - hpPercentTextSize.X - _pluginConfiguration.BarGap * _pluginConfiguration.Scale, ImGui.GetCursorPosY() + hpTextSize.Y);
                    resourceTextPos =
                        new Vector2(cursorPos.X + _pluginConfiguration.BarGap * _pluginConfiguration.Scale, ImGui.GetCursorPosY());
                    resourcePercentTextPos =
                        new Vector2(cursorPos.X + _pluginConfiguration.BarGap * _pluginConfiguration.Scale, ImGui.GetCursorPosY() + resourceTextSize.Y);
                }

                switch (_pluginConfiguration.ShowNumbers)
                {
                case true when _pluginConfiguration.ShowPercentage:
                    TextExtension.DrawOutlineText(hpTextPos, _pluginConfiguration.HpTextColorAlpha,
                                                  _pluginConfiguration.HpTextOutlineColorAlpha, hpText,
                                                  _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);
                    TextExtension.DrawOutlineText(hpPercentTextPos, _pluginConfiguration.HpTextColorAlpha,
                                                  _pluginConfiguration.HpTextOutlineColorAlpha, hpPercentText,
                                                  _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);
                    TextExtension.DrawOutlineText(resourceTextPos, _pluginConfiguration.ResourceTextColorAlpha,
                                                  _pluginConfiguration.ResourceTextOutlineColorAlpha, resourceText,
                                                  _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);
                    TextExtension.DrawOutlineText(resourcePercentTextPos,
                                                  _pluginConfiguration.ResourceTextColorAlpha,
                                                  _pluginConfiguration.ResourceTextOutlineColorAlpha, resourcePercentText,
                                                  _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);
                    break;

                case true:
                    TextExtension.DrawOutlineText(hpTextPos, _pluginConfiguration.HpTextColorAlpha,
                                                  _pluginConfiguration.HpTextOutlineColorAlpha, hpText,
                                                  _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);
                    TextExtension.DrawOutlineText(resourceTextPos, _pluginConfiguration.ResourceTextColorAlpha,
                                                  _pluginConfiguration.ResourceTextOutlineColorAlpha, resourceText,
                                                  _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);
                    break;

                default:
                    TextExtension.DrawOutlineText(
                        new Vector2(hpPercentTextPos.X, hpPercentTextPos.Y - hpTextSize.Y),
                        _pluginConfiguration.HpTextColorAlpha, _pluginConfiguration.HpTextOutlineColorAlpha,
                        hpPercentText, _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);
                    TextExtension.DrawOutlineText(
                        new Vector2(resourcePercentTextPos.X, resourcePercentTextPos.Y - resourceTextSize.Y),
                        _pluginConfiguration.ResourceTextColorAlpha,
                        _pluginConfiguration.ResourceTextOutlineColorAlpha, resourcePercentText,
                        _pluginConfiguration.FontScale * _pluginConfiguration.Scale, 2);
                    break;
                }

                ImGui.PopFont();
            }

            ImGui.End();
        }