Job erstellung + Ab fahrbare Checkpoint

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
  • Inhalt:

    • Jobs erstellen
    • Ab fahrbare Checkpoint


    Um was geht es in diesem Tutorial ?


    Hallo,



    ich erkläre euch heute in diesem Tutorial mal kurz,
    wie ihr ganz einfach einen Job und für diesen dann einen ab fahrbaren Checkpoint erstellen könnt,
    nun dann fangen wir mal an.



    Was wird benötigt ?

    • Dini ( Zum Speichern/Laden des Spielers )
    • OCMD ( Für die Befehle )


    Die Checkpoint Erklärung


    - Nun ich gehe jetzt davon aus das ihr euch oben die angeforderten Includes heruntergeladen habt.




    So als aller erstes müssen wir uns eine Variable erstellen die wir später für unsere ab fahrbare Checkpoints benötigen.
    Ihr schreibt also ganz oben unter euren includes:



    new JobCheckpoint[MAX_PLAYERS]; // Die Variable


    So und nun erstellen wir uns, unserem Befehl mit Hilfe des OCMD - Includes:



    ocmd:jobstart(playerid)
    {
    SetPlayerCheckpoint(playerid,1805.1013,-1902.0204,13.1284,10.0);
    JobCheckpoint[playerid] = 1;
    return 1;
    }





    public OnPlayerEnterCheckpoint(playerid)
    {
    if(JobCheckpoint[playerid] == 1) // Wie ich oben schon Sagte springt er nun hier hin, jetzt müssen wir noch einbauen was passieren soll wenn er durch den Ersten Checkpoint fährt.
    {
    // Ich sage er sollte, Geld und eine Nachricht bekommen.
    DisablePlayerCheckpoint(playerid); // Hier wird der Checkpoint den wir mit "/jobstart" aufgerufen haben, gelöscht.
    GivePlayerMoney(playerid, 50); // Hier bekommt er nun 50$ auf die Hand gezahlt.
    SendClientMessage(playerid,0xC3FF00FF,"Du bist durch den 1ten Checkpoint gefahren"); // Hier bekommt er nun die nachricht weil er durch den Ersten Checkpoint gefahren ist!
    SetPlayerCheckpoint(playerid, 1804.8215,-1925.0430,13.1172, 10.0);
    JobCheckpoint[playerid] = 2; // Hier springt er wieder zum 2ten Checkpoint
    }
    else if(JobCheckpoint[playerid] == 2) // Falls er durch den Zweiten Checkpoint gefahren ist soll was passieren ?
    {
    DisablePlayerCheckpoint(playerid); // Hier wird der Checkpoint 1 gelöscht.
    GivePlayerMoney(playerid, 50); // Hier bekommt er wieder 50$ auf die Hand gezahlt.
    SendClientMessage(playerid,0xC3FF00FF,"Du bist durch den 2ten CP gefahren"); // Hier bekommt er nun die nachricht
    SetPlayerCheckpoint(playerid, 1804.3311,-1925.8723,13.9501, 10.0); // Hier setzen wir den nächsten Checkpoint
    JobCheckpoint[playerid] = 3; // Hier springt er zum 3ten Checkpoint
    }
    else if(JobCheckpoint[playerid] == 3) // Falls er durch den 3ten Checkpoint gefahren ist soll was passieren ?
    {
    DisablePlayerCheckpoint(playerid); // Hier wird der Checkpoint 1 gelöscht);
    SendClientMessage(playerid,0xC3FF00FF,"Du hast den Job erfolgreich beendet");
    }
    return 1;
    }



    So das war nun die Erstellung mit den Checkpoints,
    aber es fehlt ja noch etwas, zum Beispiel:


    • Nur Spieler die den Job auch haben sollten diesen nur ausführen können.
    • Mann sollte /jobstart nur in einen Fahrzeug eingeben können und auch zugleich der Fahrer sein
    • Und falls man schon 1x /jobstart eingegeben hat, sollte eine Fehler meldung kommen das er schon im Job aktiv ist


    Dies zeige ich euch nun jetzt.

    Die Job Erklärung und deren Funktionen

    Wir haben hier unseren "/jobstart" befehl den wir nun weiter ausbauen möchten, mit den Funktionen die ich oben genannt habe.



    ocmd:jobstart(playerid)
    {
    if(GetPVarInt(playerid,"Job") == 0)return SendClientMessage(playerid,0xFFD200FF,"* Du hast nicht den Job"); // Hier wird überprüft ob er den Job hat.
    if(GetPlayerVehicleSeat(playerid) != 0)return SendClientMessage(playerid,0xFFD200FF,"Du musst der Fahrer sein!"); // Ob er auf den Fahrer sitzt ist.
    if(GetPVarInt(playerid,"Jobaktiv") !=1) // Hier wird überprüft ob der Spieler in seinem Job bereits aktiv ist also, schon einmal /jobstart eingegeben hat.
    if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 408) // Unser Fahrzeug das benötigt wird um die routen ab zu fahren ( 408 = der Müll wagen )
    {
    SetPVarInt(playerid,"Jobaktiv",1);
    SetPlayerCheckpoint(playerid,1805.1013,-1902.0204,13.1284,10.0);
    JobCheckpoint[playerid] = 1;
    }
    else
    {
    SendClientMessage(playerid,0xFFD200FF,"* Du bist nicht in dem Job Fahrzeug!"); // Hier wird die nachricht ausgegeben falls er schon /jobstart gemacht hat
    }
    else
    {
    SendClientMessage(playerid,0xFFD200FF,"* Du bist bereits im Job aktiv!"); // Falls er nicht in einer der Müllfahrzeuge ist
    }
    return 1;
    }



    - Ist ja alles schön und gut aber wo kriegt man nun den Job her ?


    wir erstellen uns nun einen neuen Befehl mit den wir den Job erhalten können:


    Ganz oben unter euren Includes erstmal:


    #define DIALOG_JOBS 1


    Achtung!!: Falls ihr die Dialog nummer "1" schon belegt habt dann nehmt einfach eine die noch Frei ist!


    ocmd:jobs(playerid)
    {
    ShowPlayerDialog(playerid,DIALOG_JOBS,DIALOG_STYLE_LIST,"Jobs","Job 1","Auswählen","Abbrechen"); // Hier zeigen wir nun unseren Job - Dialog wo er sich den Job auswählen kann.
    return 1;
    }


    Dann müssen wir für unseren "Job Dialog" nun auch noch Funktionen zu weisen, da er ja wissen muss was nun passieren soll, also:


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid==DIALOG_JOBS && response==1)
    {
    if(listitem == 0) // ihr fangt immer mit listitem 0 an, andere fangen nämlich immer mit 1 an und wundern sich später warum es nicht funktioniert da es ja falsch ist, also immer mit listitem 0 anfangen
    {
    {
    SendClientMessage(playerid,0xFFD200FF,"=> Job Info <=");
    SendClientMessage(playerid,0xFFD200FF,"Es wurde auf der Map eine Makierung gesetzt");
    SendClientMessage(playerid,0xFFD200FF,"Fahre nun dort hin und steige anschließen in einer der Fahrzeuge ein");
    SetPVarInt(playerid,"Job",1);
    // Hier eure Speicher Funktion noch rein, damit der Job auch noch nach einen Server Restart vorhanden ist
    // Also SpielerSpeichern mit der ihr halt euren User Speichern tut ^^
    }
    }
    }
    return 1;
    }



    //So wir wollen es aber nun auch so machen das nur die User in den Fahrzeugen einsteigen können die auch den Job haben.
    //ihr macht also ganz oben unter den Includes
    new JobFahrzeug[1]; // 1 = Die anzahl der Fahrzeugen die erstellt werden sollen.



    Dann erstellt ihr noch unter OnGameModeInit() das Fahrzeug mit dem ihr später die Checkpoints abfahren tut.


    public OnGameModeInit()
    {
    JobFahrzeug[0] = CreateVehicle(408,1805.2057000,-1885.3551000,14.0338000,89.9334000,1,1,15); // Unser Fahrzeug
    return 1;
    }





    So erstellt hätten wir nun unser Fahrzeug, aber nun müssen wir es so machen das nur die User es nutzen können die den Job auch angenommen haben.


    Wir gehen dazu unter public OnPlayerStateChange(playerid, newstate, oldstate)



    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    new newcar = GetPlayerVehicleID(playerid);
    if(GetPVarInt(playerid,"Job")!=1)
    {
    for(new i=0; i<sizeof(JobFahrzeug); i++)
    {
    if(newcar == JobFahrzeug[i])
    {
    RemovePlayerFromVehicle(playerid);
    SendClientMessage(playerid,0xFFBE00FF,"Du hast nicht den Job angenommen");
    }
    }
    }
    return 1;
    }



    So und nun können nur Spieler in den Fahrzeugen einsteigen die auch den Job haben ^^



    für diejenigen die das Dini include nutzen, schreibe ich hier mal die Speicher & Lade variante hin ^^



    Für das Speichern des Jobs:



    stock SpielerSpeichern(playerid)
    {
    new Spielerdatei[128];
    dini_IntSet(Spielerdatei,"Job",GetPVarInt(playerid,"Job"));
    return 1;
    }


    Für das Laden des Jobs:



    stock AccountLaden(playerid)
    {
    new Spielerdatei[128];
    SetPVarInt(playerid,"Job",dini_Int(Spielerdatei,"Job"));
    return 1;
    }




    Bitte seit mit der Kritik nicht arg so streng da dies mein erstes Tutorial hier im breadfisch forum ist ist ^^
    Werde es später auch noch natürlich überarbeiten ^^




    Stand: 11.08.2013

    • Checkpoint Fehler behoben, Der Checkpoint 2 wurde nicht angezeigt.
    • Fehler im Befehl /jobstart behoben.


    Dürfte nun alles richtig funktionieren 8)


    Grüße :D

    12 Mal editiert, zuletzt von Equ ()

  • Gibts hier schon 3mal und Besser erklärt tut mir leid aber für mich Sinnlos.


    6/10

    Erstmal danke für das Feedback.



    Aber nun sage mir doch mal lieber, HellYeah welches Tutorial besser ist es gibt User hier (darum hab ich das Tutorial auch gemacht)
    die immer Links zu Tutorials bekommen wo erklärt wird wie man Checkpoints erstellt und später verstehen die User nur Bahnhof, und sagen ich verstehe das nicht..
    ich wollte hier ein übersichtliches Tutorial gestalten was für andere User die sich hiermit noch nicht so auskennen, schön gestallten was gut lesbar und verständnisvoll rüberkommt
    nun sage mir bitte mal, was ich hier dran nicht gut erklärt habe ?


    Nettes Tutorial, aber einwenig unnütz.


    Es gibt schon genug davon und bessere, mit weniger Arbeit für den Benutzer!


    [ SCRIPTING ] Farmer System by DZ


    Erstmal danke für dein Feedback ^^.
    Das Tutorial habe ich mir vorhin mal angeschaut ich finde es unübersichtlich, es sieht alles drauf geklatscht aus wenn man es sagen darf
    und außerdem, was soll man machen wenn man bei jedem Checkpoint eine Nachricht/Dialog angezeigt lassen bekommen möchte was dort ja anscheint nicht möglich ist
    wenn doch etwas schwieriger denn es gibt hier auch Anfänger im Forum die dies nicht ganz verstanden haben.



    Kann mich hierbei nur wiederholen, finde es rech unübersichtlich ^^




    Liebe Grüße

  • Hey,
    naja es gibt schon echt viele Tutorials die Checkpoints erklären.
    Wenn du was einzigartiges gemacht hättest okay, aber so naja
    Desweiteren ist deine Lösung so

    Spoiler anzeigen
    public OnPlayerEnterCheckpoint(playerid)
    {
    if(JobCheckpoint[playerid] == 1) // Wie ich oben schon Sagte springt er nun hier hin, jetzt müssen wir noch einbauen was passieren soll wenn er durch den Ersten Checkpoint fährt.
    {
    // Ich sage er sollte, Geld und eine Nachricht bekommen.
    DisablePlayerCheckpoint(playerid); // Hier wird der Checkpoint den wir mit "/jobstart" aufgerufen haben, gelöscht.
    GivePlayerMoney(playerid, 50); // Hier bekommt er nun 50$ auf die Hand gezahlt.
    SendClientMessage(playerid,0xC3FF00FF,"Du bist durch den 1ten Checkpoint gefahren"); // Hier bekommt er nun die nachricht weil er durch den Ersten Checkpoint gefahren ist!
    SetPlayerCheckpoint(playerid, 1804.8215,-1925.0430,13.1172, 10.0);
    JobCheckpoint[playerid] = 2; // Hier springt er wieder zum 2ten Checkpoint
    }
    if(JobCheckpoint[playerid] == 2) // Falls er durch den Zweiten Checkpoint gefahren ist soll was passieren ?
    {
    DisablePlayerCheckpoint(playerid); // Hier wird der Checkpoint 1 gelöscht.
    GivePlayerMoney(playerid, 50); // Hier bekommt er wieder 50$ auf die Hand gezahlt.
    SendClientMessage(playerid,0xC3FF00FF,"Du bist durch den 2ten CP gefahren"); // Hier bekommt er nun die nachricht
    SetPlayerCheckpoint(playerid, 1804.8215,-1925.0430,13.1172, 10.0); // Hier setzen wir den nächsten Checkpoint
    JobCheckpoint[playerid] = 3; // Hier springt er zum 3ten Checkpoint
    }
    if(JobCheckpoint[playerid] == 3) // Falls er durch den 3ten Checkpoint gefahren ist soll was passieren ?
    {
    DisablePlayerCheckpoint(playerid); // Hier wird der Checkpoint 1 gelöscht);
    SendClientMessage(playerid,0xC3FF00FF,"Du hast den Job erfolgreich beendet");
    }
    return 1;
    }

    nicht grade die beste wenn du überlegst das das Script wenn man es bei jedem Job so macht schnell bei 200K Zeilen ist
    da könnte man besser mit enum's dies das arbeiten
    5/10
    Also versuche es mit

    enum CheckPointinfo
    {
    Float:Xcp,
    Float:Ycp,
    Float:Zcp,
    Float:CPSize,
    CheckPointText[75]
    }
    new Dein Job[CheckpointAnzahl][CheckPointinfo] =
    {
    //{X,Y,Z,cpsize,CP Text},
    };


  • Der Array:

    new float:CPS[][3] =
    {
    {x,y,z},
    {x,y,z]
    };



    die Schleife 8)


    for(new a; a<(sizeof(CPS)); a++)
    {
    new cp = random(sizeof(CPS));
    SetPlayerCheckpoint(playerid,CPS[a][0],CPS[a][1],CPS[a][2],range);
    }

  • Erstmal schön das du daführ ein Tutorial gemacht hast, obwohl es schon eins gibt, find ich es gut erklärt.
    Nur hättest du es gleich mit array + schleife erklären können, PermanenT und Kevin es gezeigt haben, aber dennoch für anfänger hilfreich.


    8/10

    Danke für dein Positives Feedback ^^



    Ja aber ich kenne mich mit dieser Variante am besten aus ^^


    • Hinzugefügt: Wenn der Spieler den Job nicht hat, kann er auch nicht das Job - Fahrzeug Fahren!


    Grüße

  • Zitat


    Was wird benötigt ?



    Dini ( Zum Speichern/Laden des Spielers )


    Ist es so schwer das normale performance mässig deutlich bessere Filesystem zu verwenden?
    sonst ist das tutorial relativ gut ^^



    Edit:


    Die schleife ist aber auch zu bemängeln



    for(new i=0; i<sizeof(JobFahrzeug); i++)
    {
    if(newcar == JobFahrzeug[i])
    {
    RemovePlayerFromVehicle(playerid);
    SendClientMessage(playerid,ORANGE,"Du hast nicht den Job angenommen");
    }
    }


    -->



    for(new i=0; i<sizeof(JobFahrzeug); i++)
    {
    if(!newcar == JobFahrzeug[i])continue;
    RemovePlayerFromVehicle(playerid);
    SendClientMessage(playerid,ORANGE,"Du hast nicht den Job angenommen");
    break;
    }


    Edit2: for schleife von dir nicht ganz kopiert

    76ul4ppd4lmb.png

    Einmal editiert, zuletzt von Mr.Soap ()


  • Wen ich /jobstart mache steht bei mir "Du hast den job nicht" obwohl ich den Job habe .
    Kann mir da jemand helfen?
    MFG Rockstar12

    Ich habe mal mein Tutorial ein wenig überarbeitet dürfte nun alles richtig Funktionieren.

    Wenn du erst /jobs machst und den Job 1 auswählst, und dann in das Fahrzeug steigst und /jobstart machst dürfte es gehen,
    merke dir jedoch so bald du den Server neu startest musst du es wieder neu eingeben, /jobs und job auswählen.
    es sei den du Speicherst den Job dann dürfte es eigentlich direkt gehen /jobstart.


    Falls du das Problem immer noch hast, Poste mal deine stocks:

    • LoadAccount
    • SpielerSpeichern


    Liebe Grüße

    2 Mal editiert, zuletzt von Equ ()