Habe ein kleines Problemchen mit meinem Blacklist-System

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
  • Guten Tag,
    ich habe ein kleines Problem mit meinem selbstgemacht Blacklist-System, aber wirklich nur ein kleines.
    also Folgendes: wenn ich /bl mache werden die Spieler untereinander gelistet doch das möchte ich nicht, ich möchte das
    diese nebeneinander sind bsp: Pr0x, Pr0x. so und wichtig ist das am ende ein Punkt ist, denn bei mir ist das so Pr0x nächste Zeile drunter Pr0x.


    hier der Code:


    if(PlayerInfo[playerid][pLeader] == 5 || PlayerInfo[playerid][pMember] == 5)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"Blacklist Spieler Online:");
    if(PlayerInfo[i][pLaCosaNostraBL] == 1)
    {
    format(string,sizeof(string),"%s",SpielerName(i));
    SendClientMessage(playerid,COLOR_YELLOW,string);
    }
    }
    }


    Vielen vielen dank im Voraus.

  • Bisher gibst du ja alles in der Schleife Stück für Stück aus. Du musst einen großen String bauen (Beachte maximale Länge von 128!) und diesen nach der Schleife ausgeben.

  • (Beachte maximale Länge von 128!)


    Falsch. Maximal können 144 Zeichen ausgegeben werden.


    --------------------------


    Pr0x:
    Da du mich in einer PN so nett um Hilfe gebeten hast:
    if(PlayerInfo[playerid][pLeader] == 5 || PlayerInfo[playerid][pMember] == 5)
    {
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"Blacklist Spieler Online:"); //Ausgabe der Überschrift
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(PlayerInfo[i][pLaCosaNostraBL] == 1)
    {
    if(4 + strlen(string) + strlen(SpielerName(i)) < sizeof(string)) format(string,sizeof(string),"%s, %s",string, SpielerName(i)); //Wenn der Name ''noch in den string passt'', füge ihn ein.
    else
    {
    format(string,sizeof(string),"%s,",string);
    SendClientMessage(playerid,COLOR_YELLOW,string); //Wenn nicht, gebe alles bisherige aus (mit einem Komma am Ende)
    format(string,sizeof(string),"%s",SpielerName(i)); //Und starte eine neue Zeile
    }
    }
    }
    format(string,sizeof(string),"%s.",string); //Sind alle Spieler durch, kommt ans Ende ein Punkt.
    SendClientMessage(playerid,COLOR_YELLOW,string);
    }


    Ich habe es nicht getestet. Falls es nicht tut, gib mir bitte Bescheid und erkläre, was nicht funktioniert. Es sollte aber funktionieren.


  • Falsch. Maximal können 144 Zeichen ausgegeben werden.

    Das ist so nicht ganz korrekt. Es können lediglich 128 Zeichen ausgegeben werden, es werden jedoch nur 128 Zeichen von Nachrichten bis zu einer Länge von 144 ausgegeben. Von Strings länger als 144 Zeichen wird garnichts ausgegeben.


    Zu deinem Quellcode:

    • Überprüfe, ob der Spieler in der Schleife überhaupt verbunden ist oder besser: Verwende foreach!
    • Verwende strcat(), wenn immer möglich. Ist um einiges performanter als format und zum Beispiel für das Komma vor der Ausgabe besser geeignet.
    • Überprüfe am Ende, ob überhaupt ein Spieler im String steht - ansonsten gebe auch nichts aus oder eine Fehlermeldung.

  • Funktioniert danke, würdest du mir nochmal helfen denn jetzt kommt immer ein Komma vor dem ersten namen und wenn ich das weg machen werden
    die namen zusammen geschrieben, wäre sehr nett wenn du nochmal helfen würdest.


    das ganze sieht so aus:

  • Das ist so nicht ganz korrekt. Es können lediglich 128 Zeichen ausgegeben werden, es werden jedoch nur 128 Zeichen von Nachrichten bis zu einer Länge von 144 ausgegeben. Von Strings länger als 144 Zeichen wird garnichts ausgegeben.



    Du darfst gerne nachzählen. 144 Zeichen bei SendClientMessage. Ich würde es nicht sagen, wenn ich es nicht ausprobiert hätte.



    Überprüfe, ob der Spieler in der Schleife überhaupt verbunden ist oder besser: Verwende foreach!


    Ist nicht nötig, wenn er seinen Code gescheit gemacht hat. Verlässt ein Spieler den Server, so kann er auch nicht mehr in der BlackList sein, daher ist eine Überprüfung nicht von Nöten.
    foreach ist hier absolut unangebracht, ich mülle einen "Anfänger" nicht mit zig Plugins zu, da lernt er nichts und es macht die Sache nur unnötig kompliziert.



    Verwende strcat(), wenn immer möglich. Ist um einiges performanter als format und zum Beispiel für das Komma vor der Ausgabe besser geeignet.


    Auch hier ist format die wesentlich einfachere und übersichtlichere Methode, besonders für Leute die noch relativ frisch im Bereich Scripting sind. Außerdem sprechen wir hier von Mikrosekunden bei heutigen Prozessoren, das macht hier einen irrelevanten Unterschied. Hier geht es eher darum, dass er den Code versteht, nicht, dass er 100% optimiert ist und er ihn dann nicht mehr versteht.



    Überprüfe am Ende, ob überhaupt ein Spieler im String steht - ansonsten gebe auch nichts aus oder eine Fehlermeldung.


    Danke.



    Pr0x:
    Tut mir Leid, hatte falschherum gedacht. Das Komma kommt natürlich danach, der string ist ja Anfangs leer.
    if(PlayerInfo[playerid][pLeader] == 5 || PlayerInfo[playerid][pMember] == 5)
    {
    SendClientMessage(playerid,COLOR_LIGHTBLUE,"Blacklist Spieler Online:"); //Ausgabe der Überschrift
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(PlayerInfo[i][pLaCosaNostraBL] == 1)
    {
    if(4 + strlen(string) + strlen(SpielerName(i)) < sizeof(string)) format(string,sizeof(string),"%s%s, ",string, SpielerName(i)); //Wenn der Name ''noch in den string passt'', füge ihn ein.
    else
    {
    SendClientMessage(playerid,COLOR_YELLOW,string); //Wenn nicht, gebe alles bisherige aus
    format(string,sizeof(string),"%s, ",SpielerName(i)); //Und starte eine neue Zeile
    }
    }
    }
    if(!strlen(string)) SendClientMessage(playerid,COLOR_YELLOW,"Keiner Online");
    else
    {
    strdel(string, strlen(string)-2, strlen(string)); //Macht das letzte Komma weg.
    format(string,sizeof(string),"%s.",string); //Sind alle Spieler durch, kommt ans Ende ein Punkt.
    SendClientMessage(playerid,COLOR_YELLOW,string);
    }
    }