Table of Contents

Class MapMarkerFilter

Namespace
FishMMO.Client
Assembly
FishMMO.Client.dll

Decides which markers the local player may see, and at what fidelity.

public sealed class MapMarkerFilter
Inheritance
MapMarkerFilter
Inherited Members

Remarks

This is the map system's answer to "the minimap is a radar hack that ships with the game". The observer system upstream already decides which entities exist on this client at all; this decides which of those the map is willing to draw, and — for the ones it draws grudgingly — how stale and how coarse the position it draws them at is.

Three tiers. The player's own character, their party and their guild are drawn exactly and continuously; the group already shares positions through the party frames, so the map is not the leak. World fixtures are drawn exactly and continuously because their positions are public and unchanging. Everyone else — hostile and neutral players — is drawn only inside DetectionRadius, refreshed at ThrottleInterval, snapped to a PositionQuantum grid, and never labelled.

Why that is worth doing at all, given that a modified client can skip it: the throttled position is the only position this code ever produces. A client that deletes the filter still has to read the entity's transform to beat it — at which point it is a memory-reading cheat with or without a minimap, and the map has not made it easier. What the filter does buy is that the detection radius is genuinely smaller than the observer range that put the entity here, so the honest client's map is strictly less informative than the network stream, and every value it draws has been through a rule.

Properties

DetectionRadius

How close a hostile or neutral player must be before their marker appears, in metres.

public float DetectionRadius { get; set; }

Property Value

float

Remarks

Deliberately below ObserverStreamingPolicy.MinimumRange, which is the floor the observer system will shrink a character's streaming radius to under load. Keeping this under that floor is what makes the guarantee hold in the worst case as well as the usual one: there is no server condition under which the map would be showing more than the stream already contains.

PositionQuantum

Grid, in metres, that a throttled marker's position is snapped to.

public float PositionQuantum { get; set; }

Property Value

float

Remarks

Four metres — one fog cell. Enough to say "something hostile is over there", not enough to aim with. Combined with the one-second refresh, a throttled marker tells a player roughly where an enemy was, which is what a map is for, rather than exactly where they are, which is what an aim assist is for.

ThrottleInterval

How often a throttled marker's position is re-sampled, in seconds.

public float ThrottleInterval { get; set; }

Property Value

float

Methods

Collect(List<MapMarkerSnapshot>, IPlayerCharacter, bool, FogOfWarMap)

Collects everything the local player may see.

public void Collect(List<MapMarkerSnapshot> results, IPlayerCharacter local, bool forWorldMap, FogOfWarMap fog)

Parameters

results List<MapMarkerSnapshot>

List to fill. Cleared first.

local IPlayerCharacter

The local player character. May be null.

forWorldMap bool

True for the world map, false for the minimap.

fog FogOfWarMap

The explored map, used by the discovery rule. May be null.

Reset()

Forgets every throttled position.

public void Reset()

Remarks

Called on character change and on quit to login. Carrying entries across would let a new character's map open showing where the previous character's neighbours were.