Spieler werden nicht aufgelistet...

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 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.



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


    Beziehen tut sich das auf


    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.


    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.

  • Verwende strcat! also verwende longstr (Möglichst große Länge) und string.


    und in deiner Schleife:

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

    Wer PALWAL-Sternchen vergibt, bekommt aus Prinzip ein Like 😏


    @palwal Donald Trump ist einer der besten Präsidenten welche die USA je hatte, meine Meinung.

  • Hab ich auch schon gehört, ich finde allerdings strcat bei so einer kleinen Funktion
    kontraproduktiv und viel zu Rescourcen-Fressend, weshalb ich bewusst nicht damit arbeitete...
    Andere Alternativen bitte...

  • viel zu Rescourcen-Fressend

    Inwiefern darf man das verstehen?


    Wieso hast du überhaupt den String global deklariert?!


    Versuchs mal so:



    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 ^^

    ast2ufdyxkb1.png


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

  • Inwiefern?
    2 Strings für so eine Funktion, da ist deine Variante doch viel anspruchsvoller.


    Warum ich es global definiert habe?
    Damit ich es nicht in jeder Funktion neu definieren muss? ^^


    Einfach nur
    format(string blablabla überschreiben...


    @palwal : Wie du sehen kannst ist es laut Kalibers Antwort doch anders zu lösen...

  • 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 :)

    ast2ufdyxkb1.png


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

  • @Kaliber eine Frage, ich danke dir für deine Antwort.
    Ein Scripter sagte mir mal ich soll meine Variabeln nicht mehr mit "new" definieren, sondern mit "static" ,
    ist da was dran? Der hat in seinen Script alles voll mit static statt new.


    Wenn der etwas definiert, definiert er das mit static variable;
    nicht mit new variable;


    Ist das static besser?

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


    static hat 2 Eigenschaften.


    • 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! :)
    • Du kannst static in einer Funktion verwenden, hier dazu mal ein Beispiel:

    Wir sagen du hast folgende Funktion:


    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! :)

    ast2ufdyxkb1.png


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