[Include] ICMD 8.0 Beta
#1

Primeiramente esclarecendo, ICMD й um projeto que vem sido desenvolvido desde 2011 e lб vai pedrada, pelo Bruno e os seus filhotes de codorna, porйm desde o lanзamento da sua ultima versгo ICMD 7.0 o projeto tomou um rumo diferente, continua sendo nomeado como tal, por ser mais uma include do pacote de bibliotecas IPSI, contudo, seu cуdigo foi totalmente reformulado na ultima versгo e agora novamente, sempre buscando novidades e maneiras de processar o comando da forma mais rбpida e que mais convйm aos usuбrios do sistema.

Da ultima versгo para essa, o maior fator para ter ocorrido essa reformulaзгo toda, foram os reports que chegaram atй nуs, a respeito de bugs e o fato da sintaxe ter se tornado algo complicado, esses reports foram essenciais para o amadurecimento da include atй entгo.

Quote:
Originally Posted by arakuta
Посмотреть сообщение
Achei um bug. Nгo existe o comando "k,i,i,l" no meu GM, mas quando usa isso, ele entra no "h,e,l,p"

O ID deve estar retornando o mesmo.
Quote:
Originally Posted by BielCOP
Посмотреть сообщение
Uma destas limitaзoes й ter que ficar digitando uma virgula por cada caractere, e isto й cansativo.

Jб pensou se vocк for escrever um comando gigante e ficar:

pawn Код:
d,a,r,a,d,m,i,n,p,r,o,b,i,e,l,c,o,p,p,q,e,l,e,e,h,g,o,s,t,o,s,o
Facilitando:

daradminprobielcoppqeleehgostoso


Apresentaзгo

A ICMD 8.0, й uma include para criaзгo de comandos de maneira simples, fбcil e extremamente rбpida.

Seus comandos agora podem ser definidos atravйs de dois tipos diferentes de ouvintes, ouvintes para comandos no qual exigirгo entrada de parвmetros e comandos do qual nгo exigirгo.

Ex1.
pawn Код:
public OnCommandCalled(playerid, params[])
{
    //EXEMPLO DE OUVINTE PARA COMANDO SEM ENTRADA PARВMETROS
    get_cmd_noparams(kill)
    {
        SetPlayerHealth(playerid, 0);
        return 1;
    }
   
    //EXEMPLO DE OUVINTE PARA COMANDO COM ENTRADA DE PARВMETROS
    get_cmd_params(cv)
    {
        new carId;
        if (sscanf(params, "i", carId)) return SendClientMessage(playerid, -1, "/cv [int id]"), r(1);

        new Float:x, Float:y, Float:z, Float:a;
        GetPlayerPos(playerid, x, y, z);
        GetPlayerFacingAngle(playerid, a);
        PutPlayerInVehicle(playerid, CreateVehicle(carId, x, y, z, a, -1, -1, cellmax), 0);
        return r(1);
    }
    get_cmd_params(vida)
    {
        new Float:v;
        if (sscanf(params, "f", v)) return SendClientMessage(playerid, -1, "/vida [float valor]"), r(1);
        SetPlayerHealth(playerid, v);
        return r(1);
    }
    get_cmd_params(mensagem)
    {
        new str[128];
        sscanf(params, "s[128]", str);

        new sStr[128];
        format(sStr, 128, "Mensagem: %s", str);
        SendClientMessageToAll(-1, sStr);
        return r(1);
    }
    return 0;
}
Os ouvintes sгo estados que ficam no seu GM, porйm eles nгo podem ser alcanзados atravйs de uma chamada simples a sua respectiva callback OnCommandCalled, ao invйs disso ele й chamado somente atravйs da callback original OnPlayerCommandText.


Para quem chegou a ver, ou atй mesmo usar a ICMD 7.0, poderб notar a diferenзa gritante.

Ex de cуdigo utilizando ICMD 7.0:
pawn Код:
public OnPlayerCommandText(playerid, commandid, params[]) {

    switch(commandid) {


        case iscmd("v,i,d,a"): {
            new Float:v;
            if(sscanf(params,"f", v) {
                return SendClientMessage(playerid, -1, "[Erro]: Use /vida [valor]");
            }

            SetPlayerHealth(playerid, v);

            return true;
        }
    }

    return false;
}
Ex de cуdigo utilizando ICMD 8.0:
pawn Код:
public OnCommandCalled(playerid, params[])
{
    get_cmd_params(vida)
    {
        new Float: v;
        if (sscanf(params, "f", v))
            return SendClientMessage(playerid, -1, "/vida [float quantidade]"), r(1);
           
        SetPlayerHealth(playerid, v);
        return r(1);
    }
    return 0;
}

O processador teve melhorias na sintaxe/semвntica, abstraindo a necessidade de utilizar um switch e separar os comandos por vнrgulas.


OBS: O processador estб em versгo BETA, oque indica que jб estб sendo projetado uma versгo com ganho em velocidade e fixando alguns problemas que jб foram identificados nessa versгo. O motivo de eu estar lanзando essa versгo agora, й justamente para permitir que mais pessoas testem, identificando assim, possнveis bugs se existirem...

***OBS: O processador estб preciso em todos os sentidos, logo, algumas limitaзхes precisam ser estabelecidas para o uso correto e sem problemas.

Todo e qualquer comando digitado sofre uma extraзгo padrгo de parвmetros, a identificaзгo de inexistкncia do comando causarб em mensagem de erro: "Server unkown command"

o ultimo return da callback OnCommandCalled nгo farб diferenзa no seu script, porйm os demais farгo. Uma vez que seu comando nгo contenha return, ele irб varrer todos os outros possнveis comandos, causando conflito na execuзгo.

o return da callback OnPlayerCommandText pode ser alterado de acordo com as necessidades do programador, atravйs do comando r(1/0), aonde 1 й o comando sucesso e 0 й a mensagem padrгo "Server unkown command"


Alguns scripts exemplificando a utilizaзгo do processador serгo publicados ao longo da semana, e possнveis tutoriais se for o caso.




Include source

Include (icmd.inc)
pawn Код:
/*
*
*
*       ICMD 8.0 Por Willian Luigi
*
*   -LOG:
*   Data de inicio: 07/10/2013 ICMD versгo 7.0 beta
*                   11/10/2013 ICMD versгo 7.1 alpha
*
*   Ultima atualizaзгo: 24/12/2014 ICMD versгo 8.0 beta
*
*
*   - CODE.ME, 2013.1 - Willian Luigi
*
*
*/


#if !defined isnull
    #define isnull(%1) \
                ((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif
#define g<%0> gotoaddr(%0)
#define gl<%0> saveaddr(#%0)
#define set(%0) gotoaddr(%0)
#define get_cmd_params(%0) gl<%0>;playerid=_wrefPlayerId;r(1);if(!isnull(_wrefCmdParams))strcat((params[0]=EOS,params),_wrefCmdParams, 128);if(_wrefHash(#%0)==_wrefCmdHash)
#define get_cmd_noparams(%0) gl<%0>;playerid=_wrefPlayerId;r(1);if(_wrefHash(#%0)==_wrefCmdHash)
#define F_VALUE _wrefReturnValue
#define r(%0) F_CMD(%0)
new _wrefPlayerId, _wrefCmdHash, _wrefCmdParams[128], _wrefReturnValue;
#pragma unused _wrefPlayerId
#pragma unused _wrefCmdHash
#pragma unused _wrefCmdParams
stock saveaddr(name[])
{
    static addr;
    #emit load.s.pri 4
    #emit stor.pri addr
    setproperty(.id = 0, .name = name, .value = addr);
}
stock gotoaddr(label[])
{
    static addr;
    addr = getproperty(0,label);
    #emit load.pri addr
    #emit sctrl 6
}
stock _wrefHash(s[])
{
    return s[0];
}
stock F_CMD(value)
{
    _wrefReturnValue = value;
    return value;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    _wrefCmdParams[0]=EOS;
    new __@i = 2;
    __@i = strfind(cmdtext, " ");
    _wrefPlayerId = playerid;
    _wrefCmdHash = cmdtext[1];

    if (__@i != -1)
    {
        new __@cmd[24];
        strmid(__@cmd, cmdtext, 1, __@i);
        while(cmdtext[++__@i] == 0x20){}
        strcat(_wrefCmdParams, cmdtext[__@i]);
        g<__@cmd>;
    }
    else
    {

        g<cmdtext[1]>;
    }

    return F_VALUE;
}

public OnGameModeInit()
{

    OnCommandCalled(0, "");

    if (funcidx("icmd_OnGameModeInit") != -1)
    {
        return CallLocalFunction("icmd_OnGameModeInit", "");
    }
    return 1;
}
#if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
#else
    #define _ALS_OnGameModeInit
#endif
#define OnGameModeInit icmd_OnGameModeInit
forward icmd_OnGameModeInit();
forward OnCommandCalled(playerid, params[]);

Para utilizaзгo do processador:
1. Salve o cуdigo acima em um arquivo "icmd.inc"
2. Coloque-o em sua pasta pawno/includes
3. Faзa a inclusгo dessa lib em seu cуdigo
pawn Код:
#include <icmd>
Link para download: ICMD-8.0 BETA




Exemplares

Aqui deixarei alguns comandos de exemplo, para auxilio.
pawn Код:
public OnCommandCalled(playerid, params[])
{
    get_cmd_params(vida)
    {
        new Float:vida, id;
        if (sscanf(params, "if", id, vida))
            return SendClientMessage(playerid, -1, "/vida [int id][float vida]");

        SetPlayerHealth(id, vida);
        return 1;
    }
    get_cmd_params(colete)
    {
        new Float:colete, id;
        if (sscanf(params, "if", id, colete))
            return SendClientMessage(playerid, -1, "/colete [int id][float colete]");

        SetPlayerArmour(id, colete);
        return 1;
    }
    get_cmd_params(tapa)
    {
        new id;
        if (sscanf(params, "i", id))
            return SendClientMessage(playerid, -1, "/tapa [int id]");

        new Float:x, Float:y, Float:z;
        GetPlayerPos(id, x, y, z);
        SetPlayerPos(id, x, y, z+10);
        return 1;
    }
    get_cmd_params(carro)
    {
        new id;
        if (sscanf(params, "i", id))
            return SendClientMessage(playerid, -1, "/carro [int id]");

        new Float:x, Float:y, Float:z, Float:a;
        GetPlayerPos(playerid, x, y, z);
        GetPlayerFacingAngle(playerid, a);
        PutPlayerInVehicle(playerid, CreateVehicle(id, x, y, z, a, -1, -1, cellmax), 0);
        return 1;
    }
    get_cmd_params(destruir)
    {
        new id;
        if (sscanf(params, "if", id))
            return SendClientMessage(playerid, -1, "/destruir [int id]");

        DestroyVehicle(id);
        return 1;
    }
    get_cmd_params(ir)
    {
        new id;
        if (sscanf(params, "i", id))
            return SendClientMessage(playerid, -1, "/ir [int id]");

        new Float:x, Float:y, Float:z;
        GetPlayerPos(id, x, y, z);
        SetPlayerPos(playerid, x+2, y+2, z);
        return 1;
    }
    get_cmd_params(trazer)
    {
        new id;
        if (sscanf(params, "i", id))
            return SendClientMessage(playerid, -1, "/trazer [int id]");

        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        SetPlayerPos(id, x+2, y+2, z);
        return 1;
    }
    get_cmd_params(irv)
    {
        new id;
        if (sscanf(params, "i", id))
            return SendClientMessage(playerid, -1, "/irv [int id]");

        new Float:x, Float:y, Float:z;
        GetVehiclePos(id, x, y, z);
        SetPlayerPos(playerid, x+2, y+2, z);
        return 1;
    }
    get_cmd_params(trazerv)
    {
        new id;
        if (sscanf(params, "i", id))
            return SendClientMessage(playerid, -1, "/trazerv [int id]");

        new Float:x, Float:y, Float:z;
        GetPlayerPos(playerid, x, y, z);
        SetVehiclePos(id, x+2, y+2, z);
        return 1;
    }
    get_cmd_params(entrarv)
    {
        new id;
        if (sscanf(params, "i", id))
            return SendClientMessage(playerid, -1, "/entrarv [int id]");
           
        PutPlayerInVehicle(playerid, id, 0);
        return 1;
    }
    get_cmd_params(par)
    {
        new id, smsg[128];
        if (sscanf(params, "is[128]", id, smsg))
            return SendClientMessage(playerid, -1, "/par [int id][string mensagem]");
           
        SendClientMessage(id, -1, smsg);
        return 1;
    }
   
    get_cmd_noparams(cmds)
    {
        SendClientMessage(playerid, -1, "vida, colete, tapa, carro, destruir, ir, trazer, irv, trazerv, entrarv, par");
        return 1;
    }
    return 0;
}


A include tem autoria de minha parte (Willian_Luigi)
Junto de um dos membros antigos do fуrum e idealizador da lib IPSI, ipsBruno
Juntamente com estudos compartilhados pelo ******

Agradecimentos especiais:
  • kreisson
  • PT


Estб include tem por visгo, melhorar a forma como os demais programadores da board trabalham com comandos, por tanto, quanto maior for a contribuiзгo de vocкs, maior serб a evoluзгo da mesma.

Abraзos.
Reply


Messages In This Thread
ICMD 8.0 Beta - by WLSF - 26.12.2014, 04:14
Re: ICMD 8.0 Beta - by kreison - 26.12.2014, 04:23
Re: ICMD 8.0 Beta - by DanDRT - 26.12.2014, 10:14
Re: ICMD 8.0 Beta - by PT - 26.12.2014, 10:23
Re: ICMD 8.0 Beta - by WLSF - 26.12.2014, 10:39
Re: ICMD 8.0 Beta - by Locky_ - 26.12.2014, 11:46
Re: ICMD 8.0 Beta - by GM_KoDi - 26.12.2014, 11:53
Re: ICMD 8.0 Beta - by RebeloX - 26.12.2014, 11:57
Re: ICMD 8.0 Beta - by ReDKiiL - 26.12.2014, 16:51
AW: ICMD 8.0 Beta - by Artista - 26.12.2014, 18:29
Re: ICMD 8.0 Beta - by n0minal - 26.12.2014, 18:37
Re: ICMD 8.0 Beta - by Bruno13 - 26.12.2014, 19:00
Re: ICMD 8.0 Beta - by Dolpin - 26.12.2014, 19:23
Re: ICMD 8.0 Beta - by RiqueP - 26.12.2014, 20:20
Re: ICMD 8.0 Beta - by zSuYaNw - 27.12.2014, 00:29
Re: ICMD 8.0 Beta - by #Coringa - 27.12.2014, 11:59
Re: ICMD 8.0 Beta - by ReyMysterio - 28.12.2014, 03:51
Re: ICMD 8.0 Beta - by WLSF - 01.01.2015, 12:05
Re: ICMD 8.0 Beta - by Dolpin - 01.01.2015, 12:10
Re: ICMD 8.0 Beta - by Skream - 01.01.2015, 12:16
Re: ICMD 8.0 Beta - by PT - 01.01.2015, 12:46
Re: ICMD 8.0 Beta - by WLSF - 01.01.2015, 13:19
Re: ICMD 8.0 Beta - by PT - 01.01.2015, 13:27
Re: ICMD 8.0 Beta - by WLSF - 01.01.2015, 13:29
Re: ICMD 8.0 Beta - by Skream - 01.01.2015, 13:32
Re: ICMD 8.0 Beta - by GWMPT - 01.01.2015, 13:34
Re: ICMD 8.0 Beta - by WLSF - 01.01.2015, 13:36
Re: ICMD 8.0 Beta - by PT - 01.01.2015, 13:36
Re: ICMD 8.0 Beta - by WLSF - 01.01.2015, 13:39
Re: ICMD 8.0 Beta - by Skream - 01.01.2015, 13:41

Forum Jump:


Users browsing this thread: 1 Guest(s)