[Tutorial] Compactaзгo & Melhorias de Cуdigo!
#1

Bom dia galera!

venho hoje com mais um tutorial simples, mais do coraзгo, e vai ajudar muito vocкs!

INTRODUЗГO:
Bom muito de vocкs ja foram fazer alguma logica, simples pode ser atй de um comando, mas ficou aquele cуdigo enorme e monstro que atй pode ser feio, alguns ainda nгo sabe diminuir e otimizar seu codigo, para ficar algo bonito organizado.
NOTAS:
  • eu recomendo que vocкs sabem pelo-menos o basico de ScanF, para eu nгo precisar explicar!
  • por favor, se forem usar em outro lugar este tutorial, coloquem os crйditos!
  • Se vocкs acharem coisa parecidas, por favor me perdoem, eu nгo copiei de ninguйm, fiz esta explicaзгo sozinho,deve ser alguйm que teve a ideia muito parecida!
  • se forem mostrar para alguйm, me marque nos crйditos, eu ficarei muito feliz por isso!
  • se vocкs melhorarem o cуdigo, nгo guarde para si! coloque aqui para compartilhar seu conhecimento! ^^
O QUE VAMOS APRENDER?
A deixar o seu codigo, grotescamente menor, organizado e otimizado, sem perder a funcionalidade, e talvez atй ganhar mais desempenho



PRATICAS & CODE:

Situaзгo 1:
Vocк fez um comando de teleporte para esta logado na rcon, porem este codigo ta muito grande e estranho,
dificil de entrepretar...

PHP код:
    if(strcmp(cmd"/ir"true) == 0)
    {
        if(
pAdmin[playerid] > 0//N1
        
{
            new 
plidFloat:XFloat:YFloat:Z;
            if(
sscanf(cmdtext"s[4]d"cmdplid))//N2
            
{
                
SendClientMessage(playeridVermelho"Digite: /ir [id]");
                return 
1;
            }
            if(
IsPlayerConnected(plid))//N3
            
{
                
GetPlayerPos(plidXYZ);
                
SetPlayerInterior(playeridGetPlayerInterior(plid));
                if(
IsPlayerInAnyVehicle(playerid))//N4
                
{
                    
SetVehiclePos(GetPlayerVehicleID(playerid), X+2Y+2Z);
                    
PutPlayerInVehicle(playeridGetPlayerVehicleID(playerid), 0);
                }
                else
                {
                    
SetPlayerPos(playeridX+2Y+2Z);//N5
                
}
                
format(stringsizeof(string), "O(A) ADM %s (%d) foi atй sua posiзгo para ajuda-lo(a)!"GetPlayerNameEx(playerid), playerid);
                
SendClientMessage(plidtcadmstring);
            }
            else
            {
                
SendClientMessage(playeridVermelho"Jogador Nгo Conectado!");//N3
            
}
        }
        else
        {
            
SendClientMessage(playeridVermelho"sem permissгo!");//N1
        
}
        return 
1;
    } 
nуs podemos retirar algumas chaves e mover coisas de lugar!
PHP код:
    if(strcmp(cmd"/ir"true) == 0)
    {
        new 
plidFloat:XFloat:YFloat:Z;
        if(
pAdmin[playerid] == 0)                return SendClientMessage(playeridVermelho"sem permissгo!");//N1
        
if(sscanf(cmdtext"s[4]u"cmdplid))    return SendClientMessage(playeridVermelho"Digite: /ir [nick/id]");//N2
        
if(!IsPlayerConnected(plid))                return SendClientMessage(playeridVermelho"Jogador Nгo Conectado!");//N3
        
GetPlayerPos(plidXYZ);
        
SetPlayerInterior(playeridGetPlayerInterior(plid));
        if(
IsPlayerInAnyVehicle(playerid)) SetVehiclePlayerPos(playeridX,Y,Z);//N4
        
else SetPlayerPos(playeridX+2Y+2Z);//N5
        
        
format(stringsizeof(string), "O(A) ADM %s (%d) foi atй sua posiзгo para ajuda-lo(a)!"GetPlayerNameEx(playerid), playerid);
        return 
SendClientMessage(plidtcadmstring);    
    } 
PHP код:
SetVehiclePlayerPos(playeridFloat:X,Float:Y,Float:Z)
{
   
SetVehiclePos(GetPlayerVehicleID(playerid), X+2Y+2Z);
   
PutPlayerInVehicle(playeridGetPlayerVehicleID(playerid), 0);//N4 

Quote:

N1->Antes: sу executava a funзгo, se fosse admin, se nгo, aparecia uma mensagem sem permissгo!
N1->Depois: agora se nгo for admin, mostra a mensagem e cancela o comando, caso for, roda diretamente o CODE!
N1->Conclusгo: Pode melhorar um pouco do desempenho, e retirou uma parte inutil, e separada do codigo, alem de resumir 7 linhas para 1!

N2->Antes: Consumia muitas linhas de codigo, e sу podia teleportar para determinado ID! (aceitava sу inteiros
N2->Depois: Ficou mais compactado, alem de agora aceita NICK ou ID do jogador a se teleportado ("d"-> inteiros | "u"-> Inteiros ou nick que sera convertido para id inteiro)
N2->Conclusгo: Melhorou a funcionalidade, alem de que agora o codigo foi resumido de 4 linhas para 1!

N3->Antes: Sу executava a funзгo se o player estive-se Conectado, se nгo, aparecia uma mensagem sobre o jogador nгo estar online!
N3->Depois: O codigo funicona normalmente, caso o player nгo estiver online, exibe a mensagem e cancela o comando!
N3->Conclusгo: Pode melhorar um pouco do desempenho, e retirou muitas linhas desnecessarias, alem de resumir junto com N4 & N5 de 21 linhas para 5!

N4->Antes: Consumia grande espaзo, mesmo sendo funзoes de nome pequeno e da mesma coisa!
N4->Depois: Ficou tudo na mesma linha, entre { } para que ler as 3 funзхes na mesma linha, e assim o espaзo ficou bem mais aproveitado!
N4->Conclusгo: com isso o codigo deu uma melhorada monstra, e pode reduzir 5 linhas para 1!
N4->Motivo:As 3 funзхes sгo respectivas do teleporte, entгo desde que vocк tenha pequenas funзхes de mesmo objetivo, vocк pode unilas!

N4->Alteraзгo:resolvi separar a funзгo, por que os bonzinhos, se sentirгo muito ofendido com 2 linhas em uma, e comeзaram a difamar o tutorial!

N5->Antes: Um abrimento e fechamento de chaves desnecessarias, e um retorn do inteiro 1, com um grande disperdicio de espaзo!
N5->Depois: Como existe uma funзгo sу vocк nгo precisa de { } em sua funзгo, vocк pode simplesmente colocar na frente, que vai ser intepetrado como funзгo de determinada condiзгo.

NOFF-> SendClientMessage(...): Return Values:
1: The function executed successfully. Success is reported when the string is over 144 characters, but the message won't be sent.
0: The function failed to execute. The player is not connected.
isto й como o player deu o comando entгo ele deve estбr online, e ira retornar 1, que no caso nгo mostra-ra a mensagem: "Server UNKNOWN Command"

Situaзгo 2:
Vocк fez estб fazendo algo que precisa saber arma que o player estб segurando, pode ser um antixiter para kicka-lo talvez
mas tome cuidado com o jeito que for fazer.

PHP код:
//jeito errado:
if(GetPlayerWeapon(playerid) == ... || GetPlayerWeapon(playerid) == ... || GetPlayerWeapon(playerid) == ...) 
Bom, espero que vocк tenha percebido o erro, pode afetar muito no desempenho, e desperdicar muita banda & memoria nesta situaзгo
PHP код:
    //jeito correto:
    
new arma GetPlayerWeapon(playerid); 
    if(
arma == ... || arma == ... || arma == ...) 
Quote:

N->Antes: vocк estavб testando requesitando muitas vezes a mesma coisa em uma condiзгo, entгo recebia muitos pacotes duplicados.
N->Depois: agora estб reduzido o consumo de banda, pуs й feito somente uma vez a captaзгo da arma do jogador

Situaзгo 3:
String й algo delecidado, deve se ter cuidado com ela, й o principal viгo do server mal otimizado, onde um simples numero, pode causar um delay de quase 1 segundo, й imporante sempre estar tudo bem planejado e calculado, para desfrutar do melhor.
PHP код:
//jeito ruim
stock GetPlayerNameEx(playerid)
{
    new 
playerName[MAX_PLAYER_NAME];
    
GetPlayerName(playeridplayerNamesizeof(playerName));
    return 
playerName;

Bom, algo desnessario captar mais de 1 vez o nick do jogador, visto que ele nгo pode alterar nome pelo client, somente pelo servidor,
no caso fazer 1 requesiгo e armazenar o valor seria melhor, e vocк pode alterar o nome, em conjuto com o Sv....
PHP код:
//corretamente
new nome[MAX_PLAYERS][MAX_PLAYER_NAME];  
public 
OnPlayerConnect(playerid)  
{  
     
GetPlayerName(playerid,nome[playerid],24);  
     return 
1;   

Quote:

N->Antes: vocк estavб uma requisгo que iria sempre ser a mesma coisa, e perdendo muito memoria, pois string sгo vilгo nisso.
N->Depois: agora vocк solicia somente uma vez o nick do jogador, e mantem armazendo captar quando precisar, com isso todo o GM agradece, por causa q o nome do jogador й muito utilizado em todo ele!


Quote:
Originally Posted by RazorGuigo
Посмотреть сообщение
Se vocкs gostaram disso, me avisem que eu posso trazer mais situaзхes!
CREDITOS:
RazorG: Situaзгo 1
Jelly23: Situaзгo 2 & 3
Reply


Messages In This Thread
Compactaзгo & Melhorias de Cуdigo! [Atualizado 18/03/2017] - by RazorGuigo - 09.01.2017, 15:22
Re: Compactaзгo & Melhorias de Cуdigo! - by Meck - 09.01.2017, 15:38
Re: Compactaзгo & Melhorias de Cуdigo! - by IlanZ - 09.01.2017, 15:44
Re: Compactaзгo & Melhorias de Cуdigo! - by Whoo - 09.01.2017, 17:21
Re: Compactaзгo & Melhorias de Cуdigo! - by zSuYaNw - 09.01.2017, 17:46
Re: Compactaзгo & Melhorias de Cуdigo! - by Ermanhaut - 09.01.2017, 18:00
Re: Compactaзгo & Melhorias de Cуdigo! - by pWesley - 09.01.2017, 18:02
Re: Compactaзгo & Melhorias de Cуdigo! - by KinG7 - 09.01.2017, 18:03
Programando e Gambiarrando! - by RazorGuigo - 09.01.2017, 18:04
Re: Compactaзгo & Melhorias de Cуdigo! - by [BOPE]Seu._.Madruga - 21.03.2017, 23:51

Forum Jump:


Users browsing this thread: 1 Guest(s)