Problem bei Hausbeschreibung mit sscanf & strcmp

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 Leute


    Ich möchte gerne, dass man per Befehl die Hausbeschreibung anpassen kann. Allerdings geht das hiermit nicht richtig:


    dcmd_house(playerid,params[])
    {
    new string[STRING64];
    if(sscanf(params,"s[64]",string)) return SCM(playerid, C_YELLOW, "BENUTZE: /house [name:buy,sell,lock,desc]");
    //code: buy, sell, lock --> funktioniert ohne Probleme!
    if(!strcmp(string,"desc",true))
    {
    if(sscanf(string,"s[32]",description)) return SCM(playerid, C_YELLOW, "BENUTZE: /house desc [text]");
    for(new h=0;h<MAX_HOUSES;h++)
    {
    if(House[h][hID] > 0)
    {
    if(PlayerToPoint(1.0, playerid, House[h][hEntranceX], House[h][hEntranceY], House[h][hEntranceZ]) || PlayerToPoint(1.0, playerid, House[h][hExitX], House[h][hExitY], House[h][hExitZ]))
    {
    strmid(House[h][hDesc],description,0,strlen(description),255);
    return SCM(playerid, C_GREEN, "Die Beschreibung wurde erfolgreich angepasst!");
    }
    }
    }
    return SCM(playerid, C_RED, "Du bist nicht bei deinem Haus!");
    }
    return 1;
    }


    das Problem: er setzt mir als Beschreibung direkt "desc", obwohl er eigentlich das zeugs in "text" speichern sollte. Jemand ne Ahnung? :(


    MFG


    edit: kann es sein, dass das (nicht) mehr geht? bei 0.3c hab ich (in nem alten script) nen ähnlichen Befehl drin gehabt, dort hats damals aber noch funktioniert..

  • PlayerToPoint -> IsPlayerInRangeOf


    und bei den Sscanf parametern "s[32]" nei gehöhrt, versuch mal "s"

    Wer ist der Mensch hinter der Uniform? Ist euch das bekannt?
    Es ist der selbe der noch eben in Zivil neben euch stand.
    Warum wird er gehasst und so selten respektiert?
    Warum ist er derjenige der seinen Hals für euch riskiert?
    Trägt der Bulle eine Weste, das hat er früher nie gemacht,
    die Zeiten haben sich geändert und jeder Dienst ist ein Kampf!
    Warum gibt’s das SEK und warum sind sie so brutal?
    Und wieso hat wieder einer mit seinem Leben bezahlt?

  • Scheint so,als würde sscanf bei einem Leerzeichen automatisch trennen.Kann mich aber nicht daran erinnern,dass es immer so war. Besonders nicht bei Texten. Kannst doch einfach direkt zwei Parameter abfragen,dürfte auch gehen.Um sicher zu gehen,stellen wir das Trennzeichen auf ein Leerzeichen.
    if(sscanf(params,"p< >s[64]s[32]",string,description)) return SCM(playerid, C_YELLOW, "BENUTZE: /house [name:buy,sell,lock,desc]");


    //Edit:
    Oder du lässt es wie es am Anfang machst,und arbeitest mit einem Quiet Parameter:
    if(sscanf(params,"s[64]",string)) return SCM(playerid, C_YELLOW, "BENUTZE: /house [name:buy,sell,lock,desc]");
    //code: buy, sell, lock --> funktioniert ohne Probleme!
    if(!strcmp(string,"desc",true))
    {
    if(sscanf(params,"{s[64]}s[32]",description)) return SCM(playerid, C_YELLOW, "BENUTZE: /house desc [text]");

  • PlayerToPoint -> IsPlayerInRangeOf


    und bei den Sscanf parametern "s[32]" nei gehöhrt, versuch mal "s"


    1. Unterschied..?
    2. hatte ich bereits vorher, allerdings gibt er dann nen warning im server aus ;) probiers aus.



    1. für was steht das p? Funktioniert eigentlich soweit, nur das ich auch bei buy, sell und lock nen 2. parameter angeben muss, was net unbedingt gewollt ist.. ;)
    2. der zweite Code funzt leider nicht, kommt die Meldung "BENUTZE: /house desc [text]"..


    ich weiss, es wäre einfacher, 4 verschiedene commands zu machen. aber das sparrt platz..

  • mit p< > sagst du das sscanf die string beim leerzeichen trennen soll. Und falls du das plugin benutzt, musst du die länge des strings angeben.


    Ich frage mich aber, warum du das hier machst:
    if(sscanf(params,"s[64]",string))
    da machst du ja praktisch nichts anderes, als einen string in einen string umzuwandeln^^


    Versuchs mal so:
    dcmd_house(playerid,params[])
    {
    new string[STRING64],option[STRING64];
    if(sscanf(params,"s[64]S(-)[64]",string, option)) return SCM(playerid, C_YELLOW, "BENUTZE: /house [name:buy,sell,lock,desc]");
    //code: buy, sell, lock --> funktioniert ohne Probleme!
    if(!strcmp(string,"desc",true))
    {
    if(!strcmp(string,"-",true)) return SCM(playerid, C_YELLOW, "BENUTZE: /house desc [text]");
    for(new h=0;h<MAX_HOUSES;h++)
    {
    if(House[h][hID] > 0)
    {
    if(PlayerToPoint(1.0, playerid, House[h][hEntranceX], House[h][hEntranceY], House[h][hEntranceZ]) || PlayerToPoint(1.0, playerid, House[h][hExitX], House[h][hExitY], House[h][hExitZ]))
    {
    strmid(House[h][hDesc],description,0,strlen(description),255);
    return SCM(playerid, C_GREEN, "Die Beschreibung wurde erfolgreich angepasst!");
    }
    }
    }
    return SCM(playerid, C_RED, "Du bist nicht bei deinem Haus!");
    }
    return 1;
    }

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • 1. ah so thx. Jo, das musst du PoTTii sagen :P
    2. öh keine Ahnung, so funktionierts auf jedenfall bei anderen Befehlen, dann würde das eigentlich reichen, wenn ich nur params abfrage, ob da das richtige drin ist, ohne nen sscanf aufruf? ^^
    3. jo, das geht soweit. allerdings musste ich if(!strcmp(string,"-",true)) auf if(!strcmp(option,"-",true)) bzw. if(!strcmp(description,"-",true)) ändern


    Funzt so, danke dir! :D


    edit: und wie mach ich das, wenn ich beim text noch paar zahlen hintendran hängen möchte? also zum beispiel irgendwie noch den preis und level oder so was?


    if(sscanf(params,"s[128]S(-)[64]dd",string,option,preis,level))


    das funzt net so wie das mit der beschreibung ^^


    edit2: so, hat gewirkt ^^


    danach


    if(!strcmp(string,"-",true)) return SCM(playerid, C_YELLOW, "BENUTZE: /house desc [text]");


    nochma mit sscanf testen ;)

  • 1. ah so thx. Jo, das musst du PoTTii sagen :P


    Wieso mir? ^^ Ich hab dir nicht gesagt du sollst "s[64]" lassen ^^

    Wer ist der Mensch hinter der Uniform? Ist euch das bekannt?
    Es ist der selbe der noch eben in Zivil neben euch stand.
    Warum wird er gehasst und so selten respektiert?
    Warum ist er derjenige der seinen Hals für euch riskiert?
    Trägt der Bulle eine Weste, das hat er früher nie gemacht,
    die Zeiten haben sich geändert und jeder Dienst ist ein Kampf!
    Warum gibt’s das SEK und warum sind sie so brutal?
    Und wieso hat wieder einer mit seinem Leben bezahlt?