Announcement 2026-09-22
Development update
Greetings, players! We're still working hard on improving Yggdrasil. Our latest work is smooth (CatmullRom) NPC movement: All NPC movement now arcs through its path corners instead of snapping to orientation during movement.
Backstory: When the server issues creature movement, the default approach in private servers is to map the path from A to B as straight lines across mmaps, vmaps, WMOs and GOs with collision. This generates either a valid path or an invalid path, and if invalid, the path is tweaked to have multiple adjustment points along those collision boundaries. For example, an NPC patrolling past a building ends up trailing its walls in a series of straight lines poorly imitating a circle. Think of a pentagon versus an actual circle.
What CatmullRom pathing does is send the information the client needs to calculate the path as an arc at every such break point. However, sending this from the server alone is not enough, as the client itself caches a creature_template variable known as movementId that tells it how fast the creature should change its orientation while pathing through such an arc. This has the following possible values:
| movementId | Turn rate |
|---|---|
| 1 | 2.0 radians per second |
| 321 | 4.0 radians per second |
| 341, 401, 661, 681 | 5.0 radians per second |
| 381 | 6.0 radians per second |
| 441, 541, 721, 741 | 10.0 radians per second |
| 781 | 1.0 radians per second |
| 801 | 0.25 radians per second |
| All others, including 0 and 88 | 0.0 radians per second, no smoothing |
Getting this right is important, as mismatching the arc sharpness and turn rate causes jittery client-side movements.
However, the movementId was only introduced in WotLK, while MaNGOS and derivative servers are built on sniffs from various points, including Vanilla and TBC, before this variable existed. Hence, only a few NPCs have sniffed movementId values. Though, what we learned from the present sniffs is that the predominant turn rate is 10 radians per second (movementId 741). Hence, we have used this as the baseline turn rate for all creatures whose movementId is unknown.
The result of this change is:
- Path corners render as arcs: Patrolling, chasing and all other NPC moves now sweep through their adjustment points rather than cornering through them.
- Arcs respect turning ability: Each arc is sized to fit that NPC's own turn rate, so slow turners go wide and fast turners stay tight, with no seizure at the pivot.
- Arcs respect the world: Every arc is validated against line of sight and ground height, so curves that would cut through walls or float are sent as honest corners instead.
Summary: NPCs now move the way the client was built to render them, with arcs matched to per-creature turn rates and grounded in real collision.
Check out a few examples of tricky CatmullRom areas and creatures, now fully functional:
Link to the core changes on our GitHub:
ef0a03750b926c85f86d4fbb81e018c78f065b04
b066a6e6611adc2586cf92e29afee2bc30c9b1f3