HammeriteNavigationLinkBuilder
Navigation. Inherits RefCounted
Finds the ways through a level that are not walking, and measures them.
Why there are any. Ground derived from a carved world already connects itself: two rooms that abut are joined by an aperture the compiler punched from their shared wall, and their floors come out coplanar and edge-coincident, so the navigation server stitches the two regions together and an agent walks from one to the other without anything being authored. Measured on two_windows, every ordinary doorway in the level connects for free.
What does NOT connect is a height discontinuity. A window with a 96-unit sill, a balcony over a hall, a gap between two roofs - the ground stops, and the ground on the other side is somewhere else. Those are the links, and they are exactly the places a stealth game cares about, because they are the routes a guard cannot take and a thief can.
Three are derived and one is authored. Windows come from apertures whose sill stands above the floor; drops from a patch of ground overhanging lower ground; jumps from two patches within reach of each other across clear air. What cannot be seen in the geometry - that this ladder is climbable, that this rope reaches the balcony - is placed by hand as a entity_type() entity.
Nothing here knows what an agent is. Every link carries how high it must be climbed, how far it spans, how far it falls and how wide and tall the way through is; agent profiles compare against those numbers game-side. The thresholds below are only about what is worth LOOKING at - generous enough that nothing a game might permit is missed.
Properties
| Type | Name | Default |
|---|---|---|
HammeriteCompileProgress | progress | |
float | step_height | |
String[] | warnings |
Methods
| Returns | Method |
|---|---|
HammeriteNavigationLinkData[] | build_links(map: HammeriteMap, surfaces: HammeriteNavigationSurface[]) |
float | default_step_height() static |
StringName | entity_type() static |
float | max_drop() static |
float | max_jump_rise() static |
float | max_jump_span() static |
StringName | name_key() static |
StringName | one_way_key() static |
StringName | target_key() static |
Property descriptions
progress
var progress: HammeriteCompileProgress
Told how far build_links() has got, when it runs as part of a compile. It stops early once this says it was cancelled.
step_height
var step_height: float
The tallest rise that is a STEP rather than a drop or a climb - one stair tread, one kerb - for this build. Set from HammeriteNavigationAgentProfiles.step_height by the runtime.
It is a fact about the world's units rather than about any particular creature: whether a given agent can manage one is its profile's business (HammeriteNavigationAgentProfile.climb_height), so a rat with an 8-unit stride still cannot use a staircase built for people.
warnings
var warnings: String[]
What the last build could not do: an authored link with no other end, a window nobody can reach.
Method descriptions
build_links()
func build_links(map: HammeriteMap, surfaces: HammeriteNavigationSurface[]) -> HammeriteNavigationLinkData[]
Every traversal link in map, derived from surfaces (the output of HammeriteNavigationBuilder) and from what the author placed.
default_step_height()
static func default_step_height() -> float
The step height a build uses when nobody says otherwise: 18 units, which Hammerite inherits from Hammer and which its stairs are built to.
entity_type()
static func entity_type() -> StringName
Entity type of an authored link, and the properties it carries.
max_drop()
static func max_drop() -> float
Drops further than this are not looked for. Nothing walks off a 1024-unit cliff on purpose, and the pair would only be filtered out game-side anyway.
max_jump_rise()
static func max_jump_rise() -> float
The biggest height change across a jump looked for, either way, in map units.
max_jump_span()
static func max_jump_span() -> float
The widest gap treated as jumpable, and the biggest height change across one. Deliberately larger than any agent's real reach: what is generated is a candidate, and profiles do the rejecting.
name_key()
static func name_key() -> StringName
Entity property: the link's name, for HammeriteNavigationRuntime.set_link_enabled().
one_way_key()
static func one_way_key() -> StringName
Entity property: true lets the link be taken only from the entity towards its far end.
target_key()
static func target_key() -> StringName
Entity property: a Vector3 from the entity's origin to the link's far end, in map units. A link whose far end is less than a unit away is dropped with a warning. Any entity carrying this is read as a link, whatever its type.