[Tutorial] Criando Servidor Básico

1º - Baixando arquivos do Servidor:

- Primeiro baixe o programa para abrir o servidor por esse link tirado do site Oficial do SA-MP:

http://files.sa-mp.com/samp022server.win32.zip

2º - Descompactando Arquivos:

- Abra a pasta zip que você baixou e descompacte os arquivos dentro dela arrastando para uma pasta qualquer.

- Se você não tem o WinRAR instalado no seu pc, baixe pelo link: http://baixaki.ig.com.br/download/WinRAR.htm

- Não é nescessário baixar o WinRAR se não quiser, se você não quiser baixa-lo o arquivo abrirá em uma pasa zipada, é quase a mesma coisa que abrir no WinRAR mas com menos recursos. Faça a mesma coisa, arraste todos os arquivos para uma pasta qualquer e depois configure o servidor.

3º - Configurando o Servidor:

- Logo abaixo temos uma imagêm mostrando os arquivos existentes no download, e explicações básicas sobre as pastas e arquivos mais importantes pro seu Servidor:

- Para configurar seu servidor abra o arquivo "server.cfg" no blocos de nota e aparecerá isso:

- Explicação:

echo Executing Server Config...

lanmode 0 (Serve para ativar a rede local, 1 é ativado e 0 é desativado.)

rcon_password changeme (Senha do administrador, mude o "changeme" para uma senha de sua escolha)

maxplayers 32 (Limite de jogadores que poderam entrar no seu servidor, dependendo da sua internet você pode aumenta-lo ou abaixa-lo)

port 7777 (Porta do SA:MP, aconselhavel não muda-la)

hostname Unnamed 0.2.2 Server (Nome do Servidor, mude o "Unnamed 0.2.2 Server" para um nome de sua escolha)

gamemode0 lvdm 1 (Gamemode que vai rodar no seu server, para escolher outro entre na pasta Gamemode e pegue o nome dele e cole no lugar do "lvdm 1". Os Gamemodes compilados terão um ".amx" no final do nome do mode, coloque apenas o nome que está antes do ".amx". Se quiser mais Gamemodes para seu servidor baixe-los ou faça você mesmo, mas isso é outra história. Você pode encontrar Gamemodes aqui no blog ou na comunidade do pawno: http://www.orkut.com/Community.aspx?cmm=38308205)

filterscripts adminspec vactions (FilterScripts que vão rodar no seu servidor, se quiser adicionar outros faça o mesmo esquema dos Gamemodes, pegue o nome antes do ".amx" e cole depois do "filterscripts". Você também pode baixa-los aqui no blog ou na comunidade do pawno)

announce 1

query 1

weburl www.sa-mp.com (Aqui você pode por o link do seu site para fazer propaganda no canto do programa do client do SA-MP)

anticheat 0

Se você quiser por senha no seu server coloque embaixo do query 1:

password senhadesuaescolha

4º - Ligando o Servidor:

Após terminar de configurar seu servidor clique duas vezes no arquivo "samp-server" e aparecerá isso:
- E após fazer isso seu server já está ligado, agora só falta você pegar seu IP para seus amigos adicionarem nos favoritos e jogarem.

5º - Pegando seu IP:

- Para pegar seu IP entre no site www.meuip.com.br , copie seu IP que está depois do "Meu ip é" e passe para seus amigo e adicione nos favoritos no SA:MP.

Exemplo: Meu ip é 111.11.111.111

- Se seu ip não for fixo, ele vai mudar cada vez que você desconectar ou desligar o modem.

OBS: Seu server estará automaticamente na lista de servidore, após ligar o servidor!

Depois disso é só jogar! =D

FIM

[TUTORIAL] Diretiva #define

A diretiva #define serve para substiuir um valor ou script de uma linha por uma palavra de sua escolha. Por exemplo:

#include

#define SKABUSKA print("Oi!");

main()
{
SKABUSKA
}
Entendendo o código

A primeira linha inclue a biblioteca a_samp no script, obrigatória para fazer gamemodes e filterscripts para SA-MP.

A segunda linha vai definir a palavra SKABUSKA para que seja a "representante" da função print("Oi");.

A terceira linha, a função main() é obrigatória para inicializar seu gamemode.

Dentro das chaves ( { e } ) ou corpo da função, colocamos a palavrava SKABUSKA que irá representar a função print("Oi");.

Assim depois de compilar(F5) o script, inicie o seu servidor com o gamemode que contenha esse script e veja na tela do console do windows que aparecerá a palavra "Oi!". O resultado seria o mesmo se fizessimos desse jeito:

#include

main()
{
print("Oi!");
}
Substituindo valores por palavras
Para fazer uma profissão, por exemplo, existe uma técnica, que funciona da seguinte forma:

Declaramos o nome da profissão com a diretiva #define e colocamos um valor para que seja substituido pelo nome da profissão. Por exemplo:

#define DESEMPREGADO 0
#define POLICIAL 1

Esses valores seriam os IDs (ou números de indentificação) das profissões. Para setar a profissão você precisa atribuir o valor, que no caso seria o número que repesenta a profissão (ID), à uma array, se você não sabe o que são arrays, clique aqui.
Assim não precisamos nos preocupar de memorizar o ID de cada profissão.

Essa técnica pode ser aplica na criação de gangs, profissões e inúmeras coisas, mas não tratarei disso nesse tutorial.

E é assim que funciona a diretiva #define.

Até mais pessoal.

[TUTORIAL] Aprendendo a salvar as coisas

Bom dia, senhores leitores do blog do Cronos, eu sou o novo colaborador, antigo [JPP]MrBean, e hoje, vou ensinar vocês a salvar as coisas...

-- Introdução --

Voces vao ver o que salvar com o que eu vou ensinar voces a fazerem, claro que voces podem se aprimorar mais, mais apenas vou ensinar o básico...

enum aAcc
{
aPassword[128],
aScore,
aCash,
Float:aX,
Float:aY,
Float:aZ,
Float:aA,
aLogged,
}


Como visto acima, nós usamos apenas uma variável em vez de colocar uma variável pra cada coisa ocupando mais memória...

new AccountInfo[MAX_PLAYERS][aAcc];


A variável acima, será o que vai reconhecer o PlayerID do jogador para salvar as informaçoes...

-- Criando, Carregando e Salvando contas --

- Registrando

forward RegisterPlayer(playerid, password[]);
public  RegisterPlayer(playerid, password[])
{
if(IsPlayerConnected(playerid))
{
 new name[MAX_PLAYER_NAME], str[128];
 GetPlayerName(playerid, name, sizeof name);
 format(str, sizeof str, "%s.ini", name);
 new File:account = fopen(str, io_write);
 if (account)
 {
    strmid(AccountInfo[playerid][aPassword], password, 0, strlen(password), 128);
     AccountInfo[playerid][aCash] = GetPlayerMoney(playerid);
  AccountInfo[playerid][aScore] = GetPlayerScore(playerid);
  GetPlayerPos(playerid, AccountInfo[playerid][aX], AccountInfo[playerid][aY], AccountInfo[playerid][aZ]);
  GetPlayerFacingAngle(playerid, AccountInfo[playerid][aA]);
  new file[128];
  {
   format(file, sizeof file, "Password: %s\n", AccountInfo[playerid][aPassword]);
   { fwrite(account, file); }
   format(file, sizeof file, "Grana: %d\n",AccountInfo[playerid][aCash]);
   { fwrite(account, file); }
   format(file, sizeof file, "Score: %d\n", AccountInfo[playerid][aScore]);
   { fwrite(account, file); }
   format(file, sizeof file, "X: %f\n",AccountInfo[playerid][aX]);
   { fwrite(account, file); }
   format(file, sizeof file, "Y: %f\n",AccountInfo[playerid][aY]);
   { fwrite(account, file); }
   format(file, sizeof file, "Z: %f\n",AccountInfo[playerid][aZ]);
   { fwrite(account, file); }
   format(file, sizeof file, "Angulo: %f\n",AccountInfo[playerid][aA]);
   { fwrite(account, file); }
  }
  fclose(account);
  SendClientMessage(playerid, 0x21DD00FF, "Voce foi registrado, agora logue-se.");
 }
}
return 1;
}


- Agora que a conta foi criada vamos fazer o jogador se logar...

forward LoginPlayer(playerid, password[]);
public  LoginPlayer(playerid, password[])
{
new name[MAX_PLAYER_NAME], str[128];
GetPlayerName(playerid, name, sizeof name);
format(str, sizeof str, "%s.ini", name);
new File:account = fopen(str, io_read);
if (account)
{
 new pass[256];
 new passres[128], value[128];
  fread(account, pass, sizeof pass);
 passres = GetFileString(pass);
 if (!strcmp("Password", passres))
 {
  value = GetFileValue(pass);
  strmid(AccountInfo[playerid][aPassword], value, 0, strlen(value)-1, 128); // -1 to remove the extra space(\n)
 }
 if (!strcmp(AccountInfo[playerid][aPassword], password, true))
 {
  while (fread(account, pass, 256))
  {
   passres = GetFileString(pass);
   if (strfind(passres, "Cash") != -1)
   {
    value = GetFileValue(pass);
    AccountInfo[playerid][aCash] = strval(value);
   }
   if (strfind(passres, "Score") != -1)
   {
    value = GetFileValue(pass);
    AccountInfo[playerid][aScore] = strval(value);
   }
   if (strfind(passres, "X") != -1)
   {
    value = GetFileValue(pass);
    AccountInfo[playerid][aX] = floatstr(value);
   }
   if (strfind(passres, "Y") != -1)
   {
    value = GetFileValue(pass);
    AccountInfo[playerid][aY] = floatstr(value);
   }
   if (strfind(passres, "Z") != -1)
   {
    value = GetFileValue(pass);
    AccountInfo[playerid][aZ] = floatstr(value);
   }
   if (strfind(passres, "Angle") != -1)
   {
    value = GetFileValue(pass);
    AccountInfo[playerid][aA] = floatstr(value);
   }
  }
     fclose(account);
  AccountInfo[playerid][aLogged] = 1;
 }
 else
 {
  SendClientMessage(playerid, 0xE60000FF, "Senha errada.");
  fclose(account);
  return 1;
 }
 GivePlayerMoney(playerid, AccountInfo[playerid][aCash]);
 SetPlayerScore(playerid, AccountInfo[playerid][aScore]);
 SetPlayerPos(playerid, AccountInfo[playerid][aX], AccountInfo[playerid][aY], AccountInfo[playerid][aZ]);
 SetPlayerFacingAngle(playerid, AccountInfo[playerid][aA]);
 SendClientMessage(playerid, 0x21DD00FF, "Logado com sucesso");
 printf("%s logou", name);
}
return 1;
}


Agora vamos salvar....

forward SavePlayer(playerid);
public  SavePlayer(playerid)
{
if(IsPlayerConnected(playerid))
{
 if(AccountInfo[playerid][aLogged] == 1)
 {
  new name[MAX_PLAYER_NAME], str[128];
  GetPlayerName(playerid, name, sizeof name);
  format(str, sizeof str, "%s.ini", name);
  new File:account = fopen(str, io_write);
  if (account)
     {
   AccountInfo[playerid][aCash] = GetPlayerMoney(playerid);
   AccountInfo[playerid][aScore] = GetPlayerScore(playerid);
   GetPlayerPos(playerid, AccountInfo[playerid][aX], AccountInfo[playerid][aY], AccountInfo[playerid][aZ]);
   GetPlayerFacingAngle(playerid, AccountInfo[playerid][aA]);
   new file[128];
   {
    format(file, sizeof file, "Password: %s\n", AccountInfo[playerid][aPassword]);
    { fwrite(account, file); }
    format(file, sizeof file, "Grana: %d\n",AccountInfo[playerid][aCash]);
    { fwrite(account, file); }
    format(file, sizeof file, "Score: %d\n", AccountInfo[playerid][aScore]);
    { fwrite(account, file); }
    format(file, sizeof file, "X: %f\n",AccountInfo[playerid][aX]);
    { fwrite(account, file); }
    format(file, sizeof file, "Y: %f\n",AccountInfo[playerid][aY]);
    { fwrite(account, file); }
    format(file, sizeof file, "Z: %f\n",AccountInfo[playerid][aZ]);
    { fwrite(account, file); }
    format(file, sizeof file, "Angulo: %f\n",AccountInfo[playerid][aA]);
    { fwrite(account, file); }
   }
   fclose(account);
  }
 }
}
return 1;
}


-- AGORA FAZENDO O BONECO SALVAR MESMO --

public OnPlayerDisconnect(playerid, reason)
{
SavePlayer(playerid);
return 1;
}


Isso vai salvar quando ele sair =D

public OnPlayerConnect(playerid)
{
AccountInfo[playerid][aCash] = 0;
AccountInfo[playerid][aScore] = 0;
AccountInfo[playerid][aX] = 0;
AccountInfo[playerid][aY] = 0;
AccountInfo[playerid][aZ] = 0;
AccountInfo[playerid][aA] = 0;
strmid(AccountInfo[playerid][aPassword], "-", 0, 1, 1);
return 1;
}


Isso vai criar um pedaço da conta quando ele entrar =D

-- AGORA OS COMANDOS --

new cmd[128], tmp[128], idx;
cmd = strtok(cmdtext, idx);

if (!strcmp(cmd, "/logar", true))
{
new tmppass[128];
if(AccountInfo[playerid][aLogged] == 1) return SendClientMessage(playerid, 0xE60000FF, "Você já está logado.");
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, 0xF97804FF, "USE: /logar [password]");
new plname[MAX_PLAYER_NAME];
GetPlayerName(playerid, plname, sizeof plname);
format(plname, sizeof plname, "%s.ini", plname);
if(!fexist(plname)) return SendClientMessage(playerid, 0xE60000FF, "Por favor registre-se primeiro");
strmid(tmppass, tmp, 0, strlen(cmdtext), 128);
Encrypt(tmppass);
LoginPlayer(playerid, tmppass);
return 1;
}

if (!strcmp(cmd, "/registrar", true))
{
if(AccountInfo[playerid][aLogged] == 1) return SendClientMessage(playerid, 0xE60000FF, "Você já está logado.");
new plname[MAX_PLAYER_NAME];
GetPlayerName(playerid, plname, sizeof plname);
format(plname, sizeof plname, "%s.ini", plname);
new File: hFile = fopen(plname, io_read);
if (hFile)
{
SendClientMessage(playerid, 0xE60000FF, "Alguem já está usando esse nick.");
fclose(hFile);
return 1;
}
new tmppass[128];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp)) return SendClientMessage(playerid, 0xF97804FF, "USE: /registrar [password]");
strmid(tmppass, tmp, 0, strlen(cmdtext), 128);
Encrypt(tmppass);
RegisterPlayer(playerid, tmppass);
return 1;
}


-- E AGORA AS FUNÇOES DE PROTEÇAO DE SENHA --

stock Encrypt(string[]) // Made by Y_Less
{
for(new x=0; x < class="pawnkeyword">if(string[x] > (0xff))
 {
  string[x] -= 256;
 }
}
}

stock strtok(const string[], &index,seperator=' ')
{
new length = strlen(string);
new offset = index;
new result[128];
while ((index < class="pawnkeyword">if ((index < class="pawnkeyword">return result;
}



Gente, de meu próximo tutorial, vou ensinar a usar dini, esse é so para voces verem mesmo que pode-se fazer sem usar outro include...

[TUTORIAL]Abrindo portão por busina

Primeiramenta va ate a linha: public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
se no seu GameMode não tiver ela adicione.
Embaixo do public coloque este code:

/* Se o jogador apertar o BOTÃO DE BUZINA E ESTIVER DENTRO DE UM VEÍCULO */
if((newkeys == KEY_HORN) && (IsPlayerInAnyVehicle(playerid)))
{
// ENTÃO ELE PROCESSA O QUE ESTÁ AQUI
}
return 1;
}

--explicação--
o if está dizendo que se o jogador estiver em um carro e aperta o botão da busina "H" ou "CapsLook" (Que neste caso é a key "horn") o portão ira abrir (Ou o que você colocou ali no code)

Obs:. Não se esqueça de por o define: #define KEY_HORN 2

[TUTORIAL] Acessando site do SA-MP

Se você está tentando entrar no site do SA-MP, mas não consegue, é porque está bloqueado para a América Latina.
Uma maneira fácil e rápida de acessá-lo, sem fazer altas gambiarras ou resetar o modem sem parar até que seu IP mude para um que não esteja bloqueado, é por proxys.
No site abaixo existe uma lista de proxys publicos que podem ser usados para acessar qualquer site de uma maneira que disfarce seu IP (não é 100% seguro que você será totalmente disfarçado):

http://proxy.org/

No lado direito do site está a lista e um campo de formulario. Para entrar no site desejado coloque a URL do site no campo de formulario, escolha um proxy publico na lista que está abaixo do campo (caso queria um proxy aleatorio deixe em "*** random proxy ***").

Pronto!

O único problema é que eu até agora não achei nenhum proxy publico que deixe você fazer downloads dos sites que você acessa, nem ver vídeos etc e tal.

Praticamente, isso só servirá para ver a wiki do samp. ^^

[TUTORIAL] Criando mapas para SA-MP

Muita gente entra em servidores cheio de rampas, pontos e outras coisas... Ai da aquela vontade do cão de criar um gamemode com seu próprio mapa. Mas como fazer um mapa pra samp?

Primeiro baixe o MTA:
http://mtavc.com/124.html


Instale o programa e execute-o.
Irá abrir o GTA e aparecerá um menu diferente do jogo. Clique em Map Editor, espere carregar e então você aparecerá em Ganton, com um mirazinha no centro e alguns icones na tela.

Para usar o cursor, que servirá para clicar nos ícones, tecle F.

Para acessar a lista de objetos e adiciona-los no jogo faça o seguinte:

Depois de ter teclado F, vá com o cursor até o lado inferior esquerdo no ícone de uma caixa, chamada Object.

Aparecerá milhares de objetos do jogos, para adiciona-los ao jogo de dois cliques no item da lista ou de OK.

Pronto, você adicionou o objeto no jogo, mas você não poderá mexer a camera para coloca-lo onde você quiser, terá que ir com as setinhas, mas para resolver isso bastar teclar F de novo.

Quando quiser deixa-lo no lugar definitivo apenas de um clique.

Caso queria excluir o objeto apenas tecle delete.

Para ver a lista de objetos que você adicionou, com a teclada F precionada, vá até a parte de cima da tela e clique em current elements. Você poderá excluir, ir até o objeto, mudar sua posição, seleciona-lo etc.

Comandos básicos:

Modo cursor ON/OFF: Tecla F
Mover objeto: Setas
Mover camera: WSAD
Mover objeto para cima: Page Up
Mover objeto para baixo: Page Down
Rotacionar: ctrl + setas/page down/page up
Mover objeto com modo cursor OFF: Mouse

Para salvar o objeto clique, com a tecla F pressionada, em Save As ( caso for a primeira vez ) ou em Save (caso for edição de um mapa já existente).

Para abrir um mapa, também com a tecla F pressionada, clique em Open e para criar um novo mapa clique em New.

Para testar o mapa, jogando com o CJ, tecle F5 ou clique em Test. Para sair do teste apenas tecle F5 novamente.

Para adicionar veículos clique em Vehicles, no lado inferior esquerdo da tela, são quase os mesmos comandos de manipular objetos.

Para converter, você precisar pegar seu arquivo salvo do mapa, que geralmente fica na pasta:

C:\Arquivos de programas\MTA San Andreas\server\mods\deathmatch\resources

Dentro de uma pasta com o mesmo nome do mapa.

Entre no site:

http://gtamap.delux-host.com/converter/

Selecione para qual formato seu mapa será convertido e então clique em "Arquivo...", procure pelo seu mapa (nomedomapa.map) e clique em abrir.

Ele automaticamente será convertido então na parte de baixo do site copie as linhas de código e introduza-as em seu gamemode ou sei lá o que!

[APP] AdvancedConverter(Traduzido)

Esse programa serve para converter mapas feitos no MTA Race para código pawno.
Possibilidades de conversão:
-Código Pawno simples(CreateObject)
-YSI
-xObjects
-Novo Gamemode
/