Jump to content

[RELEASE] MTA:SA Pathfinding Module


Recommended Posts


We, the eXo-Reallife team, would like to release a module that is also used on our server.
It is a pathfinding module developed by Jusonex and StiviK.
The module uses the A * algorithm. (https://en.wikipedia.org/wiki/A*_search_algorithm)
We use this for our GPS:


Why did we develop a module for this and did not simply write a script?
This has a very simple reason. The module calculates the routes in your own threads, which has the advantage that it is much faster than a script, and secondly, you can calculate how much routes as you want side by side. This will not cause any lags etc.!

What are the features of the module?

  • The module can load several graphs / nodes side by side
  • The module calculates the routes in its own threads
  • Very useful API functions (such as findNodeAt or getNodeNeighbors)

What are the main features?
int loadPathGraph (String pathToGraphFile)
This function loads the graph from the given file and returns a GraphId which you need for all other functions. If something does not work, false is returned.

bool findShortestPathBetween (int graphId, float startX, float startY, float startZ, float endX, float endY, float endZ, function callback)
This function finds the shortest route between the points. (Unfortunately, no vectors can be handed over!)
The callback function is called when the calculation is finished. As an argument, either a table is returned that contains all nodes, or false if no route is found.

bool unloadPathGraph (int graphId)
You can use this function if you no longer need and want to unload the graph, it returns true if everything is fine, false if an error has occurred.

You will find all the other functions that are included in our documentation.

Why is the eXo team releasing all this?
Well, that has the simple reason, we want to share our work with others and not just keep it for us! We hope we can enrich you with it and vlt. Even help!

Where can I download the module?
The whole module is open-source and can be viewed in our GitHub organization.
It's released under the MIT License.

GitHub organization: https://github.com/eXo-MTA
Repository: https://github.com/eXo-MTA/ml_pathfind
Download the module (Windows / Linux): https://github.com/eXo-MTA/ml_pathfind/releases
Nodes of all roads in SA: https://github.com/eXo-MTA/ml_pathfind/blob/master/test/sa_nodes.json

If you find any mistakes or suggestions, you can simply create a new issue and we will look into it.

So now that's it, have fun with the module!

- StiviK and the eXo-Reallife team
(Original thread in German: https://www.mta-sa.org/thread/36365-release-mta-sa-pathfinding-module/?postID=407938#post407938)

Edited by StiviK
  • Like 15
  • Thanks 2
Link to post
  • 1 month later...

An example script directly not, but here is it how i use it in my Gamemode:

function GPS:constructor()
	-- Check if module is loaded
	if not loadPathGraph then
		outputDebugString("GPS module not loaded. Continuing without...", 2)

	-- Load path graph
	self.m_GraphId = loadPathGraph("files/paths/sa_nodes.json")

function GPS:destructor()
	if unloadPathGraph then

function GPS:getRoute(callback, from, to)
	if not findShortestPathBetween then
		return false
	return findShortestPathBetween(self.m_GraphId, from.x, from.y, from.z, to.x, to.y, to.z, callback)


  • Like 1
Link to post

You should see a message like 'MODULE: Loaded "Pathfind Module" (1.00) by "Jusonex, StiviK"' in the console, otherwise it was not loaded!

Did you add it to your mtaserver.conf! Or try 'loadmodule ml_pathfind_TYPE.dll' in the console.

Link to post

I've managed to generate the path and get the shortest route to your destination.Now my question is how to seperate those in x,y,z coordinates since i'm going to use the draw lines function

Edited by Syntrax#
Link to post

The return value of the function is a table with this structure: { { x1, y1, z1 }, { x2, y2, z2 }, ..., { xN, yN, zN } } (where N is the count of the used nodes in the Route)


@Jayceon are you trying to use the functions server-side or client-side?

Edited by StiviK
Link to post
51 minutes ago, StiviK said:

The return value of the function is a table with this structure: { { x1, y1, z1 }, { x2, y2, z2 }, ..., { xN, yN, zN } } (where N is the count of the used nodes in the Route)


@Jayceon are you trying to use the functions server-side or client-side?

Already got it working but i've to say the test nodes are seriously messed up they literally take the shortest route which means for example at the greenwood hospital to the highway they will decide to directly jump of the edge to to highway and visa versa

This is what i've managed to create thanks to the module :D, i've to say that it isn't completed yet and is for from stable. I've to find a way to update the route without requesting too much peformance from the server or client. for example when someone doesn't follow the path.


Edited by Syntrax#
Link to post
Just now, StiviK said:

Which graph did you use? You'r own? Or the sa_nodes from the repo? Ich think you messed up the edges.

i've used the sa_nodes one but i've to say i'm just looping most of the values not considering the edges etc what is  the meaning of those edges btw?

Link to post

I mean the modules find's the neighbour node of a node by looking at the edges of a node. The edges of a node are defined in the graph, the defined edges are only realistic reachable nodes.

Which means if the Input graph (sa_nodes) is correct, what you described should not happen.

Edited by StiviK
Link to post

I'm using it in client side, but tried it in server side. Every side return the "attempt to call" :/

I don't know what the problem. I'm using Windows 10 Pro 64 bit, MTA SA server 1.5.4. The console show the module successfully loaded.

Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Create New...