[Tutorial] Como Criar um GameMode do 0
#1

Bom, Olб Pessoal. Como eu estava sem nada para fazer resolvi criar meu primeiro tutorial, Claramente dedicado aos mais novatos. Este tutorial, irб clarificar como funciona tal funзгo, o que й tal coisa e ensinando a criar comandos.

O seguinte tutorial conta com as seguintes caracterнsticas :

- Sistema de login/registro
- Sistema de Administraзгo
- TextDraw's
- Criando duelos.
- Criando pickup's.


Lembre-se, isto й apenas o ponta pй inicial para sua longa jornada criando o seu gamemode ao seu estilo.



Код:
////////////////////////////////////////////////////////////////////////////////
//
//
//
//            >>>>     Tutorial Criado por leonardo1434
//
//       >>>>     Acesse meu blog para mais informaзхes: http://leonardo1434.blogspot.com.br
//     >>>   Tutorial Sobre Criaзгo de GameModes <<<
//
//
/////////////////////////////////////////////////////////////////////////////////



/*
Formatos da string:

%b	 Numero Bнnario
%c   Caracter
%d   Nъmeros
%f   Floats - Numeros quebrados.
%i	 Inteiros.
%s   Insere uma string, podendo contas numeros,letras,inteiros e etc.
%x   Insere numeros em Hex.
%%   Insere a porcentagem.

Zamaroth Editor 1.0 ( Criador de textdraw's, bem ъtil )

Ao criar um textdraw lembre-se,

Textdraw's para todos >>> [URL="https://sampwiki.blast.hk/wiki/TextDrawCreate"]https://sampwiki.blast.hk/wiki/TextDrawCreate[/URL]

Textdraw bem ъtil para a criaзгode textdraw's visнveis para todos, podendo cria-las para tambйm para cada player, porйm tem necessidade de ser destruнda ao disconnect.

Textdraw's para cada player >>> [URL="https://sampwiki.blast.hk/wiki/CreatePlayerTextDraw"]https://sampwiki.blast.hk/wiki/CreatePlayerTextDraw[/URL]

Bom, estб textdraw й bem ъtil criando uma textdraw para cada player e tambйm sem a necessidade de destruir ao player disconectar.

MAX_PLAYERS  valor 500 slots isso terб um slot para cada jogador, possivelmente ligado , para que vocк saiba os dados para um jogador nгo irб interferir com os dados para um outro jogador. (by Schocc)


*/

// Includes
#include <a_samp>
#include <SII>
#include <zcmd>
#include <sscanf2>

// Definiзхes do id da dialog.
#define DIALOG_REGISTRO 5555
#define DIALOG_LOGAR 6666
#define DIALOG_BOX 7777
#define DIALOG_BAN 8888

// Definiзхes opcionais.
#define chatkill // mostra quem matou e a causa da morte, Caso nгo queira isto, Apenas colocar comentar, ficando assim: //#define chatkill
#define Times // Deixei a opзгo de definir os times ou nгo fica a seu gosto, Caso nгo, modificar para: //#define Times.
//#define comswitch //  Estб opзгo й apenas para mostrar como funciona o switch - Estб comentada pois, Na minha Opniзгo аs vezes utilizando pode occorer uma confunsгo, caso queira. apenas descomentar.
#define semswitch // Estб opзгo й apenas para mostrar como funciona o switch. Caso nгo queira,modificar para: //#define armas
#define armas // Bom, Estб funзгo й para caso queira dar armas para ambos os times, Caso nгo queira,modificar para: //#define armas
#define mensagenss // Irб mostrar as mensagens ao player se desconectar. Caso nгo queira,modificar para: //#define mensagenss
#define status // Irб mostrar o stats de cada jogador em uma textdraw prуpria, Matou & Mortes. Caso nгo queira,modificar para: //#define status
#define pastadesalvamento "Contas3/%s.ini" // modificar a seu gosto, estб й a pasta onde serб salvo as contas.
#define pastadebanimento "Contas3/Banidos%s.ini" // modificar a seu gosto, estб й a pasta onde serб salvo os banidos.
#define skintime0 167 // Time 0, mudar a seu gosto.
#define skintime1 217 // Time 1, mudar a seu gosto.
//#define statsatual // Bom, Estб funзгo irб atualizar o stats mais rбpido, ao invйs de sу atualiza-lo no onplayerdisconnect. Vai atualia-la a todo estante. 

// Nomes do Times.
#define NomeDoTime0 0 // Apenas Modificar б seu gosto.
#define NomeDoTime1 1 // Apenas Modificar б seu gosto.

// Cores.
#define amarelo 0xFFFF00AA // Cor do time 0.
#define azul 0x33CCFFAA // Cor do time 1

// Bom veja aqui, Estamos trabalhando com enum's,Traduзгo de enum й enumerator, Bem semelhante a array "new",Porйm й uma constante.
enum pInfo
{
    pSenha,
    pScore,
    pDinheiro,
    pAdmin,
    pMata,
    pMortes,
    pVip,
    pAvisos,
}
new PlayerInfo[MAX_PLAYERS][pInfo]; // Estб funзгo й basicamente criando um array Para todos os jogadores e ligando com o enum pInfo, Assim podendo ser usado para acessar/inserir dados nas vбriaveis.
// Lembre-se enum's nгo sao vбriaveis,Apenas sгo atribuнdas as vбriaveis.



new bool:tanox1[MAX_PLAYERS]; // Estб var vai setar ele no x1. jogador no x1 ou nгo !
// Pode fazer sem a bool? Sim ! Apenas setar  a var para ambos os playerid !
new x1 = 0; // Estб var irб contar quantos tem no x1.

new times[MAX_PLAYERS]; // Bom, Eu nгo adicionei estб Var ao enum, Poнs muitos novatos poderiam confundir, Estб funзгo й para armazenar os Times.

// TextDraw's
new PlayerText:matou[MAX_PLAYERS]; // Textdraw para cada jogador.
new PlayerText:morreu[MAX_PLAYERS];// Textdraw para cada jogador.
new PlayerText:ping[MAX_PLAYERS];// Textdraw para cada jogador.

// Pickups, Bom iremos criar picukups й muito dнficil ? Nгo.

new pickupvida; // Podemos usar assim, que й apenas um var.
// new tele[50]; ou assim, Tornando-se 50 array's. ex: tele[0],tele[1] e assim pod diante.

//forwards
forward atualizartext(playerid); // forward й uma regra da lнnguagem pawn.(Nunca entendi muito bom porque tem estб regra D:)
forward stats(playerid); // Mesma coisa citada acima.

main() // Isto irб printar no console.
{
	print("\n----------------------------------");
	print(" Qualquer titulo que desejas");
	print("----------------------------------\n");
}


public OnGameModeInit()
{
	// Cordenadas aleбtorias, Modifica-las a seu gosto.
	#if defined Times
	AddPlayerClass(0,1234,1234,25,1234,0,0,0,0,-1,-1); // Classe/time 0, Sempre comeзarб do 0.
    AddPlayerClass(1,1234,1234,25,1234,0,0,0,0,-1,-1); // Classe/time 1 , e assim por diante.
    #endif
    AddPlayerClass(0,1234,1234,25,1234,0,0,0,0,-1,-1); // Caso nгo seja definido os Times, Sempre deixar no mнnimo um addplayerclss, se nгo irб bugar.

    pickupvida = CreatePickup(1240, 2, 1234,1234,2); // aqui, Defindo a pickup vida.
	return 1;
}
public OnGameModeExit()
{
	return 1;
}


public OnPlayerRequestClass(playerid, classid) // Estб funзгo й chamada quando o jogador estб a selecionar os skins.
{
    SetPlayerInterior(playerid,14); // Interior
    SetPlayerPos(playerid,258.4893,-41.4008,1002.0234);// Posiзгo do jogador
    SetPlayerFacingAngle(playerid, 270.0);//Posiзгo do вngulo
    SetPlayerCameraPos(playerid,256.0815,-43.0475,1004.0234);// Posiзгo da camera
    SetPlayerCameraLookAt(playerid,258.4893,-41.4008,1002.0234);// Posiзгo da camera
	#if defined Times
	if(classid == 0) // Classe/time 0
    {
       GameTextForPlayer(playerid,"~y~Classe/Time 0",3000,3); // Isso farб com que a mensagem tenha letras grandes.
    }
    if(classid == 1) // Classe/time 1
    {
       GameTextForPlayer(playerid,"~b~Classe/Time 1",3000,3); // Isso farб com que a mensagem tenha letras grandes.
    }
    #endif
	return 1;
}

public OnPlayerConnect(playerid)
{
    if (fexist(contas(playerid)))//Caso a conta exista mostra isso.
    {
        ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD,"Logar","Digite sua senha abaixo para efetuar login.","Logar","Sair");
    }
    else//Caso nгo exista mostra isso.
    {
        ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD,"Registraзгo","Digite sua senha abaixo para se registrar","Registrar","Sair");
    }
    #if defined status
    matou[playerid] = CreatePlayerTextDraw(playerid,496.000000, 99.000000, "Matou:"); // Cria a textdraw
	PlayerTextDrawBackgroundColor(playerid,matou[playerid], 255);//Texto de fundo
	PlayerTextDrawFont(playerid,matou[playerid], 1);//Fonte
	PlayerTextDrawLetterSize(playerid,matou[playerid], 0.500000, 1.000000);//Tamanho da letra
	PlayerTextDrawColor(playerid,matou[playerid], 65535); //Cor
	PlayerTextDrawSetOutline(playerid,matou[playerid], 0);//Fora da linha
	PlayerTextDrawSetProportional(playerid,matou[playerid], 1);//Proporзгo
	PlayerTextDrawSetShadow(playerid,matou[playerid], 0);//Escuridгo.

	morreu[playerid] = CreatePlayerTextDraw(playerid,496.000000, 110.000000, "Mortes:");
	PlayerTextDrawBackgroundColor(playerid,morreu[playerid], 255);
	PlayerTextDrawFont(playerid,morreu[playerid], 1);
	PlayerTextDrawLetterSize(playerid,morreu[playerid], 0.500000, 1.000000);
	PlayerTextDrawColor(playerid,morreu[playerid], 65535);
	PlayerTextDrawSetOutline(playerid,morreu[playerid], 0);
	PlayerTextDrawSetProportional(playerid,morreu[playerid], 1);
	PlayerTextDrawSetShadow(playerid,matou[playerid], 0);

    ping[playerid] = CreatePlayerTextDraw(playerid,5.000000, 432.000000, "Ping:");
	PlayerTextDrawBackgroundColor(playerid,ping[playerid], 255);
	PlayerTextDrawFont(playerid,ping[playerid], 1);
	PlayerTextDrawLetterSize(playerid,ping[playerid], 0.500000, 1.000000);
	PlayerTextDrawColor(playerid,ping[playerid],  -65281);
	PlayerTextDrawSetOutline(playerid,ping[playerid], 0);
	PlayerTextDrawSetProportional(playerid,ping[playerid], 1);
	PlayerTextDrawSetShadow(playerid,ping[playerid], 0);

	new tempo[MAX_PLAYERS]; // Criando uma var para todos os players.
	tempo[playerid] = SetTimer("atualizartext",1000,true); // Usando a var para criar um timer para cada player, Assim a cada 1 segundo serб atualizado.
	#endif

	//Bom Aqui comeзar o Sistema de Banimento, Fiz o MБXIMO que pude para deixa bem direto & claro !
    new nome[MAX_PLAYER_NAME],Ip[30],lol[128],Hora, Minuto, Segundo, Dia, Mes, Ano,arquivo[128],administrador[24], motivoban[128];
    GetPlayerName(playerid, nome, sizeof(nome));//formata o nome
 	GetPlayerIp(playerid, Ip, sizeof(Ip));//formata o ip.
 	format(arquivo, sizeof(arquivo), pastadebanimento, nome);//formata a pasta com o nome
	if(fexist(arquivo))//abre a pasta, checa se o nome do player estб banido.
	{//vai ler tudo isso.
		if(INI_Open(arquivo))//Abre o arquivo.
		{
		  INI_ReadString(administrador, "Admin");// Lendo a string...
		  INI_ReadString(motivoban, "MotivoBan");// Lendo a string...
		  Dia = INI_ReadInt("Dia");// Lendo as numeros.
		  Mes = INI_ReadInt("Mes");// Lendo as numeros.
		  Ano = INI_ReadInt("Ano");// Lendo as numeros.
		  Hora = INI_ReadInt("Hora");// Lendo as numeros
		  Minuto = INI_ReadInt("Minuto");// Lendo a string...
		  Segundo = INI_ReadInt("Segundo");// Lendo as numeros  // Aqui embaixo, Formatando a string.
          format(lol, sizeof(lol), "[SERVER] Seu nick estб banido.\n\
		                            [SERVER]: Admin: %s | Data: %d/%d/%d | Hora: %d:%d:%d | Motivo: %s ]", administrador, Dia, Mes, Ano, Hora, Minuto, Segundo, motivoban);
          ShowPlayerDialog( playerid, DIALOG_BAN, DIALOG_STYLE_MSGBOX, "Vocк estб banido !", lol, "Ok...", "");//mostrando a dialog para o player
		  INI_Close();//fecha poнs estava lendo e nгo inserindo.
		}
		Kick(playerid);//kicka o playerid banido.
 	}
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    if(INI_Open(contas(playerid))) // Funзгo que abre a stock contas, estб localizada ao fim do gm.
	{
	  INI_WriteInt("Admin",PlayerInfo[playerid][pAdmin]); // Estб inserindo as informaзхes do jogador.
	  INI_WriteInt("Vip",PlayerInfo[playerid][pVip]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Score",PlayerInfo[playerid][pScore]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Mata",PlayerInfo[playerid][pMata]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Mortes",PlayerInfo[playerid][pMortes]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Avisos",PlayerInfo[playerid][pAvisos]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Dinheiro",GetPlayerMoney(playerid)); // Estб inserindo as informaзхes do jogador.


      INI_Save(); // Salvando as informaзхes do jogador
      INI_Close(); // Fechando as informaзхes do jogador
    }
	#if defined mensagenss
    new mensagens[70],nome[MAX_PLAYER_NAME];
    GetPlayerName(playerid, nome, sizeof(nome));
    switch(reason) // Como o swicth foi jб explicado, й apenas uma transiзгo entre definiзхes.
    {
        case 0: format(mensagens, sizeof(mensagens), "%s Saiu do servidor. (Problema de Conexгo)", nome);
        case 1: format(mensagens, sizeof(mensagens), "%s Saiu do servidor. (Saindo/Saiu)", nome);
        case 2: format(mensagens, sizeof(mensagens), "%s Saiu do servidor. (Kickado / Banido)", nome);
    }
    #endif
    return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_REGISTRO:
        {
            if (!response) return Kick(playerid); // Caso ele clice em Sair.
            if (response)
            {
                if(!strlen(inputtext)) {//Caso ele nгo tenha digitado nada. mostra а dialog
                ShowPlayerDialog(playerid, DIALOG_REGISTRO, DIALOG_STYLE_PASSWORD, "Registrando...","Vocк digitou uma senha invбlida, Por Favor digitar а senha !","Registro","Sair");
                }

                if(INI_Open(contas(playerid))) {
                INI_WriteString("Senha",inputtext); // Pegando o que player digitou na dialog.
                INI_WriteInt("Admin",0); // Inserindo as informaзхes iniciais
                INI_WriteInt("Vip",0);// Inserindo as informaзхes iniciais
                INI_WriteInt("Score",0);// Inserindo as informaзхes iniciais
                INI_WriteInt("Mata",0);// Inserindo as informaзхes iniciais
                INI_WriteInt("Mortes",0);// Inserindo as informaзхes iniciais
                INI_WriteInt("Avisos",0);// Inserindo as informaзхes iniciais
                INI_WriteInt("Dinheiro",0);// Inserindo as informaзхes iniciais

                INI_Save();//Salvando
                INI_Close();//Fechando
				// Ao se registrar vai mostrar estб dialog.
                ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD,"Logando...","Digitar sua senha abaixo para efetuar login.","Logar","Sair");
            }
        }
    }
        case DIALOG_LOGAR:
        {
            if (!response) return Kick (playerid); // Caso ele clice em Sair.
            if(response)
            {
                if(!strlen(inputtext)) {//Caso ele nгo tenha digitado nada
                ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logando...","Vocк digitou uma senha invбlida, Por Favor digitar а senha !","Logar","Sair");
                }

                if(INI_Open(contas(playerid))) {//Abrindo a pasta contas.
                INI_ReadString(PlayerInfo[playerid][pSenha],"Senha",30);// Lendo a senha que foi salva ao se registrar

                if(strcmp(inputtext,PlayerInfo[playerid][pSenha],false))//Caso erre a senha serб mostrada estб dialog.
				{
                  ShowPlayerDialog(playerid, DIALOG_LOGAR, DIALOG_STYLE_PASSWORD, "Logando...","Vocк digitou uma senha invбlida, Por Favor digitar а senha !","Logar","Sair");
                }
                else
				{
                  ResetPlayerMoney(playerid); // Reseta o dinheiro
                  PlayerInfo[playerid][pAdmin] = INI_ReadInt("Admin"); //Lendo o que foi inserido..
                  PlayerInfo[playerid][pVip] = INI_ReadInt("Vip");//Lendo o que foi inserido..
                  SetPlayerScore(playerid,INI_ReadInt("Score"));//Lendo o que foi inserido..
                  PlayerInfo[playerid][pMata] = INI_ReadInt("Mata");//Lendo o que foi inserido..
                  PlayerInfo[playerid][pMortes] = INI_ReadInt("Mortes");//Lendo o que foi inserido..
                  PlayerInfo[playerid][pAvisos] = INI_ReadInt("Avisos");//Lendo o que foi inserido..
                  GivePlayerMoney(playerid,INI_ReadInt( "Dinheiro"));//Lendo o que foi inserido..
                }

                INI_Close(); // Fecha, nгo precisa salvar, poнs apenas estб carregando o stats do jogador, e nгo adicionando/editando.
                }
            }
        }
    }
    return 1;
}
public OnPlayerDeath(playerid, killerid, reason) // Ao jogador morre, estб public й chamada.
{
	#if defined chatkill
    SendDeathMessage(killerid, playerid, reason); // mostra quem matou e a causa da morte.

    #endif

    if(killerid != INVALID_PLAYER_ID) // Se o id й valido.
    {
        PlayerInfo[killerid][pMata]++; // Ira aumentar os kills ao matar alguйm.
        PlayerInfo[killerid][pScore]++; // Ira aumentar o Score ao matar alguйm
        SetPlayerScore(killerid, PlayerInfo[killerid][pScore]); // Vai setar o score que foi aumentado.

        GivePlayerMoney(killerid, 100); // Vai Dar o dinheiro a quem matou.
        // PlayerInfo[killerid][pDinheiro] +=100   <<< Poderia ser usado assim tбmbem, porйm necessitбria de uma atualizaзгo constante do stats.
    }
    PlayerInfo[playerid][pMortes]++; // Ira aumentar as mortes ao morrer.

    if(tanox1[playerid] ==  true) // se ta tanox1 й 1 e tambйm й o jogador que matou, irб executar a funзгo abaixo.
    {
       PlayerInfo[killerid][pMata] = false; // setando a var como falsa, assim nгo contando no stats os kills.
       PlayerInfo[killerid][pScore] = false; // setando a var como falsa, assim nгo contando no stats o score.
       PlayerInfo[playerid][pMortes] = false; // setando a var como falsa, assim nгo contando no stats as mortes.
       SpawnPlayer(playerid); // Ao morrer vai dar respawn.
	   SpawnPlayer(killerid);// Ao matarr vai dar respawn.
	   tanox1[playerid] = false;// Setando a bool como false, assim dizendo que nгo estб mais no x1.
       tanox1[killerid] = false; // Setando a bool como false, assim dizendo que nгo estб mais no x1.
	   x1 = 0; // setando a var x1 para 0.
	   GivePlayerMoney(killerid,10000); // Dando dinheiro para o que matou.
	   new string[60],nome[MAX_PLAYER_NAME],nomevitima[MAX_PLAYER_NAME];
	   GetPlayerName(killerid,nome,sizeof(nome)); // formatando o nome de quem matou
	   GetPlayerName(playerid,nomevitima,sizeof(nomevitima)); // formatando o nome de quem morreu
	   format(string, sizeof(string),"%s Matou %s no X1 !",nome, nomevitima);//formatando a string
	   SendClientMessageToAll(-1,string);// enviando para todos a string.
    }
    return 1;
}
public OnPlayerSpawn(playerid)
{
  SetPlayerInterior(playerid,0);
  #if defined comswitch
  switch(times[playerid]) // O que й um switch ? й basicamente uma transaзгo entre definiзхes.
  {
    case 0: // Classe/Time 0
    {
      SetPlayerPos(playerid,1234,1234,10); // Aqui й para onde o time 0 serб teleportado, ao dar spawn.
      #if defined armas
      GivePlayerWeapon(playerid,4,1); // Estб funзгo irб dar um knife para todos os jogadores do time 0.
      GivePlayerWeapon(playerid,24,1000); // Estб funзгo ira dar uma desert eagle para todos os jogadores do time 0 com 1000 balas.
      GivePlayerWeapon(playerid,26,1000); // Estб funзгo ira dar uma sawn off para todos os jogadores do time 1 com 1000 balas.
      #endif
      SetPlayerSkin(playerid,skintime0);
      SetPlayerColor(playerid,amarelo); // Vai definir a cor do time 0 para amarelo.
      SendClientMessage(playerid,amarelo,"Vocк й do time 0!"); // Esta mensagem serб enviada a todos que derem Spawn e somente se, Forйm do time 0.
    }
    case 1: // Classe/Time 1
    {
      SetPlayerPos(playerid,1234,1234,10); // Aqui й para onde o time 1 serб teleportado, ao dar spawn.
      #if defined armas
      GivePlayerWeapon(playerid,4,1); // Estб funзгo irб dar um knife para todos os jogadores do time 1.
      GivePlayerWeapon(playerid,24,1000); // Estб funзгo ira dar uma desert eagle para todos os jogadores do time 1 com 1000 balas.
      GivePlayerWeapon(playerid,26,1000); // Estб funзгo ira dar uma sawn off para todos os jogadores do time 1 com 1000 balas.
      #endif
      SetPlayerSkin(playerid,skintime1);// seta a skin do time.
      SetPlayerColor(playerid,azul); // set a cor do time.
      SendClientMessage(playerid,azul,"Vocк й do time 1! "); // Esta mensagem serб enviada a todos que derem Spawn e somente se, Forйm do time 1.
    }
  }
  #endif
  #if defined semswitch
  if(times[playerid] == NomeDoTime0) // classe/Time 0
  {
      SetPlayerPos(playerid,1234,1234,10); // Aqui й para onde o time 0 serб teleportado, ao dar spawn.
	  #if defined armas
      GivePlayerWeapon(playerid,4,1); // Estб funзгo irб dar um knife para todos os jogadores do time 0.
      GivePlayerWeapon(playerid,24,1000); // Estб funзгo ira dar uma desert eagle para todos os jogadores do time 0 com 1000 balas.
      GivePlayerWeapon(playerid,26,1000); // Estб funзгo ira dar uma sawn off para todos os jogadores do time 1 com 1000 balas.
      #endif
      SetPlayerSkin(playerid,skintime0);// seta a skin do time.
      SetPlayerColor(playerid,amarelo); // Vai definir a cor do time 0 para amarelo.
      SendClientMessage(playerid,amarelo,"Vocк й do time 0!"); // Esta mensagem serб enviada a todos que derem Spawn e somente se, Forйm do time 0.

  }
  else if(times[playerid] == NomeDoTime1) // Classe/ Time 0
  {
      SetPlayerPos(playerid,1234,1234,10); // Aqui й para onde o time 1 serб teleportado, ao dar spawn.
      #if defined armas
      GivePlayerWeapon(playerid,4,1); // Estб funзгo irб dar um knife para todos os jogadores do time 1.
      GivePlayerWeapon(playerid,24,1000); // Estб funзгo ira dar uma desert eagle para todos os jogadores do time 1 com 1000 balas.
      GivePlayerWeapon(playerid,26,1000); // Estб funзгo ira dar uma sawn off para todos os jogadores do time 1 com 1000 balas.
      #endif
      SetPlayerSkin(playerid,skintime1);// seta a skin do time.
      SetPlayerColor(playerid,azul); // Vai definir a cor do time 1 para azul
      SendClientMessage(playerid,azul,"Vocк й do time 1! "); // Esta mensagem serб enviada a todos que derem Spawn e somente se, Forйm do time 1.
  }
  #endif
  #if defined status
  PlayerTextDrawShow(playerid, matou[playerid]); // mostrando a textdraw ao dar spawn
  PlayerTextDrawShow(playerid, morreu[playerid]); // mostrando a textdraw ao dar spawn
  PlayerTextDrawShow(playerid, ping[playerid]); // mostrando a textdraw ao dar spawn
  #endif
  #if defined statsatual
  new tempo2[MAX_PLAYERS];
  tempo2[playerid] = SetTimer("stats",5000,true); // Usando a var para criar um timer para cada player, Assim a cada 5 segundo serб atualizado.
  #endif
}

public OnPlayerPickUpPickup(playerid, pickupid) // Bom, ao passa sobre o pickup estб public й chamada.
{
    if(pickupid == pickupvida) // Comparando, compara se o pickup й igual a var que nomeamos no нnicio.
	{
	  new Float:Vida;
	  GetPlayerHealth(playerid,Vida); // Pega a vida que ele estб no momento.
	  SetPlayerHealth(playerid,Vida +20); // E adicionar +20 de vida.
    }
    return 1;
}


// COMANDOS

CMD:daradmin(playerid,params[])
{
   new ID,Level,string[128],nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"ui",ID,Level)) return SendClientMessage(playerid,-1,"/daradmin [ID] [LEVEL]!"); // Caso o jogador digite parametros errados, irб aparecer estб mensagem.
   if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Prevenзгo, Caso um admin usar seus poderes em outro admin, й necessбrio que seu level seja maior ou igual ao da vнtima,Caso contrбrio retornarб a mensagem
   if (!IsPlayerConnected(ID)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! "); // Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   if ( Level < 0 || Level > 5 )  return SendClientMessage(playerid,-1,"Admin level entre 0 - 5 "); // Compara os leveis, Caso seja menor que 0 ou maior que 5 retorna a mensagem
   PlayerInfo[ID][pAdmin] = Level; // Setando o level da vнtima ao Level escolhido pelo playerid.
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(ID,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   format(string,sizeof(string),"Administrador:%s setou como admin %s level %d",nome,nomevitima,PlayerInfo[ID][pAdmin]); // Formatando o Texto, e mostrando quem deu,quem recebeu,
   SendClientMessageToAll(-1,string); // Enviando a string.
   return 1;
}
CMD:pspawn(playerid,params[])
{
   new ID,nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYERS];
   if(PlayerInfo[playerid][pAdmin] < 1 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!");// Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"u",ID)) return SendClientMessage(playerid,-1,"/pspawn [ID/NOME]");// Caso o jogador digite parametros errados, irб aparecer estб mensagem.
   if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!");// Prevenзгo, Caso um admin usar seus poderes em outro admin, й necessбrio que seu level seja maior ou igual ao da vнtima,Caso contrбrio retornarб a mensagem
   if (!IsPlayerConnected(playerid)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! ");// Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   SpawnPlayer(ID);//da spawn na vнtima
   new String[35];
   GetPlayerName(ID,nomevitima,sizeof(nomevitima));//formata o nome
   format( String, sizeof String, "%s deu spawn em %s ",nome,nomevitima);//formata o texto
   SendClientMessage(ID, -1, String );//envia pra todos.
   return 1;
}
CMD:darvip(playerid,params[])
{
   new ID,Level,string[70],nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"ui",ID,Level)) return SendClientMessage(playerid,-1,"/darvip [ID] [LEVEL]!"); // Caso o jogador digite parametros errados, irб aparecer estб mensagem.
   if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Prevenзгo, Caso um admin usar seus poderes em outro admin, й necessбrio que seu level seja maior ou igual ao da vнtima,Caso contrбrio retornarб a mensagem
   if (!IsPlayerConnected(ID)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! "); // Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   if ( Level < 0 || Level > 3 )  return SendClientMessage(playerid,-1,"Vip level entre 0 - 3 "); // Compara os leveis, Caso seja menor que 0 ou maior que 5 retorna a mensagem
   PlayerInfo[ID][pVip] = Level; // Setando o level da vнtima ao Level escolhido pelo playerid.
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(ID,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   format(string,sizeof(string),"Administrador:%s setou como Vip %s level %d",nome,nomevitima,PlayerInfo[ID][pVip]); // Formatando o Texto, e mostrando quem deu,quem recebeu.
   SendClientMessageToAll(-1,string); // Enviando a string.
   return 1;
}
CMD:x1(playerid,params[])
{
   new nome[MAX_PLAYERS],string[27];
   if(sscanf(params,"")) return SendClientMessage(playerid,-1,"/x1"); // Caso o jogador digite parametros errados, irб aparecer estб mensagem.
   x1++;
   if(x1 == 2) return SendClientMessage(playerid,-1,"Jб tem 2 no x1."); // Caso tenha 2 pessaos, vai retornar estб mensagem.
   if(tanox1[playerid] == true) return SendClientMessage(playerid,-1,"Vocк jб esta no x1"); // Caso ele jб esteja no x1, assim evitando spam.
   SetPlayerPos(playerid,1234,1234,1234); // Colocar aqui as cordenadas do x1.
   format(string,sizeof(string),"%s Entrou no x1 ! ",nome);//formatando a mensagem
   SendClientMessageToAll(-1,string); //enviando a mensagem para todos.
   tanox1[playerid] = true; //setando a var para o playerid.
   return 1;
}
CMD:sairx1(playerid,params[])
{
   new nome[MAX_PLAYERS],string[37];
   if(sscanf(params,"")) return SendClientMessage(playerid,-1,"/sairx1"); // Caso o jogador digite parametros errados, irб aparecer estб mensagem.
   if(x1 == 2) return SendClientMessage(playerid,-1,"Jб tem 2 no x1."); // Caso tenha 2 pessaos, vai retornar estб mensagem.
   format(string,sizeof(string),"%s Saiu do X1 ! ",nome);//formatando a mensagem
   SendClientMessageToAll(-1,string); //enviando a mensagem para todos.
   tanox1[playerid] = false; //setando a var para o playerid.
   SpawnPlayer(playerid);
   return 1;
}
CMD:avisar(playerid,params[])
{
   new ID,string[128],nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 3 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"us[128]",ID,string)) return SendClientMessage(playerid,-1,"/avisar [ID] [MOTIVO]!"); // Caso o jogador digite parametros errados, irб aparecer estб mensagem.
   if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Prevenзгo, Caso um admin usar seus poderes em outro admin, й necessбrio que seu level seja maior ou igual ao da vнtima,Caso contrбrio retornarб a mensagem
   if (!IsPlayerConnected(ID)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! "); // Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   PlayerInfo[ID][pAvisos]++; // Setando o level da vнtima ao Level escolhido pelo playerid.
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(ID,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   format(string,sizeof(string),"Administrador:%s Avisou %s Motivo: %s",nome,nomevitima,string); // Formatando o Texto, e mostrando quem deu,quem recebeu.
   SendClientMessageToAll(-1,string); // Enviando a string.
   format(string,sizeof(string),"Agora vocк tem %d avisos ! 3 avisos = KICK !",PlayerInfo[ID][pAvisos]); // Formatando o texto !
   SendClientMessage(playerid,-1,string); // Enviando a string.
   if(PlayerInfo[ID][pAvisos] == 3)
   {
   format(string,sizeof(string),"%s foi kickado por ter 3 avisos",nomevitima);
   SendClientMessageToAll(-1,string);
   PlayerInfo[ID][pAvisos] = 0;
   Kick(ID);
   }
   return 1;
}
CMD:stats(playerid,params[])
{
  new string[70],id,ping2[MAX_PLAYERS],nome[MAX_PLAYERS],score2[MAX_PLAYERS];
  ping2[id] = GetPlayerPing(id); // geta o ping.
  score2[id] = GetPlayerScore(id);//geta o score
  GetPlayerName(id, nome, sizeof(nome));//formata o nome
  format(string, sizeof(string), "Nome: %s\nMata %d - Mortes %d - Score: %d  - Ping: %d", nome,PlayerInfo[id][pMata],PlayerInfo[id][pMortes],score2[id],ping2[id]);//formata o texto
  ShowPlayerDialog(playerid, 4000, DIALOG_STYLE_MSGBOX,"Status",string,"Ok !","");//mostra string em dialog.
  return 1;
}
CMD:setaviso(playerid,params[])
{
   new ID,Aviso,string[128],nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"ui",ID,Aviso)) return SendClientMessage(playerid,-1,"/setaviso [ID] [AVISOS]!"); // Caso o jogador digite parametros errados, irб aparecer estб mensagem.
   if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Prevenзгo, Caso um admin usar seus poderes em outro admin, й necessбrio que seu level seja maior ou igual ao da vнtima,Caso contrбrio retornarб a mensagem
   if (!IsPlayerConnected(ID)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! "); // Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   if ( Aviso < 0 || Aviso > 2 )  return SendClientMessage(playerid,-1,"Avisos entre 0 - 2"); // Compara os warns, Caso seja menor que 0 ou maior que 2 retorna a mensagem
   PlayerInfo[ID][pAvisos] = Aviso; // Setando os avisos da vнtima aos avisos escolhidos pelo playerid.
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(ID,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   format(string,sizeof(string),"Administrador:%s setou o numero de avisos de %s para %d",nome,nomevitima,PlayerInfo[ID][pAvisos]); // Formatando o Texto, e mostrando quem deu,quem recebeu.
   SendClientMessageToAll(-1,string); // Enviando a string.
   return 1;
}
CMD:setmata(playerid,params[])
{
   new ID,mata,string[128],nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!");
   if(sscanf(params,"ui",ID,mata)) return SendClientMessage(playerid,-1,"/setmata [ID/NOME] [NUMERO DE KILLS]");// Caso o jogador digite parametros errados, irб aparecer estб mensagem.
   if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!");// Prevenзгo, Caso um admin usar seus poderes em outro admin, й necessбrio que seu level seja maior ou igual ao da vнtima,Caso contrбrio retornarб a mensagem
   if (!IsPlayerConnected(ID)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! ");// Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   if ( mata < 0 || mata > 9999999 )  return SendClientMessage(playerid,-1,"Matar de  0 - 99999999 ");// Compara os mata, Caso seja menor que 0 ou maior que 9999999 retorna a mensagem
   PlayerInfo[ID][pMata] = mata;// Setando o mata da vнtima ao mata escolhido pelo playerid.
   GetPlayerName(playerid,nome,sizeof(nome));// Formatando o nome do playerid
   GetPlayerName(ID,nomevitima,sizeof(nomevitima));// Formatando o nome da vнtima
   format(string,sizeof(string),"%s setou para %s total de kills %d",nome,nomevitima,PlayerInfo[ID][pMata]);// Formatando o Texto, e mostrando quem deu,quem recebeu.
   SendClientMessageToAll(-1,string);//enviando para todos
   return 1;
}
CMD:setmortes(playerid,params[])
{
   new ID,Mortes,string[70],nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!");
   if(sscanf(params,"ui",ID,Mortes)) return SendClientMessage(playerid,-1,"/setmortes [ID/NOME] [NUMERO DE MORTES]!");
   if(PlayerInfo[playerid][pAdmin] < PlayerInfo[playerid][pAdmin]) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!");
   if (!IsPlayerConnected(ID)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! ");// Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   if ( Mortes < 0 || Mortes > 9999999 )  return SendClientMessage(playerid,-1,"Mortes 0 - 9999999 ");// Compara os mata, Caso seja menor que 0 ou maior que 9999999 retorna a mensagem
   PlayerInfo[ID][pMortes] = Mortes;// Setando o mortes da vнtima ao mortes escolhido pelo playerid.
   GetPlayerName(playerid,nome,sizeof(nome));// Formatando o nome do playerid
   GetPlayerName(ID,nomevitima,sizeof(nomevitima));// Formatando o nome da vнtima
   format(string,sizeof(string),"%s Setou para %s o total de mortes %d",nome,nomevitima,PlayerInfo[ID][pMortes]); // Formatando o Texto, e mostrando quem deu,quem recebeu.
   SendClientMessageToAll(-1,string);//enviando para todos
   return 1;
}
CMD:ir(playerid,params[])
{
   new id,Float:x,Float:y,Float:z,nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME],string[60];
   if(PlayerInfo[playerid][pAdmin] < 1 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 1 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"u",id)) return SendClientMessage(playerid,-1,"/ir [ID] ");  // Caso o jogador digite parametros errados, irб aparecer estб messagem.
   if (!IsPlayerConnected(id)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! "); // Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   GetPlayerPos(id,x,y,z); // Pega a posiзгo da vнtima.
   SetPlayerPos(playerid,x,y,z); // Seta a posiзгo do playerid, atй a vнtima.
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(id,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   for(new i=0;i<MAX_PLAYERS;i++) // Loop para mandar a mensagem para todos os administradores.
   {
      if (IsPlayerConnected(i)) // Checando se o jogador estб conectado, assim o loop serб mais rбpido.
      {
        if(PlayerInfo[i][pAdmin] >= 1) // Checa se o jogador tem o level maior ou igual а 1.
        {
          format(string,sizeof(string),"Administrador:%s se teleportou atй %s",nome,nomevitima); // Formatando o Texto, e mostrando quem deu,quem recebeu.
          SendClientMessage(i,-1,string); // Caso seja verdade que й maior ou igual а 1, irб enviar a mensagem.
        }
	  }
   }
   return 1;
}
CMD:pegar(playerid,params[])
{
   new id,Float:x,Float:y,Float:z,nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME],string[60];
   if(PlayerInfo[playerid][pAdmin] < 1 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 1 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"u",id)) return SendClientMessage(playerid,-1,"/ir [ID] ");  // Caso o jogador digite parametros errados, irб aparecer estб messagem.
   if (!IsPlayerConnected(id)) return SendClientMessage(playerid,-1,"Jogador nгo estб conectado! "); // Checa se a vнtima estб conectada, Caso contrбrio retorna a mensagem
   GetPlayerPos(playerid,x,y,z); // Pega a sua posiзгo
   SetPlayerPos(id,x,y,z); // Seta a posiзгo do da vнtima atй vocк
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(id,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   for(new i=0;i<MAX_PLAYERS;i++) // Loop para mandar a mensagem para todos os administradores.
   {
      if (IsPlayerConnected(i)) // Checando se o jogador estб conectado, assim o loop serб mais rбpido.
      {
        if(PlayerInfo[i][pAdmin] >= 1) // Checa se o jogador tem o level maior ou igual а 1.
        {
          format(string,sizeof(string),"Administrador:%s Puxou %s",nome,nomevitima); // Formatando o Texto, e mostrando quem deu,quem recebeu.
          SendClientMessage(i,-1,string); // Caso seja verdade que й maior ou igual а 1, irб enviar a mensagem.
        }
	  }
   }
   return 1;
}
CMD:tapa(playerid,params[])
{
   new id,Float:x,Float:y,Float:z,nomevitima[MAX_PLAYER_NAME],nome[MAX_PLAYER_NAME],string[60];
   if(PlayerInfo[playerid][pAdmin] < 1 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 1 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"u",id)) return SendClientMessage(playerid,-1,"/tapa [ID] ");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerPos(id,x,y,z); // Pega a posiзгo da vнtima
   SetPlayerPos(id,x,y,z+10); // Seta a posiзгo da vнtima um pouco alta.
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(id,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   format(string,sizeof(string),"Administrador:%s Deu uma tapa em %s !",nome,nomevitima); // Formatando o Texto, e mostrando quem deu,quem recebeu.
   SendClientMessageToAll(-1,string); // Envia a string para todos, ao invйs de somente admins.
   return 1;
}
CMD:dardinheiro(playerid,params[]) // Estб funзгo irб acrescentar a quantidade atual de dinheiro
{
   new id,dinheiro,nome[MAX_PLAYER_NAME],string[60],nomevitima[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"ui",id,dinheiro)) return SendClientMessage(playerid,-1,"/dardinheiro [id] [quantidade] ");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerMoney(id); // Pega a quantidade de dinheiro da vнtima
   GivePlayerMoney(id,dinheiro); // Dб o dinheiro para a vнtima
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(playerid,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   format(string,sizeof(string),"Administrador:%s deu para %s a quantidade de cash: %i",nome,nomevitima,dinheiro);// Formatando o Texto, e mostrando quem deu,quem recebeu.
   SendClientMessageToAll(-1,string); // Envia a string para todos, ao invйs de somente admins.
   return 1;
}
CMD:resetardinheiro(playerid,params[]) // Estб funзгo irб resetar e dar o dinheiro escolhido.
{
   new id,dinheiro,nome[MAX_PLAYER_NAME],string[60],nomevitima[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"ui",id,dinheiro)) return SendClientMessage(playerid,-1,"/resetardinheiro [id] [quantidade] ");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
   ResetPlayerMoney(id); // Reseta o dinheiro ra vнtima
   GivePlayerMoney(id,dinheiro); // Dб o dinheiro para a vнtima
   GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do playerid
   GetPlayerName(playerid,nomevitima,sizeof(nomevitima)); // Formatando o nome da vнtima
   format(string,sizeof(string),"Administrador:%s deu para %s a quantidade de cash: %i",nome,nomevitima,dinheiro);// Formatando o Texto, e mostrando quem deu,quem recebeu.
   SendClientMessageToAll(-1,string); // Envia a string para todos, ao invйs de somente admins.
   return 1;
}
CMD:a(playerid,params[])
{
   new string[128],string2[128],nome[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] == 0 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja igual 0 e tambйm nгo sejam um rcon admin Retornar a mensagem.
   if(sscanf(params,"s[128]",string)) return SendClientMessage(playerid,-1,"/a [texto]  "); // Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerName(playerid,nome,sizeof(nome));//formata o nome do playerid
   for(new i=0;i<MAX_PLAYERS;i++)
   {
	 if(PlayerInfo[i][pAdmin] >= 1 ) // Vai mandar a mensagem para todos que tiverem o level maior ou igual a 1.
	 {
	 format(string2,sizeof(string2),"{F81414}%s: {FFFFFF}%s",nome,string);//formatando a sting.
	 SendClientMessage(i,-1,string2);//enviando-a para todos que sгo iguais ou maiores que o level 1.
	 }
   }
   return 1;
}
CMD:admins(playerid,params[])
{
   new string[128],nome[MAX_PLAYER_NAME],countando;
   if(PlayerInfo[playerid][pAdmin] >= 0 && !IsPlayerAdmin( playerid ) )
   if(sscanf(params,"")) return SendClientMessage(playerid,-1,"/admins"); // Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerName(playerid,nome,sizeof(nome));//formata o nome do playerid
   for(new i=0;i<MAX_PLAYERS;i++)
   {
	 if(PlayerInfo[i][pAdmin] >= 1 )// Vai pegar todos os que forem iguais ou superiores a o level 1..
	 {
	 countando++;
	 format(string,sizeof(string),"{F81414}%s - Level %i\n",nome,PlayerInfo[i][pAdmin]);//formatando a sting.
	 }
   }
   if(countando == 0)return ShowPlayerDialog( playerid, 1245, DIALOG_STYLE_MSGBOX, "Lista De Admins","Nenhum Admin online no momento!","Ok...", "");//Caso a array contando seja 0, ou seja, nгo tenha aumentado.significa que nгo tinha admin online, entгo retorna a dialog.
   ShowPlayerDialog( playerid, 1244, DIALOG_STYLE_MSGBOX, "Lista De Admins",string,"Ok...", "");//mostrando a dialog para o player caso tenha admins.
   return 1;
}
CMD:viplist(playerid,params[])
{
   new string[128],nome[MAX_PLAYER_NAME],countando;
   if(PlayerInfo[playerid][pAdmin] >= 0 && !IsPlayerAdmin( playerid ) )
   if(sscanf(params,"")) return SendClientMessage(playerid,-1,"/viplist"); // Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerName(playerid,nome,sizeof(nome));//formata o nome do playerid
   for(new i=0;i<MAX_PLAYERS;i++)
   {
	 if(PlayerInfo[i][pVip] >= 1 ) // Vai pegar todos os que forem iguais ou superiores a o level 1..
	 {
	 countando++;
	 format(string,sizeof(string),"{F81414}%s - Vip Level %i\n",nome,PlayerInfo[i][pVip]);//formatando a sting.
	 }
   }
   if(countando == 0)return ShowPlayerDialog( playerid, 1247, DIALOG_STYLE_MSGBOX, "Lista de Vips online","Nenhum Vip online no momento!","Ok...", "");//mostrando a dialog para o player
   ShowPlayerDialog( playerid, 1248, DIALOG_STYLE_MSGBOX, "Lista de Vips online",string,"Ok...", "");//mostrando a dialog para o player
   return 1;
}
CMD:banir(playerid, params[])
{
	new string[256], Dia, Mes, Ano, Hora, Minuto, Segundo,vitima, nomedavitima[MAX_PLAYER_NAME],Motivo[128],nome[MAX_PLAYERS],Ip[15],arquivo[128];
	if(PlayerInfo[playerid][pAdmin] < 3 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
	if(sscanf(params, "us[128]", vitima,Motivo)) return SendClientMessage(playerid, -1, "/banir [id] [motivo]");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
	getdate(Ano, Mes, Dia);//pega a data
	gettime(Hora, Minuto, Segundo);//pega o tempo
	GetPlayerName(playerid, nome, sizeof(nome));//formata o nome do playerid
	GetPlayerName(vitima, nomedavitima, sizeof(nomedavitima)); //formata o nome da vнtima
	GetPlayerIp(vitima, Ip, sizeof(Ip));//pega o ip - formata o ip.
	if(!IsPlayerConnected(vitima)) return SendClientMessage(playerid, -1, "Jogador nгo estб conectado");//caso a vitima nгo estб conectada
	format(string, sizeof(string), "Administrador %s baniu %s [Motivo: %s]", nome, nomedavitima, Motivo);//formata a string
	SendClientMessageToAll(-1, string);//envia pra todos
	format(string, sizeof(string), "%d/%d/%d", Dia, Mes, Ano);//formata a data
	format(arquivo, sizeof(arquivo), pastadebanimento, nomedavitima);//formata a pasta onde vai ser salva
	if(INI_Open(arquivo))//abre a pasta e o arquivo.
	{// vai inserir tudo isto.
		INI_WriteString("Admin", nome);
		INI_WriteInt("Dia", Dia);
		INI_WriteInt("Mes", Mes);
		INI_WriteInt("Ano", Ano);
		INI_WriteInt("Hora", Hora);
		INI_WriteInt("Minuto", Minuto);
		INI_WriteInt("Segundo", Segundo);
		INI_WriteString("MotivoBan", Motivo);
		INI_WriteString("IP", Ip);
		INI_Save();
		INI_Close();
	}
	Kick(vitima);//apуs inserir,kick а vнtima.
	return 1;
}
CMD:desbanirconta(playerid, params[])
{
  	new banido[MAX_PLAYER_NAME], string[45],arquivo[128];
  	if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
	if(sscanf(params, "s[128]", banido)) return SendClientMessage(playerid, -1, "/desbanirconta [nome do banido]");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
    format(arquivo, sizeof(arquivo), pastadebanimento, banido);//formata a pasta onde foi salva
	if(fexist(arquivo))//abre a pasta e o arquivo.
	{// Vai ler e procurar por IP.
	  INI_Open(arquivo);
	  format(string, sizeof(string), "SERVER : Vocк desbaniu a conta: %s", banido);// formatando a string.
	  SendClientMessage(playerid, -1, string);//enviando-a.
      format(arquivo, sizeof(arquivo), pastadebanimento, banido);//Defindo a conta
      INI_Remove(arquivo);//removendo o nome dele.
	  INI_Close();
	}
	else SendClientMessage(playerid,-1, "Conta nгo estб banida");// Caso nгo esteja banido.
	return 1;
}
CMD:vidatodos(playerid,params[])
{
	new string[35],nome[MAX_PLAYER_NAME];
    if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
    if(sscanf(params, "")) return SendClientMessage(playerid, -1, "/vidatodos");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
    GetPlayerName(playerid,nome,sizeof(nome));//formatando o nome do playerid.
    format(string,sizeof(string),"%s Deu vida para todos!",nome); // formatando o texto.
    SendClientMessageToAll(-1,string); // Enviando a menssagem para todos.
    for(new i=0;i<MAX_PLAYERS;i++) // Vai pegar todos os jogadores.
    {
	  if(IsPlayerConnected(i)) // Diminui o tempo do loop.
	  {
	    SetPlayerHealth(i,100); // Definir a vida de todos os jogadores 100.
	  }
    }
    return 1;

}
CMD:coletetodos(playerid,params[])
{
	new string[35],nome[MAX_PLAYER_NAME];
    if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
    if(sscanf(params, "")) return SendClientMessage(playerid, -1, "/coletetodos");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
    GetPlayerName(playerid,nome,sizeof(nome));//formatando o nome do playerid.
    format(string,sizeof(string),"%s Deu colete para todos!",nome); // formatando o texto.
    SendClientMessageToAll(-1,string); // Enviando a menssagem para todos.
    for(new i=0;i<MAX_PLAYERS;i++) // Vai pegar todos os jogadores.
    {
	  if(IsPlayerConnected(i)) // Diminui o tempo do loop.
	  {
	    SetPlayerArmour(i,100); // Definir o colete de todos os jogadores 100.
	  }
    }
    return 1;

}
CMD:verip(playerid,params[])
{
   new ip[15],nome[MAX_PLAYER_NAME],string[50],ID;
   if(PlayerInfo[playerid][pAdmin] < 1 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params, "u",ID)) return SendClientMessage(playerid, -1, "/verip [ID");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerName(ID,nome,sizeof(nome)); // formata o nome
   GetPlayerIp(ID,ip,sizeof(ip)); // formata o ip.
   format(string,sizeof(string),"Nome: %s - IP: %d",nome,ip);//formata o texto.
   ShowPlayerDialog(playerid, 1222, DIALOG_STYLE_MSGBOX,"IP",string,"Fechar",""); // envia o texto em forma de dialog.

   return 1;
}
CMD:congelar(playerid,params[])
{
   new nome[MAX_PLAYER_NAME],nomevitima[MAX_PLAYER_NAME],string[128],ID;
   if(PlayerInfo[playerid][pAdmin] < 1 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params, "us[128]",ID,string)) return SendClientMessage(playerid, -1, "/desbanirconta [nome do banido]");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerName(playerid,nome,sizeof(nome));//geta o nome do playerid.
   GetPlayerName(ID,nomevitima,sizeof(nomevitima)); // geta o nome da vнtima
   format(string,sizeof(string),"Administrador:%s congelou %s Motivo: %s",nome,nomevitima,string);//formata a string
   SendClientMessageToAll(-1,string);//envia a string para todos.
   TogglePlayerControllable(ID,0); // congelando.
   return 1;
}
CMD:descongelar(playerid,params[])
{
   new nome[MAX_PLAYER_NAME],nomevitima[MAX_PLAYER_NAME],string[128],ID;
   if(PlayerInfo[playerid][pAdmin] < 1 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params, "u",ID)) return SendClientMessage(playerid, -1, "/desbanirconta [nome do banido]");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerName(playerid,nome,sizeof(nome));//geta o nome do playerid.
   GetPlayerName(ID,nomevitima,sizeof(nomevitima)); // geta o nome da vнtima
   format(string,sizeof(string),"Administrador:%s descongelou %s",nome,nomevitima,string);//formata a string
   SendClientMessageToAll(-1,string);//envia a string para todos.
   TogglePlayerControllable(ID,1); // congelando.
   return 1;
}
CMD:bc(playerid,params[])
{
   new string[128],tempo,letra;
   if(PlayerInfo[playerid][pAdmin] < 5 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo seja um rcon admin, Retornar a mensagem.
   if(sscanf(params, "s[128]i",string,tempo,letra)) return SendClientMessage(playerid, -1, "/bc [texto] [letra]");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
   if(letra < 0 || letra > 3) return SendClientMessage(playerid,-1,"Letras de 0 - 3"); // Compara com o que o playerid digitou, menor que 0 ou maior que 3 retorna a mensagem
   GameTextForAll(string,5000, letra); // Envia a string para todos.o gametext й uma letra enorme.
   return 1;
}
CMD:kick(playerid,params[])
{
   new ID,string[128],lol[128],nome[MAX_PLAYER_NAME],nomevitima[MAX_PLAYER_NAME];
   if(PlayerInfo[playerid][pAdmin] < 3 && !IsPlayerAdmin( playerid ) ) return SendClientMessage(playerid,-1,"Sem Autorizaзгo!"); // Basicamente diz, Caso o level seja menor que 5 e tambйm nгo sejam um rcon admin, Retornar a mensagem.
   if(sscanf(params,"us[128]",ID,string)) return SendClientMessage(playerid,-1,"/kick [ID] [MOTIVO] ");// Caso o jogador digite parametros errados, irб aparecer estб messagem.
   GetPlayerName(playerid,nome,sizeof(nome));//formata o nome do playerid.
   GetPlayerName(ID,nomevitima,sizeof(nomevitima));//formata o nome da vнtima
   format(lol,sizeof(lol),"Administrador %s kickou jogador % Motivo: %s",nome,nomevitima,string);//formata o texto.
   SendClientMessageToAll(-1,lol); // Manda a mensagem para todos.
   Kick(ID); // Kicka a vнtima

   return 1;
}
CMD:acmds(playerid,params[])
{



}
// STOCKS / PUBLICS
public stats(playerid)
{
  #if defined statsatual
    if(INI_Open(contas(playerid))) // Funзгo que abre a stock contas, estб localizada ao fim do gm.
	{
	  INI_WriteInt("Admin",PlayerInfo[playerid][pAdmin]); // Estб inserindo as informaзхes do jogador.
	  INI_WriteInt("Vip",PlayerInfo[playerid][pVip]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Score",PlayerInfo[playerid][pScore]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Mata",PlayerInfo[playerid][pMata]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Mortes",PlayerInfo[playerid][pMortes]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Avisos",PlayerInfo[playerid][pAvisos]); // Estб inserindo as informaзхes do jogador.
      INI_WriteInt("Dinheiro",GetPlayerMoney(playerid)); // Estб inserindo as informaзхes do jogador.

      INI_Save(); // Salvando as informaзхes do jogador
      INI_Close(); // Fechando as informaзхes do jogador
  }
  #endif
}
public atualizartext(playerid)
{
 new matadd[15],morreudd[15],pingdd[10],pingdd2[MAX_PLAYERS];
 pingdd2[playerid] = GetPlayerPing(playerid); // Pegando o ping do jogador.
 format(matadd, sizeof matadd, "Matou:%d",PlayerInfo[playerid][pMata]); // Formatando a textdraw
 format(morreudd, sizeof morreudd, "Mortes:%d",PlayerInfo[playerid][pMortes]); // Formatando a textdraw
 format(pingdd, sizeof pingdd, "Ping:%d",pingdd2[playerid]); // Formatando a textdraw
 PlayerTextDrawSetString(playerid,matou[playerid], matadd); // Vai atualizar a string, Colocando assim o novo numero.
 PlayerTextDrawSetString(playerid,morreu[playerid], morreudd);// Vai atualizar a string, Colocando assim o novo numero.
 PlayerTextDrawSetString(playerid,ping[playerid], pingdd);// Vai atualizar a string, Colocando assim o novo numero.
}

stock contas(playerid) // Uma stock, й basicamente uma funзгo que pode ou nгo ser usada,evitando erros na copilaзгo sendo normalmente usada na criaзгo de librбrias.(******)(Fiquei em dъvida sobre minha definiзгo)
{
  new conta[64],nome[MAX_PLAYER_NAME]; // Conta й o nome da string, Que serб usada para elaborar a formataзгo do texto, Nome й a funзгo que irб armazenar o nome dos jogadores.
  GetPlayerName(playerid,nome,sizeof(nome)); // Formatando o nome do jogadores.
  format(conta,30,pastadesalvamento,nome); // Formatando a string, e dizendo onde armazenala e qual nome ela terб, que no caso serб o nome do jogador.
  return conta; // Retornando a string.
  // Lembrete importante, publics nгo podem retornar strings, Apenas stock's.
}

Tenho certeza que este tуpico poderб evitar alguns pedidos/informaзхes de comandos.

eu estava a pensar a adicionar um tutorial de sistema de gangs, porйm achei que seria um pouco mais avanзado, jб que este tutorial й dedicado a iniciantes entгo achei meio que desnecessбrio.


Bom para finalizar, Deixe suas opiniхes sobre o que deixou a desejar, erros que cometi, lembrando que, uma crнtica bem construнda й sempre bem vinda.


Links para includes && Crйditos ao devidos criadores .
- Sscanf2
- SII
- Zcmd

e Tambйm Crйditos а:
- Sa-mp Wiki (como sempre vivendo e aprendendo.)
- Leonardo1434 (Criador do tutorial)
Reply
#2

Boa iniciativa, porйm, como vocк disse, й um tutorial destinado a novatos, e vocк citou alguns termos que talvez eles nгo entendam...

Seria уtimo uma explicaзгo mais detalhada
Reply
#3

Em quais aspectos eu poderia melhorar, poderia citar algum?

Obrigado pelo seu post !
Reply
#4

Mas e se eles quiserem fazer um 'rpg' / 'rp'?

Bom Tutorial.
Reply
#5

Ae! acabou o tuto!
Muito bom man parabйns :]
Agora nгo sei porque eu nгo me bato muito bem com SII =/
Reply
#6

Quote:
Originally Posted by leonardo1434
Посмотреть сообщение
Em quais aspectos eu poderia melhorar, poderia citar algum?

Obrigado pelo seu post !
Operadores, contagem de cйlulas...
Reply
#7

Aproveitando Pedro, Eu nгo entendo muito de contagem de cйlulas,
O que isso significa e tem algum programa, site ou outra coisa que conte as cйlulas?
Reply
#8

Tem vбrios por ai.

Contando:

pawn Код:
new str[3] = "oi"; // oi = 2 cйlulas + EOS = 1 cйlula
Eu sei por em prбtica mas nгo sou bom com explicaзхes, por isso se vocк perceber nunca faзo tutoriais.
Reply
#9

Quote:
Originally Posted by Pedro_Miranda
Посмотреть сообщение
Tem vбrios por ai.

Contando:

pawn Код:
new str[3] = "oi"; // oi = 2 cйlulas + EOS = 1 cйlula
Eu sei por em prбtica mas nгo sou bom com explicaзхes, por isso se vocк perceber nunca faзo tutoriais.
Ahhhhhhhh,,
Entгo quer dizer que ''oi'' que sгo as cйlulas? ¬¬
Aff pensei que era tudo LOL
Obrigado pela explicaзгo!

Obs: Leo desculpa os off's agora nгo vo fazer mais
Reply
#10

lol tutorial para criar gm do 0 nгo deveria ter criado o gm com comentarios

e sim explicar o que й ex:
pawn Код:
new var[MAX_PLAYERS];
new nova array
var nome da array
MAX_PLAYERS  valor 500 slots isso terб um slot para cada jogador, possivelmente ligado , para que vocк saiba os dados para um jogador nгo irб interferir com os dados para um outro jogador
Reply
#11

Indenta isso ae champs.
Reply
#12

do jeito que ta explicado aк,sу nao aprende quem nao quer.
OBS: um tutorial como esse em video ficaria show!

(:
Reply
#13

Desculpa por "Ressuscitar" o post...

Mas, esta acontecendo um pequenito problema quando o player cria a conta.
O Score (ou seja, a Pontuaзгo) ja comeзa com 50 :S
sendo que no registro esta normal, setado para comeзar com 0:

Quote:

INI_WriteInt("Score",0);// Inserindo as informaзхes iniciais

Alguem poderia da um forзa ai (:
Reply
#14

Isto se deve ao fato de vocк jб ter definido algo, ou estб manipulando os dados contidos neste tutorial de um modo errado, pois tais dados foram testados por mim (vбrias vezes...) e estгo funcionando perfeitamente e eu atualmente uso para testar algo.

Procurar por esta funзгo: https://sampwiki.blast.hk/wiki/SetPlayerScore
Reply
#15

;/
pior q nao fiz nada usando o Score ou algo do tipo, pois eu peguei aquele cod que voce postou e coloquei e criei um gm novo com ele.
Talvez seja a minha include do SII que esteja fail ;/

Mas mesmo assim obg pela ajuda (;
Reply
#16

Tente comentar estб linha(veja abaixo), Provavelmente й isto. aqui funciona bem salvando constantemente os dados. porйm deve estar ocorrendo algum bug ou algo do gкnero.

pawn Код:
// Ficando assim
//#define statsatual
Reply
#17

eu gostei da ideia mais eu acredito que nгo se aprende a criar um gamemode do 0 com tutoriais eu acredito que й melhor ler muitos tutorias sobre coisas basicas do pawno e dps tentar colocar em pratica.

Mais oque vale й a inteзгo da proxima vez tente explicar melhor mais o tutorial esta muito bom.
Reply
#18

Quote:
Originally Posted by MegaStyle157
Посмотреть сообщение
eu gostei da ideia mais eu acredito que nгo se aprende a criar um gamemode do 0 com tutoriais eu acredito que й melhor ler muitos tutorias sobre coisas basicas do pawno e dps tentar colocar em pratica.

Mais oque vale й a inteзгo da proxima vez tente explicar melhor mais o tutorial esta muito bom.
Concordo, clique aqui.
Reply
#19

Legal! mesmo faltando algumas coisinhas ainda pode ajudar COMO SEMPRE DIGO

se isso tivesse aparecido quando comecei Hoje acho que tinha mais conhecimento!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)