feat(detail): flag a nearby player's position on the in-game map - #42
Merged
Conversation
The detail toolbar gains a map-marker button that drops the game's flag on the selected player's current spot and opens the map there, so the marker also shows up on the minimap and compass. Live Observation gains a Position row with the zone and coordinates in the game's own (12.3, 8.7) form, plus an inline shortcut to the same action. Both are gated on the player actually being in range, since only players in the object table have a position — which for most of the list, being database history, they don't. The gate reads the watcher's visibility snapshot, so it can lag up to a scan interval; a click in that window re-resolves and simply does nothing rather than flagging a stale spot. Positions are re-read at most five times a second and only while the Summary tab is in front, keeping the object-table walk off the per-frame path. Bumps the NexusKit constraint floor 0.3.0 -> 0.4.0 for IPlayerMapMarker.
nxships
enabled auto-merge (squash)
July 30, 2026 13:49
NexusKit 0.4.0 is built against Microsoft.Extensions.* 10.0.9, so NexusKit.Hosting requires Logging and DependencyInjection >= 10.0.9. The plugin's direct 10.0.8 references downgraded both and NU1605 failed the restore — the 0.4.0 floor bump and this one have to land together. Also raises the NexusKit.Modules floor to 0.1.3, the release that carries the same NexusKit 0.4.0 floor and therefore the SQLitePCLRaw fix for GHSA-2m69-gcr7-jv3q. Supersedes #41, which made the same 10.0.9 bump on its own.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a way to find a tracked player in the world: flag their current position on the in-game map.
Two entry points, both for the selected player:
Positionrow showing the zone and coordinates in the game's own(12.3, 8.7)form, with an inline shortcut to the same action.In range or not
Only players in the object table have a position, and most of the list is database history of people long gone. Both entry points are gated on the player actually being in range; the row states "Not in range" rather than offering an action that cannot work.
The gate reads the watcher's visibility snapshot, which refreshes on its own scan interval rather than per frame, so it can lag by up to about a second. A click inside that window re-resolves and simply does nothing rather than flagging a stale spot — no error, no misleading flag.
Positions are re-read at most five times a second, and only while the Summary tab is in front. The visibility check is a set lookup and can run every frame; walking the object table for a text row cannot.
Framework side
Depends on
IPlayerMapMarker, added in NexusKit 0.4.0 (NexusFFXIV/NexusKit#25). This PR raises the constraint floor0.3.0→0.4.0accordingly.Nothing here talks to
IObjectTable,IGameGuior Lumina directly — that all sits behind the framework abstraction. The only plugin-side plumbing is registeringIGameGuiinPlugin.csand aMainWindowState.IsSelectedInRangepassthrough over the watcher's snapshot, which keepsPlayerDetailPanelfree of aModules.InternalDatadependency.Also picks up the fix for disabled icon buttons never showing a tooltip (same NexusKit release), which is what makes the greyed-out button explain why it is unavailable instead of silently doing nothing.
Localization
Six new keys in
Language.resx+Language.de.resx. This establishes the first.disabledtooltip key in the plugin — a disabled control whose tooltip still describes the action it will not perform is worse than no tooltip.Verification
Workspace solution builds clean in
Debug|x64. All Dalamud APIs were checked against the shipped assemblies rather than assumed — including the IL ofMapUtil.WorldToMap(Vector2, Map)to confirm the axis/offset mapping, since a swap there would have produced plausible-looking but wrong coordinates.In-game behaviour was reviewed by @nxships before this was opened.