IsPlayerNameOnline funktioniert ... nicht

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
  • stock IsPlayerNameOnline(pname[])
    {
    new playername[MAX_PLAYER_NAME];
    for(new i; i<MAX_PLAYERS;i++)
    {
    GetPlayerName(i,playername,sizeof playername);
    if(!strcmp(pname,playername,true))
    {
    return i;
    }
    }
    return -1;
    }



    stock IsPlayerNameOnline(pname[]){ new playername[MAX_PLAYER_NAME]; for(new i; i<MAX_PLAYERS;i++) { GetPlayerName(i,playername,sizeof playername); if(!strcmp(pname,playername,true)) { return i; } } return -1;}



    Dieser besagte Code funktioniert nicht, er soll abfragen ob ein Spieler mit dem Namen Online ist.
    Doch er prüft nur ID 0 ab.


    Ich hoffe ihr könnt helfen

  • stock IsPlayerNameOnline(playerid, pName[])
    {
    new YourOwnName[MAX_PLAYER_NAME],
    pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, YourOwnName, sizeof(YourOwnName));
    for(new i=0; i < MAX_PLAYERS; i++)
    {
    GetPlayerName(i, pName, sizeof(pName));
    if(strcmp, playerid, pName, true) return SencClientMessage(playerid, -1, "Name gefunden."); break; //returnt 0
    else continue; //returnt 1
    }
    return 1;
    }


    Kompiliert einwandfrei, schaut mal, ob's klappt.

  • Das Problem besteht darin das dein string leer ist und wenn ein leerer string verglichen wird so wird dieser als valide anerkannt.


    einfach somit überprüfen ob der spieler erstmal online ist


    stock IsPlayerNameOnline(pname[])
    {
    new playername[MAX_PLAYER_NAME];
    for(new i; i<MAX_PLAYERS;i++){
    if(!IsPlayerConnected(i))continue;
    GetPlayerName(i,playername,sizeof playername);
    if(!strcmp(pname,playername,false))return i;
    }
    return -1;
    }

  • Funktioniert irgendwie immer noch nicht richtig. Nur wenn der Spieler ID 0 ist wird er auch als Online angesehen.

  • @DirectX:
    http://forum.sa-mp.de/gta-multiplayer-mods/san-andreas-multiplayer/scripting-base/18-nützliche-codeschnipsel-53#post1833300


    Das funktioniert auf jeden Fall. :thumbup:


    if(ReturnPlayerID("Jeffry") != INVALID_PLAYER_ID) //Jeffry ist online.

    stock IsPlayerNameOnline(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    GetPlayerName(i, l_name, MAX_PLAYER_NAME);
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    GetPlayerName(i, l_name, MAX_PLAYER_NAME);
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }



    würde das so auch gehen?

  • Ja, du hast ja nur den Stock umbenannt. Das ist kein Problem, den kannst du auch Staubsauger nennen, das interessiert den Code nicht :D


    Fuß Wenn (@Paradoxon: Autokorrektur am Handy meh...) du dennoch wieder Probleme hast, dann poste bitte den Code mit dem du die Abfrage machst.

    3HZXdYd.png

    2 Mal editiert, zuletzt von Jeffry ()

  • Warum speichert ihr nicht einfach beim Verbindungsaufbau (OnPlayerConnect()) einmalig die Daten der Benutzer? Dazu dann noch foreach verwenden, um unnötiges Aufrufen von IsPlayerConnected() zu verhindern. Ist doch viel effizienter:



    #include <a_samp>
    #include <YSI\y_iterate> // foreach


    enum playerDataEnumerator {
    username[MAX_PLAYER_NAME]
    }


    new playerData[MAX_PLAYERS][playerDataEnumerator],
    Iterator:playerIterator<MAX_PLAYERS>;


    public OnPlayerConnect(playerid) {
    Iter_Add(playerIterator, playerid);
    GetPlayerName(playerid, playerData[playerid][username], MAX_PLAYER_NAME);
    return 1;
    }


    public OnPlayerDisconnect(playerid, reason) {
    Iter_Remove(playerIterator, playerid);
    resetPlayerDataIndex(playerid);
    return 1;
    }


    isPlayerNameConnected(name[]) {
    foreach(new i : playerIterator) {
    if(strcmp(playerData[i][username], name, false) == 0) {
    return 1;
    }
    }


    return 0;
    }


    resetPlayerDataIndex(index) {
    for(new i = 0; i < sizeof(playerData[]); i++) {
    playerData[index][playerDataEnumerator:i] = 0;
    }
    }


    P.S.: Ungetestet.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Ja, du hast ja nur den Stock umbenannt. Das ist kein Problem, den kannst du auch Staubsauger nennen, das interessiert den Code nicht :D


    Fuß du dennoch wieder Probleme hast, dann poste bitte den Code mit dem du die Abfrage machst.


    stock IsPlayerNameOnline(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    GetPlayerName(i, l_name, MAX_PLAYER_NAME);
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    GetPlayerName(i, l_name, MAX_PLAYER_NAME);
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }


    Genau diesen Code habe ich verwendet,
    aber es wird immer nur wenn der Spieler ID ist als Online Player erkannt.

  • GetPlayerId stock:
    stock GetPlayerId(playername[])
    {
    for(new i = 0; i <= MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    new playername2[MAX_PLAYER_NAME];
    GetPlayerName(i, playername2, sizeof(playername2));
    if(strcmp(playername2, playername, true, strlen(playername)) == 0)
    {
    return i;
    }
    }
    }
    return INVALID_PLAYER_ID;
    }


    IsPlayerNameOnline stock:
    stock IsPlayerNameOnline(PName[])
    {
    if(GetPlayerId(PName) != INVALID_PLAYER_ID)
    {
    if(IsPlayerConnected(GetPlayerId))
    {
    return 1;
    }
    else return 0;
    }
    else return 0;
    }


    Müsste eigentlich funktionieren...

  • @#Reverse: Poste doch mal den Code mit dem du die "IsPlayerNameOnline"-Funktion aufrufst. Es liegt wahrscheinlich an dem Code, und nicht an der Funktion, da ich diese selbst getestet habe.


    ocmd:checktickets(playerid, params[])
    {
    if(PlayerInfo[playerid][pAdmin] <= 2000)
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Du bist nicht die Server Leitung!");
    return 1;
    }
    new Name[300];
    if(!IsPlayerConnected(playerid)) return SendClientMessage(playerid, COLOR_GRAD2, "[Server Error]");
    if(sscanf(params, "s", Name)) return SendClientMessage(playerid, COLOR_GRAD2, "SERVER: /checktickets [Vollständiger Spielername]");
    {
    new string[400];
    format(string, sizeof string, "/Spielerdateien/%s.ini", Name);
    if(!dini_Exists(string))
    {
    new estring[400];
    format(estring, sizeof estring, "Der Spieler %s existiert nicht.", Name);
    SendClientMessage(playerid, COLOR_LIGHTRED, estring);
    return 1;
    }
    if(!IsPlayerNameOnline(Name))
    {
    new Supporterid = IsPlayerNameOnline(Name);
    new ProblemeAngenommen = PlayerInfo[Supporterid][pSupportProblemeAccepted];
    new FragenAngenommen = PlayerInfo[Supporterid][pSupportFragenAccepted];
    new FragenVerworfen = PlayerInfo[Supporterid][pSupportFragenVerworfen];
    new stringp[2000];
    format(stringp, sizeof(stringp), "{FFFFFF}\nName: %s (ONLINE)\nTeamrang: %s\n\nTicket Probleme angenommen: %d\nTicket Fragen beantwortet: %d\nTicket Fragen verworfen: %d", Name,GetTeamRang(Supporterid),ProblemeAngenommen,FragenAngenommen,FragenVerworfen);
    ShowPlayerDialog(playerid,DIALOG_GEBANNT,DIALOG_STYLE_MSGBOX,"Supporter Infos",stringp,"OK","");
    return 1;
    }
    SendClientMessage(playerid, COLOR_LIGHTRED, "Player is offline");




    }
    return 1;
    }


    Nochmal wegen Anzeigefehlern: http://pastebin.com/a7Mi0D53</a>


    Wenn der Spieler ID 0 ist funktioniert es ohne Probleme