Schleife durch alle Spieler funktioniert nur auf localhost

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 ein kleines Problem.
    Undzwar, wenn ich meinen Befehl (/liste) aufrufe, und eine Liste auswähle, wird manchmal etwas angezeigt manchmal steht aber dort dass niemand der Personen online ist, obwohl sie die passenden Vorrausetzungen haben.


    case DIALOG_LISTE:
    {
    new string[128];
    new str2[2048];
    if(response)
    {
    if(listitem==0)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 1)
    {
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Farmer online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_FARMLISTE, DIALOG_STYLE_MSGBOX,COLOR_HEX_ORANGE"Farmer-Liste", str2, "Schließen", "");
    }
    if(listitem==1)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 2)
    {
    format(string, sizeof(string), "Busfahrer %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Busfahrer online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_BUSLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Busfahrer-Liste",str2, "Schließen", "");
    }
    if(listitem==2)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 3)
    {
    format(string, sizeof(string), "Trucker %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Trucker online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_TRUCKLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Truck-Liste",str2, "Schließen", "");
    }
    if(listitem==3)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 4)
    {
    format(string, sizeof(string), "Pilot %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Pilote online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_PILOTLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Pilot-Liste",str2, "Schließen", "");
    }
    if(listitem==4)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 5)
    {
    format(string, sizeof(string), "KFZ-Mech. %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Mechatroniker online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_KFZLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"KFZ-Mech.-Liste",str2, "Schließen", "");
    }
    if(listitem==5)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 6)
    {
    format(string, sizeof(string), "Anwalt %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Anwälte online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_ANWALTLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Anwalt-Liste",str2, "Schließen", "");
    }
    if(listitem==6)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pAdmin] > 0)
    {
    new rang[32];
    if(Spieler[i][pAdmin] == 1){rang = "Trial-Supporter";}
    else if(Spieler[i][pAdmin] == 2){rang ="Supporter";}
    else if(Spieler[i][pAdmin] == 3){rang ="Trial-Admin";}
    else if(Spieler[i][pAdmin] == 4){rang ="Admin";}
    else if(Spieler[i][pAdmin] == 5){rang ="Projektleiter";}
    format(string, sizeof(string), "%s %s (ID: %i) (Tel: -)\n", rang, GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Team-Mitglieder online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_ADMINLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Admin-Liste", str2, "Schließen", "");
    }
    if(listitem==7)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pFraktion] == 4)
    {
    format(string, sizeof(string), "News Reporter %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Reporter online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_REPLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"News Reporter Liste",str2, "Schließen", "");
    }
    if(listitem==8)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pFraktion] == 3)
    {
    format(string, sizeof(string), "Sanitäter %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Sanitäter online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_SANILISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Sanitäter Liste",str2, "Schließen", "");
    }
    if(listitem==9)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pFraktion] == 5)
    {
    format(string, sizeof(string), "Ordnungsämtler %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Ordnungsämtler online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_OAMTLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Ordnungsamt Liste",str2, "Schließen", "");
    }
    if(listitem==10)
    {
    if(Spieler[playerid][pFraktion] == 1 || Spieler[playerid][pFraktion] == 2)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pWanteds] >= 1)
    {
    format(string, sizeof(string), "Verbrecher %s (ID: %i) (Wantedlevel: %i)\n", GetName(i), i, Spieler[i][pWanteds]);
    strcat(str2, string);


    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Verbrecher online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_WTDLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Verbrecher Liste",str2, "Schließen", "");
    }
    else if(Spieler[playerid][pFraktion] == 3)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pTotTime] >= 1)
    {
    format(string, sizeof(string), "Toter %s (ID: %i) (Zeit: %i)\n", GetName(i), i, Spieler[i][pTotTime]);
    strcat(str2, string);
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Toten online.");
    return 1;
    }
    }
    }
    ShowPlayerDialog(playerid, DIALOG_TOTLISTE, DIALOG_STYLE_MSGBOX, COLOR_HEX_ORANGE"Gestorbenenliste",str2, "Schließen", "");
    }
    }


    }
    if(!response)
    {
    return 1;
    }
    }


    Ich weiß echt nicht woran es liegen könnte. :S
    Danke ;)
    (e) Kann jemand helfen? :/
    (e) Hab mal getestet. Wenn ich alleine auf localhost bin, geht die Liste. Auf dem Server von Sponsoring-Network geht dies nicht. :/
    (e) Problem ist immernoch :cursing:
    (e) Überschrift geändert ..

  • Du machst in der Schleife return,sobald ein Spieler NICHT in einer bestimmten Fraktion ist ( Farmer , Busfahrer usw. ) wird bei dir davon ausgegangen,dass es KEINEN in dieser Fraktion gibt. Natürlich muss das nicht stimmen.
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 1)
    {
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);
    }
    else // Ist der Spieler kein <FARMER>,wird dieser Zweig durchgegangen.
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Farmer online.");
    return 1; // <-- Dieses return ist das Problem. Selbst wenn 99 Spieler <Farmer> sind und nur 1 nicht,dann wird hier durch return alles beendet. So als gäbe es 0 <Farmer>
    }
    }
    }
    Könntest es auf viele Weisen lösen. Einfach wäre es zB einfach eine neue Variable anzulegen und hochzuzählen,falls es <Farmer> gibt ( Einfach von false auf true setzen erfüllt die Gleichen Zweck ).
    Dann NACH der Schleife Abfragen,ob die Variable 0 / false ist und daraus ableiten,dass es keine <Farmer> gibt ( Nachricht absenden,dass es keine <Farmer> gibt ) . Ist die Variable > 0 oder true,dann gibt es <Farmer> und du kannst den Dialog anzeigen.
    Der else - Zweig ist natürlich dann komplett zu entfernen.

  • Ungf. so?


    new bool:IsAnyFarmerOnline;
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(IsAnyFarmerOnline == true)
    {
    if(Spieler[i][pJob] == 1)
    {
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GREY, "Keine Farmer online.");
    return 1;
    }
    }
    }

  • :D nein die Abfrage, ob IsAnyFarmerOnline ist muss selbstverständlich außerhalb der Schleife stehen, denk' doch mal logisch:


    Erst fertigen wir einen Fragebogen an: new bool:IsAnyFarmerOnline = false; (Bool := kann nur false und true enthalten)


    Dann befragen wir jede Person, ob sie farmer ist (= Forschleife)
    Wenn die befragte Person Farmer ist, notieren wir das (= In der For-Schleife: IsAnyFarmerOnline = true;)


    nach der Umfrage werten wir Sie aus, d.h. wir können erst NACH der For-Schleife auswerten:
    Also NACH !! der For-Schleife: if (IsAnyFarmerOnline == false) oder kürzer if (!IsAnyFarmerOnline)

    nanosMalte


    Zitat

    Zitat von Goldkiller




    Obwohl MiniYoda das Wörtchen "Dynamisch" in der Deutschen SA-MP szene mit durchaus fatalen Folgen verbreitete, so hat er dennoch bewiesen, dass er das Handwerk PAWN hervorragend beherrscht. Er gehört definitiv zu den kompetentesten Scriptern die man bei SA-MP.DE finden kann.

  • new bool:IsAnyFarmerOnline;
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i])
    {
    if(Spieler[i][pJob] == 1)
    {
    IsAnyFarmerOnline = true;
    }
    }
    }
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);


    Wäre das so richtig? :D
    Sorry, ich bin nicht so der Schleifen-Experte. Nur bei Hausfrauen. (*hust*) :D


    (e) Suche immernoch Hilfe. :/
    (e) MiniYoda wie meinst du das denn ? <.<
    (e)
    Habe es jetzt so, denke auch dass es richtig ist, aber was ist, wenn kein Farmer online ist? Also wenn vorher ein Farmer online war, jemand /liste gemacht hat, dann wird ja die Variable auf true gesetzt, und wenn alle Farmer dann offline sind. Da muss ja irgendwo noch was auf false gesetzt werden. ;)
    Hier mal der Quelltext wie es jetzt aussieht:
    if(listitem==0)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 1)
    {
    IsAnyFarmerOnline = true;
    }
    }
    }
    if(!IsAnyFarmerOnline)
    {
    SendClientMessage(playerid, COLOR_GREY, "Kein Farmer online!");
    return 1;
    }
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: %d)\n", GetName(i), i, Spieler[i][pHandyNr]);
    strcat(str2, string);
    ShowPlayerDialog(playerid, DIALOG_FARMLISTE, DIALOG_STYLE_MSGBOX,COLOR_HEX_ORANGE"Farmer-Liste", str2, "Schließen", "");
    }

    (e) Suche immernoch Hilfe -.- 8|

  • Ich denk mal so sollte es gehen wie du willst



    new bool:IsAnyFarmerOnline;
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i])
    {
    if(Spieler[i][pJob] == 1)
    {
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: -)\n", GetName(i), i);
    strcat(str2, string);
    IsAnyFarmerOnline = true;
    }
    else
    {
    IsAnyFarmerOnline = false;
    }
    }
    }
    if(IsAnyFarmerOnline) return SendClientMessage(playerid, COLOR_GREY, "Kein Farmer online!");

  • Ist aber falsch,so einfach ist das ( lPrototypel ).


    Ich zeig dir mal wo der Fehler liegt:
    if(listitem==0)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(i) && gPlayerLogged[i] == 1)
    {
    if(Spieler[i][pJob] == 1)
    {
    IsAnyFarmerOnline = true;
    }
    }
    }
    if(!IsAnyFarmerOnline)
    {
    SendClientMessage(playerid, COLOR_GREY, "Kein Farmer online!");
    return 1;
    }
    format(string, sizeof(string), "Farmer %s (ID: %i) (Tel: %d)\n", GetName(i), i, Spieler[i][pHandyNr]); // <-- wo kommt denn hier das i her ?
    strcat(str2, string); // <-- Muss mit der format() Zeile zusammen verschoben werden.
    ShowPlayerDialog(playerid, DIALOG_FARMLISTE, DIALOG_STYLE_MSGBOX,COLOR_HEX_ORANGE"Farmer-Liste", str2, "Schließen", "");
    }
    Die Zeilen die falsch sind,habe ich dir markiert.
    Wo machen sie denn am meisten Sinn ? Du willst ja die Spieler die du in der Schleife prüfst verarbeiten, dass machst du ja auch richtig mit dem i , nur an der falschen Stelle. Das i ist außerhalb der Schleife nicht vorhanden und du würdest dann sowieso immer nur einen Spieler verarbeiten können.
    Es muss also irgendwo wo hin verschoben werden,wo es direkt mit dem i aus der Schleife zusammen arbeiten kann, falls der Spieler ein Farmer ist.

  • Bin zwar grade nicht am PC aber es geht.
    Habe es so gemacht ca.

    new bool:IsOnline;
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(Spieler[i][pJob] == 1)
    {
    strcat..
    format..
    IsOnline = true;
    }
    }
    if(!IsOnline)return SendClientMessage..
    ShowPlayerDialog..

    Danke euch. :p
    Close ^^