- Add reusable RSMOD line-of-sight helpers for projectile checks
- Avoid hot movement prediction list allocations during combat ticks
- Use direct projectile LOS checks for combat movement, swings, and peltables
- Reuse loaded LOS windows during ranged and magic approach filtering
- Extend pathfinder tests for the direct RSMOD LOS helpers
Adventure bots could enter combat with NPCs near the edge of the SmartPathfinder truncation window, causing combat movement to try attack tiles at distance 50+ and spam pathfinding exceptions.
Skip SMART combat movement destinations that SmartPathfinder cannot attempt, and make the pathfinder cutoff follow max_pathfind_dist instead of a hard-coded 50. Added a regression test for the reported coordinate boundary.
Treat overlapping occupied tiles as out of melee reach so combat movement must find a real adjacent attack tile. Improve intent resolution to preserve queued steps that already enter attack range and account for same-tick projected movement, preventing reciprocal melee movement loops.
Update dumb NPC overlap movement to consider all valid attack tiles instead of stalling on blocked preferred directions. Add regression coverage for player/NPC overlap cases, blocked-side fallback, and mutual melee movement.
Filtered combat chase destinations so melee avoids interaction-blocked border tiles, and ranged/magic approach tiles require projectile line of sight before being selected.
This fixes looping when attacking through the opened Lumbridge house door and when autocasting against Lumbridge river ducks from projectile-blocked spell range.
Players now attempt to path into combat range before rejecting attacks against stationary NPCs on unwalkable tiles, such as Lumbridge river ducks. Ranged and magic attacks can move to valid attack-range land tiles, while melee still fails with "I can't reach that!" only after pathing as close as possible.
Added regression coverage for Lumbridge river duck ranged and melee attacks, and adjusted unreachable-target combat movement tests to expect pathing before failure.
Default melee NPCs now use constrained target-facing combat tiles instead of scanning every border tile, preserving safespots around obstacles.
Diagonal chases may use the two corner-adjacent sides so NPCs can step into range when a direct-ish tile is open, without routing around blocked corners.
Added combat movement regressions for static safespots, one-tile obstacle chases, and diagonal corner cases.
Reject partial pathfinder results for combat approach tiles so unreachable targets stop combat and show "I can't reach that!" instead of endlessly queueing chase movement.
Also clear stale combat state on teleport/cross-map targets, keep combat movement queues to immediate steps, and prevent NPC retaliation from forcing run movement.
Add a late combat movement pressure pass after world pulses so melee attackers can react to target run paths queued by live walk packets in the same tick. This prevents the attacker from lagging one tile too far behind when a PvP target starts running away.
Also add regressions for melee pressure against running targets, including the live WorldspaceWalk path with run enabled and dragon scimitars, and update the combat movement rewrite notes.
Replaced CombatPulse's private MovementPulse pathing with an engine-side CombatMovementIntents queue resolved before normal walking queues. Exposed candidate attack tiles from CombatMovementPlanner so intents can select and reserve deterministic melee approach paths.
Enabled the first pending combat movement scenario using an open wilderness fixture, added intent resolver coverage, and updated the combat movement rewrite living document.
Move shared combat reach checks out of swing handlers and update melee, range, and magic handlers to delegate to the new reach boundary. Add focused combat tests for large-target melee reach and planner behavior, and update the living combat movement rewrite notes with completed progress and next steps.