Files
HSUI/Interface/HudManager.cs
T

800 lines
34 KiB
C#

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<PluginConfigObject, DraggableHudElement> _hudElements = null!;
private List<IHudElementWithActor> _hudElementsUsingPlayer = null!;
private List<IHudElementWithActor> _hudElementsUsingTarget = null!;
private List<IHudElementWithActor> _hudElementsUsingTargetOfTarget = null!;
private List<IHudElementWithActor> _hudElementsUsingFocusTarget = null!;
private List<IHudElementWithPreview> _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<uint, JobHudTypes> _jobsMap = null!;
private Dictionary<uint, Type> _unsupportedJobsMap = null!;
private List<Type> _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<PluginConfigObject, DraggableHudElement> tmp = new SortedList<PluginConfigObject, DraggableHudElement>(new StrataLevelComparer<PluginConfigObject>());
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<GridConfig>();
_hudOptions = ConfigurationManager.Instance.GetConfigObject<HUDOptionsConfig>();
_hudElements = new SortedList<PluginConfigObject, DraggableHudElement>(new StrataLevelComparer<PluginConfigObject>());
_hudElementsUsingPlayer = new List<IHudElementWithActor>();
_hudElementsUsingTarget = new List<IHudElementWithActor>();
_hudElementsUsingTargetOfTarget = new List<IHudElementWithActor>();
_hudElementsUsingFocusTarget = new List<IHudElementWithActor>();
_hudElementsWithPreview = new List<IHudElementWithPreview>();
_nameplatesHud = new NameplatesHud(ConfigurationManager.Instance.GetConfigObject<NameplatesGeneralConfig>());
CreateUnitFrames();
CreateManaBars();
CreateCastbars();
CreateStatusEffectsLists();
CreateMiscElements();
foreach (var element in _hudElements.Values)
{
element.SelectEvent += OnDraggableElementSelected;
}
}
private void CreateUnitFrames()
{
var playerUnitFrameConfig = ConfigurationManager.Instance.GetConfigObject<PlayerUnitFrameConfig>();
_playerUnitFrameHud = new PlayerUnitFrameHud(playerUnitFrameConfig, "Player");
_hudElements.Add(playerUnitFrameConfig, _playerUnitFrameHud);
_hudElementsUsingPlayer.Add(_playerUnitFrameHud);
_hudElementsWithPreview.Add(_playerUnitFrameHud);
var targetUnitFrameConfig = ConfigurationManager.Instance.GetConfigObject<TargetUnitFrameConfig>();
_targetUnitFrameHud = new UnitFrameHud(targetUnitFrameConfig, "Target");
_hudElements.Add(targetUnitFrameConfig, _targetUnitFrameHud);
_hudElementsUsingTarget.Add(_targetUnitFrameHud);
_hudElementsWithPreview.Add(_targetUnitFrameHud);
var targetOfTargetUnitFrameConfig = ConfigurationManager.Instance.GetConfigObject<TargetOfTargetUnitFrameConfig>();
_totUnitFrameHud = new UnitFrameHud(targetOfTargetUnitFrameConfig, "Target of Target");
_hudElements.Add(targetOfTargetUnitFrameConfig, _totUnitFrameHud);
_hudElementsUsingTargetOfTarget.Add(_totUnitFrameHud);
_hudElementsWithPreview.Add(_totUnitFrameHud);
var focusTargetUnitFrameConfig = ConfigurationManager.Instance.GetConfigObject<FocusTargetUnitFrameConfig>();
_focusTargetUnitFrameHud = new UnitFrameHud(focusTargetUnitFrameConfig, "Focus Target");
_hudElements.Add(focusTargetUnitFrameConfig, _focusTargetUnitFrameHud);
_hudElementsUsingFocusTarget.Add(_focusTargetUnitFrameHud);
_hudElementsWithPreview.Add(_focusTargetUnitFrameHud);
var partyFramesConfig = ConfigurationManager.Instance.GetConfigObject<PartyFramesConfig>();
var partyFramesHud = new PartyFramesHud(partyFramesConfig, "Party Frames");
_hudElements.Add(partyFramesConfig, partyFramesHud);
_hudElementsWithPreview.Add(partyFramesHud);
var allianceFrames1Config = ConfigurationManager.Instance.GetConfigObject<AllianceFrames1Config>();
var allianceFrames1Hud = new AllianceFramesHud(allianceFrames1Config, "Alliance Frames 1");
_hudElements.Add(allianceFrames1Config, allianceFrames1Hud);
_hudElementsWithPreview.Add(allianceFrames1Hud);
var allianceFrames2Config = ConfigurationManager.Instance.GetConfigObject<AllianceFrames2Config>();
var allianceFrames2Hud = new AllianceFramesHud(allianceFrames2Config, "Alliance Frames 2");
_hudElements.Add(allianceFrames2Config, allianceFrames2Hud);
_hudElementsWithPreview.Add(allianceFrames2Hud);
var enemyListConfig = ConfigurationManager.Instance.GetConfigObject<EnemyListConfig>();
var enemyListHud = new EnemyListHud(enemyListConfig, "Enemy List");
_hudElements.Add(enemyListConfig, enemyListHud);
_hudElementsWithPreview.Add(enemyListHud);
}
private void CreateManaBars()
{
var playerManaBarConfig = ConfigurationManager.Instance.GetConfigObject<PlayerPrimaryResourceConfig>();
_playerManaBarHud = new PrimaryResourceHud(playerManaBarConfig, "Player Mana Bar");
_playerManaBarHud.ParentConfig = _playerUnitFrameHud.Config;
_hudElements.Add(playerManaBarConfig, _playerManaBarHud);
_hudElementsUsingPlayer.Add(_playerManaBarHud);
var targetManaBarConfig = ConfigurationManager.Instance.GetConfigObject<TargetPrimaryResourceConfig>();
var targetManaBarHud = new PrimaryResourceHud(targetManaBarConfig, "Target Mana Bar");
targetManaBarHud.ParentConfig = _targetUnitFrameHud.Config;
_hudElements.Add(targetManaBarConfig, targetManaBarHud);
_hudElementsUsingTarget.Add(targetManaBarHud);
var totManaBarConfig = ConfigurationManager.Instance.GetConfigObject<TargetOfTargetPrimaryResourceConfig>();
var totManaBarHud = new PrimaryResourceHud(totManaBarConfig, "ToT Mana Bar");
totManaBarHud.ParentConfig = _totUnitFrameHud.Config;
_hudElements.Add(totManaBarConfig, totManaBarHud);
_hudElementsUsingTargetOfTarget.Add(totManaBarHud);
var focusManaBarConfig = ConfigurationManager.Instance.GetConfigObject<FocusTargetPrimaryResourceConfig>();
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<PlayerCastbarConfig>();
_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<TargetCastbarConfig>();
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<TargetOfTargetCastbarConfig>();
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<FocusTargetCastbarConfig>();
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<PlayerBuffsListConfig>();
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<PlayerDebuffsListConfig>();
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<TargetBuffsListConfig>();
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<TargetDebuffsListConfig>();
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<FocusTargetBuffsListConfig>();
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<FocusTargetDebuffsListConfig>();
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<CustomEffectsListConfig>();
_customEffectsHud = new CustomEffectsListHud(custonEffectsConfig, "Custom Effects");
_hudElements.Add(custonEffectsConfig, _customEffectsHud);
_hudElementsUsingPlayer.Add(_customEffectsHud);
_hudElementsWithPreview.Add(_customEffectsHud);
}
private void CreateMiscElements()
{
var gcdIndicatorConfig = ConfigurationManager.Instance.GetConfigObject<GCDIndicatorConfig>();
var gcdIndicator = new GCDIndicatorHud(gcdIndicatorConfig, "GCD Indicator");
_hudElements.Add(gcdIndicatorConfig, gcdIndicator);
_hudElementsUsingPlayer.Add(gcdIndicator);
var mpTickerConfig = ConfigurationManager.Instance.GetConfigObject<MPTickerConfig>();
var mpTicker = new MPTickerHud(mpTickerConfig, "MP Ticker");
_hudElements.Add(mpTickerConfig, mpTicker);
_hudElementsUsingPlayer.Add(mpTicker);
var expBarConfig = ConfigurationManager.Instance.GetConfigObject<ExperienceBarConfig>();
var expBarHud = new ExperienceBarHud(expBarConfig, "Experience Bar");
_hudElements.Add(expBarConfig, expBarHud);
_hudElementsUsingPlayer.Add(expBarHud);
var pullTimerConfig = ConfigurationManager.Instance.GetConfigObject<PullTimerConfig>();
var pullTimerHud = new PullTimerHud(pullTimerConfig, "Pull Timer");
_hudElements.Add(pullTimerConfig, pullTimerHud);
_hudElementsUsingPlayer.Add(pullTimerHud);
var limitBreakConfig = ConfigurationManager.Instance.GetConfigObject<LimitBreakConfig>();
var limitBreakHud = new LimitBreakHud(limitBreakConfig, "Limit Break");
_hudElements.Add(limitBreakConfig, limitBreakHud);
var hotbarsConfig = ConfigurationManager.Instance.GetConfigObject<HotbarsConfig>();
HotbarBarConfig[] hotbarConfigs = new HotbarBarConfig[]
{
ConfigurationManager.Instance.GetConfigObject<Hotbar1BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar2BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar3BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar4BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar5BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar6BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar7BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar8BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar9BarConfig>(),
ConfigurationManager.Instance.GetConfigObject<Hotbar10BarConfig>()
};
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<PartyCooldownsConfig>();
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<uint, JobHudTypes>()
{
// 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<uint, Type>()
{
// 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<Type>()
{
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);
}
}