[Include] JCMD - Processador de comandos rбpido e fбcil...
#1

Bom dia, enfim aqui sгo 4:00 horas da manhг,
todos sabem que adoro tirar uma lasquinha do Pawn na madrugada.
Entгo aqui estou novamente para compartilhar com vocкs meu processador de comandos.


• Descriзгo:

Simples processador de comandos feito na mesma idйia do ZCMD, cria uma callback para todo comando criado, e chama essa callback pelo OnPlayerCommandText quando o player digita tal comando.

• Forma de uso:

Simples, contendo duas formas de adicionar comandos, sendo elas:

Код:
newCmd:teste(playerid,params[])
{
	new k;
	if(sscanf(params, "d", k))
	    return SendClientMessage(playerid, -1, "Correct Syntax: /teste params");

	SendClientMessage(playerid, -1, "Valor printado!");
	printf("[Debug] - Result do CMD: teste, %d", k);
	return 1;
}

// ou 

newCommand:teste2(playerid,params[])
{
	new k;
	if(sscanf(params, "d", k))
	    return SendClientMessage(playerid, -1, "Correct Syntax: /teste params");

	SendClientMessage(playerid, -1, "Valor printado!");
	printf("[Debug] - Result do CMD: teste, %d", k);
	return 1;
}
Lembrando, continuaria a mesma coisa com sscanf pra quem jб sabe usar...

- Como eu faria para criar um comando com a mesma funзгo de outro?

Код:
newCmd:teste(playerid,params[])
{
	new k;
	if(sscanf(params, "d", k))
	    return SendClientMessage(playerid, -1, "Correct Syntax: /teste params");

	SendClientMessage(playerid, -1, "Valor printado!");
	printf("[Debug] - Result do CMD: teste, %d", k);
	return 1;
}

newCommand:teste2(playerid,params[])
{
	return @teste(playerid, params);
}
Vou deixar aqui abaixo a tabela dos especificadores bбsicos do sscanf, pra quem ainda nгo conheзe todos. ([Plugin] sscanf)
Код:
Specifier(s)			Name				Example values
	i, d			Integer				1, 42, -10
	c			Character			a, o, *
	l			Logical				true, false
	b			Binary				01001, 0b1100
	h, x			Hex				1A, 0x23
	o			Octal				045 12
	n			Number				42, 0b010, 0xAC, 045
	f			Float				0.7, -99.5
	g			IEEE Float			0.7, -99.5, INFINITY, -INFINITY, NAN, NAN_E
	u			User name/id (bots and players)	******, 0
	q			Bot name/id			ShopBot, 27
	r			Player name/id			******, 42
-------------------------------------------------------------------------------------------------------------------

E aqui uma SS da bench, feito teste de velocidade... Tirem suas conclusхes e faзam seus testes tambйm !




-------------------------------------------------------------------------------------------------------------------
Espero que ajude alguns, obrigado.
OBS: Desculpem pela desorganizaзгo do tуpico, nгo estou 100% acordado para me preocupar com detalhes de stйtica para um tуpico bonito.

Source:
pawn Код:
/******************************************************************************\
|                                                                              |
|                       [Include] - Processador de comandos                    |
|                             By Jeffrey_Hatrix                                |
|                   Special thanks to: SlashPT for speed ideas                 |
|                                                                              |
\******************************************************************************/


// JCMD Fast and simple, enjoy.

#if !defined MAX_CMD_PARAMS
        #define MAX_CMD_PARAMS 256
#endif

#define newCmd:%1(%2) \
        forward @%1(%2); \
        public @%1(%2)

#define newCommand:%1(%2) \
        newCmd:%1(%2)

static  c_sys_cmd[MAX_CMD_PARAMS], c_sys_loop;

public OnPlayerCommandText(playerid, cmdtext[])
{
    c_sys_loop = strfind((cmdtext[0] = 0x40 ,cmdtext), "\x20" );
    c_sys_cmd [0] = '\0';

    if(c_sys_loop != -1)
    {
        if(cmdtext[c_sys_loop+1] == '\0')
        {
            cmdtext[c_sys_loop] = '\0';
            return (CallLocalFunction(cmdtext, "is", playerid, "\1") == -1) ? (0) : (1);
        }
        strmid(c_sys_cmd, cmdtext, 0, MAX_CMD_PARAMS);
        c_sys_cmd[c_sys_loop] = '\0';
        return (CallLocalFunction(c_sys_cmd, "is", playerid, cmdtext[c_sys_loop+1]) == -1) ? (0) : (1);
    }
    else
    {
        return (CallLocalFunction(cmdtext, "is", playerid, "\1") == -1) ? (0) : (1);
    }
}
Special thanks to:
SlashPT, idйias para otimizaзгo e velocidade.
Reply
#2

Muito Bom .
Reply
#3

Bom Trabalho!
Reply
#4

Bom TrabalhoІ
Reply
#5

bem legal, mas ainda nao se pode usar a callback On‌PlayerCommandText =x
Reply
#6

Уtimo processador.
Parabйns. =)
Reply
#7

isso nгo suporta case sensitive.
Reply
#8

Quote:
Originally Posted by Bosma_cmd
Посмотреть сообщение
isso nгo suporta case sensitive.
Exato, nгo fiz com a intenзгo de que suportasse.
Reply
#9

Quote:
Originally Posted by BlackCoder
Посмотреть сообщение
bem legal, mas ainda nao se pode usar a callback On‌PlayerCommandText =x
Edit: Eu e o Jeffrey ja estбmos a tentar arranjar soluзгo...
Reply
#10

Atualizado,

o cуdigo foi trabalhado para que economizasse tempo de processo, ganhando velocidade.
Foi atingido essa meta, fiz alguns testes com ZCMD e espero que vocкs tambйm faзam.




Bom, nгo foi trabalhado o case sensitive, eu tinha como prioridade a velocidade(...)
- Oque seria o case Sensitive ?
R: A diferenзa entre maiusculos e minusculos, oque pode afetar o uso de um comando.

Код:
Exemplo: caso o comando seja
newCmd:teste(playerid,params[])
{
	print("[Debug] - Result do CMD: teste, funcionando!");
	return 1;
}

Caso digite /Teste, /TESTE, /tesTe, /testE o comando nгo irб funcionar.



foi trocada a нndice de processamentos para que podesse liberar e nгo precisasse repitir o OnPlayerCommandText juntamente com os comandos criados usando este processador, os comandos estгo sendo processados em uma stock aparte.

No caso, й sim possнvel o uso frequente e misto de comparaзхes (strcmp) no OnPlayerCommandText, para a criaзгo de comandos. Mas seguindo a lуgico, o strcmp pode reduzir a velocidade original do processador.


Exemplos de alguns comandos com sscanf:
Код:
//Cria um carro

newCmd:cc(playerid, params[])
{
	new carId;
	if(sscanf(params, "d", carId))
	    return false;
	    
	new Float:pos[4];
	GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
	GetPlayerFacingAngle(playerid, pos[3]);
	CreateVehicle(carId, pos[0], pos[1], pos[2], pos[3], -1, -1, 99999999);
	return 1;
}

//Teleporta atй outro player

newCmd:ir(playerid, params[])
{
	new playerB;
	if(sscanf(params, "d", playerB))
	    return false;
	    
	new Float:s[3];
	GetPlayerPos(playerB, s[0], s[1], s[2]);
	SetPlayerPos(playerid, s[0]+1, s[1], s[2]);
	return 1;
}

//Mata alguйm

newCmd:kill(playerid, params[])
{
	new playerB;
	if(sscanf(params, "d", playerB))
	    return false;
	    
	SetPlayerHealth(playerB, 0);
	return 1;
}

--------------------------------------------------------------------------------------

Bom para estes comandos usei apenas parвmetros com integers

d | i    =       valores inteiros.

Entгo tambйm poderia ser:

if(sscanf(params, "i", ...))
Source:
pawn Код:
/******************************************************************************\
|                                                                              |
|                       [Include] - Processador de comandos                    |
|                             By Jeffrey_Hatrix                                |
|                   Special thanks to: SlashPT for speed ideas                 |
|                                                                              |
\******************************************************************************/


// JCMD Fast and simple, enjoy.

#if !defined MAX_CMD_PARAMS
        #define MAX_CMD_PARAMS 256
#endif

#define newCmd:%1(%2) \
        forward @%1(%2); \
        public @%1(%2)

#define newCommand:%1(%2) \
        newCmd:%1(%2)

forward ProcessarComandos_Strcmp(playerid,cmdtext[]);

static  c_sys_cmd[MAX_CMD_PARAMS], c_sys_loop, call_index;

static bool:callback_strcmp = false;

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
    callback_strcmp = funcidx("ProcessarComandos_Strcmp") != -1;
    return CallLocalFunction("jcmd_OnFilterScriptInit", "");
}

#if defined _ALS_OnFilterScriptInit
    #undef OnFilterScriptInit
#else
    #define _ALS_OnFilterScriptInit
#endif
#define OnFilterScriptInit jcmd_OnFilterScriptInit
forward jcmd_OnFilterScriptInit();

#else

public OnGameModeInit()
{
    callback_strcmp = funcidx("ProcessarComandos_Strcmp") != -1;
    if(funcidx("jcmd_OnGameModeInit") != -1)
    {
        return CallLocalFunction("jcmd_OnGameModeInit", "");
    }
    return 1;
}

#if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
#else
    #define _ALS_OnGameModeInit
#endif
#define OnGameModeInit jcmd_OnGameModeInit
forward jcmd_OnGameModeInit();
#endif

stock ProcessarComando_jCmd(playerid, cmdtext[])
{
    c_sys_loop = strfind((cmdtext[0] = 0x40 ,cmdtext), "\x20");
    c_sys_cmd [0] = '\0';

    if(c_sys_loop != -1)
    {
        if(cmdtext[c_sys_loop+1] == '\0')
        {
            cmdtext[c_sys_loop] = '\0';
            call_index = CallLocalFunction(cmdtext, "is", playerid, "\1");

        }
        else
        {
            strmid(c_sys_cmd, cmdtext, 0, MAX_CMD_PARAMS);
            c_sys_cmd[c_sys_loop] = '\0';
            call_index = CallLocalFunction(c_sys_cmd, "is", playerid, cmdtext[c_sys_loop+1]);
        }
    }
    else
    {
        call_index = CallLocalFunction(cmdtext, "is", playerid, "\1");
    }

    if(callback_strcmp == true)
    {
        if(call_index == 0 || call_index == -1)
        {
            cmdtext[0] = '/';
            call_index = CallLocalFunction("ProcessarComandos_Strcmp", "is", playerid, cmdtext);
            return (call_index == -1) ? (0) : (call_index);
        }
        else
        {
            return 1;
        }
    }
    return (call_index == -1) ? (0) : (call_index);
}


Obrigado especial:

SlashPT.

Outros projetos/tutoriais:


[FilterScript] Cars Machine v1.0 (Inglish, updated)
[FilterScript] AdminSt, Jeffrey_Hatrix
[Tutorial] How to: ShowPlayerDialog & callback OnDialogResponse
[Tutorial] How to: SII
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)