diff --git a/ActionTimelineEx/ActionTimelineEx.csproj b/ActionTimelineEx/ActionTimelineEx.csproj index a2a804a..538176c 100644 --- a/ActionTimelineEx/ActionTimelineEx.csproj +++ b/ActionTimelineEx/ActionTimelineEx.csproj @@ -51,4 +51,8 @@ + + + + diff --git a/ActionTimelineEx/Configurations/ActionSetting.cs b/ActionTimelineEx/Configurations/ActionSetting.cs index 305d007..dabe0d9 100644 --- a/ActionTimelineEx/Configurations/ActionSetting.cs +++ b/ActionTimelineEx/Configurations/ActionSetting.cs @@ -1,11 +1,7 @@ using ActionTimeline.Helpers; -using Dalamud.Plugin.Services; using ECommons.DalamudServices; -using FFXIVClientStructs.FFXIV.Common.Lua; using ImGuiNET; -using System.Drawing; using System.Numerics; -using System.Xml.Linq; using XIVConfigUI.Attributes; namespace ActionTimelineEx.Configurations; @@ -26,6 +22,12 @@ public override void OnClick(object obj) //TODO: Change the acion ID... } + + public override string GetDescription(object obj) + { + if (obj is not ActionSetting setting) return base.GetDescription(obj); + return setting.DisplayName; + } } public enum ActionSettingType : byte @@ -40,12 +42,10 @@ public class ActionSetting internal uint IconId { get; private set; } = 0; internal bool IsGCD { get; private set; } = false; - [UI("Name")] internal string DisplayName { get; private set; } = ""; private uint _actionId; - [UI("Id")] public uint ActionId { get => _actionId; @@ -57,7 +57,8 @@ public uint ActionId Update(); } } - + [JsonIgnore, UI("Id")] + public int Id { get => (int)ActionId; set => ActionId = (uint) value; } private ActionSettingType _type; [UI("Type")] @@ -104,7 +105,7 @@ void UpdateAction() IsGCD = action.CooldownGroup == 58 || action.AdditionalCooldownGroup == 58; - IconId = action.Icon; + IconId = GetActionIcon(action); DisplayName = $"{action.Name} ({(IsGCD ? "GCD" : "Ability")})"; } @@ -121,4 +122,15 @@ public void Draw(ImDrawListPtr drawList, Vector2 point, float size) drawList.DrawActionIcon(IconId, Type is ActionSettingType.Item, point, size); if (!string.IsNullOrEmpty(DisplayName) && DrawHelper.IsInRect(point, new Vector2(size))) ImGui.SetTooltip(DisplayName); } + + private static uint GetActionIcon(Lumina.Excel.GeneratedSheets.Action action) + { + var isGAction = action.ActionCategory.Row is 10 or 11; + if (!isGAction) return action.Icon; + + var gAct = Svc.Data.GetExcelSheet()?.FirstOrDefault(g => g.Action.Row == action.RowId); + + if (gAct == null) return action.Icon; + return (uint)gAct.Icon; + } } diff --git a/ActionTimelineEx/Configurations/RotationsSetting.cs b/ActionTimelineEx/Configurations/RotationsSetting.cs index 8aab047..84e4976 100644 --- a/ActionTimelineEx/Configurations/RotationsSetting.cs +++ b/ActionTimelineEx/Configurations/RotationsSetting.cs @@ -1,6 +1,4 @@ -using System.Text.Json.Serialization; - -namespace ActionTimelineEx.Configurations; +namespace ActionTimelineEx.Configurations; public class RotationsSetting { diff --git a/ActionTimelineEx/Configurations/Settings.cs b/ActionTimelineEx/Configurations/Settings.cs index 9114285..284227f 100644 --- a/ActionTimelineEx/Configurations/Settings.cs +++ b/ActionTimelineEx/Configurations/Settings.cs @@ -101,6 +101,9 @@ public string RotationName [UI("Icon Spacing", Parent = nameof(DrawRotation))] public int IconSpacing { get; set; } = 5; + [UI("Show the wrong clicking", Parent = nameof(DrawRotation))] + public bool ShowWrongClick { get; set; } = true; + [JsonProperty] private Dictionary> _rotationHelpers = []; diff --git a/ActionTimelineEx/Configurations/UiString.cs b/ActionTimelineEx/Configurations/UiString.cs index eb15e55..d5a6f34 100644 --- a/ActionTimelineEx/Configurations/UiString.cs +++ b/ActionTimelineEx/Configurations/UiString.cs @@ -31,4 +31,7 @@ internal enum UiString [Description("Rotation")] Rotation, + + [Description("Reset Count")] + RotationReset, } diff --git a/ActionTimelineEx/Helpers/RotationHelper.cs b/ActionTimelineEx/Helpers/RotationHelper.cs index 8c228f3..4320ea1 100644 --- a/ActionTimelineEx/Helpers/RotationHelper.cs +++ b/ActionTimelineEx/Helpers/RotationHelper.cs @@ -28,31 +28,47 @@ private set if (_count == value) return; _count = value; - if (_highLight == null) return; - _highLight.Color = Plugin.Settings.RotationHighlightColor; - _highLight.HotbarIDs.Clear(); - - var action = ActiveActon; - if (action == null) return; + UpdateHighlight(); + } + } + public static uint SuccessCount { get; private set; } = 0; - HotbarID? hotbar = null; + private static void UpdateHighlight() + { + if (_highLight == null) return; + _highLight.Color = Plugin.Settings.RotationHighlightColor; + _highLight.HotbarIDs.Clear(); - switch (action.Type) - { - case ActionSettingType.Action: - hotbar = new HotbarID(FFXIVClientStructs.FFXIV.Client.UI.Misc.RaptureHotbarModule.HotbarSlotType.Action, action.ActionId); - break; + var action = ActiveActon; + if (action == null) return; - case ActionSettingType.Item: - hotbar = new HotbarID(FFXIVClientStructs.FFXIV.Client.UI.Misc.RaptureHotbarModule.HotbarSlotType.Item, action.ActionId); - break; - } + HotbarID? hotbar = null; - if (hotbar == null) return; - _highLight.HotbarIDs.Add(hotbar.Value); + switch (action.Type) + { + case ActionSettingType.Action: + var isGAction = Svc.Data.GetExcelSheet()?.GetRow(action.ActionId)?.ActionCategory.Row is 10 or 11; + if (isGAction) + { + var gAct = Svc.Data.GetExcelSheet()?.FirstOrDefault(g => g.Action.Row == action.ActionId); + if (gAct != null) + { + hotbar = new HotbarID(FFXIVClientStructs.FFXIV.Client.UI.Misc.RaptureHotbarModule.HotbarSlotType.GeneralAction, gAct.RowId); + break; + } + } + + hotbar = new HotbarID(FFXIVClientStructs.FFXIV.Client.UI.Misc.RaptureHotbarModule.HotbarSlotType.Action, action.ActionId); + break; + + case ActionSettingType.Item: + hotbar = new HotbarID(FFXIVClientStructs.FFXIV.Client.UI.Misc.RaptureHotbarModule.HotbarSlotType.Item, action.ActionId); + break; } + + if (hotbar == null) return; + _highLight.HotbarIDs.Add(hotbar.Value); } - public static uint SuccessCount { get; private set; } = 0; public static void Init() { @@ -60,8 +76,9 @@ public static void Init() Svc.DutyState.DutyWiped += DutyState_DutyWiped; Svc.DutyState.DutyCompleted += DutyState_DutyWiped; Svc.ClientState.TerritoryChanged += ClientState_TerritoryChanged; - + ClientState_TerritoryChanged(Svc.ClientState.TerritoryType); _highLight = new(); + UpdateHighlight(); } public static void Dispose() @@ -102,9 +119,9 @@ private static void ActionFromSelf(ActionEffectSet set) { SuccessCount++; } - else + else if(Plugin.Settings.ShowWrongClick) { - Svc.Chat.Print("Failed to click the action!"); + Svc.Chat.PrintError($"Clicked the wrong action {set.Name}! You should Click {action.DisplayName}!"); } Count++; } diff --git a/ActionTimelineEx/Localization/Localization.json b/ActionTimelineEx/Localization/Localization.json index 18bde58..e94b966 100644 --- a/ActionTimelineEx/Localization/Localization.json +++ b/ActionTimelineEx/Localization/Localization.json @@ -112,5 +112,21 @@ "ActionTimeline.SettingsName.RotationName": "Rotation Name", "ActionTimeline.SettingsName.RotationCount": "Rotation Count", "ActionTimeline.SettingsName.RotationHighlightColor": "Rotation Highlight Color", - "ActionTimeline.SettingsName.Position": "Rotation Position" + "ActionTimeline.SettingsName.Position": "Rotation Position", + "ActionTimeline.SettingsName.RotationLocked": "Locked", + "ActionTimeline.SettingsName.RotationLockedBackgroundColor": "Locked Background Color", + "ActionTimeline.SettingsName.RotationUnlockedBackgroundColor": "Unlocked Background Color", + "ActionTimeline.SettingsName.GCDIconSize": "GCD Icon Size", + "ActionTimeline.SettingsName.OGCDIconSize": "Off GCD Icon Size", + "ActionTimeline.SettingsName.IconSpacing": "Icon Spacing", + "ActionTimelineEx.Configurations.UiString.RotationSetting": "Rotation Setting", + "ActionTimelineEx.Configurations.UiString.Rotation": "Rotation", + "ActionTimelineEx.Windows.RotationHelperItem": "Rotation Helper", + "ActionTimelineEx.Configurations.ActionSetting": "ActionSetting", + "ActionTimelineEx.Configurations.ActionSettingType.Action": "Action", + "ActionTimelineEx.Configurations.ActionSettingType.Item": "Item", + "ActionTimelineEx.Configurations.ActionSettingName.Type": "Type", + "ActionTimelineEx.Configurations.ActionSettingName.Id": "Id", + "ActionTimelineEx.Configurations.ActionSettingDescription": "Maim (GCD)", + "ActionTimelineEx.Configurations.UiString.RotationReset": "Reset Count" } \ No newline at end of file diff --git a/ActionTimelineEx/Plugin.cs b/ActionTimelineEx/Plugin.cs index 72dbe85..5e0621b 100644 --- a/ActionTimelineEx/Plugin.cs +++ b/ActionTimelineEx/Plugin.cs @@ -76,7 +76,6 @@ public Plugin(IDalamudPluginInterface pluginInterface) Svc.PluginInterface.UiBuilder.OpenMainUi += OpenConfigUi; TimelineManager.Initialize(); - RotationHelper.Init(); try { @@ -87,6 +86,7 @@ public Plugin(IDalamudPluginInterface pluginInterface) Settings = new Settings(); } + RotationHelper.Init(); CreateWindows(); } diff --git a/ActionTimelineEx/Windows/RotationHelperItem.cs b/ActionTimelineEx/Windows/RotationHelperItem.cs index 66075c0..d47d88d 100644 --- a/ActionTimelineEx/Windows/RotationHelperItem.cs +++ b/ActionTimelineEx/Windows/RotationHelperItem.cs @@ -5,6 +5,7 @@ using Dalamud.Interface.Textures.TextureWraps; using Dalamud.Interface.Utility.Raii; using ECommons.DalamudServices; +using ECommons.GameHelpers; using ImGuiNET; using Lumina.Excel.GeneratedSheets; using System.ComponentModel; @@ -38,7 +39,7 @@ public override void Draw(ConfigWindow window) _group ??= new CollapsingHeaderGroup(new() { - { () => UiString.RotationSetting.Local(), () => window.Collection.DrawItems(1) }, + { () => UiString.RotationSetting.Local(), () => DrawSetting(window) }, { () => UiString.Rotation.Local(), () => ConditionDrawer.Draw(setting.RotationSetting.Actions) }, }); @@ -46,6 +47,15 @@ public override void Draw(ConfigWindow window) base.Draw(window); } + private static void DrawSetting(ConfigWindow window) + { + if (ImGui.Button(UiString.RotationReset.Local())) + { + RotationHelper.Clear(); + } + window.Collection.DrawItems(1); + } + private static void DrawTerritoryHeader() { _territories ??= Svc.Data.GetExcelSheet()? @@ -56,14 +66,28 @@ private static void DrawTerritoryHeader() var name = GetName(rightTerritory); var imFont = DrawingExtensions.GetFont(21); - float width = 0; + float width = 0, height = 0; using (var font = ImRaii.PushFont(imFont)) { width = ImGui.CalcTextSize(name).X + (ImGui.GetStyle().ItemSpacing.X * 2); + height = ImGui.CalcTextSize(name).Y + (ImGui.GetStyle().ItemSpacing.Y * 2); + } + + var HasJob = ImageLoader.GetTexture(62100 + Player.Object.ClassJob.Id, out var jobTexture); + + if (HasJob) + { + width += height + ImGui.GetStyle().ItemSpacing.X; } ImGuiHelper.DrawItemMiddle(() => { + if (HasJob) + { + ImGui.Image(jobTexture.ImGuiHandle, Vector2.One * height); + ImGui.SameLine(); + } + var territories = _territories ?? []; var index = Array.IndexOf(territories, rightTerritory); if (ImGuiHelper.SelectableCombo("##Choice the specific dungeon", [.. territories.Select(GetName)], ref index, imFont, ImGuiColors.DalamudYellow)) @@ -77,7 +101,7 @@ private static void DrawTerritoryHeader() static string GetName(TerritoryType? territory) { var str = territory?.ContentFinderCondition?.Value?.Name?.RawString; - if (string.IsNullOrEmpty(str)) str = territory?.Name?.RawString; + if (string.IsNullOrEmpty(str)) str = territory?.PlaceName?.Value?.Name?.RawString; if (string.IsNullOrEmpty(str)) return "Unnamed Territory"; return str; } diff --git a/ActionTimelineEx/Windows/RotationHelperWindow.cs b/ActionTimelineEx/Windows/RotationHelperWindow.cs index b2d71ec..a1103c4 100644 --- a/ActionTimelineEx/Windows/RotationHelperWindow.cs +++ b/ActionTimelineEx/Windows/RotationHelperWindow.cs @@ -46,7 +46,7 @@ private static void DrawContent() var spacing = Plugin.Settings.IconSpacing; var drawList = ImGui.GetWindowDrawList(); - var pos = ImGui.GetWindowPos() + new Vector2(0, ImGui.GetWindowSize().Y / 2 - gcdHeight / 2); + var pos = ImGui.GetWindowPos() + new Vector2(gcdHeight * 0.2f, ImGui.GetWindowSize().Y / 2 - gcdHeight / 2); var maxX = pos.X + ImGui.GetWindowSize().X; bool isFirst = true; diff --git a/ECommons b/ECommons index 429dbd5..daa4836 160000 --- a/ECommons +++ b/ECommons @@ -1 +1 @@ -Subproject commit 429dbd56d94c116021d02a1d663b36d059b660ad +Subproject commit daa48360a6fec2424b6062f5ce41f35f49c7bfa0 diff --git a/XIVConfigUI b/XIVConfigUI index 0fa3270..d189655 160000 --- a/XIVConfigUI +++ b/XIVConfigUI @@ -1 +1 @@ -Subproject commit 0fa327049175f55a81dd22b9d316c976197a8a06 +Subproject commit d189655bea6d646c17b17a446dfbc8567ac51016