using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Interface; using Dalamud.Interface.Utility; using HSUI.Config; using HSUI.Helpers; using HSUI.Interface.EnemyList; using HSUI.Interface.GeneralElements; using HSUI.Interface.Jobs; using HSUI.Interface.Nameplates; using HSUI.Interface.Party; using HSUI.Interface.PartyCooldowns; using HSUI.Interface.StatusEffects; using FFXIVClientStructs.FFXIV.Component.GUI; using Dalamud.Bindings.ImGui; using System; using System.Collections.Generic; using System.Numerics; namespace HSUI.Interface { public class HudManager : IDisposable { private GridConfig? _gridConfig; private HUDOptionsConfig? _hudOptions; private DraggableHudElement? _selectedElement = null; private SortedList _hudElements = null!; private List _hudElementsUsingPlayer = null!; private List _hudElementsUsingTarget = null!; private List _hudElementsUsingTargetOfTarget = null!; private List _hudElementsUsingFocusTarget = null!; private List _hudElementsWithPreview = null!; private UnitFrameHud _playerUnitFrameHud = null!; private UnitFrameHud _targetUnitFrameHud = null!; private UnitFrameHud _totUnitFrameHud = null!; private UnitFrameHud _focusTargetUnitFrameHud = null!; private PlayerCastbarHud _playerCastbarHud = null!; private CustomEffectsListHud _customEffectsHud = null!; private PrimaryResourceHud _playerManaBarHud = null!; private JobHud? _jobHud = null; private Dictionary _jobsMap = null!; private Dictionary _unsupportedJobsMap = null!; private List _jobTypes = null!; private NameplatesHud _nameplatesHud = null!; private double _occupiedInQuestStartTime = -1; private HudHelper _hudHelper = new HudHelper(); public HudManager() { CreateJobsMap(); ConfigurationManager.Instance.ResetEvent += OnConfigReset; ConfigurationManager.Instance.LockEvent += OnHUDLockChanged; ConfigurationManager.Instance.ConfigClosedEvent += OnConfingWindowClosed; ConfigurationManager.Instance.StrataLevelsChangedEvent += OnStrataLevelsChanged; ConfigurationManager.Instance.GlobalVisibilityEvent += OnGlobalVisibilityChanged; CreateHudElements(); } ~HudManager() { Dispose(false); } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { if (!disposing) { return; } _hudHelper.Dispose(); foreach (var element in _hudElements.Values) { try { element.Dispose(); } catch (Exception ex) { Plugin.Logger.Error($"Error disposing HUD element {element.ID}: {ex.Message}"); } } try { _jobHud?.Dispose(); } catch (Exception ex) { Plugin.Logger.Error($"Error disposing JobHud: {ex.Message}"); } _hudElements.Clear(); _hudElementsUsingPlayer.Clear(); _hudElementsUsingTarget.Clear(); _hudElementsUsingTargetOfTarget.Clear(); _hudElementsUsingFocusTarget.Clear(); ConfigurationManager.Instance.ResetEvent -= OnConfigReset; ConfigurationManager.Instance.LockEvent -= OnHUDLockChanged; ConfigurationManager.Instance.ConfigClosedEvent -= OnConfingWindowClosed; ConfigurationManager.Instance.StrataLevelsChangedEvent -= OnStrataLevelsChanged; ConfigurationManager.Instance.GlobalVisibilityEvent -= OnGlobalVisibilityChanged; } private void OnConfigReset(ConfigurationManager sender) { CreateHudElements(); _jobHud = null; } private void OnHUDLockChanged(ConfigurationManager sender) { var draggingEnabled = !sender.LockHUD; foreach (var element in _hudElements.Values) { element.DraggingEnabled = draggingEnabled; element.Selected = false; } if (_jobHud != null) { _jobHud.DraggingEnabled = draggingEnabled; } _selectedElement = null; } private void OnConfingWindowClosed(ConfigurationManager sender) { if (_hudOptions == null || !_hudOptions.AutomaticPreviewDisabling) { return; } foreach (IHudElementWithPreview element in _hudElementsWithPreview) { element.StopPreview(); } _nameplatesHud.StopPreview(); } private void OnStrataLevelsChanged(ConfigurationManager sender, PluginConfigObject config) { SortedList tmp = new SortedList(new StrataLevelComparer()); foreach (DraggableHudElement element in _hudElements.Values) { tmp.Add(element.GetConfig(), element); } _hudElements = tmp; } private void OnGlobalVisibilityChanged(ConfigurationManager sender, VisibilityConfig config) { foreach (DraggableHudElement element in _hudElements.Values) { if (element is IHudElementWithVisibilityConfig e) { e.VisibilityConfig?.CopyFrom(config); } } foreach (Type jobType in _jobTypes) { JobConfig jobConfig = (JobConfig)ConfigurationManager.Instance.GetConfigObjectForType(jobType); jobConfig.VisibilityConfig.CopyFrom(config); } } private void OnDraggableElementSelected(DraggableHudElement sender) { foreach (var element in _hudElements.Values) { element.Selected = element == sender; } if (_jobHud != null) { _jobHud.Selected = _jobHud == sender; } _selectedElement = sender; } private void CreateHudElements() { _gridConfig = ConfigurationManager.Instance.GetConfigObject(); _hudOptions = ConfigurationManager.Instance.GetConfigObject(); _hudElements = new SortedList(new StrataLevelComparer()); _hudElementsUsingPlayer = new List(); _hudElementsUsingTarget = new List(); _hudElementsUsingTargetOfTarget = new List(); _hudElementsUsingFocusTarget = new List(); _hudElementsWithPreview = new List(); _nameplatesHud = new NameplatesHud(ConfigurationManager.Instance.GetConfigObject()); CreateUnitFrames(); CreateManaBars(); CreateCastbars(); CreateStatusEffectsLists(); CreateMiscElements(); foreach (var element in _hudElements.Values) { element.SelectEvent += OnDraggableElementSelected; } } private void CreateUnitFrames() { var playerUnitFrameConfig = ConfigurationManager.Instance.GetConfigObject(); _playerUnitFrameHud = new PlayerUnitFrameHud(playerUnitFrameConfig, "Player"); _hudElements.Add(playerUnitFrameConfig, _playerUnitFrameHud); _hudElementsUsingPlayer.Add(_playerUnitFrameHud); _hudElementsWithPreview.Add(_playerUnitFrameHud); var targetUnitFrameConfig = ConfigurationManager.Instance.GetConfigObject(); _targetUnitFrameHud = new UnitFrameHud(targetUnitFrameConfig, "Target"); _hudElements.Add(targetUnitFrameConfig, _targetUnitFrameHud); _hudElementsUsingTarget.Add(_targetUnitFrameHud); _hudElementsWithPreview.Add(_targetUnitFrameHud); var targetOfTargetUnitFrameConfig = ConfigurationManager.Instance.GetConfigObject(); _totUnitFrameHud = new UnitFrameHud(targetOfTargetUnitFrameConfig, "Target of Target"); _hudElements.Add(targetOfTargetUnitFrameConfig, _totUnitFrameHud); _hudElementsUsingTargetOfTarget.Add(_totUnitFrameHud); _hudElementsWithPreview.Add(_totUnitFrameHud); var focusTargetUnitFrameConfig = ConfigurationManager.Instance.GetConfigObject(); _focusTargetUnitFrameHud = new UnitFrameHud(focusTargetUnitFrameConfig, "Focus Target"); _hudElements.Add(focusTargetUnitFrameConfig, _focusTargetUnitFrameHud); _hudElementsUsingFocusTarget.Add(_focusTargetUnitFrameHud); _hudElementsWithPreview.Add(_focusTargetUnitFrameHud); var partyFramesConfig = ConfigurationManager.Instance.GetConfigObject(); var partyFramesHud = new PartyFramesHud(partyFramesConfig, "Party Frames"); _hudElements.Add(partyFramesConfig, partyFramesHud); _hudElementsWithPreview.Add(partyFramesHud); var allianceFrames1Config = ConfigurationManager.Instance.GetConfigObject(); var allianceFrames1Hud = new AllianceFramesHud(allianceFrames1Config, "Alliance Frames 1"); _hudElements.Add(allianceFrames1Config, allianceFrames1Hud); _hudElementsWithPreview.Add(allianceFrames1Hud); var allianceFrames2Config = ConfigurationManager.Instance.GetConfigObject(); var allianceFrames2Hud = new AllianceFramesHud(allianceFrames2Config, "Alliance Frames 2"); _hudElements.Add(allianceFrames2Config, allianceFrames2Hud); _hudElementsWithPreview.Add(allianceFrames2Hud); var enemyListConfig = ConfigurationManager.Instance.GetConfigObject(); var enemyListHud = new EnemyListHud(enemyListConfig, "Enemy List"); _hudElements.Add(enemyListConfig, enemyListHud); _hudElementsWithPreview.Add(enemyListHud); } private void CreateManaBars() { var playerManaBarConfig = ConfigurationManager.Instance.GetConfigObject(); _playerManaBarHud = new PrimaryResourceHud(playerManaBarConfig, "Player Mana Bar"); _playerManaBarHud.ParentConfig = _playerUnitFrameHud.Config; _hudElements.Add(playerManaBarConfig, _playerManaBarHud); _hudElementsUsingPlayer.Add(_playerManaBarHud); var targetManaBarConfig = ConfigurationManager.Instance.GetConfigObject(); var targetManaBarHud = new PrimaryResourceHud(targetManaBarConfig, "Target Mana Bar"); targetManaBarHud.ParentConfig = _targetUnitFrameHud.Config; _hudElements.Add(targetManaBarConfig, targetManaBarHud); _hudElementsUsingTarget.Add(targetManaBarHud); var totManaBarConfig = ConfigurationManager.Instance.GetConfigObject(); var totManaBarHud = new PrimaryResourceHud(totManaBarConfig, "ToT Mana Bar"); totManaBarHud.ParentConfig = _totUnitFrameHud.Config; _hudElements.Add(totManaBarConfig, totManaBarHud); _hudElementsUsingTargetOfTarget.Add(totManaBarHud); var focusManaBarConfig = ConfigurationManager.Instance.GetConfigObject(); var focusManaBarHud = new PrimaryResourceHud(focusManaBarConfig, "Focus Mana Bar"); focusManaBarHud.ParentConfig = _focusTargetUnitFrameHud.Config; _hudElements.Add(focusManaBarConfig, focusManaBarHud); _hudElementsUsingFocusTarget.Add(focusManaBarHud); } private void CreateCastbars() { var playerCastbarConfig = ConfigurationManager.Instance.GetConfigObject(); _playerCastbarHud = new PlayerCastbarHud(playerCastbarConfig, "Player Castbar"); _playerCastbarHud.ParentConfig = _playerUnitFrameHud.Config; _hudElements.Add(playerCastbarConfig, _playerCastbarHud); _hudElementsUsingPlayer.Add(_playerCastbarHud); _hudElementsWithPreview.Add(_playerCastbarHud); var targetCastbarConfig = ConfigurationManager.Instance.GetConfigObject(); var targetCastbar = new TargetCastbarHud(targetCastbarConfig, "Target Castbar"); targetCastbar.ParentConfig = _targetUnitFrameHud.Config; _hudElements.Add(targetCastbarConfig, targetCastbar); _hudElementsUsingTarget.Add(targetCastbar); _hudElementsWithPreview.Add(targetCastbar); var targetOfTargetCastbarConfig = ConfigurationManager.Instance.GetConfigObject(); var targetOfTargetCastbar = new TargetOfTargetCastbarHud(targetOfTargetCastbarConfig, "ToT Castbar"); targetOfTargetCastbar.ParentConfig = _totUnitFrameHud.Config; _hudElements.Add(targetOfTargetCastbarConfig, targetOfTargetCastbar); _hudElementsUsingTargetOfTarget.Add(targetOfTargetCastbar); _hudElementsWithPreview.Add(targetOfTargetCastbar); var focusTargetCastbarConfig = ConfigurationManager.Instance.GetConfigObject(); var focusTargetCastbar = new FocusTargetCastbarHud(focusTargetCastbarConfig, "Focus Castbar"); focusTargetCastbar.ParentConfig = _focusTargetUnitFrameHud.Config; _hudElements.Add(focusTargetCastbarConfig, focusTargetCastbar); _hudElementsUsingFocusTarget.Add(focusTargetCastbar); _hudElementsWithPreview.Add(focusTargetCastbar); } private void CreateStatusEffectsLists() { var playerBuffsConfig = ConfigurationManager.Instance.GetConfigObject(); var playerBuffs = new StatusEffectsListHud(playerBuffsConfig, "Buffs"); playerBuffs.ParentConfig = _playerUnitFrameHud.Config; _hudElements.Add(playerBuffsConfig, playerBuffs); _hudElementsUsingPlayer.Add(playerBuffs); _hudElementsWithPreview.Add(playerBuffs); var playerDebuffsConfig = ConfigurationManager.Instance.GetConfigObject(); var playerDebuffs = new StatusEffectsListHud(playerDebuffsConfig, "Debuffs"); playerDebuffs.ParentConfig = _playerUnitFrameHud.Config; _hudElements.Add(playerDebuffsConfig, playerDebuffs); _hudElementsUsingPlayer.Add(playerDebuffs); _hudElementsWithPreview.Add(playerDebuffs); var targetBuffsConfig = ConfigurationManager.Instance.GetConfigObject(); var targetBuffs = new StatusEffectsListHud(targetBuffsConfig, "Target Buffs"); targetBuffs.ParentConfig = _targetUnitFrameHud.Config; _hudElements.Add(targetBuffsConfig, targetBuffs); _hudElementsUsingTarget.Add(targetBuffs); _hudElementsWithPreview.Add(targetBuffs); var targetDebuffsConfig = ConfigurationManager.Instance.GetConfigObject(); var targetDebuffs = new StatusEffectsListHud(targetDebuffsConfig, "Target Debuffs"); targetDebuffs.ParentConfig = _targetUnitFrameHud.Config; _hudElements.Add(targetDebuffsConfig, targetDebuffs); _hudElementsUsingTarget.Add(targetDebuffs); _hudElementsWithPreview.Add(targetDebuffs); var focusTargetBuffsConfig = ConfigurationManager.Instance.GetConfigObject(); var focusTargetBuffs = new StatusEffectsListHud(focusTargetBuffsConfig, "focusTarget Buffs"); focusTargetBuffs.ParentConfig = _focusTargetUnitFrameHud.Config; _hudElements.Add(focusTargetBuffsConfig, focusTargetBuffs); _hudElementsUsingFocusTarget.Add(focusTargetBuffs); _hudElementsWithPreview.Add(focusTargetBuffs); var focusTargetDebuffsConfig = ConfigurationManager.Instance.GetConfigObject(); var focusTargetDebuffs = new StatusEffectsListHud(focusTargetDebuffsConfig, "focusTarget Debuffs"); focusTargetDebuffs.ParentConfig = _focusTargetUnitFrameHud.Config; _hudElements.Add(focusTargetDebuffsConfig, focusTargetDebuffs); _hudElementsUsingFocusTarget.Add(focusTargetDebuffs); _hudElementsWithPreview.Add(focusTargetDebuffs); var custonEffectsConfig = ConfigurationManager.Instance.GetConfigObject(); _customEffectsHud = new CustomEffectsListHud(custonEffectsConfig, "Custom Effects"); _hudElements.Add(custonEffectsConfig, _customEffectsHud); _hudElementsUsingPlayer.Add(_customEffectsHud); _hudElementsWithPreview.Add(_customEffectsHud); } private void CreateMiscElements() { var gcdIndicatorConfig = ConfigurationManager.Instance.GetConfigObject(); var gcdIndicator = new GCDIndicatorHud(gcdIndicatorConfig, "GCD Indicator"); _hudElements.Add(gcdIndicatorConfig, gcdIndicator); _hudElementsUsingPlayer.Add(gcdIndicator); var mouseGcdIndicatorConfig = ConfigurationManager.Instance.GetConfigObject(); var mouseGcdIndicator = new MouseGCDIndicatorHud(mouseGcdIndicatorConfig, "Mouse GCD Indicator"); _hudElements.Add(mouseGcdIndicatorConfig, mouseGcdIndicator); _hudElementsUsingPlayer.Add(mouseGcdIndicator); var mpTickerConfig = ConfigurationManager.Instance.GetConfigObject(); var mpTicker = new MPTickerHud(mpTickerConfig, "MP Ticker"); _hudElements.Add(mpTickerConfig, mpTicker); _hudElementsUsingPlayer.Add(mpTicker); var expBarConfig = ConfigurationManager.Instance.GetConfigObject(); var expBarHud = new ExperienceBarHud(expBarConfig, "Experience Bar"); _hudElements.Add(expBarConfig, expBarHud); _hudElementsUsingPlayer.Add(expBarHud); var pullTimerConfig = ConfigurationManager.Instance.GetConfigObject(); var pullTimerHud = new PullTimerHud(pullTimerConfig, "Pull Timer"); _hudElements.Add(pullTimerConfig, pullTimerHud); _hudElementsUsingPlayer.Add(pullTimerHud); var limitBreakConfig = ConfigurationManager.Instance.GetConfigObject(); var limitBreakHud = new LimitBreakHud(limitBreakConfig, "Limit Break"); _hudElements.Add(limitBreakConfig, limitBreakHud); var hotbarsConfig = ConfigurationManager.Instance.GetConfigObject(); HotbarBarConfig[] hotbarConfigs = new HotbarBarConfig[] { ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject(), ConfigurationManager.Instance.GetConfigObject() }; for (int i = 0; i < hotbarConfigs.Length; i++) { var barConfig = hotbarConfigs[i]; var barHud = new ActionBarsHud(barConfig, $"Hotbar {i + 1}"); _hudElements.Add(barConfig, barHud); _hudElementsUsingPlayer.Add(barHud); } var partyCooldownsConfig = ConfigurationManager.Instance.GetConfigObject(); var partyCooldownsHud = new PartyCooldownsHud(partyCooldownsConfig, "Party Cooldowns"); _hudElements.Add(partyCooldownsConfig, partyCooldownsHud); _hudElementsWithPreview.Add(partyCooldownsHud); } public void Draw(uint jobId) { if (!FontsManager.Instance.DefaultFontBuilt) { Plugin.UiBuilder.FontAtlas.BuildFontsAsync(); } try { PullTimerHelper.Instance.Update(); } catch { } TooltipsHelper.Instance.RemoveTooltip(); // remove tooltip from previous frame _hudHelper.Update(); if (!ShouldBeVisible()) { return; } WhosTalkingHelper.Instance?.Update(); ClipRectsHelper.Instance.Update(); ImGui.PushStyleVar(ImGuiStyleVar.WindowRounding, 0); ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, new Vector2(0, 0)); ImGui.PushStyleVar(ImGuiStyleVar.WindowBorderSize, 0); ImGuiHelpers.ForceNextWindowMainViewport(); ImGui.SetNextWindowPos(Vector2.Zero); ImGui.SetNextWindowSize(ImGui.GetMainViewport().Size); var begin = ImGui.Begin( "HSUI_HUD", ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoBackground | ImGuiWindowFlags.NoInputs | ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoSavedSettings ); ImGui.PopStyleVar(3); if (!begin) { ImGui.End(); return; } UpdateJob(jobId); AssignActors(); var origin = ImGui.GetMainViewport().Size / 2f; if (_hudOptions != null && _hudOptions.UseGlobalHudShift) { origin += _hudOptions.HudOffset; } // show only castbar during quest events if (ShouldOnlyShowCastbar()) { _playerCastbarHud?.PrepareForDraw(origin); _playerCastbarHud?.Draw(origin); ImGui.End(); return; } // grid if (_gridConfig is not null && _gridConfig.Enabled) { DraggablesHelper.DrawGrid(_gridConfig, _hudOptions, _selectedElement); } // nameplates if (_nameplatesHud.GetConfig().Enabled) { ClipRectsHelper.Instance?.AddNameplatesClipRects(); _nameplatesHud.PrepareForDraw(origin); _nameplatesHud.Draw(origin); ClipRectsHelper.Instance?.RemoveNameplatesClipRects(); } // draw elements lock (_hudElements) { DraggablesHelper.DrawElements(origin, _hudHelper, _hudElements.Values, _jobHud, _selectedElement); } // world object tooltip (mouseover in 3D world) TooltipsHelper.Instance.ShowWorldObjectTooltip(); // tooltip TooltipsHelper.Instance.Draw(); ImGui.End(); } protected unsafe bool ShouldBeVisible() { if (!ConfigurationManager.Instance.ShowHUD || Plugin.ObjectTable.LocalPlayer == null) { return false; } bool hudHidden = Plugin.Condition[ConditionFlag.WatchingCutscene] || Plugin.Condition[ConditionFlag.WatchingCutscene78] || Plugin.Condition[ConditionFlag.OccupiedInCutSceneEvent] || Plugin.Condition[ConditionFlag.CreatingCharacter] || Plugin.Condition[ConditionFlag.BetweenAreas] || Plugin.Condition[ConditionFlag.BetweenAreas51] || Plugin.Condition[ConditionFlag.OccupiedSummoningBell]; if (hudHidden) { return false; } AtkUnitBase* parameterWidget = (AtkUnitBase*)Plugin.GameGui.GetAddonByName("_ParameterWidget", 1).Address; AtkUnitBase* fadeMiddleWidget = (AtkUnitBase*)Plugin.GameGui.GetAddonByName("FadeMiddle", 1).Address; bool paramenterVisible = parameterWidget != null && parameterWidget->IsVisible; bool fadeMiddleVisible = fadeMiddleWidget != null && fadeMiddleWidget->IsVisible; return paramenterVisible && !fadeMiddleVisible; } protected bool ShouldOnlyShowCastbar() { // when in quest dialogs and events, hide everything except castbars // this includes talking to npcs or interacting with quest related stuff if (Plugin.Condition[ConditionFlag.OccupiedInQuestEvent] || Plugin.Condition[ConditionFlag.OccupiedInEvent]) { // we have to wait a bit to avoid weird flickering when clicking shiny stuff // we hide HSUI after half a second passed in this state // interestingly enough, default hotbars seem to do something similar var time = ImGui.GetTime(); if (_occupiedInQuestStartTime > 0) { if (time - _occupiedInQuestStartTime > 0.5) { return true; } } else { _occupiedInQuestStartTime = time; } } else { _occupiedInQuestStartTime = -1; } return false; } private void UpdateJob(uint newJobId) { if (_jobHud != null && _jobHud.Config.JobId == newJobId) { return; } JobConfig? config = null; // unsupported jobs if (_unsupportedJobsMap.ContainsKey(newJobId) && _unsupportedJobsMap.TryGetValue(newJobId, out var type)) { config = (JobConfig)Activator.CreateInstance(type)!; _jobHud = new JobHud(config); } // supported jobs if (_jobsMap.TryGetValue(newJobId, out var types)) { config = (JobConfig)ConfigurationManager.Instance.GetConfigObjectForType(types.ConfigType); _jobHud = (JobHud)Activator.CreateInstance(types.HudType, config, types.DisplayName)!; _jobHud.SelectEvent += OnDraggableElementSelected; } } private void AssignActors() { // player IPlayerCharacter? player = Plugin.ObjectTable.LocalPlayer; foreach (var element in _hudElementsUsingPlayer) { element.Actor = player; if (_jobHud != null) { _jobHud.Actor = player; } } // target IGameObject? target = Plugin.TargetManager.SoftTarget ?? Plugin.TargetManager.Target; foreach (var element in _hudElementsUsingTarget) { element.Actor = target; if (_customEffectsHud != null) { _customEffectsHud.TargetActor = target; } } // target of target IGameObject? targetOfTarget = Utils.FindTargetOfTarget(target, player, Plugin.ObjectTable); foreach (var element in _hudElementsUsingTargetOfTarget) { element.Actor = targetOfTarget; } // focus IGameObject? focusTarget = Plugin.TargetManager.FocusTarget; foreach (var element in _hudElementsUsingFocusTarget) { element.Actor = focusTarget; } // player mana bar if (_jobHud != null && _playerManaBarHud != null && !_jobHud.Config.UseDefaultPrimaryResourceBar) { _playerManaBarHud.ResourceType = PrimaryResourceTypes.None; } } protected void CreateJobsMap() { _jobsMap = new Dictionary() { // tanks [JobIDs.PLD] = new JobHudTypes(typeof(PaladinHud), typeof(PaladinConfig), "Paladin HUD"), [JobIDs.WAR] = new JobHudTypes(typeof(WarriorHud), typeof(WarriorConfig), "Warrior HUD"), [JobIDs.DRK] = new JobHudTypes(typeof(DarkKnightHud), typeof(DarkKnightConfig), "Dark Knight HUD"), [JobIDs.GNB] = new JobHudTypes(typeof(GunbreakerHud), typeof(GunbreakerConfig), "Gunbreaker HUD"), // healers [JobIDs.WHM] = new JobHudTypes(typeof(WhiteMageHud), typeof(WhiteMageConfig), "White Mage HUD"), [JobIDs.SCH] = new JobHudTypes(typeof(ScholarHud), typeof(ScholarConfig), "Scholar HUD"), [JobIDs.AST] = new JobHudTypes(typeof(AstrologianHud), typeof(AstrologianConfig), "Astrologian HUD"), [JobIDs.SGE] = new JobHudTypes(typeof(SageHud), typeof(SageConfig), "Sage HUD"), // melee [JobIDs.MNK] = new JobHudTypes(typeof(MonkHud), typeof(MonkConfig), "Monk HUD"), [JobIDs.DRG] = new JobHudTypes(typeof(DragoonHud), typeof(DragoonConfig), "Dragoon HUD"), [JobIDs.NIN] = new JobHudTypes(typeof(NinjaHud), typeof(NinjaConfig), "Ninja HUD"), [JobIDs.SAM] = new JobHudTypes(typeof(SamuraiHud), typeof(SamuraiConfig), "Samurai HUD"), [JobIDs.RPR] = new JobHudTypes(typeof(ReaperHud), typeof(ReaperConfig), "Reaper HUD"), [JobIDs.VPR] = new JobHudTypes(typeof(ViperHud), typeof(ViperConfig), "Viper HUD"), // ranged [JobIDs.BRD] = new JobHudTypes(typeof(BardHud), typeof(BardConfig), "Bard HUD"), [JobIDs.MCH] = new JobHudTypes(typeof(MachinistHud), typeof(MachinistConfig), "Mechanic HUD"), [JobIDs.DNC] = new JobHudTypes(typeof(DancerHud), typeof(DancerConfig), "Dancer HUD"), // casters [JobIDs.BLM] = new JobHudTypes(typeof(BlackMageHud), typeof(BlackMageConfig), "Black Mage HUD"), [JobIDs.SMN] = new JobHudTypes(typeof(SummonerHud), typeof(SummonerConfig), "Summoner HUD"), [JobIDs.RDM] = new JobHudTypes(typeof(RedMageHud), typeof(RedMageConfig), "Red Mage HUD"), [JobIDs.BLU] = new JobHudTypes(typeof(BlueMageHud), typeof(BlueMageConfig), "Blue Mage HUD"), [JobIDs.PCT] = new JobHudTypes(typeof(PictomancerHud), typeof(PictomancerConfig), "Pictomancer HUD") }; _unsupportedJobsMap = new Dictionary() { // base jobs [JobIDs.GLA] = typeof(GladiatorConfig), [JobIDs.MRD] = typeof(MarauderConfig), [JobIDs.PGL] = typeof(PugilistConfig), [JobIDs.LNC] = typeof(LancerConfig), [JobIDs.ROG] = typeof(RogueConfig), [JobIDs.ARC] = typeof(ArcherConfig), [JobIDs.THM] = typeof(ThaumaturgeConfig), [JobIDs.ACN] = typeof(ArcanistConfig), [JobIDs.CNJ] = typeof(ConjurerConfig), // crafters [JobIDs.CRP] = typeof(CarpenterConfig), [JobIDs.BSM] = typeof(BlacksmithConfig), [JobIDs.ARM] = typeof(ArmorerConfig), [JobIDs.GSM] = typeof(GoldsmithConfig), [JobIDs.LTW] = typeof(LeatherworkerConfig), [JobIDs.WVR] = typeof(WeaverConfig), [JobIDs.ALC] = typeof(AlchemistConfig), [JobIDs.CUL] = typeof(CulinarianConfig), // gatherers [JobIDs.MIN] = typeof(MinerConfig), [JobIDs.BOT] = typeof(BotanistConfig), [JobIDs.FSH] = typeof(FisherConfig) }; _jobTypes = new List() { typeof(PaladinConfig), typeof(WarriorConfig), typeof(DarkKnightConfig), typeof(GunbreakerConfig), typeof(WhiteMageConfig), typeof(ScholarConfig), typeof(AstrologianConfig), typeof(SageConfig), typeof(MonkConfig), typeof(DragoonConfig), typeof(NinjaConfig), typeof(SamuraiConfig), typeof(ReaperConfig), typeof(ViperConfig), typeof(BardConfig), typeof(MachinistConfig), typeof(DancerConfig), typeof(BlackMageConfig), typeof(SummonerConfig), typeof(RedMageConfig), typeof(BlueMageConfig), typeof(PictomancerConfig) }; } } internal struct JobHudTypes { public Type HudType; public Type ConfigType; public string DisplayName; public JobHudTypes(Type hudType, Type configType, string displayName) { HudType = hudType; ConfigType = configType; DisplayName = displayName; } } public static class ForcedJob { internal static bool Enabled; internal static uint ForcedJobId; } internal static class HUDConstants { internal static int BaseHUDOffsetY = (int)(ImGui.GetMainViewport().Size.Y * 0.3f); internal static int UnitFramesOffsetX = 160; internal static int PlayerCastbarY = BaseHUDOffsetY - 13; internal static int JobHudsBaseY = PlayerCastbarY - 14; internal static Vector2 DefaultBigUnitFrameSize = new Vector2(270, 50); internal static Vector2 DefaultSmallUnitFrameSize = new Vector2(120, 20); internal static Vector2 DefaultStatusEffectsListSize = new Vector2(292, 82); internal static Vector2 DefaultPlayerNameplateBarSize = new Vector2(120, 10); internal static Vector2 DefaultEnemyNameplateBarSize = new Vector2(220, 26); } }