Hallo,
ich habe hier eine kleine Alternative zu strtok bzw. strget gescriptet.
( Dies ist die BETA-Version und wurde nur auf meinem HomeServer getestet. Falls Bugs vorhanden sind, melden, ich setzte mich dann gleich ran um sie zu beheben. )
// ====> Code <====
// Irgendwo einfügen
retstr(const sstr[], desstr[][],args, del = ' ')
{
new
s,Num,start,argnum;
do
{
if((sstr== del && sstr[s+1] != del) || s == strlen(sstr))
{
if(args == 0 && argnum == 0)
{
strmid(desstr[0],sstr,start,s,128);
break;
}
strmid(desstr[Num],sstr,start,s,128);
start = s+1;
Num++;
argnum++;
if(argnum == args && sstr != EOS )
{
strmid(desstr[Num],sstr,start,strlen(sstr),128);
break;
}
}
s++;
}
while(s < strlen(sstr));
return 1;
}
Nun erkläre ich euch kurz wie es funktioniert und gebe 2 Beispiele dazu:
Zuerst fügt ihr unter "OnPlayerCommandText(...)" folgendes ein:
new tmp[5][35];
Die "5" könnt ihr mit jeder Zahl tauschen (sie gibt die Anzahl der maximal möglichen Parameter an - ohne 0, dazu kommen wir aber noch).
Natürlich könnt ihr "tmp" mit allem erdenklichen austauschen (wie z.B.: "new param[5][128];"). Die 35 lasst ihr am besten so.
Dann vergleicht ihr - wie immer - den CMDTEXT und den CMD (= "/kick","/givecash", usw. )
if(strcmp("/givecash",cmdtext,false,9) == 0) { // die 9 nicht vergessen - gibt an, wie lange der CMD (einschließlich des "/") ist.
Jetzt müsst ihr nur folgendes einfügen:
retstr(cmdtext,tmp,2);
Ihr müsst nur die "2" mit der Anzahl der Parameter tauschen (z.B.: "/kick ID GRUND" = 2 | "/adminchat TEXT" = 1 | "/givecash ID MENGE" = 2 | ... ).
Dann könnt ihr auch schon loslegen. Ihr verwendet einfach (statt wie bei strtok tmp = strtok(cmdtext, idx)) tmp[1] und tmp[2] (bzw. tmp[1], tmp[2],tmp[3], ... bzw. param[1], ... )
( WICHTIG: Diese beiden sind strings, d.h. müssen um Zahlen (wie ID's) zu werden umgeformt werden (strval(tmp[1]). Zudem ist tmp[0] immer der CMD-Anfang, sprich "/giveceash","/kick", usw. )
Prinzip:
retstr trennt den eingegebenen string (cmdtext), wenn ein " " (Space / Leertaste) gefunden worden ist, jedoch kein " " darauf folgt ! Die "Stücken" überträgt es in das Arry solange, bis alle Argumente übertragen worden sind. Das letzte Parameter wird vollkommen übertragen,d.h. nicht abgeschnitten, geeignet für Strings. Es (bei "/upm ID TEXT" gibt er den gesamten Text zurück am Ende).
Beispiele:
public OnPlayerCommandText(playerid, cmdtext[])
{
new tmp[3][128];
if(strcmp("/givecash",cmdtext,false,9) == 0)
{
retstr(cmdtext,tmp,2);
if(!strlen(tmp[1]) || !strlen(tmp[2])) return SendClientMessage(playerid,0xAAAAAAAA,"*** Verwende: /givecash ID MENGE ***");
if(!IsPlayerConnected(strval(tmp[1]))) return SendClientMessage(playerid,0xAAAAAAAA,"*** Angegebener User nicht online ***");
if(strval(tmp[2]) <= 0 || strval(tmp[2]) >= 1001) return SendClientMessage(playerid,0xFF66FFAA,"*** Menge muss zwischen 1 und 1000 liegen ***");
GivePlayerMoney(strval(tmp[1]),strval(tmp[2]));
GivePlayerMoney(playerid,-strval(tmp[2]));
SendClientMessage(playerid,0xAAAAAAAA,"*** Geld abgegeben ***");
SendClientMessage(strval(tmp[1]),0xAAAAAAAA,"*** Geld erhalten ***");
return 1;
}
if(strcmp("/upm",cmdtext,false,4) == 0)
{
retstr(cmdtext,tmp,2);
if(!strlen(tmp[1]) || !strlen(tmp[2])) return SendClientMessage(playerid,0xAAAAAAAA,"*** Verwende: /upm ID NACHRICHT ***");
if(!IsPlayerConnected(strval(tmp[1]))) return SendClientMessage(playerid,0xAAAAAAAA,"*** Angegebener User nicht online ***");
new string1[100],string2[100],name1[MAX_PLAYER_NAME],name2[MAX_PLAYER_NAME];
GetPlayerName(playerid,name1,sizeof name1);
GetPlayerName(strval(tmp[1]),name2,sizeof name2);
format(string1, sizeof string1,"*** User PM to %s: %s ***",name2,tmp[2]);
format(string2, sizeof string2,"*** User PM from %s: %s ***",name1,tmp[2]);
SendClientMessage(playerid,0xAAAAAAAA,string1);
SendClientMessage(strval(tmp[1]),0xAAAAAAAA,string2);
return 1;
}
return 0;
}
Hier noch ein ReturnUser Code von mir wieder:
stock ReturnUser(string[])
{
new i = 0;
new count = 0;
new len = strlen(string);
if(len > 3)
{
for(; i < MAX_PLAYERS;i++)
{
new name[MAX_PLAYER_NAME];
GetPlayerName(i,name,sizeof(name));
if(strcmp(name,string,false) == 0)
{
return i;
}
else
{
if(len == 3)
{
count = 2;
}
else
{
count = 1;
}
}
}
}
else
{
return strval(string);
}
return (count == 1) ? (INVALID_PLAYER_ID) : (strval(string));
}
Anwendung mit retstr wäre:
Kick(ReturnUser(tmp[1]));
Der User hat die Möglichkeit, statt nur einer ID oder nur einen Namen, beides anzugeben. Bei der Selection (falls es genau 3 Zeichen seien sollten) hat der String (bzw. als Name) eine höhere priorität.
Hoffe alles klappt, sonst behebe ich es selbstverständlich.
MfG KornChief.
// Edit: Ich vergaß zu erwähnen, dass natürlich alles von mir ist und nichts kopiert worden ist.