Skip to content

feat(detail): flag a nearby player's position on the in-game map - #42

Merged
nxships merged 2 commits into
mainfrom
feat/mark-player-position
Jul 30, 2026
Merged

feat(detail): flag a nearby player's position on the in-game map#42
nxships merged 2 commits into
mainfrom
feat/mark-player-position

Conversation

@nxships

@nxships nxships commented Jul 30, 2026

Copy link
Copy Markdown
Collaborator

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:

  • Detail toolbar — a map-marker button that drops the game's flag on their spot and opens the map there. Because it uses the game's own map-link mechanism, the marker also appears on the minimap and compass, so it works as a waypoint you can walk to.
  • Live Observation — a Position row 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 floor 0.3.00.4.0 accordingly.

Nothing here talks to IObjectTable, IGameGui or Lumina directly — that all sits behind the framework abstraction. The only plugin-side plumbing is registering IGameGui in Plugin.cs and a MainWindowState.IsSelectedInRange passthrough over the watcher's snapshot, which keeps PlayerDetailPanel free of a Modules.InternalData dependency.

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 .disabled tooltip 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 of MapUtil.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.

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
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.
@nxships
nxships merged commit 8867f2f into main Jul 30, 2026
3 checks passed
@nxships
nxships deleted the feat/mark-player-position branch July 30, 2026 14:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant