O intuito deste guia é referente a organização e otimizações que podem ser realizadas em qualquer script
e a maioria dos passos podem ser aplicados em outras linguagens.
Organizando
Indentação
Em primeiro lugar um script bem organizado começa com sua tabulação correta!
Indentar o código de forma adequada facilita a leitura e manutenção do código.
Indentador: https://tabuladorpawn.000webhostapp.com/index.html
Comentários
Comentar linhas e/ou funções é parte básica do processo de organização.
Lembre-se que você é um ser humano e não uma máquina, portanto, mesmo que você seja o responsável
pelo código, ainda assim será possível se perder em meio a ele.
Considerando isso, sempre que tiver dificuldades na criação de determinado código comente sobre
ele ou em determinadas linhas para que em caso de uma manutenção futura você consiga realizar
esta tarefa rapidamente e sem dificuldades.
Nomenclaturas
Nem todos gostam de nomenclaturas muito grandes, porém em alguns casos isso pode ser necessário
e isso está longe de ser um problema, pelo contrário, isso torna o entendimento mais fácil da
finalidade pela qual a variável foi criada, portanto, não economize caracteres.
Já falei que não somos máquinas? Pois é. Ela interpreta qualquer código antes de você começar a lê-lo,
logo uma nomenclatura boba pode não fazer o código perder o sentido, mas pode sim atrapalhar a
sua compreensão.
Código morto
É muito comum mantermos certas funções cuja intenção é utilizá-la posteriormente. Acontece que ao
iniciar esta prática acabamos adicionando várias funções com o mesmo propósito e no fim, mesmo
percebendo que se trata de uma função sem utilidade, ainda assim a deixamos permanecer.
É sempre interessante fazer uma reanálise no script para limpar este código cuja função ou resultado nunca
é utilizado.
Módulos
Afinal, não adotar este método é um problema?
É uma discussão válida e a resposta é muito relativa.
Alguns enfrentam dificuldades, outros não gostam ou não veem necessidade disso já que não estão
trabalhando com um número considerável de linhas.
Mas quando falamos em 'programar' devemos estar cientes de que precisaremos lidar com um número de linhas
ilimitado, ou seja, devemos estar preparados para inúmeros desafios e o principal, em se tratando de
pawn, é: como organizar tudo isso em um único arquivo.
Fora desta linguagem, podemos trabalhar com outras onde é possível separar facilmente o código com
base em sua função. A lógica se aplica aqui de forma semelhante.
Estruturas de condição If e Switch
Sim, por incrível que pareça isso também faz diferença no código.
Em muitos sistemas antigos a estrutura de condição IF era muito e ao mesmo tempo mal usada.
Alguns casos em específico é possível alternar entre estas estruturas e isso acaba ajudando bastante no
entendimento de um código.
Certas situações acabam até afetando o desempenho do código e isso será abordado na parte de
otimizações.
Otimizando
Células
Para facilitar o trabalho é costume colocar um número superior de células em variáveis. O problema
é quando este valor é exagerado de forma desnecessária.
Quanto mais células uma variável/array tiver, mais memória ela vai consumir e, por consequência,
seu arquivo .amx ficará mais pesado assim como a compilação ficará mais demorada.
Busque utilizar um número de células superior, porém próximo do necessário.
Redefinição de definições nativas
MAX_PLAYERS, VEHICLES, PICKUPS, ACTORS...
Um servidor, de início, dificilmente utiliza a capacidade máxima de cada um dos recursos acima citado
(entre outros, até mesmo não nativos).
Sempre redefina as definições mais utilizadas e principalmente as que possuem valores maiores para
valores próximos ao que o servidor irá utilizar. Isto porque utilizamos estes valores principalmente
para loopings e isso retarda o encerramento de uma função que utiliza este recurso.
Loopings
Uma breve continuação do item anterior, é sempre útil facilitar o processo de looping.
Portanto, se possível, utilize a livraria FOREACH.
Uma livraria utilizada principalmente para jogadores, porém se bem explorada pode agregar muito mais.
Caso esteja usando a versão 0.3.7 do SA:MP e não tenha costume de usar a livraria foreach, pode usar
como apoio as funções GetPlayerPoolSize, GetVehiclePoolSize e GetActorPoolSize onde ambas retornam o
maior ID relacionado a ela. Nos demais casos, é importante ressaltar a relevância do item anterior.
Condições
As condições, quando bem utilizadas, podem encerrar uma instrução a qualquer momento evitando uma
carga contínua desnecessária.
Como este é um tema bem específico, vou abordar uma das callbacks mais utilizadas e com ela exemplificar
o ponto que quero chegar.
É muito comum, por exemplo, a callback OnDialogResponse possuir um número exorbitante de condicionais
já que por ela passa todas as caixas de diálogo do servidor.
A proposta, neste caso, é identificar somente a caixa de diálogo relacionada a determinado ID.
Alguns sistemas não utilizam a condição IF nesta callback da forma correta, pois esquecem a existencia de
ELSE IF e ao invés de encerrar a instrução quando necessário (ou seja, quando identifica o ID da caixa
de diálogo), deixam o servidor executar todas as demais verificações (que não são poucas).
Observações finais
Espero ter sido claro quanto às informações que eu passei e, caso eu tenha errado em algum ponto
ou queiram agregar alguma informação, por gentileza me informe.
Provavelmente eu me esqueci de algumas coisas. Na verdade com certeza eu esqueci, mas se eu lembrar
eu atualizo o tópico.
Todos os pontos abordados são FATOS de meu conhecimento, por isso o tópico não é tão extenso.
Com base em muito código estudado cheguei a essas conclusões e espero que isso possa iluminar
principalmente quem está começando para que adote desde cedo a maioria dessas técnicas e consiga
evoluir enquanto programador mesmo que somente por hobby.
Então eu tô com a gm de um amigo aqui pra arrumar, o sistema de sequestros pra ele, ao tentar realizar a ação in game, apenas aparece "Valor deve ser entre 1.00 e 80.000" porém o valor utilizado se encaixa na demanda, sou scripter (noob) ainda e não achei erro no código do sistema, se alguém puder me auxiliar ou ajudar, fico grato.
Código:
Código:
CMD:sequestrar(playerid, params[])
{
if(IsPlayerConnected(playerid))
{
if(PlayerInfo[playerid][pMembro] == 5 || PlayerInfo[playerid][pLider] == 5 || PlayerInfo[playerid][pMembro] == 6 || PlayerInfo[playerid][pLider] == 6 || PlayerInfo[playerid][pMembro] == 15 || PlayerInfo[playerid][pLider] == 15 || PlayerInfo[playerid][pMembro] == 16 || PlayerInfo[playerid][pLider] == 16 || PlayerInfo[playerid][pMembro] == 18 || PlayerInfo[playerid][pLider] == 18 || PlayerInfo[playerid][pMembro] == 8 || PlayerInfo[playerid][pLider] == 8
|| PlayerInfo[playerid][pMembro] == 22 || PlayerInfo[playerid][pLider] == 22 || PlayerInfo[playerid][pMembro] == 20 || PlayerInfo[playerid][pLider] == 20 || PlayerInfo[playerid][pMembro] == 19 || PlayerInfo[playerid][pLider] == 19 || PlayerInfo[playerid][pMembro] == 23 || PlayerInfo[playerid][pLider] == 23 || PlayerInfo[playerid][pMembro] == 11 || PlayerInfo[playerid][pLider] == 11 || PlayerInfo[playerid][pMembro] == 21 || PlayerInfo[playerid][pLider] == 21
|| PlayerInfo[playerid][pMembro] == 24 || PlayerInfo[playerid][pLider] == 24 || PlayerInfo[playerid][pMembro] == 26 || PlayerInfo[playerid][pLider] == 26)
{
if(psequestrar == 1)
{
SendClientMessage(playerid,COR_GRAD2,"Sequestraram recentimente, so pode sequestrar a cada 4 minutos!");
return 1;
}
if(PlayerInfo[playerid][pCargo] < 2)
{
SendClientMessage(playerid, COR_GRAD2, "Voce precisa ser acima do cargo 2 para usar este comando !");
return 1;
}
if(PlayerInfo[playerid][pLevel] < 4)
{
SendClientMessage(playerid, COR_LIGHTBLUE, "Voce precisa ser level 4+ para usar este comando!");
return 1;
}
new money;
if(sscanf(params, "u", sscanfid, money))
{
SendClientMessage(playerid, COR_GRAD2, "{ffffff} USE: /sequestrar [id] [quantia]");
return 1;
}
if(money < 1000 || money > 80000) { SendClientMessage(playerid, COR_GREY, "O valor requisitado no sequestro deve ser entre R$1.000 e R$80.000 !"); return true; }
if(IsPlayerConnected(sscanfid))
{
if(sscanfid != INVALID_PLAYER_ID)
{
new car = GetPlayerVehicleID(playerid);
if(IsPlayerInAnyVehicle(playerid) && GetPlayerState(playerid) == 2 && IsPlayerInVehicle(sscanfid, car))
{
if(sscanfid == playerid)
{
SendClientMessage(playerid, COR_GREY, "Voce nao pode se sequestrar !");
return true;
}
if(PlayerInfo[sscanfid][pLevel] <= 4)
{
SendClientMessage(playerid, COR_GRAD1, "Voce nao pode sequestrar jogadores abaixo do level 4!");
return 1;
}
if(GetPlayerOrg(sscanfid) == GetPlayerOrg(playerid))
{
SendClientMessage(playerid, COR_GRAD1, "Voce nao pode usar este comando na sua propria org!");
return 1;
}
new dinheirovitima = GetPlayerMoneyEx(sscanfid);
GetPlayerName(sscanfid, giveplayerZCMD, sizeof(giveplayerZCMD));
GetPlayerName(playerid, sendername, sizeof(sendername));
GivePlayerMoneyEx(sscanfid, - dinheirovitima);
format(stringZCMD, sizeof(stringZCMD), "* Voce foi sequestrado por %s, e perdeu todo o seu dinheiro que tinha na mao, e perdeu seu celular!", sendername);
SendClientMessage(sscanfid, COR_LIGHTBLUE, stringZCMD);
GivePlayerMoneyEx(playerid, dinheirovitima);
format(stringZCMD, sizeof(stringZCMD), "* Voce sequestrou %s e recebeu [%d] que ele tinha nas maos.", giveplayerZCMD, dinheirovitima);
SendClientMessage(playerid, COR_LIGHTBLUE, stringZCMD);
format(stringZCMD, sizeof(stringZCMD), "[Sequestro %s]: %s sequestrou %s[%d] e quer R$[%d] para liberta-lo.", NomeORG(playerid), sendername ,giveplayerZCMD,sscanfid, money);
SendClientMessageToAll(GetPlayerColor(playerid), stringZCMD);
GetPlayerName(playerid, sendername, sizeof(sendername));
GameTextForPlayer(sscanfid, "~r~Sequestrado", 2500, 3);
psequestrar = 1;
PlayerCuffed[sscanfid] = 2;
SetPlayerAttachedObject(sscanfid, 9, 19418, 6, -0.031999, 0.024000,-0.024000,-7.900000,-32.000011,-72.299987, 1.115998, 1.322000, 1.406000);
SetPlayerSpecialAction(sscanfid, 24);
Sequestrado[sscanfid] = 1;
PlayerInfo[sscanfid][pPnumber] = 0;
TempoSequestrar = SetTimer("Sequestrar",186000, 0);
PlayerMutado[sscanfid] = 1;
PlayerInfo[playerid][pSequestros] ++;
}
else
{
SendClientMessage(playerid, COR_GREY, "O Jogador nao esta em seu carro, ou Voce nao e o motorista !");
}
}
}
else
{
SendClientMessage(playerid, 0xfa4c4cff, "{fa4c4c}ERRO: {ffffff}nao ha nenhum jogador on-line com esse ID/Nick!");
}
}
else
{
SendClientMessage(playerid, COR_GREY, "Voce nao e um Gangster !");
}
}
return true;
}
Bom dia, tenho servidor de samp 149.56.253.206:7777 ele está com Hosted ativa no SAMP - PC. porem na aba hosted mobile não está aparecendo alguem sabe me dizer como colocar pra aparecer la?
Alguém tem alguma ideia do que do que pode ser?
Toda vez que eu reinicio o servidor agora eu tenho que entrar na host, matar o processo do samp03svr e abrir ele de novo pelo terminal
Se não o servidor crasha alguns minutos depois de reiniciar
Boa tarde pessoal! Trago-lhes o "Super Nova RP/RPG". Cidade que estou adaptando para o RP, no momento possui diversas mecânicas, mas estou sempre em busca de melhora-las, estou usando uma "Gamemode" já pronta e editando-a. Tenho uma certa dificuldade com programação, já tentei até mesmo faculdade, mas minha área está em segurança da info... Então quem quiser ajudar por espontânea vontade e quem sabe construirmos juntos um servidor próspero, estarei a disposição. Quero construir algo bem sério, aonde futuramente meus administradores e helpers possam receber uma parte das doações como seu "salário" pela sua contribuição ao servidor, por isso quero contar com administradores sérios, que estão ali para inteirar em alguma coisa.
Organizações(27+4 organizações privadas "À VENDA", com seus comandos exclusivos.)
Três concessionárias, sendo uma da "FERRARI".
Casas normais(com portão). Casas editadas e exclusivas com sistemas de portão e etc...
Sistema de doações, sendo eles: VIP Gratuito, VIP Premium, Cofre particular, Escritório, entre outros benefícios que ajudam no investimento na cidade.
Empresas e mini empresas, aonde o jogador pode arrecadar uma grana extra e até mesmo ter seu sócio.
Apartamentos editáveis, podendo personaliza-lo do seu jeito!
Detran como uma das mais importantes organizações, evitando os carros jogados pela rua ou locais indevidos.
Entre outras mecânicas que você mesmo pode estar conhecendo.
Como dito, quero adaptar ela para o RP com elementos RPG, porém é um processo longo que requer toda uma construção e equilíbrio, que apenas com jogadores podemos chegar em tais resultados.
Se surgiu interesse e quiser conhecer a cidade e chamar amigos, agora é a hora! Estou dando a liderança para quem quiser(exceto orgs privadas) e level 3 para poder começar a jogar tranquilamente e se divertir. Criei um Discord para a cidade e personalizei ele para deixar mais fácil e atrativo para os jogadores. Lá será o nosso famoso e antigo "forúm". Então se quiser conhecer a cidade, venha!
Nome: Super Nova RP/RPG [VIP GRATIS+ANDROID] O original
Discord: https://discord.gg/NUrTdCFjC2 (Obrigatório estar para ser líder e etc... Lá contém todas informações necessárias e até mesmo lá será setado seu nome para o RP, utilize nomes fictícios mas reais. ex: Carlos_Eduardo)
IP: 149.56.252.173:7778
Modo: RP/RPG: BR/PT
new DCC_Channel:channel; DCC_GetMessageChannel(message, channel); new DCC_Role:role = DCC_FindRoleById("98xxxxxxx40788756");
new DCC_Guild:guild = DCC_FindGuildById("98xxxxx379084"); if (guild == DCC_INVALID_GUILD) return 0; // invalid guild id
new DCC_User:author; DCC_GetMessageAuthor(message, author);
new ds_userid[20 + 1]; DCC_GetUserId(author, ds_userid); new DCC_User:user = DCC_FindUserById(ds_userid); if (user == DCC_INVALID_USER) return 0; // invalid user id