Namen aller Spieler Problem

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 Morgen liebe Community,


    ich möchte gerne überprüfen, ob es den Spielernamen den ein Spieler in einem Dialog eingibt auf dem Server gibt.. aber ich bekomme jedes mal
    die Meldung das der Spieler nicht online sei ?..


    for(new i; i<MAX_PLAYERS;i++) { if(strcmp(inputtext,SpielerName(i),false))return ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }


    Wo liegt hier bitte der Fehler ?


  • for(new i; i<MAX_PLAYERS;i++){
    if(!strcmp(inputtext,SpielerName(i),false)){
    //Bla bla
    return 1;
    }
    }
    return ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }


  • So kann ich auf jeden ein Kopfgeld setzten, selbst wenn er nicht Online ist ^^


  • for(new i; i<MAX_PLAYERS;i++){
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(!strcmp(inputtext,SpielerName(i),false)){
    //Bla bla
    return 1;
    }
    }
    return ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }

    Schonmal so probiert ? ;)



    Hinweis: Keinen Kontakt über TeamViewer oder Skype !
    Grüßt den Fehlerklärbär von mir.
    Coming soon: Pawn-Café ( Concept-Sharing | Scripting-First-Aid )

  • Natürlich!
    Ich habe lediglich noch eingefügt, dass die Spieler, die nicht online sind (und der spieler selbst), übersprungen werden.


    Anbei habe ich noch eine kleine Änderung vorgenommen:

    for(new i=0; i<GetMaxPlayres();i++){
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(strcmp(inputtext,SpielerName(i),true) == 0){
    //Dein Code..
    break;
    return 1;
    }
    }
    return ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }



    Auf die Gefahr hin, dass dein String (SpielerName) falsch abgefragt wird, hier nochmal direkt deklariert:

    new namestr[25];
    for(new i=0; i<GetMaxPlayres();i++){
    GetPlayerName(i, namestr, sizeof(namestr));
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(strcmp(inputtext,namestr,true) == 0){
    //Dein Code..
    break;
    return 1;
    }
    }
    return ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }



    Hinweis: Keinen Kontakt über TeamViewer oder Skype !
    Grüßt den Fehlerklärbär von mir.
    Coming soon: Pawn-Café ( Concept-Sharing | Scripting-First-Aid )

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen


  • Schreib die strcmp abfrage vor dem return mal so.
    if(strcmp(inputtext,SpielerName(i),false)!=0)


    Funktioniert leider beides nicht ^^

  • Als du den Namen eingegeben hast. Hast du auch die Groß&Kleinschreibung beachtet?


    Versuch es mal so:


    for(new i;i<MAX_PLAYERS;i++)
    {
    if(strcmp(inputtext,SpielerName(i),false)==0)
    {
    //Code
    break;
    }
    else if(i==MAX_PLAYERS-1)
    {
    ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen");
    }
    }

    Einmal editiert, zuletzt von [DT]midomen ()

  • Groß- und Kleinschreibung habe ich mit dem Ignore-Case hinfällig gemacht. Genau um diese Fehlerquelle auszumerzen.


    Eine Idee hätte ich noch.
    So banal es klingen mag: Wo hast du den Code eingefügt.
    Und nicht zu vergessen: Hast du deine DialogIDs richtig definiert (bzw. abgefragt) ? Ist eine häufige Fehlerursache.



    Hinweis: Keinen Kontakt über TeamViewer oder Skype !
    Grüßt den Fehlerklärbär von mir.
    Coming soon: Pawn-Café ( Concept-Sharing | Scripting-First-Aid )

  • Groß- und Kleinschreibung habe ich mit dem Ignore-Case hinfällig gemacht. Genau um diese Fehlerquelle auszumerzen.


    Eine Idee hätte ich noch.
    So banal es klingen mag: Wo hast du den Code eingefügt.
    Und nicht zu vergessen: Hast du deine DialogIDs richtig definiert (bzw. abgefragt) ? Ist eine häufige Fehlerursache.


    Hier jetzt mal mein code:


    if(dialogid==DIALOG_CONTRACT)
    {
    if(response)
    {
    new namestr[24];
    for(new i=0; i<GetMaxPlayers();i++)
    {
    GetPlayerName(i, namestr, sizeof(namestr));
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(strcmp(inputtext,namestr,true) == 0)
    {
    format(string,sizeof(string),"Du möchtest auf {FFAA00}%s{FEFEFE} ein Kopfgeld aussetzen.\nBitte gib das Kopfgeld für den Spieler an!",inputtext);
    ShowPlayerDialog(playerid,DIALOG_CONTRACT1,DIALOG_STYLE_INPUT,"Contract",string,"absenden","abbrechen");
    format(Spieler[playerid][ContractSpieler],24,inputtext);
    break;
    }
    }
    return ShowPlayerDialog(playerid,DIALOG_CONTRACT,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen");
    //for(new i; i<MAX_PLAYERS; i++) { if(strcmp(inputtext,SpielerName(i),false))return ShowPlayerDialog(playerid,DIALOG_CONTRACT,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Zielperson ein","absenden","abbrechen"); }
    }
    }
    if(dialogid==DIALOG_CONTRACT1)
    {
    if(response)
    {
    new a = playerid;
    format(string,sizeof(string),"Das Kopfgeld muss höher als 50$ und niedriger als 1000$ sein!\nDu möchtest auf {FFAA00}%s{FEFEFE} ein Kopfgeld aussetzen.\nBitte gib das Kopfgeld für den Spieler an!",inputtext);
    if(strval(inputtext) < 50 || strval(inputtext) > 1000)return ShowPlayerDialog(playerid,DIALOG_CONTRACT1,DIALOG_STYLE_INPUT,"Contract",string,"absenden","abbrechen");
    format(string,sizeof(string),"INSERT INTO `contracts` (`auftraggeber`,`zielperson`,`kopfgeld`) VALUES ('%s','%s','%d')",SpielerName(playerid),Spieler[playerid][ContractSpieler],strval(inputtext));
    mysql_query(string);
    format(Auftrag[a][geber],24,SpielerName(playerid));
    format(Auftrag[a][ziel],24,Spieler[playerid][ContractSpieler]);
    Auftrag[a][kopfgeld] = strval(inputtext);
    for(new i; i<MAX_PLAYERS; i++)
    {
    if(SpielerInfo[i][Fraktion] == 12)
    {
    SendClientMessage(playerid,Gelb,"Es ist ein neuer Auftrag eingegangen!");
    return 1;
    }
    }
    }
    }


  • Break beendet nur die Schleife, danach macht er weiter.
    Also er zeigt dir wahrscheinlich KURZ den Dialog "Du möchtest auf ..." an, aber DIREKT danach zeigt er dir an, dass der Spieler nicht online ist.
    Das "return" da unten wird IMMER nach der Schleife ausgeführt.


  • Break beendet nur die Schleife, danach macht er weiter.
    Also er zeigt dir wahrscheinlich KURZ den Dialog "Du möchtest auf ..." an, aber DIREKT danach zeigt er dir an, dass der Spieler nicht online ist.
    Das "return" da unten wird IMMER nach der Schleife ausgeführt.


    Nein es kommt direkt die Meldung das der Spieler nicht online ist.


  • Nein es kommt direkt die Meldung das der Spieler nicht online ist.


    Ja, weil dein Server schneller ist als dein Auge :)
    Oder weil der Client das 1. noch garnicht richtig verarbeitet hat und sofort zum 2. springt.
    Kommentiere einfach mal eben die return-Zeile aus (//)

  • Bevor das mit dem break noch zu viele Probleme aufwirft, schreibe ich das Problem eben um:



    new namestr[25], merk;
    merk=-1;
    for(new i=0; i<GetMaxPlayres();i++){
    GetPlayerName(i, namestr, sizeof(namestr));
    if(i==playerid || !IsPlayerConnected(i)) continue;
    if(strcmp(inputtext,namestr,true) == 0) { merk=i; break; }
    iff(i==GetMaxPlayers() && !IsPlayerConnected(i)) { ShowPlayerDialog(playerid,DIALOG_PERSON,DIALOG_STYLE_INPUT,"Contract","Der Spieler ist nicht Online!\nGib den Namen der Person ein","absenden","abbrechen"); }
    }



    ..
    //ShowPlayerDialog..
    //if(merk!=-1) //Show (alt.)





    das "merk=i;" kann man natürlich direkt mit ShowPlayerDialog ersetzen ;)


    Der Rest sollte wohl kein Problem sein ;)



    Code
    break
    
    
    break breaks out of a loop, ending it prematurely:
    for (new a = 0; a < 10; a++)
    {
    	if (a == 5) break;
    }
    This loop will go 6 times but code after the break will only be executed 5 times.



    Wir müssen den Dialog aus der Schleife rausziehen, sonst bricht er dort ab.



    Hinweis: Keinen Kontakt über TeamViewer oder Skype !
    Grüßt den Fehlerklärbär von mir.
    Coming soon: Pawn-Café ( Concept-Sharing | Scripting-First-Aid )

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen