Schleifen-Problem

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 bin's mal wieder mit meinen Schleifen :D
    Unswar ist das Problem, dass mir die Nachricht so oft gesendet wird, wie auch Spieler online sind.
    Habe es hier auch schon mit einem bool versucht :(


    new bool:SendMSG;
    for(new i;i<MAX_PLAYERS;i++)
    {
    SendMSG = true;
    if(!IsPlayerConnected(i)) continue;
    format(string,sizeof(string),"Properties: $%d Zone/s: $%d (%d zone/s) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    format(stringd,sizeof(stringd),"Unternehmen: $%d Gebiet/e: $%d (%d Gebiet/e) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    if(SendMSG) {
    ClientLanguageText(i,COLOR_ORANGE,string,stringd);
    SendMSG = false;
    }
    }


    Hoffe mir kann das nochmal einer erklären. :)
    lg

  • @ DurtyFree
    Er möchte ja nicht das so viel nachrichten kommen.


    So verstehe ich das jedenfalls.


    Jedoch verstehe ich nicht was dein Problem ist.
    Nimm das SendMSG = false; raus und schon wird die nachricht nur einmal gesendet.
    Jedoch bekommt doch jeder spieler eine nachricht und nicht jeder spieler z.B. 50 wenn 50 online sind oder verstehe ich dich gerade falsch?

  • Ich möchte ben nicht, dass die Spieler die Nachricht so oft bekommen wie SPieler online sind.
    Das Porblem ohne den bool war ja, dass die Nachricht so oft kommt wie Spieler online sind.
    Mit dem jetzigen bool bekomme ich eine Nachricht und ca. 20 sec. später die Nachricht nochmal.

  • Ich habe weiter oben in einem Public bestimtmen Variablen einen Wert gegeben, falls diese bestimmte Vorgaben erfüllen.
    In der jetzgien Schleife packe ich alle Variablen übersichtlich in einen String. Dann soll dieser String an alle Spieler gesendet werden.
    EIn PayDay-Script sozusagen ;)


    lg

  • Hier:
    stock ClientLanguageText(playerid, color, const message0[], const message1[])
    {
    if(PlayerLanguage[playerid] == 0)
    {
    SendClientMessage(playerid, color, message0);
    return 1;
    }
    if(PlayerLanguage[playerid] == 1)
    {
    SendClientMessage(playerid, color, message1);
    return 1;
    }
    return 1;
    }

  • for(new i;i<MAX_PLAYERS;i++)
    {
    format(string,sizeof(string),"Properties: $%d Zone/s: $%d (%d zone/s) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    format(stringd,sizeof(stringd),"Unternehmen: $%d Gebiet/e: $%d (%d Gebiet/e) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    if(PlayerLanguage[playerid] == 0)
    {
    SendClientMessage(playerid, color, message0);
    return 1;
    }
    if(PlayerLanguage[playerid] == 1)
    {
    SendClientMessage(playerid, color, message1);
    return 1;
    }
    }
    Also wenn ich das rcihtig verstehe wär die sage so geklärt jenachdem unter welchem callback die schleife ist


  • Wasn das fürn Mist?


    Unglaublich, dass mir das nicht vorher eingefallen ist.
    format(string,sizeof(string),"Properties: $%d Zone/s: $%d (%d zone/s) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    format(stringd,sizeof(stringd),"Unternehmen: $%d Gebiet/e: $%d (%d Gebiet/e) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);


    if(PlayerLanguage[playerid] == 0) SendClientMessageToAll(COLOR_ORANGE, string);
    else if(PlayerLanguage[playerid] == 1) SendClientMessage(playerid, COLOR_ORANGE, stringd);
    Edit: Automatische Formatierung = Fail

  • Check ich nicht.
    Erst SendCLientMEssageToALl und dann SendClientMessage(playerid,... ?(
    AUßerdem habe ich es in dem stock genauso definiert oder nicht.


    edit: Die Funktion ClientLanguageText ist schon richtig, jedoch i.was im Code nicht.
    Die Nachricht wird mir gesendet und dann ca. 20-30 sec. später nochmals.

    Einmal editiert, zuletzt von Zcelo12 ()

  • Ok, hier habt ihr mein komplette public:


    public PayDay()
    {
    new
    iMoney[MAX_PLAYERS],
    string[100],
    stringd[100],
    BMoney[MAX_PLAYERS],
    JMoney[MAX_PLAYERS],
    bool:SendMSG;
    SendClientMessageToAll(COLOR_ORANGE,"______________________Payday______________________");
    for(new i;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i)) continue;
    SendMSG = true;
    for(new g; g<sizeof(Gebiete); g++)//Damit alle gebiete durchlaufen werden
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    iMoney[i] += 300;
    Player[i][Bank] += iMoney[i];
    }
    }
    if(Org[i][Member] == 4)
    {
    JMoney[i] += 425;
    }
    if(Org[i][Member] == 5)
    {
    JMoney[i] += 350;
    }
    if(Org[i][Member] == 6)
    {
    JMoney[i] += 500;
    }
    if(Org[i][Member] == 7)
    {
    JMoney[i] += 550;
    }
    Player[i][Bank] += JMoney[i];
    if(GetPVarInt(i, "Businessearnings") != 0)
    {
    BMoney[i] = GetPVarInt(i, "Businessearnings");
    Player[i][Bank] += GetPVarInt(i, "Businessearnings");
    }
    format(string,sizeof(string),"Properties: $%d Zone/s: $%d (%d zone/s) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    format(stringd,sizeof(stringd),"Unternehmen: $%d Gebiet/e: $%d (%d Gebiet/e) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    if(SendMSG) {
    ClientLanguageText(i,COLOR_ORANGE,stringd,string);
    SendMSG = false;
    }
    }
    SendClientMessageToAll(COLOR_ORANGE,"__________________________________________________");
    return 1;
    }


    edit: Fehler ausgebessert.


    lg

    Einmal editiert, zuletzt von Zcelo12 ()

  • Lösch mal ganz oben das "SendMSG = true" raus.
    Oben hängst du ein "[MAX_PLAYER]" an das "bool:SendMSG" an.
    Dann änderst du die if-Abfrage bei "if(SendMSG)" folgendermaßen um:
    if(!SendMSG[i])
    Zum Schluss ändere das "SendMSG = false" so um:
    SendMSG[i] = true;


  • new bool:SendMSG;
    for(new i;i<MAX_PLAYERS;i++)
    {
    SendMSG = true;
    if(!IsPlayerConnected(i)) continue;
    format(string,sizeof(string),"Properties: $%d Zone/s: $%d (%d zone/s) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    format(stringd,sizeof(stringd),"Unternehmen: $%d Gebiet/e: $%d (%d Gebiet/e) Job: $%d",BMoney[i],iMoney[i], ( iMoney[i] / 300 ) , JMoney[i]);
    if(SendMSG) {
    ClientLanguageText(i,COLOR_ORANGE,string,stringd);
    SendMSG = false;
    }
    }



    Abgesehen davon,dass es total beknackt ist ... Hier mal genauer.




    new
    bool:SendMSG;
    for(new i;i<MAX_PLAYERS;i++)
    {
    SendMSG = true;
    /* .. */
    if(SendMSG) {
    /* .. */
    SendMSG = false;
    }
    }

    Sinn ? SendMSG wird bei dir immer true sein. Somit macht die Abfrage keinen Sinn.


    Wie auch immer. Ich hab das mal überarbeiten. Habs nicht auf Fehler kompilieren lassen.
    Solltest du dabei Fehler bekommen, poste die mal.
    public PayDay()
    {
    new
    iMoney, // Wieso Array ?
    string[100],
    stringd[100],
    BMoney, // Wieso Array ?
    JMoney; // Wieso Array ?
    // bool:SendMSG; // brauchen wir nicht
    SendClientMessageToAll(COLOR_ORANGE,"______________________Payday______________________");
    for(new i;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i)) continue;
    // Alle Variablen "reseten"
    // Damit überprüfen, ob Geld dazu kommt oder nicht
    iMoney = 0;
    BMoney = 0;
    JMoney = 0;
    for(new g; g < sizeof(Gebiete); g++)//Damit alle gebiete durchlaufen werden
    {
    if(gTeam[i] == Gebiete[g][gOwner])
    {
    iMoney += 300;
    // Player[i][Bank] += iMoney;
    // Wenn man immer iMoney zu iBank hinzufügt
    // Dann vervielfältigt sich das immer
    // Beim 1x wird durch iMoney 300 mehr
    // danach ( beim 2x ) um 600 mehr
    // 3x - 900 mehr
    // usw
    // daher
    Player[i][Bank] += 300;
    }
    }
    if(Org[i][Member] == 4)
    {
    JMoney += 425;
    }
    if(Org[i][Member] == 5)
    {
    JMoney += 350;
    }
    if(Org[i][Member] == 6)
    {
    JMoney += 500;
    }
    if(Org[i][Member] == 7)
    {
    JMoney += 550;
    }
    Player[i][Bank] += JMoney;
    if(GetPVarInt(i, "Businessearnings") != 0)
    {
    BMoneyi = GetPVarInt(i, "Businessearnings");
    Player[i][Bank] += GetPVarInt(i, "Businessearnings");
    }
    // Wenn iMoney , BMoney oder JMoney nicht der Startwert ist ( 0 )
    // Dann wurde irgendwo Geld generiert.
    // Also kommt auch nur das in die Abfrage
    if( iMoney > 0 || BMoney > 0 || JMoney > 0 ) {
    // wir brauchen nicht formatieren, wenn wir die Nachricht sowieso
    // nicht senden wollen
    format(string,sizeof(string),"Properties: $%d Zone/s: $%d (%d zone/s) Job: $%d",BMoneyi,iMoney, ( iMoney / 300 ) , JMoney ) ;
    format(stringd,sizeof(stringd),"Unternehmen: $%d Gebiet/e: $%d (%d Gebiet/e) Job: $%d",BMoneyi,iMoney, ( iMoney / 300 ) , JMoney);
    ClientLanguageText(i,COLOR_ORANGE,stringd,string);
    }
    }
    SendClientMessageToAll(COLOR_ORANGE,"__________________________________________________");
    return 1;
    }


    Und tatsächlich, SendMSG machte auch hier immernoch keinen Sinn.

  • Goldkiller
    edit: Das komische ist jedoch, dass ich die Nachricht immernoch 2x bekomme :S
    edit2: Fehler ausgebessert -.-
    edit3: Ich habe bisher alles versucht, sogar foreach anzuwenden, jedoch ohne Erfolg. Kann mir jemand dringend helfen?
    Ich brauche dieses unbedingt heute noch fertig :S


    edit4: Weiß denn wirklich keiner weiter?

    4 Mal editiert, zuletzt von Zcelo12 ()

  • Dann wird PayDay vllt 2x hintereinander aufgerufen. Welche Nachricht bekommst du denn 2x gesendet ? Mal geprüft ob du nur die Textnachrichten 2x bekommst oder auch doppeltes Geld?


    Füg doch einfach Debug-Nachrichten ein.Denn an PayDay() ist nichts zu sehen, auch nicht bei ClientLanguageText.