diff --git a/DynamicBridge/Configuration/ApplyRule.cs b/DynamicBridge/Configuration/ApplyRule.cs index 0b69ddd..6400f47 100644 --- a/DynamicBridge/Configuration/ApplyRule.cs +++ b/DynamicBridge/Configuration/ApplyRule.cs @@ -25,6 +25,7 @@ public class ApplyRule public List Gearsets = []; public List Players = []; public List OnlineStatuses = []; + public List Mounts = []; public List Precise_Times = [ new TimelineSegment((float)0/24,(float)5/24,0), new TimelineSegment((float)5/24,(float)7/24,0), @@ -54,5 +55,6 @@ public class NotConditions public List Gearsets = []; public List Players = []; public List OnlineStatuses = []; + public List Mounts = []; } } diff --git a/DynamicBridge/Configuration/Config.cs b/DynamicBridge/Configuration/Config.cs index befdd96..5d4e49e 100644 --- a/DynamicBridge/Configuration/Config.cs +++ b/DynamicBridge/Configuration/Config.cs @@ -54,6 +54,7 @@ public class Config : IEzConfig public bool Cond_Gearset = false; public bool Cond_Players = false; public bool Cond_OnlineStatus = false; + public bool Cond_Mount = false; public bool Cond_Delay = false; public bool Cond_Time_Precise = false; diff --git a/DynamicBridge/DynamicBridge.cs b/DynamicBridge/DynamicBridge.cs index cec348d..b200112 100644 --- a/DynamicBridge/DynamicBridge.cs +++ b/DynamicBridge/DynamicBridge.cs @@ -380,7 +380,10 @@ private void OnUpdate() && (!C.AllowNegativeConditions || !x.Not.Players.Any(rp => GuiPlayers.SimpleNearbyPlayers().Any(sp => rp == sp.Name && C.selectedPlayers.Any(sel => sel.Name == sp.Name && (sel.Distance >= sp.Distance || sel.Distance >= 150f)))))) && (!C.Cond_OnlineStatus || ((x.OnlineStatuses.Count == 0 || x.OnlineStatuses.Contains(Player.OnlineStatus)) - && (!C.AllowNegativeConditions || !x.Not.OnlineStatuses.Contains(Player.OnlineStatus)))); + && (!C.AllowNegativeConditions || !x.Not.OnlineStatuses.Contains(Player.OnlineStatus)))) + && + (!C.Cond_Mount || ((x.Mounts.Count == 0 || x.Mounts.Contains(Utils.GetCurrentMountId())) + && (!C.AllowNegativeConditions || !x.Not.Mounts.Contains(Utils.GetCurrentMountId())))); if(conditionsMet) { diff --git a/DynamicBridge/Gui/GuiRules.cs b/DynamicBridge/Gui/GuiRules.cs index afb3bbb..a52fc2c 100644 --- a/DynamicBridge/Gui/GuiRules.cs +++ b/DynamicBridge/Gui/GuiRules.cs @@ -7,15 +7,19 @@ using ECommons.Throttlers; using Lumina.Excel.Sheets; using Newtonsoft.Json; +using System.Globalization; using System.IO; using Action = System.Action; using Emote = Lumina.Excel.Sheets.Emote; +using Mount = Lumina.Excel.Sheets.Mount; using Weather = Lumina.Excel.Sheets.Weather; + namespace DynamicBridge.Gui; public static unsafe class GuiRules { + private static Vector2 iconSize => new(24f); private static string[] Filters = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]; @@ -45,7 +49,6 @@ void ButtonsLeft() } } ImGuiEx.Tooltip("Add new rule"); - ImGui.SameLine(); if(ImGuiEx.IconButton(FontAwesomeIcon.Paste)) { @@ -264,6 +267,7 @@ static void DrawRuleFolder(Profile currentProfile, List rulesList, ou C.Cond_ZoneGroup, C.Cond_Players, C.Cond_OnlineStatus, + C.Cond_Mount, ]; ImGui.PushStyleVar(ImGuiStyleVar.CellPadding, Utils.CellPadding); @@ -284,6 +288,7 @@ static void DrawRuleFolder(Profile currentProfile, List rulesList, ou if(C.Cond_Gearset) ImGui.TableSetupColumn("Gearset"); if(C.Cond_Players) ImGui.TableSetupColumn("Players"); if(C.Cond_OnlineStatus) ImGui.TableSetupColumn("Online Status"); + if(C.Cond_Mount) ImGui.TableSetupColumn("Mount"); if(C.Cond_Delay) ImGui.TableSetupColumn("Delays"); ImGui.TableSetupColumn("Preset"); ImGui.TableSetupColumn(" ", ImGuiTableColumnFlags.NoResize | ImGuiTableColumnFlags.WidthFixed); @@ -787,7 +792,46 @@ void FiltersSelection() if(fullList != null) ImGuiEx.Tooltip(UI.AnyNotice + fullList); } filterCnt++; - + + if(C.Cond_Mount) + { + ImGui.TableNextColumn(); + //Mount + ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X); + if(ImGui.BeginCombo("##mount", rule.Mounts.Select(x => Svc.Data.GetExcelSheet().GetRowOrDefault(x)?.Singular.ExtractText().ToTitleCase() ?? $"{x}").PrintRange(rule.Not.Mounts.Select(x => Svc.Data.GetExcelSheet().GetRowOrDefault(x)?.Singular.ExtractText().ToTitleCase() ?? $"{x}"), out var fullList), C.ComboSize)) + { + FiltersSelection(); + + if(Player.Available && Utils.GetCurrentMountId() != 0) + { + var currentMount = Utils.GetCurrentMountId(); + var currentMountName = Svc.Data.GetExcelSheet().GetRowOrDefault(currentMount)?.Singular.ExtractText().ToTitleCase() ?? $"{currentMount}"; + if(ImGui.Selectable($"Current: {currentMountName}")) + { + if(!rule.Mounts.Contains(currentMount)) + rule.Mounts.Add(currentMount); + } + ImGui.Separator(); + } + + foreach(var mount in Svc.Data.GetExcelSheet().Where(m => !m.Singular.ExtractText().IsNullOrEmpty())) + { + var name = mount.Singular.ExtractText().ToTitleCase() ?? ""; + if(Filters[filterCnt].Length > 0 && !name.Contains(Filters[filterCnt], StringComparison.OrdinalIgnoreCase)) continue; + if(OnlySelected[filterCnt] && !rule.Mounts.Contains(mount.RowId)) continue; + if(ThreadLoadImageHandler.TryGetIconTextureWrap(mount.Icon, false, out var texture)) + { + ImGui.Image(texture.Handle, iconSize); + ImGui.SameLine(); + } + DrawSelector($"{name}##{mount.RowId}", mount.RowId, rule.Mounts, rule.Not.Mounts); + } + ImGui.EndCombo(); + } + if(fullList != null) ImGuiEx.Tooltip(UI.AnyNotice + fullList); + } + filterCnt++; + if(C.Cond_Delay) { ImGui.TableNextColumn(); diff --git a/DynamicBridge/Gui/GuiSettings.cs b/DynamicBridge/Gui/GuiSettings.cs index 707a517..eee3c4b 100644 --- a/DynamicBridge/Gui/GuiSettings.cs +++ b/DynamicBridge/Gui/GuiSettings.cs @@ -124,6 +124,7 @@ public static void Draw() () => ImGui.Checkbox($"Gearset", ref C.Cond_Gearset), () => ImGui.Checkbox($"Nearby Players", ref C.Cond_Players), () => ImGui.Checkbox($"Online Status", ref C.Cond_OnlineStatus), + () => ImGui.Checkbox($"Mount", ref C.Cond_Mount), () => ImGui.Checkbox($"Delays", ref C.Cond_Delay), ], (int)(ImGui.GetContentRegionAvail().X / 180f), ImGuiTableFlags.BordersInner); diff --git a/DynamicBridge/Utils.cs b/DynamicBridge/Utils.cs index 68a078d..b61c46a 100644 --- a/DynamicBridge/Utils.cs +++ b/DynamicBridge/Utils.cs @@ -30,6 +30,18 @@ public static uint GetAdjustedEmote() return em; } + public static uint GetCurrentMountId() + { + if (!Player.Available) return 0; + return Player.Character->Mount.MountId; + } + + public static string ToTitleCase(this string text) + { + if(string.IsNullOrEmpty(text)) return text; + return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text.ToLower()); + } + public static string[] SplitDirectories(this string path) { var ret = path.Split('/', StringSplitOptions.RemoveEmptyEntries);