[jTuT] Fraktions-Fahrzeug-System mit MySQL R39-5

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Es gibt Neuigkeiten! Ab sofort könnt ihr dem Donators Club auf Lebenszeit beitreten.
    Weitere Infos im Thema Donator's Club ab heute wieder verfügbar!

    • [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-5

      [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-5




      Hallo zusammen,
      da mir in letzter Zeit die Frage nach einem Fraktions-Fahrzeug-System basierend auf dem aktuellen (Stand 08/2016) MySQL R39-5 Plugin häufig aufgefallen ist, und ich kein vernünftiges Tutorial gefunden habe, poste ich jetzt selbst eines. Gerne kann dieser Thread auch für Fragen bezüglich dem System oder eventuellen Änderungen verwendet werden.


      Voraussetzungen:
      • Einzigste Voraussetzung für dieses Tutorial ist ein vorhandenes Fraktionssystem


      Kurzer Überblick:
      • Dieses Tutorial beschreibt und erklärt die Erstellung von Fahrzeugen, die nur von einer bestimmten Fraktion verwendet werden können. Außerdem wird der Aufbau der Tabelle in der Datenbank, sowie das Laden und das Speichern der Fahrzeuge erklärt. Am Ende haben wir ein komplett funktionsfähiges Fraktions-Fahrzeug-System welches auf BlueG's MySQL Plugin Version R39-5 basiert. Falls Du das Plugin noch nicht hast, lade es Dir bitte jetzt herunter und füge es entsprechend in Deinen Server ein.
        Es ist zu beachten, dass die Codes ganz bewusst mit englischen Variablennamen versehen worden sind, da dies der Einheitlichkeit und Allgemeinverständlichkeit eines Codes dient. Kommentare habe ich auf deutsch gehalten.




      Wir arbeiten uns durch den Code:
      • Zuerst müssen wir uns überlegen, welche Daten wir in der Datenbank speichern möchten. Bei diesem Fahrzeug-System nehmen wir der Einfachheit halber die gängingsten Daten, die da wären:
        Model-ID, X, Y, Z, Rotation, Farbe1, Farbe2 und die FraktionsID
        Außerdem benötigen wir eine Spalte ID die als Primary Key definiert wird.
        Natürlich können weitere Daten beliebig hinzugefügt werden. Damit das Ganze auch ohne Probleme funktioniert, selbst wenn die Tabelle (aus Versehen?) gelöscht wird, erstellen wir die Tabelle automatisch über den Code. Hierzu verwenden wir die folgende Funktion:

        C-Quellcode

        1. CreateFVTable()
        2. {
        3. new query[512];
        4. format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS `FracVehicles` (");
        5. format(query, sizeof(query), "%s`ID` int(11) NOT NULL PRIMARY KEY,", query);
        6. format(query, sizeof(query), "%s `ModelID` int(11) NOT NULL DEFAULT '0',", query);
        7. format(query, sizeof(query), "%s `PosX` float NOT NULL DEFAULT '0',", query);
        8. format(query, sizeof(query), "%s `PosY` float NOT NULL DEFAULT '0',", query);
        9. format(query, sizeof(query), "%s `PosZ` float NOT NULL DEFAULT '0',", query);
        10. format(query, sizeof(query), "%s `PosA` float NOT NULL DEFAULT '0',", query);
        11. format(query, sizeof(query), "%s `Color1` int(11) NOT NULL DEFAULT '0',", query);
        12. format(query, sizeof(query), "%s `Color2` int(11) NOT NULL DEFAULT '0',", query);
        13. format(query, sizeof(query), "%s `FracID` int(11) NOT NULL DEFAULT '-1'", query);
        14. format(query, sizeof(query), "%s) ENGINE=InnoDB DEFAULT CHARSET=latin1;", query);
        15. //handle = die Connection Handle ID die vor mysql_connect steht.
        16. mysql_tquery(handle, query);
        17. return 1;
        18. }
        Alles anzeigen




        Die Tabelle sieht dann in der Datenbank so aus:

        (Quelle: Eigener Screenshot - phpMyAdmin)
      • Dazu erstellen wir auch gleich noch die später benötigte Funktion LoadFracVehicles(), in diese packen wir die obige Funktion:

        C-Quellcode

        1. LoadFracVehicles()
        2. {
        3. CreateFVTable();
        4. //Hier folgt später mehr.
        5. return 1;
        6. }



        Beide Funktionen musst Du ganz unten in Deinem Gamemode einfügen.
        Unter OnGameModeInit (bzw. OnFilterScriptInit) musst Du dann folgendes einfügen:

        C-Quellcode

        1. LoadFracVehicles();

      • Startest Du jetzt den Server, dann wird die Tabelle direkt in der Datenbank erstellt (falls sie noch nicht existiert), natürlich ohne Daten.
        Jetzt benötigen wir noch einen Speicherplatz für die später erstellten Fahrzeuge, das machen wir mit einem Enum und einer zweidimensionalen Variable. Dazu benötigen wir noch einen Maximal-Wert, den wir hier mit 10 definieren, das kann aber beliebig geändert werden (beachte das Limit an maximal erstellbaren Fahrzeugen (MAX_VEHICLES)).

        C-Quellcode

        1. #define MAX_FRAC_VEHICLES 10
        2. enum fracVehEnum {
        3. e_modelID,
        4. Float:e_x,
        5. Float:e_y,
        6. Float:e_z,
        7. Float:e_a,
        8. e_color1,
        9. e_color2,
        10. e_fracID,
        11. e_vID
        12. };
        13. new fracVehicle[MAX_FRAC_VEHICLES][fracVehEnum];
        Alles anzeigen




        Daten können entweder direkt in die Datenbank eingetragen werden, oder mit den Befehlen erstellt/gelöscht werden, die wir später zusammen erstellen.
        In der Datenbank sieht das dann später zum Beispiel so aus:

        (Quelle: Eigener Screenshot - phpMyAdmin)
      • Jetzt nehmen wir uns die Funktion von vorhin wieder her und erweitern sie um die Funktion Daten aus der neuen Tabelle zu laden.

        C-Quellcode

        1. LoadFracVehicles()
        2. {
        3. CreateFVTable();
        4. //Hier folgt jetzt mehr.
        5. return 1;
        6. }



        Wir bauen dort nun eine Anweisung ein, die uns die Daten aus der Datenbank holt:

        C-Quellcode

        1. LoadFracVehicles()
        2. {
        3. CreateFVTable();
        4. //handle = die Connection Handle ID die vor mysql_connect steht.
        5. //Es wird ein SELECT Query an die Datenbank gesendet, diese gibt über das Callback LoadFracVehicles_Data
        6. //die Daten im Cache zurück.
        7. mysql_tquery(handle, "SELECT * FROM FracVehicles ORDER BY ID ASC", "LoadFracVehicles_Data");
        8. return 1;
        9. }

      • Dazu benötigen wir natürlich das Callback, in welchem wir dann die Daten aus dem Cache auslesen:

        C-Quellcode

        1. forward LoadFracVehicles_Data();
        2. public LoadFracVehicles_Data()
        3. {
        4. //Deklaration neuer temporärer Variablen:
        5. new rows, id, createdVehs;
        6. //Anzahl der gelesenen Datensätze abfragen:
        7. rows = cache_num_rows();
        8. //Schleife durch alle Datensätze:
        9. for(new i=0; i<rows; i++)
        10. {
        11. //Fahrzeug existiert in der Datenbank, wir laden die Daten jetzt aus dem Cache.
        12. id = cache_get_field_content_int(i, "ID");
        13. //Um Fehler bei der Verarbeitung zu vermeiden:
        14. if(id < 0 || id >= MAX_FRAC_VEHICLES) continue;
        15. //Danach die restlichen Daten laden. Unser Index (der Wert mit dem wir auf das
        16. //Fahrzeug in der Datenbank zugreifen) ist die "ID".
        17. fracVehicle[id][e_modelID] = cache_get_field_content_int(i, "ModelID");
        18. fracVehicle[id][e_x] = cache_get_field_content_float(i, "PosX");
        19. fracVehicle[id][e_y] = cache_get_field_content_float(i, "PosY");
        20. fracVehicle[id][e_z] = cache_get_field_content_float(i, "PosZ");
        21. fracVehicle[id][e_a] = cache_get_field_content_float(i, "PosA");
        22. fracVehicle[id][e_color1] = cache_get_field_content_int(i, "Color1");
        23. fracVehicle[id][e_color2] = cache_get_field_content_int(i, "Color2");
        24. fracVehicle[id][e_fracID] = cache_get_field_content_int(i, "FracID");
        25. //Zur Sicherheit fragen wir hier nun ab, ob das angegebene Modell auch existiert,
        26. //sollte das nicht der Fall sein, dann wird das Fahrzeug nicht erstellt.
        27. if(fracVehicle[id][e_modelID] >= 400 && fracVehicle[id][e_modelID] <= 611)
        28. {
        29. //Nachdem das Fahrzeug geladen wurde, wird es erstellt.
        30. fracVehicle[id][e_vID] = CreateVehicle(fracVehicle[id][e_modelID], fracVehicle[id][e_x], fracVehicle[id][e_y], fracVehicle[id][e_z], fracVehicle[id][e_a], fracVehicle[id][e_color1], fracVehicle[id][e_color2], -1);
        31. }
        32. else
        33. {
        34. //Falls eine nicht existierende Model-ID angegeben wurde, geben wir eine Information aus.
        35. printf("[Error] Model-ID %d existiert nicht (ID: %d).", fracVehicle[id][e_modelID], id);
        36. }
        37. //Zur Sicherheit fragen wir noch ab, ob das Fahrzeug-Limit noch nicht überschritten wurde.
        38. //Existiert ein Fahrzeug mit der höchsten ID, dann kann kein weiteres mehr erstellt werden.
        39. if(GetVehicleModel(MAX_VEHICLES-1) != 0) return print("Es können keine weiteren Fahrzeuge geladen werden, Limit (MAX_VEHICLES) erreicht.");
        40. //Zur weiteren Sicherheit prüfen wir noch, ob die maximale Anzahl an Fraktions-Fahrzeugen erreicht ist.
        41. createdVehs++;
        42. if(createdVehs == MAX_FRAC_VEHICLES) return print("Es können keine weiteren Fahrzeuge geladen werden, Limit (MAX_FRAC_VEHICLES) erreicht.");
        43. }
        44. return 1;
        45. }
        Alles anzeigen



        Damit hätten wir das Laden erledigt. Dieses Callback muss ebenfalls ganz unten im Gamemode eingefügt werden.
      • Unser Fahrzeug wird nun also erstellt, falls es in der Datenbank existiert. Jetzt müssen wir die Daten natürlich nach einer eventuellen Änderung speichern lassen. Dazu eignet sich zum Beispiel ein Timer, der jede Minute alle Fahrzeuge speichert.
        Dazu erstellen wir bei OnGameModeInit einen Timer:

        C-Quellcode

        1. SetTimer("SaveAllFracVehs", 60000, true); //Timer wird alle 60 Sekunden ausgeführt



        Und ganz unten im Gamemode erstellen wir wieder das Callback:

        C-Quellcode

        1. forward SaveAllFracVehs();
        2. public SaveAllFracVehs()
        3. {
        4. //Deklaration neuer temporärer Variablen:
        5. new query[256];
        6. //Schleife durch alle Fraktions-Fahrzeuge
        7. for(new i=0; i<MAX_FRAC_VEHICLES; i++)
        8. {
        9. //Wenn das Fahrzeug existiert
        10. if(fracVehicle[i][e_modelID] >= 400 && fracVehicle[i][e_modelID] <= 611)
        11. {
        12. //Wir fragen die Position des Fahrzeugs ab:
        13. GetVehiclePos(fracVehicle[i][e_vID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z]);
        14. GetVehicleZAngle(fracVehicle[i][e_vID], fracVehicle[i][e_a]);
        15. //Und wir erstellen das Query:
        16. format(query, sizeof(query), "UPDATE FracVehicles SET ModelID = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosA = '%f', Color1 = '%d', Color2 = '%d', FracID = '%d' WHERE ID = '%d'",
        17. fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID], i);
        18. //handle = die Connection Handle ID die vor mysql_connect steht.
        19. mysql_tquery(handle, query);
        20. }
        21. }
        22. return 1;
        23. }
        Alles anzeigen



        Diese Funktion kann natürlich auch bei OnGameModeExit eingefügt werden, falls gewünscht.
        Dazu einfach

        C-Quellcode

        1. SaveAllFracVehs();



        verwenden.

        Hinweis: Je nach dem wie viele Fahrzeuge erstellt werden macht es mehr oder weniger Sinn einen Timer zu verwenden. Bei 100 Fahrzeugen ist das kein Problem, hat man aber zum Beispiel 1000 Fahrzeuge, dann kann aufgrund der 1000 gleichzeitig ausgeführten Queries Lag entstehen, bzw. der Server kurzzeitig eingefroren sein. Dann sollte man von dieser Methode abstand nehmen und nur auf die nachfolgende Methode zurückgreifen.
      • Wenn wir schon dabei sind, dann können wir auch gleich noch eine Funktion erstellen, die ein Fahrzeug anhand seiner Vehicle ID speichern kann, sofern es ein Fraktions-Fahrzeug ist. Diese Funktion sieht dann so aus:

        C-Quellcode

        1. stock SaveFracVehCheck(vehicleid)
        2. {
        3. //Deklaration neuer temporärer Variablen:
        4. new query[256];
        5. //Schleife durch alle Fraktions-Fahrzeuge
        6. for(new i=0; i<MAX_FRAC_VEHICLES; i++)
        7. {
        8. //Wenn die vehicleid die gleiche ist, wie die des Fraktions-Fahrzeugs
        9. if(fracVehicle[i][e_vID] == vehicleid)
        10. {
        11. //Wir fragen die Position des Fahrzeugs ab:
        12. GetVehiclePos(fracVehicle[i][e_vID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z]);
        13. GetVehicleZAngle(fracVehicle[i][e_vID], fracVehicle[i][e_a]);
        14. //Und wir erstellen das Query:
        15. format(query, sizeof(query), "UPDATE FracVehicles SET ModelID = '%d', PosX = '%f', PosY = '%f', PosZ = '%f', PosA = '%f', Color1 = '%d', Color2 = '%d', FracID = '%d' WHERE ID = '%d'",
        16. fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID], i);
        17. //handle = die Connection Handle ID die vor mysql_connect steht.
        18. mysql_tquery(handle, query);
        19. return 1; //Es gibt ja keine zwei gleichen Fahrzeuge
        20. }
        21. }
        22. return 0; //Fahrzeug ist kein Fraktions-Fahrzeug
        23. }
        Alles anzeigen



        Das können wir, wenn wir es schon haben, bei OnPlayerExitVehicle einbauen, damit das Fahrzeug gespeichert wird, wenn ein Spieler es verlässt.
        Dazu einfach bei OnPlayerExitVehicle das einfügen:

        C-Quellcode

        1. SaveFracVehCheck(vehicleid);



        Alternativ kann man auch einen /parken Befehl erstellen, durch den man die neue Position speichert.
        Das könnte dann so aussehen:

        C-Quellcode

        1. new vehicleid = GetPlayerVehicleID(playerid);
        2. if(SaveFracVehCheck(vehicleid)) return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug geparkt.");
        3. else return SendClientMessage(playerid, 0xFF0000FF, "Dieses Fahrzeug kann nicht geparkt werden.");



        Je nach Server ist das eine oder das andere sinnvoll. Man kann es aber auch ganz anders machen, das bleibt jedem selbst überlassen.
      • Falls sich die Farben der Fahrzeuge ändern können, dann müssen an entsprechender Stelle auch die Werte der Variablen geändert werden.
        Dies macht man beispielsweise so:

        C-Quellcode

        1. //Eine Schleife durch alle Fraktions-Fahrzeuge
        2. for(new i=0; i<MAX_FRAC_VEHICLES; i++)
        3. {
        4. //Wenn die vehicleid die gleiche ist, wie die des Fraktions-Fahrzeugs
        5. if(fracVehicle[i][e_vID] == vehicleid)
        6. {
        7. //Dann ändere die Farbe.
        8. fracVehicle[i][e_color1] = color1;
        9. fracVehicle[i][e_color1] = color2;
        10. break; //Es gibt ja keine zwei gleichen Fahrzeuge
        11. }
        12. }
        Alles anzeigen



        Je nach dem an welcher Stelle das bei Dir im Code relevant ist, das können viele Stellen sein, muss aber nicht.
        Damit hätten wir den größten Teil eigentlich auch schon hinter uns. Es fehlt nur noch eine Kleinigkeit.
      • In diesem Tutorial geht es ja darum, Fraktions-Fahrzeuge zu erstellen. Momentan kann unsere Fahrzeuge aber noch jeder betreten, daher müssen wir jetzt bei OnPlayerEnterVehicle noch folgendes hinzufügen:

        C-Quellcode

        1. //Eine Schleife durch alle Fraktions-Fahrzeuge
        2. for(new i=0; i<MAX_FRAC_VEHICLES; i++)
        3. {
        4. //Wenn die vehicleid die gleiche ist, wie die des Fraktions-Fahrzeugs
        5. if(fracVehicle[i][e_vID] == vehicleid)
        6. {
        7. //Jetzt brauchen wir die Variable, mit der Dein vorher bereits existierendes Fraktions-System arbeitet.
        8. //Ich nehme jetzt einfach eine Beispiel-Variable, diese musst Du selbst mit der ersetzen,
        9. //die Dein System verwendet.
        10. //Es geht um diese Variable: PlayerInfo[playerid][pFraction]
        11. if(PlayerInfo[playerid][pFraction] != fracVehicle[i][e_fracID])
        12. {
        13. //Wenn der Spieler nicht in der Fraktion ist, die das Fahrzeug verwenden darf,
        14. //dann darf er es nicht betreten.
        15. TogglePlayerControllable(playerid, false);
        16. TogglePlayerControllable(playerid, true);
        17. SendClientMessage(playerid, 0xFF0000FF, "Du bist nicht in der Fraktion, die dieses Fahrzeug verwenden darf.");
        18. }
        19. break; //Es gibt ja keine zwei gleichen Fahrzeuge
        20. }
        21. }
        Alles anzeigen



        Wie gesagt, dieser Code muss bei OnPlayerEnterVehicle eingefügt werden.
      • Jetzt könnten wir eigentlich den Server starten und alles funktioniert einwandfrei. Allerdings müssen wir die Daten für die Fraktions-Fahrzeuge immer mühselig manuell in die Datenbank eintragen, und das macht ja recht wenig Sinn. Deshalb erstellen wir jetzt noch einen Befehl um Fraktions-Fahrzeuge im Spiel zu erstellen und einen Befehl um Fraktions-Fahrzeuge zu löschen. Im Beispiel nutze ich ocmd. Falls Du einen anderen verwendest kannst du dies einfach umschreiben.
        Außerdem verwende ich in den Beispielen strtok, da dies ohne Plugin realsierbar ist und somit eine höhere Funktionalität gewährleistet.
        Die beiden Funktionen:

        C-Quellcode

        1. stock strtok(const string[], &index) //©Jeffry
        2. {
        3. new result[20], length = strlen(string), i = index;
        4. while ((i < length) && (string[i] == ' ')) i++;
        5. strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
        6. index++;
        7. return result;
        8. }
        9. stock IsNumeric(string[])
        10. {
        11. for (new i = 0, j = strlen(string); i < j; i++)
        12. {
        13. if ((string[i] > '9' || string[i] < '0')) return 0;
        14. }
        15. return 1;
        16. }
        Alles anzeigen




        Fraktions-Fahrzeuge erstellen:

        C-Quellcode

        1. ocmd:fferstellen(playerid, params[])
        2. {
        3. //Zuerst fragen wir ab, ob wir noch Fahrzeuge erstellen können
        4. if(GetVehicleModel(MAX_VEHICLES-1) != 0) return SendClientMessage(playerid, 0xFF0000FF, "Es können keine weiteren Fahrzeuge erstellt werden, Limit (MAX_VEHICLES) erreicht.");
        5. //Wir deklarieren die benötigten temporären Variablen.
        6. new tmp[20], idx, model, fID, color1 = -1, color2 = -1;
        7. //Anschließend teilen wir mit strtok die eingegebenen Paramater auf und wandeln sie in eine Zahl um.
        8. //Falls etwas falsches eingegeben wurde, geben wir eine entsprechende Meldung zurück.
        9. tmp = strtok(params, idx);
        10. if(!strlen(tmp) || !IsNumeric(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "Verwendung: /fferstellen [Model] [FraktionsID] [opt:Farbe1] [opt:Farbe2]");
        11. model = strval(tmp);
        12. //Eine solche Abfrage kann man auch für nachfolgende FraktionsID (fID) machen, falls gewünscht.
        13. if(model < 400 || model > 611) return SendClientMessage(playerid, 0xFF0000FF, "Error: Model ID existiert nicht.");
        14. tmp = strtok(params, idx);
        15. if(!strlen(tmp) || !IsNumeric(tmp)) return SendClientMessage(playerid, 0xFF0000FF, "Verwendung: /fferstellen [Model] [FraktionsID] [opt:Farbe1] [opt:Farbe2]");
        16. fID = strval(tmp);
        17. tmp = strtok(params, idx);
        18. if(strlen(tmp) && IsNumeric(tmp)) color1 = strval(tmp);
        19. tmp = strtok(params, idx);
        20. if(strlen(tmp) && IsNumeric(tmp)) color2 = strval(tmp);
        21. //Sind alle Parameter korrekt übergeben worden, dann suchen wir uns einen freien Index in den wir das Fraktions-Fahrzeug speichern können.
        22. for(new i=0; i<MAX_FRAC_VEHICLES; i++)
        23. {
        24. //Frei:
        25. if(fracVehicle[i][e_vID] == 0)
        26. {
        27. //Daten werden übergeben
        28. new Float:x, Float:y, Float:z, Float:a;
        29. GetPlayerPos(playerid, x, y, z);
        30. GetPlayerFacingAngle(playerid, a);
        31. fracVehicle[i][e_modelID] = model;
        32. fracVehicle[i][e_x] = x;
        33. fracVehicle[i][e_y] = y;
        34. fracVehicle[i][e_z] = z;
        35. fracVehicle[i][e_a] = a;
        36. fracVehicle[i][e_color1] = color1;
        37. fracVehicle[i][e_color2] = color2;
        38. fracVehicle[i][e_fracID] = fID;
        39. //und anschließend in die Datenbank geschrieben.
        40. new query[256];
        41. format(query, sizeof(query), "INSERT INTO FracVehicles (ID, ModelID, PosX, PosY, PosZ, PosA, Color1, Color2, FracID) VALUES ('%d', '%d', '%f', '%f', '%f', '%f', '%d', '%d', '%d')",
        42. i, fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], fracVehicle[i][e_fracID]);
        43. mysql_tquery(handle, query);
        44. //Zuletzt wird dann noch das Fahrzeug erstellt und der Spieler in das Fahrzeug gesetzt.
        45. fracVehicle[i][e_vID] = CreateVehicle(fracVehicle[i][e_modelID], fracVehicle[i][e_x], fracVehicle[i][e_y], fracVehicle[i][e_z], fracVehicle[i][e_a], fracVehicle[i][e_color1], fracVehicle[i][e_color2], -1);
        46. PutPlayerInVehicle(playerid, fracVehicle[i][e_vID], 0);
        47. return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug gespeichert.");
        48. }
        49. }
        50. return SendClientMessage(playerid, 0xFF0000FF, "Error: Limit für Fraktions-Fahrzeuge erreicht.");
        51. }
        Alles anzeigen




        Fraktions-Fahrzeuge löschen:

        C-Quellcode

        1. ocmd:ffloeschen(playerid, params[])
        2. {
        3. //Wir deklarieren die benötigte temporäre Variable.
        4. new vid;
        5. //Wenn der Spieler keine Vehicle-ID eingibt wird die gelöscht, in der sich der Spieler befindet,
        6. //ansonsten die eingegebene ID.
        7. if(!IsNumeric(params) || !strlen(params)) return SendClientMessage(playerid, 0xFF0000FF, "Error: Nutze: /ffloeschen [Vehicle ID]");
        8. vid = strval(params);
        9. if(vid <= 0) return SendClientMessage(playerid, 0xFF0000FF, "Error: Vehicle-ID ist kein Fraktions-Fahrzeug.");
        10. for(new i=0; i<MAX_FRAC_VEHICLES; i++)
        11. {
        12. //Eingegebene ID und die des Fraktions-Fahrzeugs stimmen überein.
        13. if(fracVehicle[i][e_vID] == vid)
        14. {
        15. //Daten werden entfernt
        16. fracVehicle[i][e_modelID] = 0;
        17. fracVehicle[i][e_x] = 0.0;
        18. fracVehicle[i][e_y] = 0.0;
        19. fracVehicle[i][e_z] = 0.0;
        20. fracVehicle[i][e_a] = 0.0;
        21. fracVehicle[i][e_color1] = 0;
        22. fracVehicle[i][e_color2] = 0;
        23. fracVehicle[i][e_fracID] = -1;
        24. //und anschließend in der Datenbank gelöscht.
        25. new query[128];
        26. format(query, sizeof(query), "DELETE FROM FracVehicles WHERE ID = '%d'", i);
        27. mysql_tquery(handle, query);
        28. DestroyVehicle(fracVehicle[i][e_vID]);
        29. fracVehicle[i][e_vID] = 0;
        30. return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug gelöscht.");
        31. }
        32. }
        33. return SendClientMessage(playerid, 0xFF0000FF, "Error: Vehicle-ID ist kein Fraktions-Fahrzeug.");
        34. }
        Alles anzeigen




        Und wenn wir schon dabei sind machen wir auch gleich noch den /parken Befehl komplett:

        C-Quellcode

        1. ocmd:parken(playerid)
        2. {
        3. if(!IsPlayerInAnyVehicle(playerid)) return SendClientMessage(playerid, 0xFF0000FF, "Du bist in keinem Fahrzeug.");
        4. new vehicleid = GetPlayerVehicleID(playerid);
        5. if(SaveFracVehCheck(vehicleid)) return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug geparkt.");
        6. else return SendClientMessage(playerid, 0xFF0000FF, "Dieses Fahrzeug kann nicht geparkt werden.");
        7. }

      • Damit wären wir durch. Es sind alle notwendigen Teile im Code vorhanden.
        Ich hoffe, das System funktioniert bei Dir jetzt wie bei mir ohne Probleme. Wenn nicht, oder wenn irgendwelche Fragen auftreten, bzw. aufgetreten sind, darfst Du diese gerne hier oder in der Scripting Base stellen.




      Für die Faulen unter uns:
      • Wie immer habe ich für die Faulen unter uns einen fertigen FilterScript.







      Natürlich kann man das System weiter ausbauen, und weitere Daten hinzufügen, je nach dem was für den jeweiligen Server passend ist. Das könnten gefahrene Kilometer, Nummerntafeln, Tunings, etc... sein, da gibt es sehr viele Möglichkeiten. Diese kann man alle zimelich einfach hinzufügen. Falls Probleme auftreten, wie gesagt, einfach fragen!


      Viel Spaß damit! :)

      Beste Grüße,
      Jeffry 8)

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von Jeffry () aus folgendem Grund: 22.03.2015: Dynamische Fahrzeugerstellung | 10.04.2015: Fehler in LoadFracVehicles_Data() behoben | 22.06.2015: PasteBin-Bild repariert | 08.11.2015: Code-Formatierung an WBB4 angepasst | 03.08.2016: Textanpassung auf R39-5 | 30.12.2018: Screenshots repariert

    • Morimoto schrieb:

      Ein sehr schönes Tutorial. Meine Frage wäre jetzt, ob man mit einem ähnlichen Grundaufbau auch die Löhne einstellen könnte. Heißt die Löhne sind in einer Datenbank definiert, und man kann sie mit einem Befehl beliebig ändern, und es wird

      Danke.
      Ja, im Grundprinzip (Laden/Speichern) ist das genau gleich.

      FileZilla schrieb:

      Wie man von Jeffry kennt das reinste Copy & Paste 8)

      Danke dir. ;)


      Information:
      In den nächsten Tagen werde ich einige Änderungen am Tutorial vornehmen um es dynamischer zu gestalten.
    • Super Tutorial Jeff ! 8)

      Hätten wir das bei mir eigentlich lassen können und ich hätte es mit deinem Tutorial machen können :p

      Weiter so, ein Haussystem auf diese Art ist mit deinem Tutorial auch machbar stimmts?


      Mit freundlichen Grüßen

      In bearbeitung.


      San Francisco Reallife 35%




      Die heutigen Noobs, sind die Profis von morgen! :thumbup:

      Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

    • Plugins laufen nicht auf 100% aller Maschinen ohne Probleme. Dass es bei dir läuft heißt nicht, dass es auch auf allen anderen Maschinen läuft.
      Außerdem funktioniert sscanf nicht immer gleich, und variiert von Version zu Version. Strtok ist immer gleich und funktioniert immer.

      Sscanf darf ja gerne verwendet werden, wer will kann es ja entsprechend ändern, ist ja nicht verboten. Deshalb weise ich ja darauf hin.
    • Erstmal sehr gutes Tutorial @Jeffry. Sehr gut erklärt und beschrieben.
      Ich habe nur einen kleinen Fehler den ich mir nicht erklären kann.
      Undzwar, wenn ich den /park Befehl nutze wird alles richtig in die Datenbank übergeben außer die Y Achse. In der Konsole wird sie richtig geprinted nur nicht übertragen.
      Hier der code:

      PAWN-Quellcode

      1. stock SaveFracVehCheck(vehicleid)
      2. {
      3. new query[256];
      4. for(new i=0;i<MAX_FRAC_VEHICLES;i++)
      5. {
      6. if(FracVehicle[i][f_vID] == vehicleid)
      7. {
      8. GetVehiclePos(FracVehicle[i][f_vID],FracVehicle[i][f_x],FracVehicle[i][f_y],FracVehicle[i][f_z]);
      9. printf("Y=%f",FracVehicle[i][f_y]);
      10. GetVehicleZAngle(FracVehicle[i][f_vID],FracVehicle[i][f_a]);
      11. format(query,sizeof(query),"UPDATE fraccars SET Modelid='%i',PosX='%f',PosY='%f',PosY='%f',PosA='%f',Color1='%i',Color2='%i',Fracid='%i' WHERE id='%i'",
      12. FracVehicle[i][f_modelID],FracVehicle[i][f_x],FracVehicle[i][f_y],FracVehicle[i][f_z],FracVehicle[i][f_a],FracVehicle[i][f_color1],FracVehicle[i][f_color2],FracVehicle[i][f_fracID],i);
      13. /*mysql_format(Handle,query,sizeof(query),"UPDATE fraccars SET Modelid='%i',PosX='%f',PosY='%f',PosY='%f',PosA='%f',Color1='%i',Color2='%i',Fracid='%i' WHERE id='%i'",
      14. FracVehicle[i][f_modelID],FracVehicle[i][f_x],FracVehicle[i][f_y],FracVehicle[i][f_z],FracVehicle[i][f_a],FracVehicle[i][f_color1],FracVehicle[i][f_color2],FracVehicle[i][f_fracID],i);*/
      15. mysql_pquery(Handle,query);
      16. return 1;
      17. }
      18. }
      19. return 0;
      20. }
      Alles anzeigen


      Struktur der Tabelle:

      Nach dem Befehl:

      In diesem Falle gibt printf aber eine ~ -1600 Koordinate aus.

      Schonmal danke im vorraus.
    • Ich hab gerade leider nicht an die Log gedacht. Aber diese gibt auch die richtigen Koordinaten aus.

      SQL-Abfrage

      1. [22:34:38] [DEBUG] mysql_pquery - connection: 1, query: "UPDATE fraccars SET Modelid='411',PosX='1472.139770',PosY='-1699", callback: "(null)", format: "(null)"

      @Mencent:

      //EDIT:
      Was ich auch gerade bemerke ist: Dass die Y Achse immer die gleiche ist egal wo man parkt.
    • Mir ist gerade aufgefallen, das du zwei mal die Position PosY abspeichern lässt (hintereinander). So muss das ganze eigentlich aussehen:

      PAWN-Quellcode

      1. format(query,sizeof(query),"UPDATE fraccars SET Modelid='%i',PosX='%f',PosY='%f',PosZ='%f',PosA='%f',Color1='%i',Color2='%i',Fracid='%i' WHERE id='%i'",

      Schau mal ob damit der Fehler behoben ist.

      EDIT:
      @CaZe:
      Jeder kann mal was übersehen, ich habe das auch nicht direkt gesehen! :fun:

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von AirM4X () aus folgendem Grund: Einen Satz hinzugefügt, ansonsten hätte es zur Verwirrung geführt!