23.11.2017, 00:52
(
Последний раз редактировалось Pool; 08.02.2018 в 15:25.
Причина: Conserto em palavras incorretas. #1
)
Minha primeira contribuiзгo para o fуrum, й algo bem simples, pois o fуrum jб possui conhecimento atй um certo e bom nнvel(Ao meu ver, atualmente, sim).
Entгo, vim fazer uma base mais explicativa para os que possuem uma dificuldade em produzir as funзхes.
Vamos aprender a desenvolver profissхes, variantes e etc...?
Vamos comeзar!
Primeiro de tudo, vamos precisar das diretivas, "o que й uma diretiva?"
Resposta: Uma diretiva, й uma funзгo ou regra que se deve ser seguida.
Ainda nгo entendeu? pra ser mais prбtico...
Sabe isso que tem logo no topo do seu GameMode/Filterscript?
Esse "#include", significa que vocк estб incluindo uma biblioteca que as regras dela se devem ser seguidas.
Ou seja, as diretivas que iremos chegar a utilizar, serгo as seguintes:
O Link de encontro para as includes, estгo logo abaixo:
a_samp - Jб vem incluнdo ao baixar a pasta completa de create server. (Link direto da pasta - SA-MP 0.3.7-R2 Windows Server/SA-MP 0.3.7-R2 Linux Server (x86))
Double-O-Files 2 (DOF2) - Download
Pawn.CMD - Pawn.CMD - the fastest and most functional command processor
Agora, como instalamos?
O DOF2, vocк arrasta para a pasta do seu servidor e depois vai em pawno/include e cola lб.
Um exemplo do destino da pasta й assim:
Agora que jб baixamos as diretivas, vamos para a inicializaзгo das nossas funзхes.
Primeiro, entenda que uma base que irei citar aqui, jб servirб para vocк produzir as outras.
Entгo, vamos criar uma profissгo de lixeiro.
Vamos criar uma variбvel.
Mas a variбvel que vamos criar, serб em booleano.
Apуs, criarmos a variбvel com a funзгo em matriz de MAX_PLAYERS, vamos na callback OnPlayerConnect e fazer a funзгo de armazenamento em DOF2, e os comandos e funзхes.
Passo-a-passo:
Entгo, vim fazer uma base mais explicativa para os que possuem uma dificuldade em produzir as funзхes.
Vamos aprender a desenvolver profissхes, variantes e etc...?
Vamos comeзar!
Primeiro de tudo, vamos precisar das diretivas, "o que й uma diretiva?"
Resposta: Uma diretiva, й uma funзгo ou regra que se deve ser seguida.
Ainda nгo entendeu? pra ser mais prбtico...
Sabe isso que tem logo no topo do seu GameMode/Filterscript?
PHP код:
#include ...
Ou seja, as diretivas que iremos chegar a utilizar, serгo as seguintes:
PHP код:
#include <a_samp>
#include <dof2>
#include <pawn.cmd>
a_samp - Jб vem incluнdo ao baixar a pasta completa de create server. (Link direto da pasta - SA-MP 0.3.7-R2 Windows Server/SA-MP 0.3.7-R2 Linux Server (x86))
Double-O-Files 2 (DOF2) - Download
Pawn.CMD - Pawn.CMD - the fastest and most functional command processor
Agora, como instalamos?
O DOF2, vocк arrasta para a pasta do seu servidor e depois vai em pawno/include e cola lб.
Um exemplo do destino da pasta й assim:
Код:
C:\Users\Dell\Downloads\samp037_svr_R2-1-1_win32\pawno\include
Primeiro, entenda que uma base que irei citar aqui, jб servirб para vocк produzir as outras.
Entгo, vamos criar uma profissгo de lixeiro.
Vamos criar uma variбvel.
Mas a variбvel que vamos criar, serб em booleano.
PHP код:
new bool:prof_lixeiro[MAX_PLAYERS];
Passo-a-passo:
- Primeiro, procure pela callback, que geralmente, ao criar um novo Filtercript/GameMode, virб da seguinte forma:
PHP код:public OnPlayerConnect(playerid)
{
return 1;
}
- Agora, crie uma variбvel com uma quantidade de cйlulas de acordo com o nome da pasta que irб armazenar os dados. E tambйm, uma variбvel com uma referкncia em armazenamento do nome do jogador.
Agora, vamos fazer uma verificaзгo se a pasta "Lixeiros" existe e resultar com funзхes lуgicas.
Tambйm, nгo esquecer de contas as cйlulas, vн um amigo corrigindo um outro em um tуpico sobre a contagem de cйlulas, entгo aqui, temos uma base bem explicativa:
Quote:Aviso: Vou consertar a quantidade de celulas nas variбveis utilizadas para fazer a formataзгo de string, mas antes vou explicar como funciona.
- Conte a quantidade de caracteres presentes na mensagem. Recomendo esse site -> Contador de Caracteres
- Se a sua mensagem for referente a nomes, adicione mais 25, pois й o limite do nome. Exemplo:
PHP код:/* Nessa funзгo necessita de +25 cйlulas. */
new str[56], var_name[MAX_PLAYER_NAME];
GetPlayerName(playerid, var_name, sizeof(var_name));
format(str, sizeof(str), "Vocк %s, possui vida infinita.", var_name);
SendClientMessage(playerid, -1, str);
/* Mas porquк necessita de +25 cйlulas? Por conta do limite do nome.
A mensagem em si, possui 30 cйlulas, iremos adicionar mais 25 pois o referencial de nome estб incluso.
30 + 25 = 55
Entгo o valor que ficarб dentro dos colchetes serб o 55, mas eu sempre adiciono mais um por precauзгo.*/
/* Nessa funзгo, nгo necessita de +25 cйlulas */
new string[27];
format(string, sizeof(string), "Vocк, possui vida infinita");
/* Fazendo a conta normal, darб 26 celulas, mas eu sempre adiciono mais um por precauзгo */
PHP код:new prof_lixeiro[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
new save[40], nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
format(save, sizeof(save), "Lixeiros/%s.ini", nome);
if(!fexist(save))
{
DOF2::CreateFile(save);
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
}
else
prof_lixeiro[playerid] = DOF2::GetBool(save, "Lixeiro");
return 1;
}
- Agora, vamos para salvar quando o jogador for desconectar do servidor.
Tudo se resume no mesmo acima, apenas o contrбrio de 'Get', vamos apenas usar 'Set'. Nгo se pode esquecer de um SaveFile tambйm...
PHP код:public OnPlayerDisconnect(playerid)
{
new save[40], nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
format(save, sizeof(save), "Lixeiros/%s.ini", nome);
if(!fexist(save))
{
DOF2::CreateFile(save);
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
DOF2::SaveFile();
}
else
{
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
DOF2::SaveFile();
}
return 1;
}
- Agora, vamos acrescentar uma coisa bбsica, vб na callback "OnFilterScriptExit"/"OnGameModeExit", e adicione o "DOF2::Exit"(Que de acordo com a diretiva, й o mesmo que a funзгo "DOF2::WriteFile"). que й pra caso o client-server resultar em algum problema e fechar, irб armazenar os dados.
PHP код:public OnFilterScriptExit()
{
DOF2::Exit();
return true;
}
/* Caso sua preferкncia seja pra um GameMode, utilize a funзгo abaixo: */
public OnGameModeExit()
{
DOF2::Exit();
return true;
}
- Agora que jб fizemos a funзгo de armazenamento, vamos para a funзгo de setamento para o jogador ser um lixeiro.
A funзгo de setamento, irб depender de sua preferкncia, vamos ao mais simples possнvel.
Vamos setar o jogador de lixeiro ao entrar, e ao sair, remover a funзгo.
A funзхes em destaque, serгo as:
PHP код:prof_lixeiro[playerid] = true;
prof_lixeiro[playerid] = false;
PHP код:public OnPlayerConnect(playerid)
{
new save[40], nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
format(save, sizeof(save), "Lixeiros/%s.ini", nome);
if(!fexist(save))
{
DOF2::CreateFile(save);
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
}
else
prof_lixeiro[playerid] = DOF2::GetBool(save, "Lixeiro");
prof_lixeiro[playerid] = true;
return 1;
}
Agora, caso queira setar a funзгo para o player, vamos utilizar mais uma diretiva, parabйns pra vocк que veio atй aqui lendo e acompanhando e nгo foi direto ao 'CTRL+C' e 'CTRL+V'.
A diretiva que vamos utilizar, й a sscanf2, e a sua instalaзгo й a mesma que as demais, passar para a pasta pawno/include. (Link download SSCANF2 - GitHub - Southclaws/sscanf2)
Seguindo isso, vamos para o comando...
PHP код:/* O desenvolvimento do comando, й semelhante a zcmd. */
CMD:setlixeiro(playerid, params[])
{
new id;
if(!sscanf(params, "u", id))
{
prof_lixeiro[id] = true;
}
else return SendClientMessage(playerid, -1, "Use - /setlixeiro [ID]");
return true;
}
1є - Eu dei o nome para o comando de acordo com a syntax, e selecionei os parвmetros "playerid" e "params".
PHP код:CMD:setlixeiro(playerid, params[])
PHP код:{
/* Apуs finalizar as funзхes, fechб-lo. */
}
PHP код:new id;
(Como podem ver, fiz algo que nгo й visto como normal no sscanf, abri o sinal de false por introduзгo da condicional. Sabe quando vocк utiliza algum comando pra setar um jogador de administrador/organizador, e vocк digita apenas '/setadm', e ele retorna com uma mensagem semelhante a essa? 'Use - /setadm [ID]', entгo, й o sscanf que faz isso acontecer!)
PHP код:if(!sscanf(params), "u", id))
{
/* ... */
}
else return SendClientMessage(playerid, -1, "Use - /setlixeiro [ID]");
6є - Setei o jogador escolhido com a profissгo de lixeiro.
Agora, caso queira fazer algo mais arrumadinho e que o jogador saiba?
Vamos lб!
1є - crie uma variбvel com uma quantidade de cйlulas exatas de quanto iremos utilizar no comando, e tambйm uma para ser derivada do nome do jogador.
PHP код:new str[], name_of_player[MAX_PLAYER_NAME];
/* Eu, sempre deixo sem a quantidade. Quando eu for contar, aн que eu coloco a quantidade certa!
Jбjб, vocк vai entender que й melhor assim. */
3є - Formate a variбvel 'name_of_player'.
PHP код:GetPlayerName(playerid, name_of_player, sizeof(name_of_player));
PHP код:format(str, sizeof(str), "O Jogador %s te deu a profissгo de lixeiro.", name_of_player);
Obs.: A mesma regra que o Cycle deu acima, se aplica aqui tambйm.
6є - Entгo, vamos colocar a quantidade '68', nos colchetes.
PHP код:new str[68];
PHP код:SendClientMessage(id, -1, str);
/* Colocamos o 'id' invйs de 'playerid', pois й o id que for setado irб aparecer a mensagem. 'str' invйs das aspas й porque, na formataзгo a funзгo jб vem setada com as aspas duplas. */
Entгo, por fim, a conclusгo do comando й essa:
PHP код:CMD:setlixeiro(playerid, params[])
{
new id;
if(!sscanf(params, "u", id))
{
prof_lixeiro[id] = true;
}
else return SendClientMessage(playerid, -1, "Use - /setlixeiro [ID]");
return true;
}
"Mas, Pool, e se o cara nгo tiver online? vai setar ele mesmo assim?"
Boa pergunta meu caro amigo, agora, vamos fazer uma pequena alteraзгo para verificar se o player estб conectado ao servidor!
Simples, vamos fazer uma verificaзгo, caso o jogador nгo esteja presente no servidor, retorne com uma mensagem!
PHP код:if(!IsPlayerConnected(id)) return SendClientMessage(playerid, -1, "ERRO: O jogador escolhido nгo estб presente!");
Obs.: A forma abaixo, й o setamento por comando:
PHP код:#include <a_samp>
#include <dof2>
#include <pawn.cmd>
#include <sscanf2>
new bool:prof_lixeiro[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
new save[40], nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
format(save, sizeof(save), "Lixeiros/%s.ini", nome);
if(!fexist(save))
{
DOF2::CreateFile(save);
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
}
else
prof_lixeiro[playerid] = DOF2::GetBool(save, "Lixeiro");
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
new save[40], nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
format(save, sizeof(save), "Lixeiros/%s.ini", nome);
if(!fexist(save))
{
DOF2::CreateFile(save);
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
DOF2::SaveFile();
}
else
{
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
DOF2::SaveFile();
}
return 1;
}
public OnFilterScriptExit()
{
DOF2::Exit();
return true;
}
CMD:setlixeiro(playerid, params[])
{
new id, str[68], name_of_player[MAX_PLAYER_NAME];
GetPlayerName(playerid, name_of_player, sizeof(name_of_player));
if(!sscanf(params, "u", id))
{
if(!IsPlayerConnected(id))
return SendClientMessage(playerid, -1, "ERRO: O jogador escolhido nгo estб presente!");
format(str, sizeof(str), "O Jogador %s te deu a profissгo de lixeiro.");
SendClientMessage(id, -1, str);
prof_lixeiro[id] = true;
}
else return SendClientMessage(playerid, -1, "Use - /setlixeiro [ID]");
return true;
}
PHP код:#include <a_samp>
#include <dof2>
#include <pawn.cmd>
#include <sscanf2>
new bool:prof_lixeiro[MAX_PLAYERS];
public OnPlayerConnect(playerid)
{
new save[40], nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
format(save, sizeof(save), "Lixeiros/%s.ini", nome);
if(!fexist(save))
{
DOF2::CreateFile(save);
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
}
else
prof_lixeiro[playerid] = DOF2::GetBool(save, "Lixeiro");
prof_lixeiro[playerid] = true;
return 1;
}
public OnPlayerDisconnect(playerid, reason)
{
new save[40], nome[MAX_PLAYER_NAME];
GetPlayerName(playerid, nome, sizeof(nome));
format(save, sizeof(save), "Lixeiros/%s.ini", nome);
if(!fexist(save))
{
DOF2::CreateFile(save);
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
DOF2::SaveFile();
}
else
{
DOF2::SetBool(save, "Lixeiro", prof_lixeiro[playerid]);
DOF2::SaveFile();
}
prof_lixeiro[playerid] = false;
return 1;
}
public OnFilterScriptExit()
{
DOF2::Exit();
return true;
}
Confira se estб de acordo com o que vocк fez!
Obrigado, й algo bem bбsico mesmo, mas pode ajudar quem tem uma certa dificuldade!
Abraзo!