hi,
wollte mal fragen ob ocmd oder dcmd besser ist ?
ocmd oder dcmd
-
-
Ich persönlich finde dcmd besser. Ist aber geschmackssache.
-
ich glaub das werd ich auch jetz nehmen,
finde es auch besser.
und wie ist das mit sscanf, weil ich das auch im selfmade drinne hab.
kann man das schon reinmachen, weil dcmd und ocmd gleichzeitig is
ja etwas doof -
stock sscanf(string[], format[], {Float,_}:...)
{
#if defined isnull
if (isnull(string))
#else
if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
#endif
{
return format[0];
}
#pragma tabsize 4
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__
#undef foreach
#undef __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;
}
Den Code fügste ganz unten im Script ein dann brauchste auch kein sscnaf inc mehrUnd nicht das definen von dcmd vergessen ganz oben das hier..
//*DCMD Define
#define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1EDIT : DCMD
-
ja hab ich drinne ich arbeite auch mit dem,
wollte nur wissen ob das gut ist
dcmd und sscanf -
Ja ist okay.
Mache ich ja auch, läuft perfekt. -
ocmd ist eigenlicht gut musst nichts bei Onplayercommand eintragen
-
if (strcmp("/gotols", cmdtext, true, 10) == 0)
{
if(!isPlayerAnAdmin(playerid,2))return SendClientMessage(playerid,Rot,"Du bist kein Admin oder dein Level ist zu niedrig!.");
SetPlayerPos(playerid, 1536.0193,-1672.1040,13.3828);
SendClientMessage(playerid, Gelb, "Du hast dich erfolgreich teleportiert!");
ShowPlayerDialog(playerid, DIALOG_ABUSE, DIALOG_STYLE_MSGBOX,"ABUSE","Bitte das Porten nicht ausnutzen","OK","CLOSE");
return 1;
}
was ist das eigl dass ist ganz normal unter den publics einfach oder ?
also nicht ocmd oder so zeugs eben -
Das ist unter OnPlayerCommand
bei ocmd
musst du irgendwo wo du laune hast das mache comd:befehl.... -
ja ich meine ja ob das auch sowas wie ocmd ist oder ob man da dcmd und das auch benutzen kann ?
-
Einen DCMD baut man wie folgt auf..
public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(help,4,cmdtext); //Hier definierst du den CMD, die 4 steht für die Buchstabenlänge in diesem Fall 4 weil help 4 buchstaben hat.
SendClientMessage(playerid,COLOR_LIGHTRED,"Diesen Befehl gibt es nicht !"); //Wenn es den Befehl noch nicht gibt, wird diese Message verschickt.
return 1;
}// Jetzt schreibst du einfach immer unter diese Zeile ^(siehe oben) deinen Befehl.. z.b der help Befehl.
dcmd_help(playerid,params[])
[pwn]
#pragma unused params //Definiert params zu jeden Befehl den playerid also du benutzt immer das hin schreiben.
{
SendClientMessage(playerid,COLOR_YELLOW2,"** ALLGEMEIN ** : /help , /report , /admins , /buy");
SendClientMessage(playerid,COLOR_YELLOW2,"** ALLGEMEIN ** : /help , /report , /admins , /buy");
SendClientMessage(playerid,COLOR_YELLOW2,"** CHAT ** : /help , /report , /admins , /buy");
return 1;
}Das heißt diesen Mist hier brauchst du nicht mehr ...
if (strcmp("/gotols", cmdtext, true, 10) == 0)
-
und bei OCMD wäre es nur
ocmd:help(playerid,params[])
{
SendClientMessage(playerid,COLOR_YELLOW2,"** ALLGEMEIN ** : /help , /report , /admins , /buy");
SendClientMessage(playerid,COLOR_YELLOW2,"** ALLGEMEIN ** : /help , /report , /admins , /buy");
SendClientMessage(playerid,COLOR_YELLOW2,"** CHAT ** : /help , /report , /admins , /buy");
return 1;
} -
Muss man bei ocmd nicht wie bei dcmd definen siehe bei mir erster block
-
Nein Muss man nicht wie es bei mir steht musst du das machen^^
-
Das ist natürlich geil. Sind die echt zu verstehen?
Weil bei den Commands hängts bei mir noch.. also Admin Commands oder halt die schweren -
ja schon aber ich will eigl wissen was das if strcmp zeugs da iist
muss ich das in dcmdd ändder oder läuft das so auch =? -
Ja sind leicht wenn du mit sscanf arbeitest ist das dann so
ocmd:givemoney(playerid,params[])
{
new pID,geld;
if(sscanf(params,"ud",pID,geld)) return SendClientMessage(playerid, COLOR_Error, "Benutze: /givemoney [ID] [(-)Betrag]");
if(Spieler[playerid][pAdmin] <= 3) return SendClientMessage(playerid, COLOR_Error, "Kein Admin!");
GivePlayerMoney(pID,geld);
return 1;
} -
Mit was arbeitest du ?
sscanf ja nicht..
-
Ich Arbeite mit sscanf und ocmd das ist meiner Meinung nach sehr leicht,
und schnell zu Lernen. -
if (strcmp("/gotols", cmdtext, true, 10) == 0)
{
if(!isPlayerAnAdmin(playerid,2))return SendClientMessage(playerid,Rot,"Du bist kein Admin oder dein Level ist zu niedrig!.");
SetPlayerPos(playerid, 1536.0193,-1672.1040,13.3828);
SendClientMessage(playerid, Gelb, "Du hast dich erfolgreich teleportiert!");
ShowPlayerDialog(playerid, DIALOG_ABUSE, DIALOG_STYLE_MSGBOX,"ABUSE","Bitte das Porten nicht ausnutzen","OK","CLOSE");
return 1;
}ich will wissen ob ich diese befehle als dcmd machen muss oder so lassen kann..
und was sind params eigl ?