diff --git a/RotationSolver/Commands/RSCommands_StateSpecialCommand.cs b/RotationSolver/Commands/RSCommands_StateSpecialCommand.cs index 0a657ba95..a3467ae56 100644 --- a/RotationSolver/Commands/RSCommands_StateSpecialCommand.cs +++ b/RotationSolver/Commands/RSCommands_StateSpecialCommand.cs @@ -12,14 +12,21 @@ public static partial class RSCommands internal static string EntryString => $"{_stateString}{(DataCenter.SpecialTimeLeft < 0 ? string.Empty : $" - {_specialString}: {DataCenter.SpecialTimeLeft:F2}s")}"; + private static string _lastToastMessage = string.Empty; + private static void UpdateToast() { if (!Service.Config.ShowInfoOnToast) return; - Svc.Toasts.ShowQuest($" {EntryString}", new Dalamud.Game.Gui.Toast.QuestToastOptions + string currentMessage = $" {EntryString}"; + if (currentMessage == _lastToastMessage) return; + + Svc.Toasts.ShowQuest(currentMessage, new Dalamud.Game.Gui.Toast.QuestToastOptions { IconId = 101, }); + + _lastToastMessage = currentMessage; } public static unsafe void DoStateCommandType(StateCommandType stateType, int index = -1) => DoOneCommandType((type, role) => type.ToStateString(role), role => @@ -110,4 +117,4 @@ private static void DoOneCommandType(Func sayout, Func To2D() var result = new List(); var hotBarIndex = 0; - foreach (var intPtr in GetAddons() - .Union(GetAddons()) - .Union(GetAddons()) - .Union(GetAddons())) + foreach (var intPtr in GetAddons()) { var actionBar = (AddonActionBarBase*)intPtr; if (actionBar != null && IsVisible(actionBar->AtkUnitBase)) @@ -142,9 +139,16 @@ private static unsafe IEnumerable GetAddons() where T : struct { if (typeof(T).GetCustomAttribute() is not AddonAttribute on) return Array.Empty(); - return on.AddonIdentifiers - .Select(str => Svc.GameGui.GetAddonByName(str, 1)) - .Where(ptr => ptr != nint.Zero); + var result = new List(); + foreach (var str in on.AddonIdentifiers) + { + var ptr = Svc.GameGui.GetAddonByName(str, 1); + if (ptr != nint.Zero) + { + result.Add(ptr); + } + } + return result; } private static unsafe bool IsVisible(AtkUnitBase unit) @@ -239,12 +243,6 @@ public interface IDrawing2D void Draw(); } -/// Drawing the image. -/// -/// -/// -/// -/// public readonly struct ImageDrawing(IDalamudTextureWrap texture, Vector2 pt1, Vector2 pt2, uint col = uint.MaxValue) : IDrawing2D { /// @@ -262,13 +260,19 @@ public ImageDrawing(IDalamudTextureWrap texture, Vector2 pt1, Vector2 pt2, _uv2 = uv2; } - /// Draw on the - public void Draw() + public unsafe void Draw() { - ImGui.GetWindowDrawList().AddImage(_texture.ImGuiHandle, _pt1, _pt2, _uv1, _uv2, _col); + if (_texture == null) + return; + + var drawList = ImGui.GetWindowDrawList(); + if (drawList.NativePtr == null) + return; + + drawList.AddImage(_texture.ImGuiHandle, _pt1, _pt2, _uv1, _uv2, _col); } private readonly uint _col = col; private readonly Vector2 _pt1 = pt1, _pt2 = pt2, _uv1 = default, _uv2 = Vector2.One; private readonly IDalamudTextureWrap _texture = texture; -} +} \ No newline at end of file diff --git a/RotationSolver/UI/OverlayWindow.cs b/RotationSolver/UI/OverlayWindow.cs index 70f893d24..1867d8f6c 100644 --- a/RotationSolver/UI/OverlayWindow.cs +++ b/RotationSolver/UI/OverlayWindow.cs @@ -2,8 +2,6 @@ using Dalamud.Interface.Windowing; using ECommons.DalamudServices; using RotationSolver.UI.HighlightTeachingMode; -using System.Linq; -using System.Threading.Tasks; namespace RotationSolver.UI; @@ -37,7 +35,7 @@ public override void PreDraw() base.PreDraw(); } - public override async void Draw() + public unsafe override void Draw() { if (!HotbarHighlightManager.Enable || Svc.ClientState == null || Svc.ClientState.LocalPlayer == null) return; @@ -46,10 +44,17 @@ public override async void Draw() try { - await UpdateDrawingElementsAsync(); + UpdateDrawingElementsAsync().GetAwaiter().GetResult(); if (HotbarHighlightManager._drawingElements2D != null) { + var drawList = ImGui.GetWindowDrawList(); + if (drawList.NativePtr == null) + { + Svc.Log.Warning($"{nameof(OverlayWindow)}: Window draw list is null."); + return; + } + foreach (var item in HotbarHighlightManager._drawingElements2D.OrderBy(GetDrawingOrder)) { item.Draw(); @@ -72,13 +77,14 @@ private async Task UpdateDrawingElementsAsync() private int GetDrawingOrder(object drawing) { - if (drawing is PolylineDrawing poly) - { - return poly._thickness == 0 ? 0 : 1; - } - else + switch (drawing) { - return 2; + case PolylineDrawing poly: + return poly._thickness == 0 ? 0 : 1; + case ImageDrawing: + return 1; + default: + return 2; } }