[Tutorial] Melhorando seus script's e seus gamemodes
#1

Boas, partindo de um tutorial do Emmet_ que vi na board Inglesa, decidi fazer um para a board portuguesa, com o objetivo de ver os utilizadores desta board com melhores scripts e com melhor raciocнnio, isto apos ter visto muitos membros novos com codes muito mal feitos, e se nao aprendem direito de novos, nunca ou tarde endireitam.

Problema do strtok
  • Bem, vejo ainda muitos membros desta board,a usar a "velhinha" strtok feita pelo DarcoBlue.

    Funзгo strtok:

    pawn Код:
    strtok(const string[], &index)
    {
        new length = strlen(string);
        while ((index < length) && (string[index] <= ' '))
        {
            index++;
        }
     
        new offset = index;
        new result[20];
        while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
        {
            result[index - offset] = string[index];
            index++;
        }
        result[index - offset] = EOS;
        return result;
    }
    Mas, nгo sabem que ela alйm de ser velha й tambйm lenta em relaзгo a atuais comparadores de parвmetros.
    Bem, eu recomendo que usem sscanf criada pelo ******, nгo sу pela facilidade de uso, mas tambйm pela velocidade desta e nгo sу;

    Vejam a diferenзa do comando /kick [id]:


    Em strtok
    pawn Код:
    public OnPlayerCommandText(playerid, cmdtext[])
    {
        new cmd[128], idx;
        cmd = strtok(cmdtext, idx);
     
        if(strcmp(cmd, "/kick", true) == 0)
        {
            new tmp[128];
            tmp = strtok(cmdtext, idx);
     
            if(strlen(tmp) == 0)
                return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
     
            Kick(strval(tmp));
            return 1;
        }
        return 0;
    }
    Em sscanf
    pawn Код:
    public OnPlayerCommandText(playerid, cmdtext[])
    {
        if(strcmp(cmd, "/kick", true) == 0)
        {
            new id;
            if(sscanf(cmdtext, "u", id))
                return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
     
            Kick(id);
            return 1;
        }
        return 0;
    }

    Viram? Os comandos acima fazem exatamente o mesmo, porйm como podem ver, a sua elaboraзгo й diferente, pessoalmente acho que й sem dъvida o segundo, mais fбcil que o primeiro.
Problema do uso de strcmp para criar comandos
  • Bem, ainda muito usam strcmp para criar comandos. Isto atualmente normalmente diz muito sobre o programador do GM, ou й preguiзoso e nгo quer atualizar os seus comandos para processador de comandos, ou, usa um gamemode da Internet e nгo faz a mнnima ideia do que й um processador de comandos (embora atualmente tenha mais gamemodes na internet com processador de comandos). Antes de tudo strcmp tem como finalidade comparar string's e nao criar comandos.

    Usar um processador de comandos tem enormes vantagens, como a maior simplicidade na criaзгo de comandos, й prбtica, cуmodo e sobretudo mais rбpido de usar do que strcmp.

    Analisem o comando /kick [id] abaixo:

    Em strcmp (Nгo й processador de comandos)
    pawn Код:
    public OnPlayerCommandText(playerid, cmdtext[])
    {
        if(strcmp(cmd, "/kick", true) == 0)
        {
            new id;
            if(sscanf(cmdtext, "u", id))
                return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
     
            Kick(id);
            return 1;
        }
        return 0;
    }
    Em zcmd (Processador de comandos)
    pawn Код:
    CMD:kick(playerid, params[])
    {
        new id;
        if(sscanf(params, "u", id))
            return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
        Kick(id);
        return 1;
    }
    Em ycmd (Processador de comandos)
    pawn Код:
    YCMD:kick(playerid, params[], help)
    {
        #pragma unused help
        new id;
        if(sscanf(cmdtext, "u", id))
            return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
        Kick(id);
        return 1;
    }
    Viram a diferenзa?

    Й muito melhor nгo й? Eu sei que sim...

    E sim criar comandos com processadores de comandos nao precisa de colocar o comando dentro de qualquer callback.

    Tambem muitas vezes nao precisam criar variaveis, assim:

    Em zcmd
    pawn Код:
    CMD:kick(playerid, params[])
    {
        if(sscanf(params, "u", params[0]))
            return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
        Kick(params[0]);
        return 1;
    }
    Em ycmd
    pawn Код:
    YCMD:kick(playerid, params[], help)
    {
        #pragma unused help
        if(sscanf(cmdtext, "u", params[0]))
            return SendClientMessage(playerid, 0xFFFFFFFF, "Uso: /kick [playerid]");
        Kick(params[0]);
        return 1;
    }
    Porque escolhi ycmd e zcmd?

    Porque sгo os mais rбpidos (apesar de ycmd ser o mais rбpido), jб criados em pawn atualmente e sгo os que a maioria dos programadores de sa-mp que usam processadores de comandos usam.

    Sim, eu sei que ainda existem mais rбpidos desenvolvidos em C++, porйm sгo mais complexos o seu uso para quem ainda estб a aprender, porque mexe com plugins, etc.
E se eu usar sscanf e um processador de comandos, estou a agir bem?
Loops
  • A maioria tem por norma fazer os loops assim:

    pawn Код:
    for(new i = 0; i < MAX_PLAYERS; i++)
    Nгo й que esteja errado, porйm esquecem-se que o valor default de MAX_PLAYERS, se alterarem o valor para o valor real de slots mбximo do seu servidor podem fazer com que os loops tenham um processamento (velocidade) maior, como?

    Fazendo simplesmente isto:

    pawn Код:
    #include <a_samp>
    #undef MAX_PLAYERS
    #define MAX_PLAYERS (50) // o 50 voce muda pelo numero de slots do seu servidor
    Qual a diferenзa?

    Se nгo alterarem o valor, MAX_PLAYERS assume um valor que para quem nгo sabe estб definido por default pela SA-MP Team na include a_samp.inc como valor padrгo 500 (a nгo ser que seja um "pacote" de 1000 players), ou seja, irб sempre realizar o loop de 500, mas se alterarem o valor de MAX_PLAYERS ira assumir o valor mбximo no loop a quantidade de slots do seu servidor, sendo que a maioria dos membros aqui na board portuguesa quase nunca tem um servidor com 500 slots alterando o valor o loop й muito mais rбpido.


    Porem tem tambйm quem insista em fazer o loop deste jeito:

    pawn Код:
    for(new i = 0; i < GetMaxPlayers(); i++)
    Este tipo de loop й errado e mais lento.

    Apenas num caso especial poderб ser mais rбpido, se vocк tiver um servidor de 50 slots e nгo alterar o valor de MAX_PLAYERS usando o loop acima torna-se mais rбpido й verdade, porem se alterarem o valor o valor de MAX_PLAYERS para o valor real dos seus slots o loop acima torna-se muito mais lento.

    foreach

    Com esta simples include (versгo mais antiga, nas versхes mais recentes esta incorporada na YSI) feita pelo ****** vocк pode melhorar e muito os seus loops sendo que quando sгo ligados a sistemas para players apenas corre o loop nos players conectados, mas tambйm poderб nos veнculos, entre outros.

    Ou seja, cуdigos assim:

    pawn Код:
    stock DarDinheiroTodos()
    {
        for( new i = 0; i < MAX_PLAYERS; i++)
        {
            if(IsPlayerConnected(i))
            {
                GivePlayerMoney(i, 1000);
            }
        }
        return 1;
    }
    Tornam-se alem de mais fбceis, mais rбpidos tambйm na hora do processamento:


    pawn Код:
    #include <foreach>

    stock DarDinheiroTodos()
    {
        foreach(new i : Player)
        {
            GivePlayerMoney(i, 1000);
        }
        return 1;
    }
    Fazem as duas formas exactamente o mesmo porem a segunda e muito mais rбpida que a primeira na hora do processamento

    Deixo abaixo o link do tуpico da foreach para quem quiser saber mais sobre a mesma.
"Lуgicas, sem lуgica"
Crйditos
    • Emmet_ - Base da ideia para criacao do tutorial
    • PT - Criacao do tutorial

Espero que aprendam algo com este tutorial, se quiserem acrescentar algo ou melhorar o tutorial em algum aspeto, estejam б vontade.

Talvez no futuro, dependendo do vosso feedback, melhorarei ou farei mais tutoriais, deixem abaixo as suas opiniхes, tambem se tiverem em dъvida acerca de algum assunto deste tutorial, estarei б disposiзгo para responder.

Sei que o tutorial й acerca de uma matйria simples, porйm muitos ainda nunca se aperceberam ou nunca viram a vantagem de "evoluir" os seus scripts, talvez com isto aprendam algo.

Cumprimentos
Reply


Messages In This Thread
Melhorando seus script's e seus gamemodes - by PT - 07.02.2014, 22:34
Re: Melhorando seus script's e seus gamemodes - by BieeelEvolution - 07.02.2014, 22:44
Re: Melhorando seus script's e seus gamemodes - by LucaAllexandre - 07.02.2014, 22:45
Re: Melhorando seus script's e seus gamemodes - by LeMoi - 07.02.2014, 22:45
Re: Melhorando seus script's e seus gamemodes - by BieeelEvolution - 07.02.2014, 22:49
Re: Melhorando seus script's e seus gamemodes - by PT - 07.02.2014, 22:52
Re: Melhorando seus script's e seus gamemodes - by caoraivoso3 - 07.02.2014, 23:08
Re: Melhorando seus script's e seus gamemodes - by PT - 07.02.2014, 23:11
Re: Melhorando seus script's e seus gamemodes - by FallweN - 07.02.2014, 23:15
Re: Melhorando seus script's e seus gamemodes - by SeV_ - 07.02.2014, 23:28
Re: Melhorando seus script's e seus gamemodes - by ViniKuliveguisky - 07.02.2014, 23:47
Re: Melhorando seus script's e seus gamemodes - by lucas_mdr1235 - 08.02.2014, 00:15
Re: Melhorando seus script's e seus gamemodes - by Cor3y - 08.02.2014, 00:48
Re: Melhorando seus script's e seus gamemodes - by leonardo1434 - 08.02.2014, 01:02
Re: Melhorando seus script's e seus gamemodes - by s4kuL - 08.02.2014, 01:17
Re: Melhorando seus script's e seus gamemodes - by FrostyWolf - 08.02.2014, 08:56
Re: Melhorando seus script's e seus gamemodes - by Sky™ - 08.02.2014, 09:55
Re: Melhorando seus script's e seus gamemodes - by brunox - 08.02.2014, 10:01
Re: Melhorando seus script's e seus gamemodes - by Schocc - 08.02.2014, 10:10
Re: Melhorando seus script's e seus gamemodes - by StreetGT - 08.02.2014, 13:05
Re: Melhorando seus script's e seus gamemodes - by Diogo123 - 08.02.2014, 15:57
Re: Melhorando seus script's e seus gamemodes - by JonathanFeitosa - 08.02.2014, 17:16
Re: Melhorando seus script's e seus gamemodes - by RebeloX - 08.02.2014, 18:24
Re: Melhorando seus script's e seus gamemodes - by PT - 08.02.2014, 18:28
Re: Melhorando seus script's e seus gamemodes - by bruxo00 - 08.02.2014, 18:33
Re: Melhorando seus script's e seus gamemodes - by Juniiro3 - 08.02.2014, 20:06
Re: Melhorando seus script's e seus gamemodes - by DarckWilly - 08.02.2014, 21:15
Re: Melhorando seus script's e seus gamemodes - by PT - 09.02.2014, 09:21
Re: Melhorando seus script's e seus gamemodes - by DarckWilly - 09.02.2014, 12:24
Re: Melhorando seus script's e seus gamemodes - by n0minal - 09.02.2014, 14:01
Re: Melhorando seus script's e seus gamemodes - by PT - 22.04.2015, 22:52
Re: Melhorando seus script's e seus gamemodes - by DiegoCosta - 22.04.2015, 23:31
Re: Melhorando seus script's e seus gamemodes - by PT - 23.04.2015, 00:37
Re: Melhorando seus script's e seus gamemodes - by DiegoCosta - 23.04.2015, 00:48
Re: Melhorando seus script's e seus gamemodes - by matheusspohr - 23.04.2015, 01:42
Re: Melhorando seus script's e seus gamemodes - by #Luca[S]. - 23.04.2015, 01:49
Re: Melhorando seus script's e seus gamemodes - by matheusspohr - 23.04.2015, 01:56
Re: Melhorando seus script's e seus gamemodes - by DiegoCosta - 23.04.2015, 02:05
Re: Melhorando seus script's e seus gamemodes - by LockedLucas - 28.04.2015, 00:05
Re: Melhorando seus script's e seus gamemodes - by ReyMysterio - 28.04.2015, 00:14
Re: Melhorando seus script's e seus gamemodes - by LockedLucas - 28.04.2015, 00:25
Re: Melhorando seus script's e seus gamemodes - by PT - 28.04.2015, 00:34
Re: Melhorando seus script's e seus gamemodes - by LockedLucas - 28.04.2015, 00:43
Re: Melhorando seus script's e seus gamemodes - by RiqueP - 28.04.2015, 19:10
Respuesta: Melhorando seus script's e seus gamemodes - by DKDarkking - 23.06.2015, 19:58
Re: Respuesta: Melhorando seus script's e seus gamemodes - by PT - 23.06.2015, 20:48
Re: Melhorando seus script's e seus gamemodes - by HaRdiiZin - 23.06.2015, 21:32
Re: Melhorando seus script's e seus gamemodes - by TGMTeam - 24.06.2015, 19:24
Re: Melhorando seus script's e seus gamemodes - by PT - 24.06.2015, 21:48
Re: Melhorando seus script's e seus gamemodes - by PT - 13.12.2015, 13:52
Re: Melhorando seus script's e seus gamemodes - by EditPawn - 13.12.2015, 15:54
Re: Melhorando seus script's e seus gamemodes - by WLSF - 13.12.2015, 17:58
Re: Melhorando seus script's e seus gamemodes - by EditPawn - 13.12.2015, 18:31
Re: Melhorando seus script's e seus gamemodes - by Bruno13 - 13.12.2015, 19:08
Re: Melhorando seus script's e seus gamemodes - by WLSF - 13.12.2015, 20:00
Re: Melhorando seus script's e seus gamemodes - by EditPawn - 13.12.2015, 20:55
Re: Melhorando seus script's e seus gamemodes - by PT - 15.07.2017, 23:14

Forum Jump:


Users browsing this thread: 1 Guest(s)