Spieler werden nicht aufgelistet...

  • Spieler werden nicht aufgelistet...

    Hallo folgendes Problem, die Spieler in meinen Dialog werden nicht aufgelistet.
    Es wird immer nur einer Angezeigt, wahrscheinlich habe ich den string falsch formartiert.
    Doch ich wüsste nicht, wie ich ihn sonst formatieren sollte.


    PAWN-Quellcode

    1. ocmd:adaclist(playerid)
    2. {
    3. if(!DarfPlayerCommand(playerid))return ErrorMsg(playerid,"Du kannst keine Befele nutzen.");
    4. if(SpielerInfo[playerid][Job]!=4)return ErrorMsg(playerid,"Du bist kein Mitglied des ADAC's.");
    5. new adaccount=0;
    6. for(new i=0; i<MAX_PLAYERS; i++)
    7. {
    8. if(!IsPlayerEingeloggt(i))continue;
    9. if(willADAC[i]!=1)continue;
    10. format(longstr,sizeof(longstr),"Auftragsnummer\tName\tTelefon\n\n%i\t%s\t%d",i,SpielerName(i),SpielerInfo[i][HIN]);
    11. adaccount+=1;
    12. }
    13. if(adaccount==0)return ShowPlayerDialog(playerid,DIALOG_INFO,DIALOG_STYLE_MSGBOX,"ADAC - Auftragsliste","Es sind keine Aufträge vorhanden.","Ok","");
    14. ShowPlayerDialog(playerid,DIALOG_INFO,DIALOG_STYLE_TABLIST_HEADERS,"ADAC-Auftragsliste",longstr,"Ok","");
    15. return 1;
    16. }
    Alles anzeigen


    Beziehen tut sich das auf

    PAWN-Quellcode

    1. format(longstr,sizeof(longstr),"Auftragsnummer\tName\tTelefon\n\n%i\t%s\t%d",i,SpielerName(i),SpielerInfo[i][HIN]);


    Das geht einfach nicht in die Nächste Zeile. Ich weiß schon, dass ich den longstr irgendwo wieder einfügen muss, jedoch wo, ich habe es so probiert.

    PAWN-Quellcode

    1. format(longstr,sizeof(longstr),"%s\nAuftragsnummer\tName\tTelefon\n\n%i\t%s\t%d",longstr,i,SpielerName(i),SpielerInfo[i][HIN]);


    Gebe ich das so ein, wird gar nichts mehr angezeigt, ich brauche Hilfe.
    Noch ein Foto wie es In-Game aussieht.
    Bilder
    • Screenshot (1457).png

      89,75 kB, 446×311, 3 mal angesehen
  • SekLoso schrieb:

    viel zu Rescourcen-Fressend
    Inwiefern darf man das verstehen?

    Wieso hast du überhaupt den String global deklariert?!

    Versuchs mal so:


    C-Quellcode

    1. ocmd:adaclist(playerid)
    2. {
    3. if(!DarfPlayerCommand(playerid))return ErrorMsg(playerid,"Du kannst keine Befele nutzen.");
    4. if(SpielerInfo[playerid][Job]!=4)return ErrorMsg(playerid,"Du bist kein Mitglied des ADAC's.");
    5. new string[MAX_PLAYERS*MAX_PLAYER_NAME] = "Auftragsnummer\tName\tTelefon\n";
    6. for(new i=GetPlayerPoolSize(); i!=-1; i--)
    7. {
    8. if(!IsPlayerEingeloggt(i) || willADAC[i]!=1)continue;
    9. format(string,sizeof(string),"%s\n%i\t%s\t%d",string,i,SpielerName(i),SpielerInfo[i][HIN]);
    10. }
    11. if(strlen(string)==28)return ShowPlayerDialog(playerid,DIALOG_INFO,DIALOG_STYLE_MSGBOX,"ADAC - Auftragsliste","Es sind keine Aufträge vorhanden.","Ok","");
    12. ShowPlayerDialog(playerid,DIALOG_INFO,DIALOG_STYLE_TABLIST_HEADERS,"ADAC-Auftragsliste",string,"Ok","");
    13. return 1;
    14. }
    Alles anzeigen
    Musst halt auch immer neu den String auf deinen alten String packen und nicht immer überschreiben, sonst wird dir natürlich immer nur der Letzte Spieler angezeigt ^^


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/
  • Ich rate dir davon ab strings global zu deklarieren die du in sub-Funktionen nutzt.

    Wenn schnelle Änderungen im ns-ms Takt auftreten, kann es da zu erheblichen Fehlern / Überschreibungen kommen.

    Zudem blockieren sie sehr viel Heap Speicher, dann kannst du weniger auf den Stack packen, der belegt wird, wenn du solche Strings in sub-Funktionen deklarierst, was dann schneller zu einer Heap/Stack Collission führen kann, wie man es in einigen Skripten heutzutage sieht.

    Deklarier einfach in der Sub-Funktion einen String so klein wie es möglich ist und gut ist. Dieser wird ja nach beenden der Routine wieder vom Stack geschmissen. Der nimmt also nur kurz Platz weg wohingegen der im Heap reservierte Speicher permanent Platz einnimmt + die .amx größer macht + sehr Fehler anfällig sein kann :)


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/

  • Nein, also überall static zu verwenden ist kompletter Quatsch, da du es dann genauso gut global deklarieren könntest.

    static hat 2 Eigenschaften.

    1. Angenommen wir befinden uns in einem Include, dann kannst du dort global static verwende. Das sorgt dafür, dass in deinem Haupt Gamemode dieser Variablen Name nicht existiert und nur vom Include auf diese Variable zugegriffen werden kann. Dies ermöglicht eine Kapselung der Daten vom Include & Gamemode und somit eine sehr saubere Programmierung! :)
    2. Du kannst static in einer Funktion verwenden, hier dazu mal ein Beispiel:
    Wir sagen du hast folgende Funktion:

    C-Quellcode

    1. stock test()
    2. {
    3. static counter; //Wird Standardmäßig mit 0 initialisiert
    4. printf("%d",++counter);
    5. }
    6. //Rufen wir das mal in einer main auf:
    7. test(); //Gibt 1 aus
    8. test(); //Gibt 2 aus
    9. test(); //Gibt 3 aus
    Wir sehen also, der Wert wird gespeichert, wie bei einer globalen Variable, nur ist diese nur innerhalb der Funktion verfügbar.

    Kann man machen, macht aber wie man sehen sollte nicht immer wirklich Sinn und kann bei falscher Anwendung zu schweren Fehlern führen! :)


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. X/