sscanf - Mehrere Spieler in einer Liste anzeigen?

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 suche derzeit eine Möglichkeit (höchstwahrscheinlich mit sscanf) eine Liste der Spieler anzuzeigen.
    Sprich, ich schreibe "/name Guenther", auf dem Server ist nun Guenther.Mueller, Guenther.Schmidt, Guenther_Schmitz, etc.


    Der Server soll nun ausgeben:
    ID: X - Guenther.Mueller
    ID: Y - Guenther.Schmidt
    ID: Z - Guenther_Schmitz


    Danke. :)

  • Hey, ich habe dir da mal einen Befehl fertig gemacht. Ich habe es nur Local (1 Person) getestet, es sollte aber auch bei mehreren Funktionieren^^



    ocmd:name(playerid, params[])
    {
    new pID, str[30 + MAX_PLAYER_NAME], InputName[MAX_PLAYER_NAME], OutputName[MAX_PLAYER_NAME];
    if(sscanf(params, "u", pID)) return SendClientMessage(playerid, -1, "Tippe: /name [NAME]");
    GetPlayerName(pID, InputName, 24);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    GetPlayerName(i, OutputName, 24);
    if(!strcmp(InputName, OutputName, true))
    {
    format(str, sizeof(str), "ID: %d | Spielername: %s", i, OutputName);
    SendClientMessage(playerid, -1, str);
    }
    }
    }
    return 1;
    }

  • Das wird nicht klappen, da strcmp nur eindeutige Übereinstimmungen findet, also immer nur den Spieler selbst.


    Versuche es so:
    ocmd:name(playerid, params[])
    {
    new str[64], name[MAX_PLAYER_NAME];
    if(!strlen(params)) return SendClientMessage(playerid, -1, "Tippe: /name [Suchbegriff]");
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, name, MAX_PLAYER_NAME))
    {
    if(strfind(name, params, true) != -1)
    {
    format(str, sizeof(str), "ID: %d | Spielername: %s", i, name);
    SendClientMessage(playerid, -1, str);
    }
    }
    }
    return 1;
    }

  • Danke, funktioniert.
    Wie kann ich das ganze jetzt noch so machen, dass wenn er direkt eine ID eingibt, dass es angezeigt wird? ^^
    Also sprich, so wie du, aber wenn man jetzt bspw. /name 0 eingibt, dass dort dann einfach die Info vom Spieler steht ID & Name. ^^
    @Jeffry

    Einmal editiert, zuletzt von hav0K~ ()

  • Versuche es so:
    ocmd:name(playerid, params[])
    {
    new str[64], name[MAX_PLAYER_NAME];
    if(!strlen(params)) return SendClientMessage(playerid, -1, "Tippe: /name [Suchbegriff]");
    if(!IsNumeric(params))
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, name, MAX_PLAYER_NAME))
    {
    if(strfind(name, params, true) != -1)
    {
    format(str, sizeof(str), "ID: %d | Spielername: %s", i, name);
    SendClientMessage(playerid, -1, str);
    }
    }
    }
    if(!strlen(str)) SendClientMessage(playerid, 0xFF0000FF, "Kein Spieler gefunden.");
    }
    else
    {
    new pID = strval(params);
    if(GetPlayerName(pID, name, MAX_PLAYER_NAME))
    {
    format(str, sizeof(str), "ID: %d | Spielername: %s", pID, name);
    SendClientMessage(playerid, -1, str);
    }
    else SendClientMessage(playerid, 0xFF0000FF, "Diese ID ist nicht online.");
    }
    return 1;
    }


    Mit IsNumeric:
    stock IsNumeric(const string[])
    {
    for (new i = 0, j = strlen(string); i < j; i++)
    {
    if (string[i] > '9' || string[i] < '0') return 0;
    }
    return 1;
    }