For Schleife sendet mehrere NAchrichten?

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 einfach immer wieder das Problem mit den for schleifen.
    Unswar sieht meine FUnktion so aus:


    forward PayZone(playerid);
    public PayZone(playerid)
    {
    for(new i;i<MAX_PLAYERS;i++)
    {
    for(new g; g<sizeof(Gebiete); g++)//Damit alle gebiete durchlaufen werden
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    GivePlayerMoney(i,300);
    ClientLanguageText(i,COLOR_GREEN,"Du hast Geld für den Besitz von Gebieten bekommen!","You got money from the zones of your team!");
    }
    }
    }
    return 1;
    }


    SO das Prolem:
    Man soll soviel Geld bekommen (300€/$) wie viele Gebite man hat. Das bekommt man so auch.
    Die Nachricht wird jedoch auch so oft gesendet. WIe schickt man mit einer Schleife denn nur eine Nachricht ab?


    lg


  • forward PayZone(playerid);
    public PayZone(playerid)
    {
    for(new i;i<MAX_PLAYERS;i++)
    {
    for(new g; g<sizeof(Gebiete); g++)
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    GivePlayerMoney(i,300);
    ClientLanguageText(i,COLOR_GREEN,"Du hast Geld für den Besitz von Gebieten bekommen!","You got money from the zones of your team!");
    return 1;
    }
    }
    }
    return 1;
    }


    Bei der Nachricht muss ein "return 1;" Hin sobald dann das Team mit dem gOwner übereinstimmt kriegt der jenige das Geld und die Schleife stoppt.


    Have Fun

  • Mir fällt nix weiter ein als das:


    new bool:nachrichtbekommen[MAX_PLAYERS];
    forward PayZone(playerid);
    public PayZone(playerid)
    {
    for(new i;i<MAX_PLAYERS;i++)
    {
    for(new g; g<sizeof(Gebiete); g++)//Damit alle gebiete durchlaufen werden
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    GivePlayerMoney(i,300);
    if(nachrichtbekommen[i]==false)
    {
    ClientLanguageText(i,COLOR_GREEN,"Du hast Geld für den Besitz von Gebieten bekommen!","You got money from the zones of your team!");
    nachrichtbekommen[i]=true;
    }
    }
    }
    }
    return 1;
    }

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Bringt nichts,BlackAce Anarchiyx3.
    Da würde man maximal 1x die Nachricht insgesamt versenden,da return 1.
    forward PayZone(playerid);
    public PayZone(playerid) // Wieso hast du hier überhaupt playerid als Parameter?
    {
    new
    bool:bSendMessage;
    for(new i;i<MAX_PLAYERS;i++)
    {
    bSendMessage = true;
    for(new g; g<sizeof(Gebiete); g++)//Damit alle gebiete durchlaufen werden
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    GivePlayerMoney(i,300);
    if(bSendMessage) {
    ClientLanguageText(i,COLOR_GREEN,"Du hast Geld für den Besitz von Gebieten bekommen!","You got money from the zones of your team!");
    bSendMessage = false;
    }
    }
    }
    }
    return 1;
    }

  • Hi


    Message einfach nach der Schleife, mit ner abfrage ob man überhaupt gebiete hat.
    das return ist fehl am platz @Anarchiy, da man dann nur 1 mal 300$ bekommen würde, egal wie viele gebiete man besitzt ;)


    MFG, Robdeflop®


    EDIT: Das von Gold geht auch^^

  • Ich selber mach es eigentlich auch immer nach der inneren Schleife, hab es jetzt aber mal so gelassen.
    Hat Beides Vor- und Nachteile es innerhalb der Schleife zu machen oder Außerhalb.
    Wie auch immer,so wäre es etwas erweitert:
    forward PayZone(playerid);
    public PayZone(playerid) // Wieso hast du hier überhaupt playerid als Parameter?
    {
    new
    iMoney,
    bool:bSendMessage;
    for(new i;i<MAX_PLAYERS;i++)
    {
    bSendMessage = false;
    iMoney = 0;
    for(new g; g<sizeof(Gebiete); g++)//Damit alle gebiete durchlaufen werden
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    iMoney += 300;
    bSendMessage = true;
    }
    }
    if(bSendMessage) {
    GivePlayerMoney(i, iMoney);
    // Dann könnte man iMoney für einen formatierten Text nutzen.
    // format(String,sizeof(String),"Du hast %d$ für den Besitz von %d Gebieten bekommen", iMoney , ( iMoney / 300 ) );
    ClientLanguageText(i,COLOR_GREEN,"Du hast Geld für den Besitz von Gebieten bekommen!","You got money from the zones of your team!");
    bSendMessage = false;
    }
    else {
    ClientLanguageText(i,COLOR_GREEN,"Deine Gang besitzt keine Gebiete,daher erhälst du keinen Geld-Bonus"," ENG ... ");
    }
    }
    return 1;
    }