Problem mit Racecheckpoint

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 Leute!


    Ich hab ein kleines Problem mit einem Racecheckpoint:




    public OnPlayerEnterRaceCheckpoint(playerid)
    {
    if(autopruefung[playerid] == 1)
    {
    for(new i=0;i<sizeof(PruefungCheckpoint);i++)
    {
    if(pruefungstatus[playerid] == i+1)
    {
    DisablePlayerRaceCheckpoint(playerid);
    if(pruefungstatus[playerid] < 3)
    {
    SetPlayerRaceCheckpoint(playerid,0,PruefungCheckpoint[i][0],PruefungCheckpoint[i][1],PruefungCheckpoint[i][2],PruefungCheckpoint[i+1][0],PruefungCheckpoint[i+1][1],PruefungCheckpoint[i+1][2],7);
    }
    else if(pruefungstatus[playerid] == 3) //ziel
    {
    SetPlayerRaceCheckpoint(playerid,1,PruefungCheckpoint[i][0],PruefungCheckpoint[i][1],PruefungCheckpoint[i][2],0.0,0.0,0.0,7);
    }
    else
    {
    //Mach was, wenn er im [b]Ziel [/b]ist
    }
    pruefungstatus[playerid] = i+2;
    return 1;
    }
    }
    }
    return 1;
    }


    Zum testen sind es 3 checkpoints:



    new Float:PruefungCheckpoint[3][3] = {
    {2431.6069,1124.1045,10.4707},
    {2429.5059,1170.9470,10.3990},
    {2447.1611,1124.1182,10.5474}
    };


    wenn ich allerdings ins ziel fahr, bleibt der checkpoint und auch das zeugs, das dann gemacht werden soll, wird nicht ausgeführt. Was hab ich da falsch? (mit switch-case würde es vielleicht gehen, aber dann hab ich sicher knapp 300 zeilen nur für das ;) )



    MFG selEcT

  • public OnPlayerEnterRaceCheckpoint(playerid)
    {
    if(autopruefung[playerid] == 1)
    {
    for(new i=0;i<sizeof(PruefungCheckpoint);i++)
    {
    if(pruefungstatus[playerid] == i+1)
    {
    DisablePlayerRaceCheckpoint(playerid);
    if(pruefungstatus[playerid] < 2)
    {
    SetPlayerRaceCheckpoint(playerid,0,PruefungCheckpoint[i][0],PruefungCheckpoint[i][1],PruefungCheckpoint[i][2],PruefungCheckpoint[i+1][0],PruefungCheckpoint[i+1][1],PruefungCheckpoint[i+1][2],7);
    }
    else if(pruefungstatus[playerid] == 2) //Hier wird abgefragt obs der letzte Cp vorm Ziel ist
    {
    SetPlayerRaceCheckpoint(playerid,1,PruefungCheckpoint[i][0],PruefungCheckpoint[i][1],PruefungCheckpoint[i][2],0.0,0.0,0.0,7);
    }
    else if(pruefungstatus[playerid] == 3) // Wenns das Ziel ist
    {
    //Mach was, wenn er im [b]Ziel [/b]ist
    }
    pruefungstatus[playerid] = i+2;
    return 1;
    }
    }
    }
    return 1;
    }

  • hmm klappt irgendwie nicht:


    ich hab mal


    printf("%d,%d",i,pruefungstatus[playerid]);


    zwischen


    DisablePlayerRaceCheckpoint(playerid);
    if(pruefungstatus[playerid] < 2)


    eingefügt und der zeigt mir, sobald ich durch den ERSTEN Checkpoint gegangen bin in der Konsole untereinander 0,1 und 1,2 an, was ja soweit richtig ist, aber nicht gleich nacheinander.


    Ich hab ja ein return drin, warum passiert das?!

  • Erstell doch einfach ne Variable für den Spieler die jedes mal einen Wert dazu addiert bekommt

    new Var[MAX_PLAYERS];
    public OnPlayerEnterRaceCheckpoint(playerid)
    {
    if(autopruefung[playerid] == 1)
    {
    Var[playerid]++;
    DisablePlayerRaceCheckpoint(playerid);
    if(Var[playerid] < 2)
    {
    SetPlayerRaceCheckpoint(playerid,0,PruefungCheckpoint[i][0],PruefungCheckpoint[i][1],PruefungCheckpoint[i][2],PruefungCheckpoint[i+1][0],PruefungCheckpoint[i+1][1],PruefungCheckpoint[i+1][2],7);
    }
    else if(Var[playerid] == 2) //Hier wird abgefragt obs der letzte Cp vorm Ziel ist
    {
    SetPlayerRaceCheckpoint(playerid,1,PruefungCheckpoint[i][0],PruefungCheckpoint[i][1],PruefungCheckpoint[i][2],0.0,0.0,0.0,7);
    }
    else if(Var[playerid] == 3) // Wenns das Ziel ist
    {
    //Mach was, wenn er im [b]Ziel [/b]ist
    }
    }
    return 1;
    }

    Sieht doch auch ein wenig übersichtlicher aus, meinst du nicht? ;)

  • öhm, das var[playerid] ist ja dieses pruefungstatus[playerid], ich weiss nicht genau was du mir damit sagen möchtest.. und ich habs auch genau so..


    aber ich sehe, du hast das jetzt ohne for schleife gemacht, das würde wahrscheinlich schon gehn, aber das gibt bei all den checkpoints sicher etwa 300 zeilen. Mit dem for sollte es doch auch gehen?!


    edit: habs jetzt so, wie du es in etwa gesagt hast, geht aber nicht..:



    public OnPlayerEnterRaceCheckpoint(playerid)
    {
    if(autopruefung[playerid] == 1)
    {
    for(new i=0;i<sizeof(PruefungCheckpoint);i++)
    {
    if(pruefungstatus[playerid] == i)
    {
    pruefungstatus[playerid]++;
    DisablePlayerRaceCheckpoint(playerid);
    if(pruefungstatus[playerid] < 2)
    {
    SetPlayerRaceCheckpoint(playerid,0,PruefungCheckpoint[i][0],PruefungCheckpoint[i][1],PruefungCheckpoint[i][2],PruefungCheckpoint[i+1][0],PruefungCheckpoint[i+1][1],PruefungCheckpoint[i+1][2],7);
    }
    else if(pruefungstatus[playerid] == 2) //ziel
    {
    SetPlayerRaceCheckpoint(playerid,1,PruefungCheckpoint[i][0],PruefungCheckpoint[i][1],PruefungCheckpoint[i][2],0.0,0.0,0.0,7);
    }
    else if(pruefungstatus[playerid] == 3)
    {
    Motor[autopruefungauto[playerid]] = 0;
    DestroyVehicle(autopruefungauto[playerid]);
    SetPlayerPos(playerid,2415.7702,1123.8610,10.8203);
    PlayerInfo[playerid][pCarLic] = 1; GivePlayerMoney(playerid, -2500);
    autopruefung[playerid] = 0; pruefungstatus[playerid] = 0;
    return SendClientMessage(playerid, COLOR_GREEN, "Herzlichen Glueckwunsch, du hast bestanden!");
    }
    return 1;
    }
    }
    return 1;
    }
    return 1;
    }


    //edit2: Der fehler liegt NICHT in der for-schleife. Wenn ich durch den ersten Checkpoint gehe, zählt der mir den checkpoint irgendwie als 2 durchgänge, das heisst, er überspringt einen checkpoint!!!


    edit3: LOL, ich habs.. es war ein doppelter racecheckpoint drin, trotzdem danke für die hilfe ;)