Entlosschleife --> Spieler Online-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 leute, ich habe eine frage.


    Ich hab diese schleife unter ein 1-minuten timer,
    for(new i = 0; i < MAX_PLAYERS; i++){


    Doch das problem ist, dass er jedesmal meine console vollspammt, wenn ich etwas zum printen reinfüge.
    Ich möchte, dass diese Schleife nur soviel durchgeht, wieviele spieler online sind. und nicht 200.


    Geht das?


    mfg

    526C4Hj.png Mit freundlichen Grüßen,
    Noneatme

  • mach nach ganz oben


    #undef MAX_PLAYERS
    #define MAX_PLAYERS 200

  • Es geht viel einfacher, du schreibst einfach eine Funktion die zählt wieviele Spieler on sind und diese returned.


    Versuchs so:

    stock GetOnlinePlayers()
    {
    new alle;
    for(new count=0;count<=MAX_PLAYERS;count++)
    {
    if(IsPlayerConnected(i))
    {
    alle++;
    }
    }
    return alle;
    }

    Und dann einfach das:

    for(new i = 0; i < GetOnlinePlayers(); i++){
    //Blabla

  • Um Himmels Willen.


    Wenn IDs 0,1,2,3,4 und 7 on sind, geht die Schleife nur bis 5 und ID 7 hat Pech gehabt.


    Immer ein "IsPlayerConnected" als erste Abfragen oder alternativ Y_Less' foreach benutzen, dann wird das schon.

  • dann könnte er es viel einfacher machen und einfach abfragen ob er online ist.


    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))

    Wäre sinnvoller.. Aber er möchte glaube ich, das nicht mehr gemacht wird als nötig.
    Bei deiner variante würde er ja 1 schleife komplett durchgehen und dann eine 2. Da könnte er genauso gut eine schleife komplett durchgehen und abfragen ob der spieler connected ist.


    Würde es auch mit einer variablen machen.

  • Was soll ich jetz nehmen ? ._.


    MnKn's sieht gut aus.


    //edit:
    hab noch eine frage bezüglich publics mit Playerid,
    ich habe diesen Public.



    public UpdateFraktionen(playerid)
    {
    if(SpielerInfo[playerid][Fraktion] == 1 && habdiezahl[playerid] == 1){sapdonvar -= 1; habdiezahl[playerid] = 0;}
    if(SpielerInfo[playerid][Fraktion] == 2 && habdiezahl[playerid] == 1){fbionvar -= 1; habdiezahl[playerid] = 0;}
    if(SpielerInfo[playerid][Fraktion] == 3 && habdiezahl[playerid] == 1){armyonvar -= 1; habdiezahl[playerid] = 0;}
    if(SpielerInfo[playerid][Fraktion] == 4 && habdiezahl[playerid] == 1){groveonvar -= 1; habdiezahl[playerid] = 0;}
    if(SpielerInfo[playerid][Fraktion] == 5 && habdiezahl[playerid] == 1){vagosonvar -= 1; habdiezahl[playerid] = 0;}
    if(SpielerInfo[playerid][Fraktion] == 6 && habdiezahl[playerid] == 1){sanonvar -= 1; habdiezahl[playerid] = 0;}
    if(SpielerInfo[playerid][Fraktion] == 7 && habdiezahl[playerid] == 1){terroronvar -= 1; habdiezahl[playerid] = 0;}


    if(SpielerInfo[playerid][Fraktion] == 1 && habdiezahl[playerid] == 0){sapdonvar += 1; habdiezahl[playerid] = 1;}
    if(SpielerInfo[playerid][Fraktion] == 2 && habdiezahl[playerid] == 0){fbionvar += 1; habdiezahl[playerid] = 1;}
    if(SpielerInfo[playerid][Fraktion] == 3 && habdiezahl[playerid] == 0){armyonvar += 1; habdiezahl[playerid] = 1;}
    if(SpielerInfo[playerid][Fraktion] == 4 && habdiezahl[playerid] == 0){groveonvar += 1; habdiezahl[playerid] = 1;}
    if(SpielerInfo[playerid][Fraktion] == 5 && habdiezahl[playerid] == 0){vagosonvar += 1; habdiezahl[playerid] = 1;}
    if(SpielerInfo[playerid][Fraktion] == 6 && habdiezahl[playerid] == 0){sanonvar += 1; habdiezahl[playerid] = 1;}
    if(SpielerInfo[playerid][Fraktion] == 7 && habdiezahl[playerid] == 0){terroronvar += 1; habdiezahl[playerid] = 1;}
    format(ausgabe,sizeof(ausgabe),"~g~- %d ~b~- %d ~h~~g~- %d - %d ~y~- %d ~r~- %d ~y~- %d",sapdonvar,fbionvar,armyonvar,groveonvar,vagosonvar,terroronvar,sanonvar);
    TextDrawSetString(Onlinefraktion,ausgabe);
    TextDrawShowForAll(Onlinefraktion);
    }
    Dieser soll ein Textdrawstring updaten, auf die User die grade online sind.
    Ich bin immer sehr kompliziert und arbeite viel mit Variablen.


    könnte dort auch ein fehler ohne schleife auftauchen?


    mfg
    //edit2: mit 5-6 spielern getestet, funktioniert zwar, bin mir aber nicht sicher mit 10 spielern.

    526C4Hj.png Mit freundlichen Grüßen,
    Noneatme

  • Die Schnellste Konventionelle Methode ist immernoch die hier:
    for ( new slots = GetMaxPlayers( ), i; i < slots; i++ )
    {
    if ( !IsPlayerConnected( i ) ) continue;
    //dein Code
    }


    Ansonsten solltest du mal darüber nachdenken auf foreach umzusteigen bei Spieler schleifen.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • wozu getmayplayers? kann er etwa max_players nicht so definieren wv er aufn server lassen will?
    oder mach getmaxplayers bei ongamemodeinit, aber nicht in jeder schleife...

  • Noch kürzer:


    for(new i;i<MAX_PLAYERS&&IsPlayerConnected(i);i++)


    so sehn bei mir quasi alle Schleifen aus


    Dann funktionieren quasi alle deine Schleifen nicht richtig.


    Nehmen wir an,wir haben Spieler mit den IDs:

    Zitat

    0, 1 , 5 , 6


    Deine Schleife beginnt.
    0 < MAX_PLAYERS && IsPlayerConnected(0) - wahr / true
    1 < MAX_PLAYERS && IsPlayerConnected(1) - wahr / true
    2 < MAX_PLAYERS && IsPlayerConnected(2) - falsch / false
    Schleife wird beendet.
    ID 5 und 6 werden niemals erreicht.
    Denn die Schleife läuft nur so lange,wie die Bedingung wahr ist.Sobald eine ID unbenutzte haben, wird die Schleife beendet. Egal ob danach noch irgendeine belegte pielerID kommt oder nicht.
    Von daher,keine Gute Idee so die Schleifen zu machen.

  • Das mit dem GetMaxPlayers( ); sehe ich genau so als Schwachsinn an, da bei jeder Schleife er erneut auslesen muss, wie viele Spieler maximal auf den Server kommen können.


    Bester Weg:
    #undef MAX_PLAYERS
    #define MAX_PLAYERS 32


    Zu deiner Frage:
    Also ich sehe es nicht als Problem an, es können 10 Spieler oder auch 100 Spieler sein und die Funktion würde funktionieren...

  • Gut, das ist natürlich ein ziemlich mieser Logikfehler, obwohl ich sogar meine, dass DMA die Schleife in dieser Form vor etlicher Zeit mal gepostet hätte :huh:

  • Was du dort hast,sieht nämlich so aus:

    for(new i = 0 ; i < MAX_PLAYERS && IsPlayerConnected(i) ; i++) {
    // Code
    }
    // ==
    for(new i = 0 ; i < MAX_PLAYERS ; i++) {
    if( !IsPlayerConnected(i) ) break;
    // Code
    }
    Das es mit diesem break nicht sinnvoll ist,sollte klar sein :p.




    Um nochmal auf den Sinn des Threads zu kommen.
    for(new i = 0 ; i < MAX_PLAYERS ; i++) if(IsPlayerConnected(i) ) {


    }


    #define foreach(%1) \
    for(new %1 = 0; %1 < MAX_PLAYERS ; %1++) if( IsPlayerConnected(%1) )
    // Nutzung:
    foreach(i) {
    printf("ID's Online: %d",i);
    }

    Kannst also mit diesem define arbeiten.Das ist nicht das foreach, von dem hier gesprochen wurde!
    Sie meinten nämlich folgendes : http://forum.sa-mp.com/showthread.php?t=92679


    //Edit: Fehler :-0

    Einmal editiert, zuletzt von Goldkiller ()

  • printf("ID's Online: %d");


    heißt das nicht


    printf("ID's Online: %d",i);


    ?


    //edit
    Goldkiller


    falls das foreach oben definiert ist, wie du meinst, bekomme ich folgenden error beim einsetzen:


    colex.pwn(7985) : error 001: expected token: ")", but found "{"



    public Updateknast()
    {
    foreach(i) {
    ...


    //edit:



    public Updateknast()
    {
    foreach(i)) {


    so gehts...

    526C4Hj.png Mit freundlichen Grüßen,
    Noneatme

    Einmal editiert, zuletzt von Noneatme ()

  • Hast recht, hab es falsch aus meinem Code kopiert:
    // gAdmin.pwn
    #define foreach(%1) \
    for(new %1;%1<g_Max_Players;%1++) if(IsPlayerConnected(%1) && !IsPlayerNPC(%1) )

    Hab es nämlich bei mir so, wohl falsch umgeschrieben :pinch: .


    Es fehlte hinten die Klammer ) , die die Bedingung schliet.


    #define foreach(%1) \
    for(new %1 = 0; %1 < MAX_PLAYERS ; %1++) if( IsPlayerConnected(%1) )