[FRAGE] ReturnUser

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,
    da ich den "ReturnUser" Code nicht gefunden habe, habe ich selbst mal versucht es scripten und nun möchte ich wissen, ob er auf funktionieren würde.
    Es soll bewirken, dass der eingegebene String (bei strtok/zcmd üblich "tmp" genannt") überprüft wird, ob....
    ... er nur eine Zahl ist (diese wird dann zurückgegeben)
    ... ein Name (wenn der Name einem User zugeordnet werden kann,wird dessen ID zurückgegeben, wenn nicht, wird zurückgegeben, dass diese falsch ist).

    stock ReturnUser(string[])
    {
    static i;
    new ID;
    new s = 0;
    new Val = 0;
    for(;s < strlen(string); s++)
    {
    if(string[s] >= 'A' && string[s] <= 'Z' || string[s] >= 'a' && string[s] <= 'z' || string[s] == '[' || string[s] == ']' || string[s] == '_')
    {
    Namen++;
    }
    if(Namen == 3)
    {
    Val = 1;
    break;
    }
    }
    if(Val == 1)
    {
    i = 0;
    while(i++< MAX_PLAYERS)
    {
    new name[MAX_PLAyER_NAME];
    GetPlayerName(i,name,sizeof(name));
    if(strcmp(string,name,false) == 0)
    {
    Val = 2
    ID = i;
    break;
    }
    else
    {
    Val = 3;
    }
    }
    }
    return (Val == 2) ? (ID) : (Val == 3) ? (INVALID_PLAYER_ID) : (Val == 0) ? (strval(strings));
    }


    // Keiner eine Lösung?

    5 Mal editiert, zuletzt von KornChief ()

  • Ich hab jetzt ehrlich gesagt wenig Lust mir alles genau anzuschauen, hab aber paar mal eine "verbesserte" und ungetestete Version gemacht:


    stock ReturnUser(string[])
    {
    new s,
    slen = strlen(string),
    count,
    name[MAX_PLAYER_NAME];
    if(slen < 3) return INVALID_PLAYER_ID;
    for(; s<slen;++s) {
    if(string[s] >= 'A' && string[s] <= 'Z' || string[s] >= 'a' && string[s] <= 'z') {
    goto loop;
    }
    }
    loop:
    while(++s < MAX_PLAYERS) {
    if(GetPlayerName(s, name, sizeof(name))) {
    if(!strcmp(string, name)) {
    return s;
    }
    }
    }
    return INVALID_PLAYER_ID;
    }

  • Vielen Dank, hab dennoch ein paar Fragen dazu:




    if(slen < 3) return INVALID_PLAYER_ID;
    Was ist, wenn er Beispielsweise eingibt: "/cmd 4" ? Durch strtok oder zcmd gibt er ja "4" oder auch " 4" als String wieder, der jedoch in diesem Fall kleiner 3 ist - somit INVALID_PLAYER_ID returnt wird, was aber nicht der Fall sein soll. Insgesamt wird ja nur "Falsch(INVALID_PLAYER_ID) - ID(durch Namen) - Falsch(INVALID_PLAYER_ID) " wiedergegeben, aber eine Zahl (bzw. die Eingabe einer ID) wird nicht berücksichtigt.
    Geht es nicht zudem darum, dass das Script nicht mind. 3 Zeichen, sondern 3 Buchstaben finden soll (wodurch wir ausgehen können, dass es ein Name ist und weitere Überprüfung der Zeichen nicht nötig ist) und dann diesen mit den Namen vergleichen soll und schließlich dessen ID wiedergeben soll?
    Bitte klärt mir auf :)

  • Ein Name hat nicht nur die normalen Buchstaben des Alphabets, sondern auch noch die Zahlen 0 - 9, die Sonderzeichen "[", "]" und "_" sowie ab 0.3 "(", ")" und "." (beim Punkt bin ich mir nicht sicher ^^).


    Aber: Wenn du die Eingabe einer ID berücksichtigen willst, für was dann noch eine Funktion die die ID per Name returnt?

  • Update: Nun wird, wenn es 3 Zeichen lang ist, erst als Name hergenommen, dann als ID.
    stock ReturnUser(string[])
    {
    static i;
    new count = 0;
    new len = strlen(string);
    if(len >= 3)
    {
    while(i++<MAX_PLAYERS)
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(i,name,sizeof(name));
    if(strcmp(name,string,false) == 0)
    {
    return i;
    }
    else
    {
    if(len == 3)
    {
    count = 2;
    }
    else
    {
    count = 1;
    }
    }
    }
    }
    else
    {
    return strval(string);
    }
    return (count == 1) ? (INVALID_PLAYER_ID) : (strval(string));
    }

    2 Mal editiert, zuletzt von KornChief ()

  • Dein Code würde wenn niemand mit dem Namen on ist und es auch KEINE ID ist 0 returnen, also playerid 0.


    Return -1, dann dürfte alles passen.

  • forward ReturnUser(str[]);
    public ReturnUser(str[])
    {
    new namex[MAX_PLAYER_NAME],ix;
    for(new i = 0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerConnected(playerid))
    {
    GetPlayerName(playerid,namex,sizeof namex);
    if(strcmp(namex,str,false) !=-1)ix = i;
    }
    }
    return ix;
    }

    Mfg. BlackFoX_UD_ alias [BFX]Explosion


  • for(new i = 0;i<GetMaxPlayers();i++)


    *hust*...


    Naja, deine Möglichkeit wäre wieder die dass man NUR den Namen "eingeben" kann, aber keine ID, wie Sucher es eigentlich wollte.

  • Dein Code würde wenn niemand mit dem Namen on ist und es auch KEINE ID ist 0 returnen, also playerid 0.


    Return -1, dann dürfte alles passen.

    hmm....sicher?
    Return's:
    Wenn kein Name gefunden = (Count = 1) = INVALID_PLAYER_ID;
    Wenn Name gefunden = playerid;
    Wenn kein Name (bzw. eine ID) = strval(string);
    :huh: oder? Trotzdem geändert, thx.