Wie erstelle ich ein Dynamisches Car System? (Basis)

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
  • Hallo,


    hier in diesem Tutorial erkläre ich euch wie ihr ein Dynamisches Car System erstellt.


    Benötigt wird:


    -Dini
    -Fortgeschrittenes PAWN wissen


    Include einbinden:


    #include <dini>


    Ganz oben unter #include <a_samp>


    Enum Struktur:


    enum Car_System
    {
    aID,
    aModel,
    Float:aX,
    Float:aY,
    Float:aZ,
    Float:aAngle,
    }


    new CarInfo[MAX_VEHICLES][Car_System];


    Hier haben wir nun eine Enum Struktur erstellt, diese enthält:


    -Die Model ID & die Car ID & die Floats X,Y,Z u. Angle


    für was brauchen wir das?


    Das wird gebraucht um das Car beim Laden an diesen Punkten zu erstellen, wenn wir jetzt aber keine Model haben wir irgendwo ein Auto gespawnt sprich ihr habt 2 Cars
    das eine ist ein Infernus das andere ein Sultan. Der Sultan ist in LS, das andere Fahrzeug hingegen in LV. Wir starten das Script neu und schwups werden die Cars an diesen Orten gespawnt aber sie haben nicht die gewünschte Model ID.


    die Car ID hingegen ist dazu da für ein Abfrage ob man Besitzer ist ( Ist hier im Tutorial nicht enthalten!) dazu wird die Car ID abfragt wer denn der Besitzer ist.


    CarInfo ist dazu da, das jedes Vehicle diese Enum Struktur bekommt.



    Speichern & Laden:


    forward SpeicherFahrzeug(carid);
    forward LadeFahrzeug(carid);


    wie die Include oben im Script einbringen



    public SpeicherFahrzeug(carid)
    {
    if(carid <= 0)
    {
    return 1;
    }
    CarInfo[carid][aModel] = GetVehicleModel(carid);
    new str[25];
    format(str, sizeof(str), "%d.car", carid);
    dini_Create(str);
    {
    dini_IntSet(str,"ID",CarInfo[carid][aID]);
    dini_FloatSet(str,"aX", CarInfo[carid][aX]);
    dini_FloatSet(str,"aY", CarInfo[carid][aY]);
    dini_FloatSet(str,"aZ", CarInfo[carid][aZ]);
    dini_FloatSet(str,"aAngle", CarInfo[carid][aAngle]);
    dini_IntSet(str,"Model",CarInfo[carid][aModel]);
    }
    return 1;
    }


    Ganz unten im Script einfügen


    hier bekommt jedes Car eine eigene Datei zugewiesen die im CMD (Weiter unten) die von der Car ID bestimmt wird ausgenommen die Car ID: 0
    sprich Fahrzeug Nummer 1 hat die Datei Nummer 1.car


    dini_IntSet speichert ein Integer z.B. Model ist ein Integer
    dini_FloatSet speichert einen Float wert
    dini_Create erstellt eine Datei :)


    (Ich verweise hiermit auf ein Dini Tutorial : [ SCRIPTING ] Dateiensystem dini - Dateien erstellen, löschen, speichern, laden)


    public LadeFahrzeug(carid)
    {
    new str[25];
    format(str, sizeof(str), "%d.car", carid);
    if(carid == 0)
    {
    return 1;
    }
    if(fexist(str))
    {
    CarInfo[carid][aID] = dini_Int(str, "ID");
    CarInfo[carid][aX] = dini_Float(str, "aX");
    CarInfo[carid][aY] = dini_Float(str, "aY");
    CarInfo[carid][aZ] = dini_Float(str, "aZ");
    CarInfo[carid][aAngle] = dini_Float(str, "aAngle");
    CarInfo[carid][aModel] = dini_Int(str, "Model");
    }
    return 1;
    }


    Ganz unten im Script einfügen


    dini_Int lädt eine Integer
    dini_Float lädt einen Float Wert herraus


    hierbei wird mit if(fexist(str)) überprüft ob die Datei existiert wenn nicht dann passiert nicht.



    for(new i = 1; i < MAX_VEHICLES; i++)
    {
    new string[32];
    format(string, sizeof(string), "%d.car", i);
    if(fexist(string))
    {
    LadeFahrzeug(i);
    CreateVehicle(CarInfo[i][aModel], CarInfo[i][aX], CarInfo[i][aY], CarInfo[i][aZ], CarInfo[i][aAngle],0, 0, -1);
    }
    }


    dies kommt unter OnGameModeInit() rein.
    hierbei wird eine ForSchleife durch gelaufen die MAX_VEHICLES entspricht (ich glaube das ist 2000) bei jeder Datei wo existiert, wird ein Fahrzeug mit der Model ID aus der Datei erstellt und genau an den X,Y,Z u. Angle Kordinaten gespawnt.



    CMD:


    new cmd[256], idx; //Strtok
    cmd = strtok(cmdtext, idx); // Strtok
    if(strcmp(cmd, "/veh", true) == 0)
    {
    new tmp[256];
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_RED, "BENUTZUNG: /veh [modelid(400-611)]");
    return 1;
    }
    new carid, Float:x, Float:y, Float:z, Float:angle, pname[MAX_PLAYER_NAME];
    GetPlayerPos(playerid, x,y,z);
    GetPlayerFacingAngle(playerid, angle);
    carid = strval(tmp);
    if(GueltigesFahrzeug(carid))
    {
    GetPlayerName(playerid,pname,sizeof(pname));
    new id = CreateVehicle(carid, x+2,y,z,angle+4,0,0,-1);
    CarInfo[id][aID] = id;
    CarInfo[id][aX] = x;
    CarInfo[id][aY] = y;
    CarInfo[id][aZ] = z;
    CarInfo[id][aAngle] = angle;
    CarInfo[id][aModel] = carid;
    SpeicherFahrzeug(id);
    SendClientMessage(playerid, COLOR_RED, "Car gespawnt!");
    }
    else
    {
    SendClientMessage(playerid, COLOR_RED, "IDs von 400 bis 611 sind nur erlaubt!");
    }
    return 1;
    }


    ich denke dies klärt sich von selbst, wenn man alles vorher durch gelesen hat das einzigste wäre, das hier die Enum Struktur die Werte zugewiesen bekommt z.B. /veh 451
    das Fahrzeug hat damit die Model ID 451.



    forward GueltigesFahrzeug(carid);


    bei wie bei den anderen Forward erfolgt die einfügung!


    public GueltigesFahrzeug(carid)
    {
    if(carid >= 400 && carid <= 611)
    {
    return 1;
    }
    return 0;
    }


    ganz Unten im Script wie die anderen Publics
    hier bei wird die eingabe abgefragt ob sie in dem Rahmen der Model IDs ist


    strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }


    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }


    Hier erfolgt keine Erklärung wenn benötigt im SAMP Wikipedia nachsehen


    Ich hoffe euch hat das Tutorial gefallen :)



    -MfG: Apoolecu

  • Ich denke sowas würde jeder hinbekommen, der etwas Ahnung vom Dynamischen Scripten hat.


    Und viel ist hier ja auch nicht erklärt von daher:


    4/10 <- Weil du dir die Mühe gemacht hast :)

  • ich finde es relativ gut von dir.... du hättest zwar noch ein wenig mehr erklären können aber so finde ich es auch schon ganz nice


    ich danke dir, denn dieses System werde ich jetzt auch nutzen




    8/10

  • C&P Tutorial. Finde ich für mich nervig, meine Meinung dazu.


    Advertising has us chasing cars and clothes, working jobs we hate so we can buy shit we don’t need.
    – Tyler Durden


    Sobald Werbung im Spiel ist, bist du, die Nutzerin, der Nutzer, das Produkt.


  • Ich habe versucht einen /parken Befehl zu machen. Jedoch speichert er nicht die Pos ._.:


    ocmd:parken(playerid,params[])
    {
    new carid = GetPlayerVehicleID(playerid);
    SaveCar(carid);
    SendClientMessage(playerid,COLOR_YELLOW,"Du hast deinen Auto erfolgreich geparkt!");
    return 1;
    }


    = 0 Errors&Warnings

  • Moin,
    die Fahrzeug sind die ganze auf dem Server sprich sie werden erstellt wenn der Server startet und werden gelöscht wenn der Server offline geht bzw. neustartet.


    Bei SpeicherFahrzeug() & LadeFahrzeug() gibt es den den Parameter CarID also musst du erst die CarID herraus finden dies geschieht mit der Funktion GetPlayerVehicleID(playerid); Sprich es müsste dann so da stehen LadeFahrzeug(GetPlayerVehicleID(playerid));


    MfG: Apoolecu

  • Ich habe jetzt einen Shop angefangen.


    Hier der Code:


    Doch leider setzt er mich nicht in das Fahrzeug.


    Ich möchte es wie folgt haben:


    Man wählt ein Auto aus, klickt auf "Kaufen", dann wird einem das Geld abgezogen, wenn man genug Geld hat. Dann wird der Spieler an einen Punkt teleportiert und in sein Auto gesetzt, das an dem Teleportationsort steht. Und beim Disconnecten, soll die Position gespeichert werden und beim Connecten geladen werden, sodass das Auto dort ist, wo man zuletzt war und nicht dort wo man auf "Kaufen" geklickt hat. Desweiteren soll jeder User nur 1 Auto haben, im Moment wird noch jedes Auto in einer neuen Datei gespeichert. Ich will, dass ein Spieler nur 1 Auto haben kann und wenn er ein neues kauft, wird sein altes mit dem neuen überschrieben, bzw. das alte gelöscht und ein neues erstellt.


    mfG [CGR]BlackJack

  • du willst den User in das Modell setzen :D tausche carid gegen ID ein :D, zu deinem Fahrzeug problem bei den User system :D speicher die CarID halt auch in der User datei wenn der User ein user kauft wird die ID überschrieben so würde ich es machen :D

  • für RPG/RL Server einfach für alles :D du kannst das Auto jederzeit löschen (einfach die Datei löschen) kannst fast alles damit machen :D brauchst nicht jedes mal via. Pawno ein Fahrzeug adden und dann einen GMX machen :) man kann dies ganz unkompliziert IG machen :D

  • for(new i = 1; i < MAX_VEHICLES; i++)
    {
    new string[32];
    format(string, sizeof(string), "%d.car", i);
    if(fexist(string))
    {
    LadeFahrzeug(i);
    CreateVehicle(CarInfo[i][aModel], CarInfo[i][aX], CarInfo[i][aY], CarInfo[i][aZ], CarInfo[i][aAngle],0, 0, -1);
    }
    }





    wo soll ich damit hin ?

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen