Hey,
hab ein Problem mit dem sscanf in der Zeile 12/13.
geprintet wird bis 4, egal welchen versuch ich probiere.
Ingame eingabe: /setstats 0 Respektpunkte 10
ocmd:setstats(playerid,params[])
{
new str[144],pID,wert;
print("1");
if(sscanf(params,"us[144]",pID,str))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [name]"),SCM(playerid,-1,"[name]: Respektpunkte");
print("2");
if(!IsPlayerConnected(pID))return SCM(playerid,-1,"Der Spieler ist nicht online");
print("3");
if(!strcmp(str,"Respektpunkte",true))
{
print("4");
if(sscanf(params,"d",wert))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");//versuch 1
if(sscanf(params,"us[144]d",pID,str,wert))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");//versuch 2
print("5");
printf("%s || %d",str,wert);
new old=SInfo[pID][pRespekt];SInfo[pID][pRespekt]=wert;
new neu=SInfo[pID][pRespekt];
print("6");
SetPlayerProgressBarValue(playerid, ffffd, float(SInfo[playerid][pRespekt]));
print("7");
SCMEx(pID,-1,"Admin: %s hat deine Respektpunkte verändert. Vorher: %d Nacher: %d",SpielerName(playerid),old,neu);
print("8");
format(str,sizeof str,"SETSTATS: Admin %s hat die Respektpunkte von %s verändert. Vorher: %d Nacher: %d",SpielerName(playerid),SpielerName(pID),old,neu);
printlog(str);
print("9");
}
return 1;
}
Habs rumprobiert und ich finde den Fehler nicht. Findet ihn jemand?
Danke
mehere sscanf mit mehreren parameter
- theTV
- Geschlossen
- Erledigt
-
-
Mit strtok bist du besser dran.
ocmd:setstats(playerid,params[])
{
new str[144],pID,wert, tmp[20], tmp2[20], tmp3[20], idx;
tmp = strtok(params, idx);
tmp2 = strtok(params, idx);
if(!strlen(tmp2))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [name]"),SCM(playerid,-1,"[name]: Respektpunkte");
if(IsNumeric(tmp)) pID = strval(tmp);
else pID = ReturnPlayerID(tmp);
if(!IsPlayerConnected(pID))return SCM(playerid,-1,"Der Spieler ist nicht online");
if(!strcmp(tmp2,"Respektpunkte",true))
{
tmp3 = strtok(params, idx);
if(!strlen(tmp3))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");
new wert = strval(tmp3);
new old=SInfo[pID][pRespekt];
SInfo[pID][pRespekt]=wert;
new neu=SInfo[pID][pRespekt];
SetPlayerProgressBarValue(playerid, ffffd, float(SInfo[playerid][pRespekt]));
SCMEx(pID,-1,"Admin: %s hat deine Respektpunkte verändert. Vorher: %d Nacher: %d",SpielerName(playerid),old,neu);
format(str,sizeof str,"SETSTATS: Admin %s hat die Respektpunkte von %s verändert. Vorher: %d Nacher: %d",SpielerName(playerid),SpielerName(pID),old,neu);
printlog(str);
}
return 1;
}Funktionen die du definieren musst stock strtok(const string[], &index) //©Jeffry
{
new result[20], length = strlen(string), i = index;
while ((i < length) && (string[i] == ' ')) i++;
strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
index++;
return result;
}Funktionen die du definieren musst stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
{
new l_name[MAX_PLAYER_NAME];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(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(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
{
if(strfind(l_name,l_PlayerName,true)!=-1) return i;
}
}
return INVALID_PLAYER_ID;
}Funktionen die du definieren musst stock IsNumeric(string[])
{
for (new i = 0, j = strlen(string); i < j; i++)
{
if ((string[i] > '9' || string[i] < '0')) return 0;
}
return 1;
} -
Ok, dann setzt ich mich mal mit strtok auseinander. Hab ich noch nie/wenig benutzt. Danke
-
ocmd:setstats(playerid,params[])
{
/* -- */
if(sscanf(params,"us[144]",pID,str))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [name]"),SCM(playerid,-1,"[name]: Respektpunkte");
/* -- */
if(!strcmp(str,"Respektpunkte",true))
{
/* -- */
/* nachfolgende Zeile (versuch 1) kann nicht funktionieren. Du durchsuchst "params", was du ganz oben schon auf "us[144]" untersuchst hast.
Das klappt nicht, den String auf "d" und auf "us[144]" gleichzeitig erfolgreich zu scannen.
Eventuell erklärst du mal, was du damit vor hattest (oder du bleibst bei strtok, würde ich aber nicht machen).
Ohne jetzt aber den Sinn hinter "versuch 1" zu kennen, würde ich die Zeile entfernen.*/
if(sscanf(params,"d",wert))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");//versuch 1 -> Funktion wird hier durch beendet
if(sscanf(params,"us[144]d",pID,str,wert))return SCM(playerid,-1,"Fehler: /setstats [playerid/SpielerName] [Respektpunkte] {FF0000}[Wert]");//versuch 2
/* -- */
}
return 1;
} -
breadfish.de
Hat das Thema geschlossen.