[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
#2

Otimo tutorial, vai me ajudar bastante
Reply
#3

nice
Reply
#4

Legal mas menos linhas nгo quer dizer que esta mais otimizado jб que no .amx nгo vai fazer diferenзa alguma, acho que й bem mais legнvel com chaves em alguns casos do que tudo junto na mesma linha, fora que fica horrнvel coisas desse tipo:
PHP код:
 if(IsPlayerInAnyVehicle(playerid)) {SetVehiclePos(GetPlayerVehicleID(playerid), X+2Y+2Z);PutPlayerInVehicle(playeridGetPlayerVehicleID(playerid), 0);}//N4 
mas isso vai do gosto de cada um nгo й mesmo
Reply
#5

Quote:
Originally Posted by Whoo
Посмотреть сообщение
Legal mas menos linhas nгo quer dizer que esta mais otimizado jб que no .amx nгo vai fazer diferenзa alguma, acho que й bem mais legнvel com chaves em alguns casos do que tudo junto na mesma linha, fora que fica horrнvel coisas desse tipo:
PHP код:
 if(IsPlayerInAnyVehicle(playerid)) {SetVehiclePos(GetPlayerVehicleID(playerid), X+2Y+2Z);PutPlayerInVehicle(playeridGetPlayerVehicleID(playerid), 0);}//N4 
mas isso vai do gosto de cada um nгo й mesmo
Exatamente!
Reply
#6

Quote:
O QUE VAMOS APRENDER?
A deixar o seu codigo grotescamente menor, organizado e otimizado, sem perder a funcionalidade, e talvez atй ganhar mais desempenho
Ta tudo ali.

Bom tutorial, btw.
Reply
#7

Quote:
Originally Posted by Whoo
Посмотреть сообщение
Legal mas menos linhas nгo quer dizer que esta mais otimizado jб que no .amx nгo vai fazer diferenзa alguma, acho que й bem mais legнvel com chaves em alguns casos do que tudo junto na mesma linha, fora que fica horrнvel coisas desse tipo:
PHP код:
 if(IsPlayerInAnyVehicle(playerid)) {SetVehiclePos(GetPlayerVehicleID(playerid), X+2Y+2Z);PutPlayerInVehicle(playeridGetPlayerVehicleID(playerid), 0);}//N4 
mas isso vai do gosto de cada um nгo й mesmo
Faria alguma diferenзa em questгo de otimizaзгo se eu fizesse dessa maneira?

PHP код:
if(IsPlayerInAnyVehicle(playerid))
    
SetVehiclePos(GetPlayerVehicleID(playerid), X+2Y+2Z), PutPlayerInVehicle(playeridGetPlayerVehicleID(playerid), 0);//N4 
Reply
#8

pawn Код:
if(IsPlayerInAnyVehicle(playerid)) {SetVehiclePos(GetPlayerVehicleID(playerid), X+2, Y+2, Z);PutPlayerInVehicle(playerid, GetPlayerVehicleID(playerid), 0);}//N4
poha..
e pensar q eu ja fiz isso tambйm :v

Tem sempre que tomar cuidado, eu fiz isso, n era pq eu era criativo, :v й porque eu vi alguйm fazendo em um sistema
e quis fazer igual, e tomei na jabiraca
Reply
#9

Quote:
Originally Posted by Ermanhaut
Посмотреть сообщение
Ta tudo ali.



Bom tutorial, btw.
Falou tudo broder!
__________________________________________________ _______________________________________________
Quote:
Originally Posted by pWesley
Посмотреть сообщение
Faria alguma diferenзa em questгo de otimizaзгo se eu fizesse dessa maneira?
PHP код:
if(IsPlayerInAnyVehicle(playerid))
    
SetVehiclePos(GetPlayerVehicleID(playerid), X+2Y+2Z), PutPlayerInVehicle(playeridGetPlayerVehicleID(playerid), 0);//N4 
Achei que o titulo q botei fosse Compactaзгo & Melhorias de Cуdigo!,
eu escrevi talvez otimizaзгo, pq fazer "if(condiзгo) retornar MensagemdeErro(...);" gera uma pequena otimizaзгo, e futuramente, farei "Situaзгo 2"
__________________________________________________ ______________________________________________

Quote:
Originally Posted by Whoo
Посмотреть сообщение
...
tipo se eu tenho 3 funзхes pequenas para fazer sу 1 coisa, eu gosto de junta-las!
cada um seu gosto paras coisas
Reply
#10

Quote:
Originally Posted by Whoo
Посмотреть сообщение
Legal mas menos linhas nгo quer dizer que esta mais otimizado jб que no .amx nгo vai fazer diferenзa alguma, acho que й bem mais legнvel com chaves em alguns casos do que tudo junto na mesma linha, fora que fica horrнvel coisas desse tipo:
PHP код:
 if(IsPlayerInAnyVehicle(playerid)) {SetVehiclePos(GetPlayerVehicleID(playerid), X+2Y+2Z);PutPlayerInVehicle(playeridGetPlayerVehicleID(playerid), 0);}//N4 
mas isso vai do gosto de cada um nгo й mesmo
Exatamente, Pra mim cуdigo assim й igual quando o bloco de notas da pau e nгo consegue identificar em qual formato estava o arquivo kkkk.

Eu prefiro com chaves desde que saiba trabalhar com elas de forma que nгo deixe seu cуdigo extenso e nem ilegнvel.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)