6 Commits

5 changed files with 52 additions and 16 deletions
+21 -7
View File
@@ -163,11 +163,10 @@ public unsafe class IntegrationsController : IDisposable
_lastTempMarkerCount = tempCount;
_lastQuestSequenceSnapshot = sequenceSnapshot;
} else {
// During suppression: only update temp/sequence baseline so we don't false-trigger
// when suppression ends (e.g. Duty List click repopulates markers). Keep _lastQuestCount
// so quest turn-in during suppression still triggers refresh when suppression ends.
// During suppression: only update temp baseline so we don't false-trigger when suppression
// ends (e.g. Duty List click repopulates markers). Keep _lastQuestCount and _lastQuestSequenceSnapshot
// so quest turn-in and objective progression during suppression still trigger refresh when suppression ends.
_lastTempMarkerCount = tempCount;
_lastQuestSequenceSnapshot = sequenceSnapshot;
}
}
@@ -190,9 +189,11 @@ public unsafe class IntegrationsController : IDisposable
}
}
/// <summary>Call when user opens map via Duty List (quest/gathering/flag/teleport). Suppresses quest/temp-marker-triggered silent refresh for ~1s so we don't close the map.</summary>
/// <summary>Call when user opens map via Duty List (quest/gathering/flag/teleport). Suppresses quest/temp-marker-triggered silent refresh for ~1s so we don't close the map. Cancels any in-progress silent refresh so we don't Hide() the map the user just opened.</summary>
private void SuppressSilentRefreshForUserMapOpen()
{
_silentRefreshHideFramesRemaining = 0; // Cancel in-progress silent refresh so we never Hide() the map the user just opened
SilentRefreshInProgress = false;
_suppressSilentRefreshFramesRemaining = 30; // ~1 second at typical framerate
}
@@ -267,13 +268,18 @@ public unsafe class IntegrationsController : IDisposable
System.MapWindow.Close();
}
if (!ShouldShowMap())
// Allow map when user explicitly opened via Duty List / gathering / flag / teleport
if (!ShouldShowMap() && !System.MapWindow.ProcessingCommand)
{
Service.Log.Debug("[OnShow] Condition to open map is rejected, aborting.");
return;
}
if (AgentMap.Instance()->AddonId is not 0 &&
// When user opened via Duty List (quest/gathering/flag/teleport), SelectedMapId != CurrentMapId is expected
// (viewing quest map, not current zone). Don't Hide() - let the map show.
var userRequestedMap = System.MapWindow.ProcessingCommand;
if (!userRequestedMap &&
AgentMap.Instance()->AddonId is not 0 &&
AgentMap.Instance()->CurrentMapId != AgentMap.Instance()->SelectedMapId)
{
if (!System.SystemConfig.KeepOpen)
@@ -294,9 +300,17 @@ public unsafe class IntegrationsController : IDisposable
showMapHook!.Original(agent, a1, a2);
}, Service.Log, "Exception during OnShowHook");
private static bool IsUserInitiatedMapOpen(MapType type) =>
type is MapType.QuestLog or MapType.GatheringLog or MapType.FlagMarker or MapType.Bozja
or MapType.MobHunt or MapType.SharedFate or MapType.Teleport or MapType.Treasure;
private void OnOpenMapHook(AgentMap* agent, OpenMapInfo* mapInfo) =>
HookSafety.ExecuteSafe(() =>
{
// Set before Original so ShowMap (if called synchronously) can bypass ShouldShowMap rejection
if (IsUserInitiatedMapOpen(mapInfo->Type))
System.MapWindow.ProcessingCommand = true;
openMapHook!.Original(agent, mapInfo);
switch (mapInfo->Type)
+13 -3
View File
@@ -214,7 +214,7 @@ public unsafe partial class MapRenderer : IDisposable
// Markers are drawn from whatever the game has already populated (e.g. after opening the map once).
// When the game has the current map loaded (area map open or just closed), update our cache for this map.
if (agent->SelectedMapId == currentMapId && agent->SelectedMapPath.Length > 0) {
if (agent->SelectedMapId == currentMapId && agent->SelectedMapPath.Length > 0 && agent->SelectedMapBgPath.Length > 0) {
var bgPath = $"{agent->SelectedMapBgPath}.tex";
var fgPath = $"{agent->SelectedMapPath}.tex";
var pathKey = bgPath + "|" + fgPath;
@@ -346,13 +346,23 @@ public unsafe partial class MapRenderer : IDisposable
private static TexFile? GetTexFile(string rawPath)
{
var path = Service.TextureSubstitutionProvider.GetSubstitutedPath(rawPath);
if (string.IsNullOrWhiteSpace(rawPath)) return null;
string path;
try {
path = Service.TextureSubstitutionProvider.GetSubstitutedPath(rawPath);
} catch {
return null;
}
if (string.IsNullOrWhiteSpace(path)) return null;
try {
if (Path.IsPathRooted(path)) {
return Service.DataManager.GameData.GetFileFromDisk<TexFile>(path);
}
return Service.DataManager.GetFile<TexFile>(path);
} catch {
return null;
}
}
private void DrawMapMarkers()
+1 -1
View File
@@ -4,7 +4,7 @@
<Name>HSMappy</Name>
<InternalName>HSMappy</InternalName>
<Author>Knack117</Author>
<Version>1.0.0.3</Version>
<Version>1.0.0.9</Version>
<Punchline>A more versatile in-game map.</Punchline>
<Description>Replaces the in-game map with an ImGui implementation with several additional features. Fork with minimap improvements, quest radius on minimap, and more.</Description>
<RepoUrl>http://brassnet.ddns.net:33983/KnackAtNite/HSMappy</RepoUrl>
+13 -1
View File
@@ -11,6 +11,8 @@ namespace Mappy.Windows;
public class MinimapWindow : Window
{
private bool _wasLoggedIn;
public MinimapWindow() : base("HSMappy Minimap###HSMappyMinimap", new Vector2(200.0f, 200.0f))
{
DisableWindowSounds = true;
@@ -22,8 +24,18 @@ public class MinimapWindow : Window
public override void PreOpenCheck()
{
if (Service.ClientState is { IsLoggedIn: false } or { IsPvP: true })
var isLoggedIn = Service.ClientState is { IsLoggedIn: true, IsPvP: false };
if (!isLoggedIn)
{
IsOpen = false;
_wasLoggedIn = false;
return;
}
// Restore minimap when transitioning from login screen to in-game (ShowMinimap persists in config)
if (!_wasLoggedIn && System.SystemConfig.ShowMinimap)
UnCollapseOrShow();
_wasLoggedIn = true;
}
protected override unsafe void DrawContents()
+1 -1
View File
@@ -1 +1 @@
[{"Author":"Knack117","Name":"HSMappy","Punchline":"A more versatile in-game map.","Description":"Replaces the in-game map with an ImGui implementation with several additional features. Fork with minimap improvements, quest radius on minimap, white gradient player cone, and more.","Changelog":"1.0.0.3: Fix marker cache refresh after quest turn-in; invalidate temp cache so old markers don't persist. 1.0.0.2: Red direction arrow on minimap pointing to player flag. 1.0.0.1: Duty List quest click keeps Area Map open; player flags show on minimap. 1.0.0.0: Initial HSMappy release. Minimap: quest radius circle (orange, transparent), tooltip; cone drawn under markers; white gradient cone; /hsmappy commands.","InternalName":"HSMappy","AssemblyVersion":"1.0.0.3","RepoUrl":"http://brassnet.ddns.net:33983/KnackAtNite/HSMappy","ApplicableVersion":"any","Tags":["map","mapping","overlay","utility"],"CategoryTags":["jobs"],"DalamudApiLevel":14,"DownloadLinkInstall":"http://brassnet.ddns.net:33983/KnackAtNite/HSMappy/releases/download/v1.0.0.3/latest.zip","IsHide":false,"IsTestingExclusive":false,"DownloadLinkTesting":"http://brassnet.ddns.net:33983/KnackAtNite/HSMappy/releases/download/v1.0.0.3/latest.zip","DownloadLinkUpdate":"http://brassnet.ddns.net:33983/KnackAtNite/HSMappy/releases/download/v1.0.0.3/latest.zip","LastUpdate":"1772142707"}]
[{"Author":"Knack117","Name":"HSMappy","Punchline":"A more versatile in-game map.","Description":"Replaces the in-game map with an ImGui implementation with several additional features. Fork with minimap improvements, quest radius on minimap, white gradient player cone, and more.","Changelog":"1.0.0.9: Duty List quest click: don't Hide() when viewing quest map (SelectedMapId != CurrentMapId). 1.0.0.8: Cancel silent refresh when opening map from Duty List so it doesn't immediately close. 1.0.0.7: Duty List quest click opens Area Map even when Hide With Game GUI would block it. 1.0.0.6: Minimap stays open after client restart (restore on login). 1.0.0.5: Fix crash when map texture path is invalid (ArgumentOutOfRangeException in Lumina GetFileHash). 1.0.0.4: Temp marker circle refreshes when quest objective is progressed. 1.0.0.3: Fix marker cache refresh after quest turn-in; invalidate temp cache so old markers don't persist. 1.0.0.2: Red direction arrow on minimap pointing to player flag. 1.0.0.1: Duty List quest click keeps Area Map open; player flags show on minimap. 1.0.0.0: Initial HSMappy release. Minimap: quest radius circle (orange, transparent), tooltip; cone drawn under markers; white gradient cone; /hsmappy commands.","InternalName":"HSMappy","AssemblyVersion":"1.0.0.9","RepoUrl":"http://brassnet.ddns.net:33983/KnackAtNite/HSMappy","ApplicableVersion":"any","Tags":["map","mapping","overlay","utility"],"CategoryTags":["jobs"],"DalamudApiLevel":14,"DownloadLinkInstall":"http://brassnet.ddns.net:33983/KnackAtNite/HSMappy/releases/download/v1.0.0.9/latest.zip","IsHide":false,"IsTestingExclusive":false,"DownloadLinkTesting":"http://brassnet.ddns.net:33983/KnackAtNite/HSMappy/releases/download/v1.0.0.9/latest.zip","DownloadLinkUpdate":"http://brassnet.ddns.net:33983/KnackAtNite/HSMappy/releases/download/v1.0.0.9/latest.zip","LastUpdate":"1772233604"}]