Here's another update.
The nav mesh is basically done. I implemented some simple string pulling and a few other optimizations. It works, and I've actually used it to drive a character around in the game without running into things for the most part, though any human observer watching my character move around for more than a few minutes could spot it as a bot if they knew anything about AI. It does some odd things, since I'm finding a shortest path and then following it like a waypoint graph, so I hug corners, rub along walls, etc. It very rarely actually gets stuck, but it's often pushing up against stuff when moving around in cities, sort of looks like a blind guy trying to get around by feel. Outside in more open country it looks a lot better.
I have hitherto been trying to avoid implementing a "local situational awareness" engine in my system, instead relying on tricks to embed or augment my navigation mesh with the necessary information for real world pathfinding, such as locations of mobs, roads, various POI, etc. I've blown a ton of time on it and I'm still not happy with the results, so I've decided to give up on that approach and implement a proper local navigation system. This is how humans navigate, so if I want human like behavior I should do it in the same way. Easily said, but very hard to accomplish.
Here's the basic idea. Suppose you, as a human player, want to take your character from Elwynn Forest to Grizzly Hills in Northrend. How do you do it? Do you think about every tree, mob, fence, etc, before you even start? No, of course not, you get a general idea of where you're going to go, which areas you'll go through, which flight paths you'll take, etc, and then you watch out for stuff along the way and adjust as necessary.
With a local navigation system, my agent can work the same way. We still use the nav mesh to generate a path to wherever we want to go, but rather than take that path as gospel and follow it like a waypoint graph, it is instead just taken as a rough idea of how to get there, and we generally follow it while adjusting as necessary based on local conditions.
The agent maintains a radar as it moves around, say 100yds [3x3 MNCK grid] This radar will contain everything that you get via the object manager, like mobs, dynamic objects like chairs, doors, etc. In addition, the agent can cast rays into the nav mesh to figure out which areas within the radar radius can be walked through, sort of like TraceLine but out of process and way faster since it's effectively 2D ray casting on the nav mesh. Since it's only looking at a 3x3 tile area of the nav mesh at any given time, there's typically <50 polygons in the radar, so ray casts are stupid fast.
Using this information the bot can follow the predetermined path while also deviating as necessary to stay a comfortable distance from obstacles, avoid aggroing mobs, etc. Since the radar is just a Quadtree of entities separate from the nav mesh, it can be updated in real time, mobs can move, etc, no problems are presented. It makes the whole process way more elegant. It is also possible to deal with dynamic moving collidable objects elegantly, as long as they aren't so big that they invalidate the long range path find.
Adding local navigation also allows the agent to use more advanced tactics than just "go to this location". It can chase fleeing mobs without aggroing other mobs, even if they move, it can act in a coordinated manner with other agents, like "dot up", "spread out", "stand behind the boss", etc. Decent PvP play would be possible. Lots of cool stuff.
Of course, all that is great on paper but actually getting it all to WORK is another matter all together. The implementation becomes way more complex. So far I'm just getting started. My first goal is to implement a sandbox to play with the techniques without having to do it in WoW with a real agent.
Here's a webpage with some local navigation/steering demos if you want to get an idea for the kind of stuff I'm talking about. They even have an open source implementation of some of their ideas I'm hoping I can borrow to some extent.
Steering Behaviors For Autonomous Characters