Initial release: HSUI v1.0.0.0 - HUD replacement with configurable hotbars
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,786 @@
|
||||
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 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);
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user