Log in

View Full Version : Derision, your pathfinding code


Dibalamin
06-28-2009, 06:50 PM
Is brilliant. Well done. Unrest is probably the most problematic zone in the game and it works amazingly well.

Is there anything we as the community can do to help edit the .path files?

Derision
06-29-2009, 07:46 AM
Not yet, but it is high on my priority list to put #commands in to allow people to place path nodes with an external command line tool to calculate the connectivity (using line-of-sight and terrain 'steepness' tests) and generate their own .path files.

The reason for an external program to create the .path files is because it is heavily CPU intensive with the time it takes growing exponentially with each added path node. I'll add in a feature to reload the .path file into a running zone, so it shouldn't be too laborious a process.

Dibalamin
06-29-2009, 09:30 AM
Aight!

Only thing I might mention, is that feared/aggro'd mobs don't use doors....they really didn't need to before, as they would just run through the wall...

I see guards in cities opening doors as they path by, so I think the code is already there.

Dibalamin
06-30-2009, 11:41 AM
Someone over at P1999 reported that in Unrest, live mobs like beetles and werebats were running away at full speed while snared.

Live enemies that run upon low health are bugged right now. Death Beetles and Werebats were the two that I was having trouble with today.

At low health they run at full speed, even with snare on, they still run at full speed.

The pathing looks good though haha.

http://classicbetatest.guildlaunch.com/forums/viewtopic.php?t=2996073&sid=9b58c5f1c6760e086def14290d3ed814&gid=62867

Nothing special in our DB that would prevent this for these mobs.

Derision
06-30-2009, 12:49 PM
I see the problem.

MobAI.cpp Line 649

CalculateNewPosition2(Goal.x, Goal.y, Goal.z, GetRunspeed());

Should be:

CalculateNewPosition2(Goal.x, Goal.y, Goal.z, GetFearpeed());

I'll test this and commit it shortly.

gaeorn
06-30-2009, 01:50 PM
I see the problem.

MobAI.cpp Line 649

CalculateNewPosition2(Goal.x, Goal.y, Goal.z, GetRunspeed());

Should be:

CalculateNewPosition2(Goal.x, Goal.y, Goal.z, GetFearpeed());

I'll test this and commit it shortly.

Wow, GetFearpeed()... so now they pee their pants when feared? I know I would! lol

Yeormom
07-10-2009, 01:51 PM
I look forward to more of your path finding goodness. The lack of NPC pathing is the last big problem I see with the project code, since many dungeons are unplayable. I noticed the path files were far from plain text so an editing tool sounds quite exciting.

KLS
07-25-2009, 04:55 AM
Because I'm impatient I went ahead and added several #path commands for direct manipulation and saving of the pathing system. I made blackburrow and qeynos2 maps and they work quite well but I'm still working out the quirks in the commands.

#path process is fairly CPU intensive and should probably not be used on any live servers.
#path resort 's use isn't very obvious but basically if you delete a connection it can leave holes in the neighbors list which causes paths to completely fail; because for optimizing reasons when the path code comes to a hole it assumes it's the end of the line, it resorts it so there are no more holes in path node neighbors.

Also no changes are actually made to the .path file in the maps folder, if you don't #path dump it all your changes are lost when the zone boots down.
Everything else should be fairly straight forward.

Dibalamin
07-25-2009, 06:45 PM
Did you upload those path files somewhere Kimmy? I didn't see them at the SVN downloads. So, I may be blind!

KLS
07-26-2009, 12:23 AM
I don't actually like my qeynos2 file I made all that much but I did both blackburrow and mistmoore and added them to pathfiles download at http://code.google.com/p/projecteqemu/downloads/list

Dibalamin
07-26-2009, 11:44 AM
You rock. I'm assuming towards the end of the #path frenzy of maps that quest::pathto & quest::moveto will use the pathing maps?

vales
07-26-2009, 11:19 PM
Hmm. I think there's something wrong with mine because I've downloaded the pathfiles, and watched in horror as the NPCs in PoK were walking through the walls, buildings, and hopping on top of the structures. This was with the pathfiles before the newest Pathfiles_01.zip was uploaded.

Is there a certain setting or something in rules_values or something that I'm missing?

KLS
07-27-2009, 12:40 AM
The pathfiles in the zip haven't changed. And I don't believe there's been any changes to the code recently in terms of the pathing code.

vales
07-27-2009, 12:59 AM
Must be something in mysql then. I'll check the defaults to see if they've been changed or something.

KLS
07-27-2009, 01:05 AM
I'm going to start uploading any maps I make to the map svn, I did tutorialb and worked on mistmoore a bit, there were certain spots that were unreachable on the map.

Also fixed up yet more #path stuff, including a crash related to adding and deleting nodes. Also including adding #path resort nodes which is needed if you ever get your node ids out of order, like if for example you ever create node 1 2 3 4 5 and then delete node 3 so it's 1 2 4 5 it will cause issues because some of the code assumes nodes are in order and none are missing.

trevius
07-27-2009, 03:19 AM
By default, the new pathing should be on, but you can disable it with rules if you like. Here is the section from ruletypes.h that deals with the new pathing:


RULE_CATEGORY( Pathing )
// Some of these rules may benefit by being made into columns in the zone table,
// for instance, in dungeons, the min LOS distances could be substantially lowered.
RULE_BOOL ( Pathing, Aggro, true ) // Enable pathing for aggroed mobs.
RULE_BOOL ( Pathing, AggroReturnToGrid, true ) // Enable pathing for aggroed roaming mobs returning to their previous waypoint.
RULE_BOOL ( Pathing, Guard, true ) // Enable pathing for mobs moving to their guard point.
RULE_BOOL ( Pathing, Find, true ) // Enable pathing for FindPerson requests from the client.
RULE_BOOL ( Pathing, Fear, true ) // Enable pathing for fear
RULE_REAL ( Pathing, ZDiffThreshold, 10) // If a mob las LOS to it's target, it will run to it if the Z difference is < this.
RULE_INT ( Pathing, LOSCheckFrequency, 1000) // A mob will check for LOS to it's target this often (milliseconds).
RULE_INT ( Pathing, RouteUpdateFrequencyShort, 1000) // How often a new route will be calculated if the target has moved.
RULE_INT ( Pathing, RouteUpdateFrequencyLong, 5000) // How often a new route will be calculated if the target has moved.
// When a path has a path node route and it's target changes position, if it has RouteUpdateFrequencyNodeCount or less nodes to go on it's
// current path, it will recalculate it's path based on the RouteUpdateFrequencyShort timer, otherwise it will use the
// RouteUpdateFrequencyLong timer.
RULE_INT ( Pathing, RouteUpdateFrequencyNodeCount, 5)
RULE_REAL ( Pathing, MinDistanceForLOSCheckShort, 40000) // (NoRoot). While following a path, only check for LOS to target within this distance.
RULE_REAL ( Pathing, MinDistanceForLOSCheckLong, 1000000) // (NoRoot). Min distance when initially attempting to acquire the target.
RULE_INT ( Pathing, MinNodesLeftForLOSCheck, 4) // Only check for LOS when we are down to this many path nodes left to run.
// This next rule was put in for situations where the mob and it's target may be on different sides of a 'hazard', e.g. a pit
// If the mob has LOS to it's target, even though there is a hazard in it's way, it may break off from the node path and run at
// the target, only to later detect the hazard and re-acquire a node path. Depending upon the placement of the path nodes, this
// can lead to the mob looping. The rule is intended to allow the mob to at least get closer to it's target each time before
// checking LOS and trying to head straight for it.
RULE_INT ( Pathing, MinNodesTraversedForLOSCheck, 3) // Only check for LOS after we have traversed this many path nodes.
RULE_INT ( Pathing, CullNodesFromStart, 1) // Checks LOS from Start point to second node for this many nodes and removes first node if there is LOS
RULE_INT ( Pathing, CullNodesFromEnd, 1) // Checks LOS from End point to second to last node for this many nodes and removes last node if there is LOS
RULE_REAL ( Pathing, CandidateNodeRangeXY, 400) // When searching for path start/end nodes, only nodes within this range will be considered.
RULE_REAL ( Pathing, CandidateNodeRangeZ, 10) // When searching for path start/end nodes, only nodes within this range will be considered.


As long as you don't have them disabled in your rules, and you have the .path files in your maps folder, it should work. It is awesome to do a #aggrozone in PoK and watch all of the NPCs run to attack you, then turn around and start pathing back after they get to you (by default, PoK is a non-combat zone). Almost ever NPC I followed after doing that walked back to their spawn point with perfect pathing. The only one I saw that didn't was a roamer that has a pathing grid set on it and normally paths through walls in the first place :P

vales
07-27-2009, 03:18 PM
Awesome. :D Thanks for that, KLS and Trev.


The MaNGOS guys have a pretty neat waypoint/pathing system as well. Maybe you can "borrow" some of their code to make it easier as well. ;)

As of now, if you target an NPC and type some commands to get their info, it will actually show their waypoint ID as well. This way, you can identify what NPC has what waypoint and pathing ID without having to guess what goes on who. It also has a MySQL entry iirc, so you can find it much easier as well.

Opulens
08-29-2009, 02:48 PM
I'm going to start uploading any maps I make to the map svn, I did tutorialb and worked on mistmoore a bit, there were certain spots that were unreachable on the map.

Also fixed up yet more #path stuff, including a crash related to adding and deleting nodes. Also including adding #path resort nodes which is needed if you ever get your node ids out of order, like if for example you ever create node 1 2 3 4 5 and then delete node 3 so it's 1 2 4 5 it will cause issues because some of the code assumes nodes are in order and none are missing.

We get the following error now:
19610 [08.29. - 11:25:50] Unsupported path file version.
19610 [08.29. - 11:25:50] Path File ./Maps/tutorialb.path failed to load.


Please advise..