Problem mit Schleife

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,
    ICh habe mal wieder ein Problem mit einer Schleife. Ich weiß einfach nicht wo ich ein
    return einsetzen muss, da ich die Nachricht tausend mal bekomme :(


    forward RaceCount(playerid);
    public RaceCount(playerid)
    {
    if(rcount > 0)
    {
    for(new i; i < MAX_PLAYERS; i++)
    {
    if(vRacer[i] == 1)
    {
    new
    str[128];
    format(str,sizeof(str),"~r~%d",rcount);
    GameTextForPlayer(i,str,1050,4);
    rcount--;
    return 1;
    }
    }
    return 1;
    }
    else
    {
    KillTimer(rtimer);
    for(new ri; ri < MAX_PLAYERS; ri++)
    {
    if(vRacer[ri] == 1)
    {
    GameTextForPlayer(ri,"~r~GOOOOOOOOOOOOOOO!!!",1050,4);
    TogglePlayerControllable(ri,1);
    ClientLanguageText(ri,COLOR_RED,"Du hast 5 Minuten Zeit bis das Rennen automatisch beendet wird.","You have 5 minutes until the race will automatically end!");
    retimer = SetTimerEx("Rends",300000,false,"i",playerid);
    }
    }
    }
    return 1;
    }


    Hoffe mir kann geholfen werden,
    lg ;)

  • also von der syntax wäre das so richtig:



    ausserdem achte bitte auf das einrücken, das liest sich dann wesentlich besser.

  • Ich vermute Mal, dass das erste ein Countdown sein soll und das 2. dann der Startschuss.(Jedenfalls siehts dannach aus)
    forward RaceCount(playerid);
    public RaceCount(playerid)
    {
    if(rcount > 0)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(vRacer[i] == 1)
    {
    new str[128];
    format(str,sizeof(str),"~r~%d",rcount);
    GameTextForPlayer(i,str,1050,4);
    rcount--;
    return 1;
    }
    }
    return 1;
    }
    else
    {
    KillTimer(rtimer);
    for(new ri=0; ri<MAX_PLAYERS; ri++)
    {
    if(vRacer[ri] == 1)
    {
    GameTextForPlayer(ri,"~r~GOOOOOOOOOOOOOOO!!!",1050,4);
    TogglePlayerControllable(ri,1);
    ClientLanguageText(ri,COLOR_RED,"Du hast 5 Minuten Zeit bis das Rennen automatisch beendet wird.","You have 5 minutes until the race will automatically end!");
    retimer = SetTimerEx("Rends",300000,false,"i",playerid);
    }
    }
    }
    return 1;


    Dieser Code ist ansich nicht richtig, da bei jedem Spieler der durchgegangen wird(und am Rennen teilnimmt) der Count runtergeht.
    Du möchtest aber vermutlich dass es nur alle Sekunde runterzählt oder? so ists richtig:


    forward RaceCount(playerid);
    public RaceCount(playerid)
    {
    if(rcount > 0)
    {
    new str[128];//Variablen vor der for schleife deklarieren!
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(vRacer[i] == 1)
    {

    format(str,sizeof(str),"~r~%d",rcount);
    GameTextForPlayer(i,str,1050,4);
    continue;// wenn dann dieses ist aber eigentlich nicht notwendig!
    }
    }
    }
    else
    {
    KillTimer(rtimer);
    for(new ri=0; ri<MAX_PLAYERS; ri++)
    {
    if(vRacer[ri] == 1)
    {
    GameTextForPlayer(ri,"~r~GOOOOOOOOOOOOOOO!!!",1050,4);
    TogglePlayerControllable(ri,1);
    ClientLanguageText(ri,COLOR_RED,"Du hast 5 Minuten Zeit bis das Rennen automatisch beendet wird.","You have 5 minutes until the race will automatically end!");
    retimer = SetTimerEx("Rends",300000,false,"i",playerid);
    }
    }
    }
    return 1;


    //edit 1: Fehler behoben


    Ansich ist der code auch falsch, da du den playerid Parameter gar nicht brauchst :)

  • Ok,
    Du hast aber
    rcount --;
    vergessen ;)


    SO die NAchricht wird immer noch tausendmal abgesendet obwohl der TImer ja zerstört wird oder nicht?
    Zudem zählt der COuntdown manchmal viel zu schnell: Bsp. 5,3,1,GOOOOOOOOOOOO :(


    lg

    Einmal editiert, zuletzt von Zcelo12 ()

  • KillTimer(rtimer);
    retimer = SetTimerEx("Rends",300000,false,"i",playerid);


    Na, siehste´s selber ?


    edit:// Dies ist ein anderer Timer ;)
    Der Timer der dies aufruft ist eigt. :
    forward racestart(playerid);
    public racestart(playerid)
    {
    for(new i=0; i <MAX_PLAYERS; i++)
    {
    if(vRacer[i] == 1)
    {
    RaceStart();
    rtimer = SetTimerEx("RaceCount",1000,1,"i",playerid);
    rcount = 5;
    }
    }
    return 1;
    }

  • Mach rtimer mal zu nem Spieler-Array ( rtimer[playerid] ),
    evtl. überschneiden sich die Werte.


    Nur mal als Hinweis:
    Du brauchst kein SetTimerEx, wenn du damit nur einen Wert übergibst, den du eh nicht benutzt...

  • Ich danke dir Trooper, hat funktioniert.
    Könntest du mir jetzt noch sagen wie ich es bei dieser Funktion einstelle, dass die Nachricht nur jedem Spieler 1x gesendet wird?


    stock RaceStart()
    {
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(vRacer[i] == 1)
    {
    Racer[i][pri_Checkpoint]=0;
    Racer[i][pri_bAktiv]=true;
    SetPlayerRaceCheckpoint(i,0,Race_Points[0][R_fX],Race_Points[0][R_fY],Race_Points[0][R_fZ],Race_Points[1][R_fX],Race_Points[1][R_fY],Race_Points[1][R_fZ],Race_Points[0][R_fRad]);
    ClientLanguageText(i,COLOR_ORANGE,"Bereite dich vor!","Get ready!");
    }
    }
    }

    Einmal editiert, zuletzt von Zcelo12 () aus folgendem Grund: RS

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