Dynamisches GPS System + Tacho | SQLite

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hey,
    Aus ganz viel Langeweile dachte ich mir mal ich schrieb mal ein Dynamisches GPS System mit passendem Tacho.
    Ich weiß, es wird schon sehr viele Navigations Systeme geben, aber naja meine Langeweile war dadurch weg von daher.



    Funktionsumfang:
    Rcon Admin:
    - Wegpunkte erstellen
    - Wegpunkte editieren (Name, Position)
    - Wegpunkte löschen


    User
    Können sich zu den erstellen Wegpunkten einen Checkpoint anzeigen lassen.
    Über den Beiliegenden Tacho kann ebenfalls die Entfernung bestimmt werden, sofern er im Gamemode aktiviert wurde.



    Speicherung
    Als Speicherungsmethode habe ich schlicht SQLite genommen, da es schnell für kleine Datenmengen ist,
    und man nicht extra z.B. auf die verschiedenen MySQL Plugins achten muss.



    Screens
    Befinden sich im Dateianhang.



    Installation
    Um die Include zu benutzen muss sie im Gamemode eingebunden werden.
    Davor sind aber noch 1-2 Definierungen nötig:

    #define MAX_GPS 20 //definiert die Maximale anzahl an Wegpunkten
    #define GPSTacho //Aktiviert den beiliegenden Tacho, falls nicht benötigt einfach nicht definieren.
    #include <gps>



    Download
    Pastebin
    Datei befindet sich auch im Dateianhang.



    Schlussworte
    Das ist ebenfalls das erste mal das ich mit Includes arbeite, also sollte es da verbesserungs vorschläge oder Kritik geben, immer her damit.
    Ansonsten hoffe ich das es Gefällt und wünsche viel Spaß damit.


    MfG Slash

  • Ich hätte da paar Tipps:


    1. Du erstellst immer erneut den String mit den GPS Punkten warum nicht einfach einen globalen string nutzen und die GPS Punkte cachen , bedeutet das du das ganze dann aktualisierst
    wenn ein neuer Punkt hinzugefügt wird oder nicht.


    2. #pragma unused params kann man benutzen ist nur ein unnötiger lückenfüller


    3.
    dialog[MAX_PLAYERS],select[MAX_PLAYERS],NavActive[MAX_PLAYERS],NavActiveID[MAX_PLAYERS];


    könntest du durch ein enum verschönern, ist zwar nicht nötig, aber wirkt doch viel strukturierter.


    4. Die Selectid kannst du auch "umgehen" in dem du einfach das Listitem nimmst, falls du ein Listitem anklickst wird der Inhalt an inputtext übergeben
    oder du gibst dem ganzen eine Auflistung von 1 bis ... und greifst auf den Array mit den Daten zu , jedoch musst die die Zahl vom string extrahieren.


    5. Du kannst ja noch den Bug mit den Textdraws fixen also Umlauten.



    native __PlayerTextDrawSetString(playerid, PlayerText:playertextdraw, string[], font=2) = PlayerTextDrawSetString;
    stock _PlayerTextDrawSetString(playerid, PlayerText:playertextdraw, string[], font=2) {
    _encoding(string,font);
    return __PlayerTextDrawSetString(playerid,playertextdraw,string);
    }
    #if defined _ALS_PlayerTextDrawSetString
    #undef PlayerTextDrawSetString
    #else
    #define _ALS_PlayerTextDrawSetString
    #endif
    #define PlayerTextDrawSetString _PlayerTextDrawSetString
    stock _encoding(string[],font)
    {
    switch(font){
    case 0,1:{
    for(new i;;++i){
    switch(string[i]){
    case EOS: break;
    case 'Ä':string[i] = '\131;';
    case 'Ö':string[i] = '\145;';
    case 'Ü':string[i] = '\149;';
    case 'ä':string[i] = '\154;';
    case 'ö':string[i] = '\168;';
    case 'ü':string[i] = '\172;';
    }
    }
    }case 2,3:{
    for(new i;;++i){
    switch(string[i]){
    case EOS: break;
    case 'Ä','ä':string[i] = '\216;';
    case 'Ö','ö':string[i] = '\230;';
    case 'Ü','ü':string[i] = '\234;';
    }
    }
    }
    }
    }

  • IPrototypeI:
    Ich arbeite mal die punkte ab^^


    Zu 1.
    Was genau meinst du mit jedes mal nen neuen String? Weiß grad nicht was du meinst.


    Zu 2.
    Wollte damit nur bezwecken das keine Warnings auftreten.


    Zu 3.
    War in erster Planung so gedacht das es in nem Enum realisiert wird, aber ich fand es bei 3 Variablen so etwas einfacher.


    Zu 4.
    Fällt mir im moment nichts ein was ich zu sagen kann ^^


    Zu 5.
    Welchen Bug meinst du denn? Ich nutze doch keine umlaute?



    Und sonst, wie siehts mit der Include an sich aus, zum Thema Hooks etc? Du kennst dich da ja bestens aus :)


  • 1. Damit ist deine neuformatierung von deinem String gemeint bei dem befehl /gpscfg und /gps


    2. Da entstehen eigentlich keine Warnings


    5. xD hab ich irgendwie verpeilt in dem Zusammenhang mit deinem GPS System, jedoch könnte man noch das Ziel des zu suchenden Ortes einbinden.

  • @NicoWiss:
    Danke :) Ist aber nicht das erste mal, unter meinen Werken im Profil findest noch viel älteres Zeugs mit SQLite ^^


    @
    Meinst du das hier z.B. mit formatieren?

    format(string,128,"{FFFFFF}Gebe nun den neuen Namen für den Wegpunkt {0068C2}%s {FFFFFF}an",gps[select[playerid]][Name]);


    //Oder die auflistung
    for(;i<MAX_GPS;i++)
    {
    if(gps[i][erstellt]==true)
    {format(string,1024,"%s%s\n",string,gps[i][Name]);}
    }


    Bin da noch verwirrt was du meinst.


    zu 5.
    Was genau meinst du?

  • Ich weiß, es wird schon sehr viele Navigations Systeme geben, aber naja meine Langeweile war dadurch weg von daher.


    Es gibt fast keine Navigationssysteme die auch wirklich wie ein Navigationssystem funktionieren. Deins im übrigen auch nicht. Trotzdem sind die Namen immer irreführend.
    Ich mein, bist du schon mal mit dem Auto unterwegs gewesen und wolltest zu Punkt A, dir wurde aber keine Route angezeigt angezeigt sondern lediglich der Zielpunkt auf der Karte?


    stock CreatePlayerText(playerid)
    {
    #if defined GPSTacho
    [...]

    Ruf die Funktion doch erst gar nicht auf, wenn GPSTacho nicht definiert ist (OnPlayerConnect). Da es dann sowieso noch eine stock Funktion ist, fällt die beim kompilieren eh raus wenn sie nicht genutzt wird.

  • Kannst es gern probieren. Es ist aber a) nicht einfach und b) in PAWN (mMn) schwer umsetzbar wegen der Laufzeit der Algorithmen für ein solche Navigationssystems.

    Spoiler anzeigen
    Hab es selber mal gemacht, glaube kam bei 2000 Nodes nicht unter 50ms pro Berechnung :{


    Wenn du die Funktion nicht aufrufst und sie mit stock gekennzeichnet ist, wird die nicht kompiliert bzw "weggeworfen". Das ist nämlich der Sinn hinter stock.
    Dafür habe ich sogar mal Tutorial geschrieben ... [TUT] Der Mythos stock