Race Checkpoint(s) [Für Anfänger]

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

  • Moin,


    Soo, nun möchte ich einigen da Draußen was bei bringen, es seiden die wissen schon, wie sowas geht.


    In diesem Tut., lernt man, wie man Checkpoints einfach ablesen kann von einer Tabelle.


    Somit könnte man locker z.B den Job: Müllabfuhr scripten.


    Und, wie das geht, sehr ihr hier:


    // Also, dann fangen wir mal an!




    // Wir erstellen eine Verriable, die überprüfen soll, ob man jetzt den Job macht oder nicht.

    new MachtArbeit[MAX_PLAYERS]; // Ganz nach oben

    // Anschließend erstellen wir eine Veriable, welche aufzählt bei welchem Checkpoint wird sind.

    new CheckpointStatus[MAX_PLAYERS]; // Checkpoint Status, kommt auch nach ganz oben!

    ///////////////////////////////




    // So, jettt müssen wir definieren, wie viel Maximum Checkpoints es gibt:

    #define MAX_RACE_POINTS 17 // Wird gezählt von Null. Also 0, 1, 2, 3, 4. // Kommt ganz nach oben


    new Float:racecheckpoints[MAX_RACE_POINTS][3] = { // Die Defineirung von : racecheckpoints. Die [3] Bedeutet: X, Y, Z. // Das kommt ganz noach oben.
    {1656.829956, -1166.398437, 23.617559}, // 1
    {1707.867675, -1206.746826, 20.976793}, // 2
    {1783.874511, -1286.020629, 13.275278}, // 3
    {1859.596069, -1219.198364, 18.736469}, //
    {1892.303710, -1127.870849, 24.013429}, // 5
    {1907.985717, -1127.944580, 24.407924},
    {1921.429077, -1127.915771, 24.743091},
    {1957.571533, -1128.151611, 25.638833},
    {1997.838745, -1128.968505, 25.293878},
    {2029.990234, -1128.175903, 24.385658},
    {2077.569824, -1122.709838, 23.775880},
    {2079.989990, -1148.917846, 23.618659},
    {2077.754882, -1167.527221, 23.524724},
    {2077.924560, -1184.147338, 23.527599},
    {2078.348388, -1203.702514, 23.650722},
    {2089.319580, -1228.770019, 23.709350},
    {1728.458129, -1055.661743, 23.505249} // 17. Bedeutet Checkpoint Status: 17. Die Maximal Anzahl der Checkpoints beträgt also: 17.
    };

    // So nun müssen wir ja Irgendwie die "Mission" starten, wo man Race Checkpoints abfahren muss.
    // Am besten mit einem COmmand ( CMD ).


    // Unter OnPlayerCommandText




    public OnPlayerCommandText(playerid, cmdtext[]) {


    new cmd[256];


    new idx;


    cmd = strtok(cmdtext, idx);
    if(strcmp(cmd,"/mission", true) == 0) {


    if(IsPlayerInAnyVehicle(playerid)){ // Der CMD funkt nur dann, wenn man in einem Fahrzeug drinne sitzt.
    if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 408) // Der CMD funkt. nur dann, wenn man in einem Fahrzug drinne sitzt und es ein bestimmes Model ist.
    {
    MachtArbeit[playerid] = 1; // Bedeutet, dass die Arbeit ab jetzt los geht. 1 = Arbeit geht Los.
    SetPlayerRaceCheckpoint(playerid,0,racecheckpoints[0][0],racecheckpoints[0][1],racecheckpoints[0][2],racecheckpoints[1][0],racecheckpoints[1][1],racecheckpoints[1][2],3.0);


    // SetPlayerRaceCheckpoint(playerid, CheckPointtype, X, Y, Z, Nächster X, Nächster Y, Nächster, Z);
    }
    }


    return 1;
    }
    return 0;
    }


    Die richtige public nicht vergessen. :



    public OnPlayerEnterRaceCheckpoint(playerid)
    {
    if (IsPlayerInAnyVehicle(playerid)) // Bedeutet, dass die Fukntion nur dann funk. ,wennn man in einem fahrzeug sitzt.
    {
    if (GetVehicleModel(GetPlayerVehicleID(playerid)) == 408) // Model ID 408, bedeutet, dass das ganze,was unten geschicet nur dann geht, wenn man im Model 408 drinne sitzt.
    {


    if(MachtArbeit[playerid] == 1) // Dies passiert nur dann, wenn man /mission geschieben hat.
    {
    CheckpointStatus[playerid]++; // Hier werden die Checkpoints aufgezählt.


    new letzerpunkt = MAX_RACE_POINTS; // Wichtig. Hier wird der letze Checkpoint definiert.
    if(CheckpointStatus[playerid] < letzerpunkt) // Ist der checkpoint Status kleiner als die maximale Anzahl der Checkpoints, bedeutet dieser Code.
    {
    DisablePlayerRaceCheckpoint(playerid); // Beendet den Checkpoint
    SetPlayerRaceCheckpoint(playerid,0,racecheckpoints[CheckpointStatus[playerid]][0],racecheckpoints[CheckpointStatus[playerid]][1],racecheckpoints[CheckpointStatus[playerid]][2],racecheckpoints[CheckpointStatus[playerid]+1][0],racecheckpoints[CheckpointStatus[playerid]+1][1],racecheckpoints[CheckpointStatus[playerid]+1][2],3.0);
    }
    // Bedeutung: SetPlayerRaceCheckpoint(playerid, Checkpointtype, X[CheckpointSTatus], Y[CheckpointStatus], Z[CheckpointStatus], NächsterX[Nächster CheckpointSTatus],NächsterY[Nächster CheckpointSTatus],NächsterZ[Nächster CheckpointSTatus], size);



    if(CheckpointStatus[playerid] == letzerpunkt){ // Wenn der Checkpoint STatus die maximale Anzahl erreich hat. Passiert folgendes:
    MachtArbeit[playerid]= 0; // Hier wird die Mission beendet.
    CheckpointStatus[playerid] = 0; // Hier wird definiert, dass, der Checkpoint Status bei Null liegt.
    DisablePlayerRaceCheckpoint(playerid); // Damit wird der Race Checkpoint beendet.
    }
    }
    }
    }
    return 1;
    }



    So, das wars. Ich hoffe, dass ich euch helfen konnte. Ahja, Tut natürlich ganz von mir. Also ©. Bitte, wenn ihr es weiter geben wollt oder woanders zum angucken freigibt.


    Dann bitte schreiben, dass es von mir ist!



    Ansonten viel Spaß damit.



    MfG, The_Godboy

    5 Mal editiert, zuletzt von Xam_Res ()

  • Könntest du das ganze bitte in [pwn][/*pwn] Klammern setzen? Ist von der Syntax Betonung übersichtlicher.


    Ansonsten, gutes Tutorial.

  • Proffesor:


    Gucke ma if(CheckpointStatus[playerid] == letzerpunkt){


    Hier kanste die Nachricht schicken, dass alle Checkpoint abgefahren wurden


    Die Nachricht unter if(CheckpointStatus[playerid] == letzerpunkt){


    einfügen

  • kann ich auch optionen für bestimmte checkpoints (also nicht letzten sondern 2. 5. etc..) machen???
    Also statt new lastcheckpoint....


    Will nämlich das man bei bestimmten CHeckpoints gefreezed wird und stehn bleiben muss(nicht das es als "rennen" gesehen wird xDDD)

  • Super Tutorial, habe es bei mir sonst immer anders gemacht mit den Checkpoints aber mit der Mothode ist es wesentlich einfacher. Habe mich explizit ans Tut gehalten ausser das ich das ganze natürlich an meine pInfo angepasst habe.Alles sehr gut erklärt und funktioniert einwandfrei.



    10/10 Brotfischpunkte :thumbup:

    Einmal editiert, zuletzt von Traxter ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • GAnz einfache Lösung, ohne das du viel denken musst. Du machst den letzen CP zweimal rein. ;) Schon ist es der letzte CP.

  • und noch was


    das wirde nicht angezeigt

    if(CheckpointStatus[playerid] == letzerpunkt){
    SendClientMessage(playerid, 0x2641FEAA, "asldfsadfblws!");
    }


    das auch nicht
    if(CheckpointStatus[playerid] == 16){
    SendClientMessage(playerid, 0x2641FEAA, "asldfsadfblws!");
    }


    wenn ich 15 mach dan wird es angezeigt, obwohl es 17 checkpoints sind
    if(CheckpointStatus[playerid] == 15){
    SendClientMessage(playerid, 0x2641FEAA, "asldfsadfblws!");
    }


    jemand ne Lösung ????

    Einmal editiert, zuletzt von Markus20 ()

  • sry, dass ich den Topic wieder nach oben schiebe, hat mir aber sehr geholfen. ;)


    Hab dasgleiche Problem wie Markus20. ^^
    Allerdings lässt sich das durch ein Trick beheben: einfach den Letzten Checkpoint nochmal hinter schreiben und die Anzahl entsprechend ändern.


    Bei mir hat folgendes nicht geklappt:
    new cmd[256];


    new idx;


    cmd = strtok(cmdtext, idx);
    if(strcmp(cmd,"/mission", true) == 0) {



    Dort stand dann immer der Fehler, dass idx und cmdtext ungültig sind, hab ich da einen include oder dergleiches vergessen. Wenn ja bitte sagen welches. :)


    Stattdessen ging es bei mir mit:

    if (strcmp("/mission", cmdtext, true, 10) == 0)

    Das mit dem idx und cmdtext interessiert mich immer noch, weil ich ein einer ähnlichen Sache sitze. ^^

    Zitat

    Kennst du eigentlich Reallife ?

    Nö, schick mal Link. :D

  • Hi gutes tut, habs etwas verändert aber beim letzten CP geht er zwar weg aber es kommt nichts also
    public OnPlayerEnterRaceCheckpoint(playerid)
    {
    if(MachtAutoLic[playerid] == 1)
    {
    CheckpointStatus[playerid]++;
    new letzerpunkt = MAX_RACE_POINTS;
    if(CheckpointStatus[playerid] < letzerpunkt)
    {
    DisablePlayerRaceCheckpoint(playerid); // Beendet den Checkpoint
    SetPlayerRaceCheckpoint(playerid,0,racecheckpoints[CheckpointStatus[playerid]][0],racecheckpoints[CheckpointStatus[playerid]][1],racecheckpoints[CheckpointStatus[playerid]][2],racecheckpoints[CheckpointStatus[playerid]+1][0],racecheckpoints[CheckpointStatus[playerid]+1][1],racecheckpoints[CheckpointStatus[playerid]+1][2],3.0);
    }
    if(CheckpointStatus[playerid] == letzerpunkt){
    MachtAutoLic[playerid] = 0;
    CheckpointStatus[playerid] = 0;
    DisablePlayerRaceCheckpoint(playerid);
    PlayerInfo[playerid][pAutoLic] = 1;//passiert auch nicht
    SendClientMessage(playerid, COLOR_GREEN,"Du hast die Fahrprüfung Bestanden, Glückwunsch");//kommt nicht
    }
    }
    return 1;
    }
    ich habe nur verändert anstadt machtarbeit machtautolic und anstadt 17 CP's nur 10


    Leute das Problem'chen ist dabei das der Letzte Checkpoint nicht kommt und somit kann ich den Führerschein nicht bekommen, kann der Tutorial schreiber, oder ein scripter helfen?
    vielen dank



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


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

    3 Mal editiert, zuletzt von ENEF ()