StiviK

[RELEASE] MTA:SA Pathfinding Module

29 posts in this topic

Posted (edited)

Hello,

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:

6rVg3Hy.png


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
11 people like this

Share this post


Link to post

Can you add support for 64-bit please?

Share this post


Link to post

@StiviK Very nice, it was necessary for some servers, thank you! But, can you explain how we can install/use it in our servers? Thank you again!

1 person likes this

Share this post


Link to post

@eggman yeah, soon i will look into it.

@aka Blue what do you want to know?

Share this post


Link to post

What type of format do the graphs need to be in? (Asking due to the possibility of using this along side custom maps.

Share this post


Link to post

But @Jusonex and me are looking into creating a tool, to export Nodes from GTA:SA, for example for Ped routes.

Share this post


Link to post

Is there an example of a script using this or?

Share this post


Link to post

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)
		return
	end

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

function GPS:destructor()
	if unloadPathGraph then
		unloadPathGraph()
	end
end

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

 

1 person likes this

Share this post


Link to post

I'm loaded the module, but i get "attempt to call global" error when i try to use those functions.

Share this post


Link to post

Are you sure the module is loaded properly and an no errors occurred?

Share this post


Link to post

Yes. The console/debugscript didn't write anything error message.

I tried the 32 and 64 bit modules, but same problem.

Share this post


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.

Share this post


Link to post

I see the message in console.

I tried to add mtaconf. Start server and the module is loaded, and tried the loadmodule command but nothing changes. The functions dont work.

Share this post


Link to post

Posted (edited)

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#

Share this post


Link to post

Posted (edited)

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

Share this post


Link to post

Posted (edited)

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.

6yozkh.png

Edited by Syntrax#

Share this post


Link to post

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

Share this post


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?

Share this post


Link to post

Posted (edited)

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

Share this post


Link to post

oh okey thank you for this support going to take a look on it now

Are those Id's btw?

Share this post


Link to post

@Syntrax# if you need further support, just write me a PN and i'll try to help you.

Share this post


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.

Share this post


Link to post

I'm now tried the module in MTA SA 1.4 server and successfully loaded.

What the problem with 1.5.4 server?

Share this post


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.