Scripting Fehler, sscanf

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 liebe SA:MP User,


    mein Name lautet Marcel und ich bin einer, der ocmd bevorzugt.
    Hierbei ist sscanf sehr gefragt, doch leider spackt sscanf seit 0.3d bei mir rum.


    Wenn ich z.B. /slap 2 mache, werde ich geslappt, egal was ich eingebe.
    Hier mein CMD:



    ocmd:slap (playerid,params[])
    {
    new MSG[50],TargetID, AdminMSG[50];
    if(!isPlayerAdmin(playerid,1))return SendClientMessage(playerid, FARBE_ROT, "Du darfst diesen Befehl nicht nutzen !");
    if(sscanf(params,"u",TargetID))return SendClientMessage(playerid,FARBE_GRAU,"Fehler: /slap [Username/ID]");
    new Float:x,y,z;
    GetPlayerPos(TargetID,Float:x,Float:y,Float:z);
    SetPlayerPos(TargetID,Float:x,Float:y,Float:z+15);
    format(MSG,sizeof(MSG),"Du wurdest von %s geslappt !", SpielerName(playerid));
    SendClientMessage(TargetID,FARBE_ROT, MSG);
    format(AdminMSG,sizeof(AdminMSG),"SERVER: ADMIN %s hat %s geslappt !", SpielerName(playerid), SpielerName(TargetID));
    for(new i=0; i<GetMaxPlayers(); i++)
    {
    if(isPlayerAdmin(i,1))
    {
    SendClientMessage(i,FARBE_ROT,AdminMSG);
    }
    }
    return 1;
    }


    eins von vielen Beispielen.


    regards,
    iAIR


    //edit Titel

    Einmal editiert, zuletzt von iAIR ()

  • es stimmt es geht noch nicht...musst du vorerst wohl umschreiben...

    Mit freundlichen Grüßen
    Developer
    Go/Python Developer | ehm. Webdeveloper | Fachinformatiker Anwendungsentwicklung
    Arbeitet in einem cloudigen Umfeld bei einem der größten deutschen Rechenzentrumsbetreibern

  • ocmd:slap(playerid,params[])
    {
    new MSG[50],TargetID;
    if(!isPlayerAdmin(playerid,1))return SendClientMessage(playerid, FARBE_ROT, "Du darfst diesen Befehl nicht nutzen !");
    if(sscanf(params,"u",TargetID))return SendClientMessage(playerid,FARBE_GRAU,"Fehler: /slap [Username/ID]");
    new Float:x, Float:y, Float:z;
    GetPlayerPos(TargetID,x,y,z);
    SetPlayerPos(TargetID,x,y,z+15);
    format(MSG,sizeof(MSG),"Du wurdest von %s geslappt !", SpielerName(playerid));
    SendClientMessage(TargetID,FARBE_ROT, MSG);
    format(MSG,sizeof(MSG),"SERVER: ADMIN %s hat %s geslappt !", SpielerName(playerid), SpielerName(TargetID));
    for(new i=0; i<GetMaxPlayers(); i++)
    {
    if(isPlayerAnAdmin(i, 1))
    {
    SendClientMessage(i, FARBE_ROT, MSG);
    }
    }
    return 1;
    }


    versuchs mal so

  • sscanf ist für die r2 von 0.3d noch nicht gefixt entweder du benutzt nicht die r2 oder wartest.
    Ich glaub es sind auch schon inofizelle sscanf updates gemacht worden. schau auf den letzten seiten vom offizellen sscanf thema nach so einem update

  • Ich benutze nun schon seid 0.3b die SSCANF-Funktion in form eines stocks.
    Diese tut in allen Versionen...
    stock sscanf(string[],format[],{Float,_}:...){if(string[0]==0||(string[0]==1&&string[1]==0)){return format[0];}new formatPos=0,stringPos=0,paramPos=2,paramCount=numargs(),delim=' ';while(string[stringPos]&&string[stringPos]<=' '){stringPos++;}while(paramPos<paramCount&&string[stringPos]){switch(format[formatPos++]){case'\0':{return 0;}case'i','d':{new neg=1,num=0,ch=string[stringPos];if(ch=='-'){neg=-1;ch=string[++stringPos];}do{stringPos++;if('0'<=ch<='9'){num=(num * 10) + (ch - '0');}else{return -1;}}
    while((ch=string[stringPos])>' '&&ch!=delim);setarg(paramPos,0,num * neg);}case'h','x':{new num=0,ch=string[stringPos];do{stringPos++;switch(ch){case'x','X':{num=0;continue;}case'0' .. '9':{num=(num << 4) | (ch - '0');}case'a' .. 'f':{num=(num << 4) | (ch - ('a' - 10));}case'A' .. 'F':{num=(num << 4) | (ch - ('A' - 10));}default:{return -1;}}}while((ch=string[stringPos])>' '&&ch!=delim);setarg(paramPos,0,num);}case'c':{setarg(paramPos,0,string[stringPos++]);}
    case'f':{new changestr[16],changepos=0,strpos=stringPos;while(changepos<16&&string[strpos]&&string[strpos]!=delim){changestr[changepos++]=string[strpos++];}changestr[changepos]='\0';setarg(paramPos,0,_:floatstr(changestr));}case'p':{delim=format[formatPos++];continue;}case'\'':{new end=formatPos - 1,ch;while((ch=format[++end])&&ch!='\'') {}if(!ch){return -1;}format[end]='\0';if((ch=strfind(string,format[formatPos],false,stringPos))==-1){if(format[end + 1]){
    return -1;}return 0;}format[end]='\'';stringPos=ch + (end - formatPos);formatPos=end + 1;}case'u':{new end=stringPos - 1,id=0,bool:num=true,ch;while((ch=string[++end])&&ch!=delim){if(num){if('0'<=ch<='9'){id=(id*10)+(ch-'0');}else{num=false;}}}if(num&&IsPlayerConnected(id)){setarg(paramPos,0,id);}else{
    #if!defined foreach
    #define foreach(%1,%2) for (new %2=0; %2<MAX_PLAYERS; %2++) if(IsPlayerConnected(%2))
    #define __SSCANF_FOREACH__
    #endif
    string[end]='\0';num=false;new name[MAX_PLAYER_NAME];id=end - stringPos;foreach (Player,playerid){GetPlayerName(playerid,name,sizeof (name));if(!strcmp(name,string[stringPos],true,id)){setarg(paramPos,0,playerid);num=true;break;}}if(!num){setarg(paramPos,0,INVALID_PLAYER_ID);}string[end]=ch;
    #if defined __SSCANF_FOREACH__
    #endif
    }stringPos=end;}case's','z':{new i=0,ch;if(format[formatPos]){while((ch=string[stringPos++])&&ch!=delim){setarg(paramPos,i++,ch);}if(!i){return -1;}}else{while((ch=string[stringPos++])){setarg(paramPos,i++,ch);}}stringPos--;setarg(paramPos,i,'\0');}default:{continue;}}while(string[stringPos]&&string[stringPos]!=delim&&string[stringPos]>' '){stringPos++;}while(string[stringPos]&&(string[stringPos]==delim||string[stringPos]<=' ')){stringPos++;}paramPos++;}do
    {if((delim=format[formatPos++])>' '){if(delim=='\''){while((delim=format[formatPos++])&&delim!='\'') {}}else if(delim!='z'){return delim;}}}while(delim>' ');return 0;}


    Einfach in den Gamemode einfügen.. bei mir tut sie ;)

  • stock sscanf(string[],format[],{Float,_}:...){if(string[0]==0||(string[0]==1&&string[1]==0)){return format[0];}new formatPos=0,stringPos=0,paramPos=2,paramCount=numargs(),delim=' ';while(string[stringPos]&&string[stringPos]<=' '){stringPos++;}while(paramPoswhile((ch=string[stringPos])>' '&&ch!=delim);setarg(paramPos,0,num * neg);}case'h','x':{new num=0,ch=string[stringPos];do{stringPos++;switch(ch){case'x','X':{num=0;continue;}case'0' .. '9':{num=(num << 4) | (ch - '0');}case'a' .. 'f':{num=(num << 4) | (ch - ('a' - 10));}case'A' .. 'F':{num=(num << 4) | (ch - ('A' - 10));}default:{return -1;}}}while((ch=string[stringPos])>' '&&ch!=delim);setarg(paramPos,0,num);}case'c':{setarg(paramPos,0,string[stringPos++]);}
    case'f':{new changestr[16],changepos=0,strpos=stringPos;while(changepos<16&&string[strpos]&&string[strpos]!=delim){changestr[changepos++]=string[strpos++];}changestr[changepos]='\0';setarg(paramPos,0,_:floatstr(changestr));}case'p':{delim=format[formatPos++];continue;}case'\'':{new end=formatPos - 1,ch;while((ch=format[++end])&&ch!='\'') {}if(!ch){return -1;}format[end]='\0';if((ch=strfind(string,format[formatPos],false,stringPos))==-1){if(format[end + 1]){
    return -1;}return 0;}format[end]='\'';stringPos=ch + (end - formatPos);formatPos=end + 1;}case'u':{new end=stringPos - 1,id=0,bool:num=true,ch;while((ch=string[++end])&&ch!=delim){if(num){if('0'<=ch<='9'){id=(id*10)+(ch-'0');}else{num=false;}}}if(num&&IsPlayerConnected(id)){setarg(paramPos,0,id);}else{
    #if!defined foreach
    #define foreach(%1,%2) for (new %2=0; %2#define __SSCANF_FOREACH__
    #endif
    string[end]='\0';num=false;new name[MAX_PLAYER_NAME];id=end - stringPos;foreach (Player,playerid){GetPlayerName(playerid,name,sizeof (name));if(!strcmp(name,string[stringPos],true,id)){setarg(paramPos,0,playerid);num=true;break;}}if(!num){setarg(paramPos,0,INVALID_PLAYER_ID);}string[end]=ch;
    #if defined __SSCANF_FOREACH__
    #endif
    }stringPos=end;}case's','z':{new i=0,ch;if(format[formatPos]){while((ch=string[stringPos++])&&ch!=delim){setarg(paramPos,i++,ch);}if(!i){return -1;}}else{while((ch=string[stringPos++])){setarg(paramPos,i++,ch);}}stringPos--;setarg(paramPos,i,'\0');}default:{continue;}}while(string[stringPos]&&string[stringPos]!=delim&&string[stringPos]>' '){stringPos++;}while(string[stringPos]&&(string[stringPos]==delim||string[stringPos]<=' ')){stringPos++;}paramPos++;}do
    {if((delim=format[formatPos++])>' '){if(delim=='\''){while((delim=format[formatPos++])&&delim!='\'') {}}else if(delim!='z'){return delim;}}}while(delim>' ');return 0;}


    /edit jmd. ne lösung, wie sscanf noch funzen könnte, is wirklich wichtig



    funkt i-wie nicht ;(

    Einmal editiert, zuletzt von iAIR ()

  • Huhu,


    Ich kenn mich mit sscanf nicht wirklich aus aber vielleicht solltest du dir mal den "sscanf stock" aus dem Wiki hohlen. Der müsste Funktionieren.
    Versuch mal bei dem Befehl die "Target ID" auszulesen das heißt eine SendClientMessage mit der Variable und gucken was für ein Wert sie übergibt.


    PS: Müsste bei diesem Code nicht eig. ein Fehler entstehen ?



    GetPlayerPos(TargetID,Float:x,Float:y,Float:z);
    SetPlayerPos(TargetID,Float:x,Float:y,Float:z+15);



    ersetzen zu:

    GetPlayerPos(TargetID,x,y,z);
    SetPlayerPos(TargetID,x,y,z+15);


    Genauso wie bei der Definitionen der Float´s


    new Float:x,y,z; (Hier ist X der einzige Float. Y sowie Z sind Interger)


    zu


    new Float:x, Float:y, Float:z;




    (e) Definition
    Mfg


  • Wenn ich das lesen könnt :o

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski