[RELEASE] MTA:SA Pathfinding Module

  • Hallo,


    Wir, das eXo-Reallife Team, möchten heute ein Modul releasen, dass auch auf unserem Server Verwendung findet.
    Es handelt sich hierbei um ein Pathfinding Modul, dass von Jusonex und StiviK entwickelt wurde.
    Das Modul nutzt das A* verfahren. (https://de.wikipedia.org/wiki/A*-Algorithmus)
    Wir nutzen dieses z.B. für unser GPS:



    Das ist ja alles schön und gut, aber warum haben wir dafür ein Modul entwickelt und nicht einfach ein Script geschrieben?
    Dies hat einen ganz einfachen Grund. Durch das Modul werden die Routen in eigenen Threads berechnet, was erstens den Vorteil hat, dass es viel schneller als ein Script ist, und zweitens können praktisch unendliche viele Routen nebeneinander berechnet werden. Das ganze verursacht auch keine Laggs o.ä. auf dem Server!


    Welche Features hat das Modul?

    • Das Modul kann mehrere Graphen/Nodes nebeneinander laden
    • Das Modul berechnet die Routen in eigenen Threads
    • Sehr nützliche API-Funktionen (wie z.B. findNodeAt oder getNodeNeighbors)

    Was sind die wichtigsten Funktionen?


    Code
    int loadPathGraph(String pathToGraphFile)

    Diese Funktion lädt euch den Graphen von der angegeben Datei und gibt eine GraphId zurück die ihr für alle weiteren Funktionen benötigt. Falls etwas nicht funktioniert hat wird false zurückgegeben.


    Lua
    bool findShortestPathBetween(int graphId, float startX, float startY, float startZ, float endX, float endY, float endZ, function callback)

    Diese Funktion sucht euch die kürzeste Route zwischen den angegebenen Punkten. (Leider können keine Vektoren übergeben werden!)
    Die callback-Function wird aufgerufen, wenn die Berechnung fertig ist. Als Argument wird entweder eine table zurückgegeben die alle Nodes enthält oder false falls keine Route gefunden wurde.


    Lua
    bool unloadPathGraph(int graphId)

    Diese Funktion könnt ihr nutzen, wenn ihr den Graphen nicht mehr braucht und entladen möchtet, es wird true zurückgegeben, wenn alles gepasst hat, false falls ein Fehler aufgetreten ist.


    Alle anderen Funktionen die das Modul enthält findet ihr in unserer Dokumentation.



    Warum releast das eXo-Team den ganzen Spaß?
    Nunja, das hat den einfachen Grund, wir wollen unsere Arbeit auch mit anderen teilen und das nicht einfach für uns behalten! Wir hoffen wir können euch damit bereichern und vlt. sogar helfen!


    Wo kann man dann das Modul runterladen?
    Das ganze Modul ist Open-Source und kann in unsere GitHub-Organisation eingesehen werden.
    Released haben wir das ganze unter der MIT License diese kann, hier, eingesehen werden.


    GitHub-Organisation: https://github.com/eXo-MTA
    Repository: https://github.com/eXo-MTA/ml_pathfind
    Download des Modules (Windows/Linux): https://github.com/eXo-MTA/ml_pathfind/releases
    Nodes aller Straßen in SA: https://github.com/eXo-MTA/ml_…master/test/sa_nodes.json


    Falls ihr Fehler findet oder Vorschläge habt, könnt ihr einfach einen neuen Issue erstellen und wir werden uns das ganze ansehen!


    So nun das wars auch, viel Spaß mit dem Modul!


    - StiviK und das eXo-Reallife Team

  • Danke für das veröffentlichen. Sieht sehr interessant aus.


    Werde es mir mal genauer anschauen.
    Inwiefern unterscheidet es sich mit der herkömmlichen class der traffic resource bis auf das Modul und dessen Vorteile?

  • Der Vorteil ist im Wesentlichen, dass es nicht zu Lags kommt, da die Routen parallel und viel schneller berechnet werden (ohne weitere Optimierung dauerts aktuell etwa 1ms pro Route).
    Die Lua Ressource hingegen hat bei längeren Routen schonmal locker 500ms gebraucht, in denen der Server/Client dann komplett hängt.


    Ein weiterer Vorteil die Routen auf dem Server zu berechnen ist, dass die relativ große Datei mit den Wegpunkten nicht heruntergeladen werden muss.

  • Ich denke an der Stelle wäre es hilfreich, wenn wir ein Tool bauen, das die PATHs Dateien aus dem GTA-Ordner einliest und daraus die json-Dateien generiert.
    Für die Autobahnen brauchen wir das sowieso und dann kann man auch direkt explizit die Ped-Paths generieren.

  • Ich scheitere schon daran eine GraphID zu bekommen:


    int loadPathGraph(String pathToGraphFile)


    pathToGraphFile - damit ist der Pfad zur JSon gemeint oder?


    Hab die in der meta stehen, in der Resource eingebunden und bekomme nur false returned. Was könnte ich falsch machen?

  • EDIT: Ok, da scheint es ein Problem mit OOP zu geben:


    Das Funktioniert: Loaded graph! (Took 171ms) Graph ID: 1

    Lua
    local id = loadPathGraph("res/paths/sa_nodes.json")


    Das Funktioniert NICHT: Bad argument @ loadPathGraph

    Lua
    self.pathFile = "res/paths/sa_nodes.json"
    local id = loadPathGraph(self.pathFile)


    Trotzdem, danke damit kann ich leben! :D

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!