Files
HSUI/Helpers/MpTickHelper.cs
KnackAtNite ccee580789 PvP hotbar fix: load saved PvE on zone leave then use live bars; Show Action ID in tooltips
- On leaving PvP, LoadSavedHotbar for all 10 bars (via TryRestorePvEHotbarsAfterLeavePvP in Framework update) and re-apply for ~2s so live Hotbars show PvE
- GetSlotData always reads from live StandardHotbars so combo updates (e.g. Pictomancer) and icons work normally
- Misc: Show Action ID option in Misc -> Tooltips; hotbar/party cooldown tooltips pass TooltipIdKind for Action vs Status IDs

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 16:26:26 -05:00

98 lines
2.8 KiB
C#

/*
Copyright(c) 2021 talimity (https://github.com/talimity/mptimer)
Modifications Copyright(c) 2021 HSUI
08/29/2021 - Mostly using original's code with minimal adaptations
for HSUI.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Dalamud.Bindings.ImGui;
using System;
using System.Linq;
using Dalamud.Game;
using Dalamud.Plugin.Services;
namespace HSUI.Helpers
{
internal class MPTickHelper : IDisposable
{
public const double ServerTickRate = 3;
protected const float PollingRate = 1 / 30f;
private int _lastMpValue = -1;
protected double LastTickTime;
protected double LastUpdate;
public MPTickHelper()
{
Plugin.Framework.Update += FrameworkOnOnUpdateEvent;
}
public double LastTick => LastTickTime;
private void FrameworkOnOnUpdateEvent(IFramework framework)
{
try
{
var player = Plugin.ObjectTable.LocalPlayer;
if (player is null)
return;
var now = ImGui.GetTime();
if (now - LastUpdate < PollingRate)
return;
LastUpdate = now;
var mp = player.CurrentMp;
// account for lucid dreaming screwing up mp calculations
var lucidDreamingActive = Utils.StatusListForBattleChara(player).Any(e => e.StatusId == 1204);
if (!lucidDreamingActive && _lastMpValue < mp)
LastTickTime = now;
else if (LastTickTime + ServerTickRate <= now)
LastTickTime += ServerTickRate;
_lastMpValue = (int)mp;
}
catch (Exception ex)
{
Plugin.Logger.Verbose($"[HSUI MpTickHelper] FrameworkOnOnUpdateEvent: {ex.Message}");
}
}
protected virtual void Dispose(bool disposing)
{
if (!disposing)
{
return;
}
Plugin.Framework.Update -= FrameworkOnOnUpdateEvent;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MPTickHelper()
{
Dispose(false);
}
}
}