DRCMD 1.3 LeírásNos szerintem mindenki ismeri a parancs feldolgozókat. Céljuk minél gyorsabban és a legegyszerûbb módon kezelni a scripterek/játékosok számára a parancsokat. Mivel ez a parancs feldolgozó nem használ összehasonlító elemzéseket, hanem egybõl meghívja a funkciót, ezáltal gyors. Használata igen egyszerû, és könnyedén darabolhatjuk fel a paramétereket!
HasználatNézzünk elõször is egy könyebb példát:
DRCMD:teszt(playerid, params[])
{
SendClientMessage(playerid, 0xFFFFFF, \"Ez egy teszt szöveges üzenet!\");
return 1;
}
Egy \"bonyolultabb\" pénzadó kódot:
DRCMD:teszt(playerid, params[])
{
new penz, jatekos;
if(sscanf(params, \"dd\", jatekos, penz)) return SendClientMessage(playerid, 0xFFFFFF, \"HASZNÁLAT: /givemoney [játékos id] [pénz]\");
else if(penz <= 0) return SendClientMessage(playerid, 0xFFFFFF, \"HIBA: A pénz összeg nem megfelelõ!\");
else if(!IsPlayerConnected(jatekos)) return SendClientMessage(playerid, 0xFFFFFF, \"A játékos nem elérhetõ!\");
else
{
format(string, sizeof(string), \"Sikeresen adtál %d$-t a következõ játékosnak: %dID\", penz, jatekos);
SendClientMessage(playerid, 0xFFFFFF, string);
format(string, sizeof(string), \"Kaptál %d$-t!\", penz);
SendClientMessage(jatekos, 0xFFFFFF, string);
}
return 1;
}
HivatkozásHa netán szeretnél a parancsodhoz \"rövidítést\" használni. Akkor azt megteheted az alábbi módon:
DRCMD:te(playerid, params[])
{
return drcmd_teszt(playerid, params[]);
}
SzinonimáiHa leakarod cserélni a mostani parancs feldolgozód (például ZCMD), akkor lehetõséged van ezt könnyen megtenni. Csak fogod kiveszed a ZCMD-t és helyette berakod a DRCMD-t. A DRCMD ugyanis tartalmazza a ZCMD-ben található makrókat, így szinte még csak cserélgetned se kell a dolgokat!
Szinonimái:
DRCMD:parancs(playerid, params[])
DRCMD_parancs(playerid, params[])
drcmd(parancs, playerid, params[])
CMD:parancs(playerid, params[])
COMMAND:parancs(playerid, params[])
FigyelemHa leakarod kérdezni a paraméter hosszúságát, azt ne az strlen függvénnyel tedd, hanem használd az isnull függvényt
if(isnull(params))
Gyorsasága ZCMD-vel szemben
Letöltés1.3:
Ez gyorsabb mint a ZCMD? Mert ha igen átírom DRCMD-re! :) :O
Ez gyorsabb mint a ZCMD? Mert ha igen átírom DRCMD-re! :) :O
Körülbelül ugyanolyan gyors :)
DRCMD:tele valami(playerid,params[])
ilyet lehet?
DRCMD:tele valami(playerid,params[])
ilyet lehet?
Szóközt nem hiszem hogy elfogad. Mivel a szóköz utáni szöveget már paraméternek veszi. De sscanf-al szépen fellehet bontani, ahogy azt mutattam a leírásban.
U.I.: Megjelent az 1.1!
Mibõl gondolod hogy gyors? Nem látom az eredményeket, de az biztos hogy egyszerû.
Feleslegesnek találom a függvénykönyvtár ellenõrzését, és az \'endinput\' irányelvet.
Elég lenne ha a_samp.inc függvénykönyvtár alá helyezzük a drcmd-t.
Másrészt ha használni szeretném az OnPlayerCommandText eljárást akkor ALS is kéne.
Tetszik nem akarsz összedobni egy konvertálót hozzá? :) mert sok parancs van a gm embe h átírogassam 1 esével
Minek a konvertáló?
Nyisd meg a módot, felül találsz egy menüsort, kattints az Edit -> Replace menüpontra,
vagy egyszerûen nyomd be a CTRL + H-t.
Részben hasonlít rá....

Beírod a következõt:
Search For: ZCMD: ( vagy ahogy megadtad )
Replace with: DRCMD:
Másodpercek alatt kész leszel vele.
igen. azt tudom csak ez egy régi módom amit megint fejlesztek és ebbe nem zcmd van hanem strcmp vagy mi az azt ezzel az eljárással nem lehet.
Mibõl gondolod hogy gyors? Nem látom az eredményeket, de az biztos hogy egyszerû.
Feleslegesnek találom a függvénykönyvtár ellenõrzését, és az \'endinput\' irányelvet.
Elég lenne ha a_samp.inc függvénykönyvtár alá helyezzük a drcmd-t.
Másrészt ha használni szeretném az OnPlayerCommandText eljárást akkor ALS is kéne.
Hát nem tudom hogy vagy vele. De endinput azért kell hogy ne hívják meg kétszer vagy esetleg többször a függvényt. Illetve az OnPlayerCommandText a DRCMD használata mellet továbbra is ugyanúgy szuperál :)
(http://wiki.sa-mp.com/wiki/Keywords:Directives#.23endinput ha esetleg nem tudnád az endinput jelentését)
Illetve itt a gyorsasága:

Script:
#include <a_samp>
#define DRCMD:%1(%2,%3) \\
forward drcmd_%1(%2,%3); \\
public drcmd_%1(%2,%3)
#define DRCMD_%1(%2,%3) \\
DRCMD:%1(%2,%3)
#define drcmd(%1,%2,%3) \\
DRCMD:%1(%2,%3)
#define CMD:%1(%2,%3) \\
DRCMD:%1(%2,%3)
#define COMMAND:%1(%2,%3) \\
DRCMD:%1(%2,%3)
main() { }
public OnGameModeInit()
{
#define MAX_TEST (990000)
for(new d; d < 10; ++d) print(\" \");
new dcmdtest = GetTickCount();
for(new a; a < MAX_TEST; ++a)
OnPlayerDraCommandText(0, \"/drcmd teszt\");
printf(\"# DRCMD in %d\",GetTickCount() - dcmdtest);
new zcmdtest = GetTickCount();
for(new a; a < MAX_TEST; ++a)
OnPlayerCommandText(0, \"/drcmd teszt\");
printf(\"# ZCMD in %d\",GetTickCount() - zcmdtest);
return true;
}
forward OnPlayerDraCommandText(playerid, cmdtext[]);
public OnPlayerDraCommandText(playerid, cmdtext[])
{
new
function[32],
szokozmeddig = -1;
while(++szokozmeddig < strlen(cmdtext)) if((cmdtext[szokozmeddig] == \' \')) break;
strmid(function, cmdtext, 1, szokozmeddig);
format(function, sizeof(function), \"drcmd_%s\", function);
while(cmdtext[szokozmeddig] == \' \') szokozmeddig++;
if(funcidx(function) != -1)
{
if(szokozmeddig == strlen(cmdtext))
{
return CallLocalFunction(function, \"is\", playerid, \"\\1\");
}
return CallLocalFunction(function, \"is\", playerid, cmdtext[szokozmeddig]);
}
return 0;
}
static
bool:zcmd_g_HasOPCS = false,
bool:zcmd_g_HasOPCE = false;
#define MAX_FUNC_NAME (32)
public OnPlayerCommandText(playerid, cmdtext[])
{
if (zcmd_g_HasOPCS && !CallLocalFunction(\"OnPlayerCommandReceived\", \"is\", playerid, cmdtext))
{
return 1;
}
new
pos,
funcname[MAX_FUNC_NAME];
while (cmdtext[++pos] > \' \')
{
funcname[pos-1] = tolower(cmdtext[pos]);
}
format(funcname, sizeof(funcname), \"cmd_%s\", funcname);
while (cmdtext[pos] == \' \') pos++;
if (!cmdtext[pos])
{
if (zcmd_g_HasOPCE)
{
return CallLocalFunction(\"OnPlayerCommandPerformed\", \"isi\", playerid, cmdtext, CallLocalFunction(funcname, \"is\", playerid, \"\\1\"));
}
return CallLocalFunction(funcname, \"is\", playerid, \"\\1\");
}
if (zcmd_g_HasOPCE)
{
return CallLocalFunction(\"OnPlayerCommandPerformed\", \"isi\", playerid, cmdtext, CallLocalFunction(funcname, \"is\", playerid, cmdtext[pos]));
}
return CallLocalFunction(funcname, \"is\", playerid, cmdtext[pos]);
}
U.I.: Kijött az 1.2 link fentebb!
Frissítve!
Aki használja a DRCMD-t (szerintem csekély annak a létszáma), kérem töltse le a legújabb verziót a fenti linkek valamelyikérõl!
Jó lett, de attól maradok a ZCMD nél megszoktam már.. :)
Az viszont tetszik benne hogy ilyen egyszerûen meg lehet oldani a rövidítéseket.
Vagy ilyet lehet ZCMD ben is ?
Jó lett, de attól maradok a ZCMD nél megszoktam már.. :)
Az viszont tetszik benne hogy ilyen egyszerûen meg lehet oldani a rövidítéseket.
Vagy ilyet lehet ZCMD ben is ?
Igen.
return cmd_parancs(playerid, params);
Huha ez nekem már magas :D de jó lett menne a + ha tudnák adni :D
Tetszetõs.
A war módba lehet beteszem.
Ment a Like :D
én használnám ha mene vele a [pawn]public OnPlayerCommandPerformed(playerid, cmdtext[], success)[/pawn]
OnPlayerCommandText-et lehet mellette használni
Ékezeteket lehet használni?
Nem, de van az új fixchars2.inc abba azt hiszem béta verziónak bele tették az ékezetes betûket vagy a sorközt...