[jTuT] Fraktions-Fahrzeug-System mit Dini 1.6

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
  • [jTuT] Fraktions-Fahrzeug-System mit Dini 1.6





    Hallo zusammen,
    da mir einige Male die Frage gestellt wurde, ob ich zu dem Fraktions-Fahrzeug-System basierend auf MySQL auch eines auf Dini basierend machen oder zeigen könnte, 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 Dateien, sowie das Laden und das Speichern der Fahrzeuge erklärt. Am Ende haben wir ein komplett funktionsfähiges Fraktions-Fahrzeug-System welches auf DracoBlue's Dini 1.6 basiert. Falls Du die Include noch nicht hast, lade es Dir bitte jetzt herunter und füge sie 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:

    • Erstelle bitte als erstes im scriptfiles-Ordner deines Server den Ordner, in dem später die Fraktions-Fahrzeuge gespeichert werden. Wir nennen ihn "fracVehicles".
    • Füge anschließend, falls Du das noch nicht hast, die Dini-Include ganz oben in Deinen Code ein:

      C
      #include <Dini>


    • Zuerst müssen wir uns überlegen, welche Daten wir in der Datei 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
      Natürlich können weitere Daten beliebig hinzugefügt werden.
    • Außerdem benötigen wir einen Speicherplatz für die später erstellten Fahrzeuge, das machen wir nach 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)).


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

    • Jetzt erstellen wir die Funktion, die zum Serverstart die Daten aus den Dini-Datein lädt.
      Hinweis: Ich verwende "floatstr" anstatt dini_Float, da dini_Float einen Tag-Mismatch verursacht.

      Füge diese Funktion ganz unten in Deinem Gamemode/Filterscript ein.


      Unter OnGameModeInit beziehungsweise OnFilterScriptInit musst Du dann folgendes einfügen:

      C
      LoadFracVehicles();


      Damit hätten wir das Laden erledigt.

    • Unser Fahrzeug wird nun also erstellt, falls es 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/OnFilterScriptInit einen Timer:

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


      Und ganz unten im Gamemode/Filterscript erstellen wir dazu das Callback:


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

      C
      SaveAllFracVehs();


      verwenden.
      Ebenso kann dort optional noch eingebaut werden, dass alle Fahrzeuge aus dem Server entfernt werden (nicht die Dateien), falls der Code beendet wird.

      C
      //Schleife durch alle Fraktions-Fahrzeuge:
      for(new i=0; i<MAX_FRAC_VEHICLES; i++)
      {
      	//Wenn das Fahrzeug existiert
      	if(fracVehicle[i][e_modelID] >= 400 && fracVehicle[i][e_modelID] <= 611)
      	{
      		DestroyVehicle(fracVehicle[i][e_vID]);
      	}
      }


      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 Speicherungen Lag entstehen, beziehungsweise 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:


      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
      SaveFracVehCheck(vehicleid);


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

      C
      new vehicleid = GetPlayerVehicleID(playerid);
      if(SaveFracVehCheck(vehicleid)) return SendClientMessage(playerid, 0x00FF00FF, "Fahrzeug geparkt.");
      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:


      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:


      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. Ich musste die Funktion strtok zu strtok2 umbenennen, da bei Dini zum Teil strtok bereits inkludiert ist, allerdings mit anderen Array-Größen.
      Die beiden Funktionen:


      Fraktions-Fahrzeuge erstellen:


      Fraktions-Fahrzeuge löschen:


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

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


    • 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)

  • Guten Abend,


    Cooles System mal Testen.
    Wird das Tuning gespeicher? Oder muss man das noch einbauen wen ja würde ich mich freuen wen Sie ein Tutorial machen könnten :)


    Du brauchst Jeffry nicht zu siezen :D (nicht böse nehmen Jeffry :) )
    Außerdem denke ich das ein Tuning für FrakCars ziemlich unnötig wäre.


    mfg :thumbup:

  • Wird das Tuning gespeicher?


    Das kannst du so machen:
    Beim Speichern:
    new tmpstr[10];
    for(new s=0; s<14; s++)
    {
    format(tmpstr, sizeof(tmpstr), "tSlot%d", s);
    dini_IntSet(path, tmpstr, GetVehicleComponentInSlot(fracVehicle[i][e_vID], s));
    }


    Beim Laden (nach CreateVehicle):
    new tmpstr[10], cmp;
    for(new s=0; s<14; s++)
    {
    format(tmpstr, sizeof(tmpstr), "tSlot%d", s);
    cmp = dini_Int(path, tmpstr);
    if(cmp > 0) AddVehicleComponent(fracVehicle[i][e_vID], cmp);
    }