TUT] Sistema de Gangs (/gang criar)
Autor: AdminDraKoN | Publicado: 2010-08-06T17:54:00-07:00


Antes vou dizer que o Tutorial esta muito bem explicado, só precisa prestar atenção nos comentários dentro do Código, se tiver algum erro comunique-me por PM, caso contrario esta me incentivando cada vez mais de parar de fazer tutos! 
Bom vou postar aqui um tutorial inédito de como criar um sistema de Gang Criáveis.. 
Primeiramente Vamos definir algumas coisinhas para posteriormente fazermos as Gangs, Lembrando que usarei SetPlayerTeam portando teremos o AntiTeamKill Feito jáTopo GM: 

pawn Code:#define MAX_GANGS 32
#define MAX_GANG_PLAYERS 16
#define SEM_GANG 0Nesta duas Diretivas acima iremos definir o número máximo que o Loop para criar Gang pode chegar (32) e o numero máximo de players em uma gang (16), enquanto a SEM_GANG é a diretiva dos players que serão sem gang (0) 

Vamos agora fazer as Arrays para a Gang: 
Ainda no Topo: 

pawn Code:new gangInvite[MAX_PLAYERS];
new PlayerInGang[MAX_PLAYERS];
new gangMembers[MAX_GANGS][MAX_GANG_PLAYERS];//Array para Enviar Mensagem posteriormenteEssa Array será usada para definir se o player esta pronto ou não para entrar para Gang, e a Array 'PlayerInGang' é para ver o ID da gang do player... 
Claro que isso pode ser substituido por PVARS para ficar mais otimizado,enfim. 

Em OnGameModeInit 

pawn Code:if(!dini_Exists(Archivo))
{
dini_Create(Archivo);
dini_IntSet(Archivo, "GangsCreates", 0);
}[i] Isso daqui cria o Arquivo para fazer o ID da Gang Posteriormente 

Agora vamos ao comando em OnPlayerCommandTex: 
GangEntrar: 

pawn Code:new cmd[128], idx;
cmd = comandos(cmdtext, idx);
if(strcmp(cmd, "/gangentrar", true) == 0)
{
if(PlayerInGang[playerid]==0 &amp;&amp; gangInvite[playerid] != 0) //Se o Convite for Diferente de '0' que seria a gang padrao  e  ele estiver fora da gang
{
SetPlayerTeam(playerid,gangInvite[playerid]); // coloca na gang como definido anteriormente
SendClientMessage(playerid, 0xFFFFFFFF, "você foi entrou na gang");
PlayerInGang[playerid] = GetPlayerTeam(playerid);
gangInvite[playerid] = 0;//Reseta o Convite
}
return 1;
} 

Enfim Vamos ao Convite: 

pawn Code:if(strcmp(cmd, "/gangconvite", true) == 0)
{
new tmp[128];
tmp = comandos(cmdtext, idx);
if(strlen(tmp) == 0) return SendClientMessage(playerid, 0xFFFFFFFF, "Uso do Comando: /gangconvite[ID]");
SendClientMessage(playerid, 0xFFFFFFFF, "você foi convidado a entrar em uma gang");
gangInvite[strval(tmp)] == PlayerInGang[playerid];//Habilita Convite para o ID da Gang
return 1;
} 
Primeiramente vamo criar um Loop para definir o ID da Gang 
Esse será o comando de criar a gang, claro que ele nunca salvará o nome da Gang apenas o ID dela porém você pode fazer um jogo de 'salvamento' e salvar o ID da Gang em um arquivo com Nome dela, Veja Abaixo.. 

pawn Code:if(strcmp(cmd, "/gangcriar", true) == 0)
{
new tmp[128];
tmp = comandos(cmdtext, idx);
if(PlayerInGang[playerid]&gt;0)//Se o player estive em uma gang
{
return SendClientMessage(playerid, 0xFF8040FF, " Já estás em uma gang");;
}
new i;//define id da gang
i= dini_Int("Gang.ini", "GangsCreates")+1;//define id da gang
new string[128];
format(string, sizeof(string),"Você criou a gang: '%s' (%d)", tmp, i);//Irá Enviar MSG que a gang foi criada com ID
SendClientMessage(playerid, 0xFF8040FF, string);//Envia MSG
PlayerInGang[playerid]=i;//Irá Colocar o Player na Gang
SetPlayerTeam(playerid,PlayerInGang[playerid]);//Seta o Player a Uma Gang a Ativa Anti TK
return 1;
} 

pawn Code:new file[64];
format(file, sizeof(file), "%d.ini", GetPlayerTeam(playerid));// Salva Arquivo com ID_DA_GANG.ini
dini_Create(file);
dini_Set(file,"Nome",tmp);//Salvara Nome da GangEntão para Carregar: 

pawn Code:stock ler_nome(gangid)
{
new arquivo[128];
format(arquivo,sizeof(arquivo),"%i.ini",gangid);
format(arquivo,sizeof(arquivo),dini_Get(arquivo,"Nome"));
return arquivo;
}então basta fazer 

pawn Code:ler_nome(GetPlayerTeam(playerid));//Lê o nome da gang em arquivo 
Agora Vamos Criar o Chat da Gang: 


pawn Code:public OnPlayerText(playerid, text[])
{
if(text[0] == '!') {//Se Tiver '!'
new string[128]; GetPlayerName(playerid,string,sizeof(string));//Geta Nome
format(string,sizeof(string),"Gang Chat: %s: %s",string,text[1]);//Formato da Mensagem
SendMessageToGang(playerid,0xFFFFFFFF,string);//Envia Mensagem
}
return 0;
} 
Agora a Stock que Envia Mensagem para a Gang Internamente: 

pawn Code:stock SendMessageToGang(playerid,color,const msg[])
{
for (new i=0; i&lt;MAX_GANG_PLAYERS; i++)//Pega os Membros da Gang
{
if (IsPlayerConnected(i) &amp;&amp; PlayerInGang[playerid] &gt; 0)//se tiver conectado e for de um gang
{
SendClientMessage(gangMembers[GetPlayerTeam(playerid)][i],color,msg);//Envia MSG para os mesmos da gang
}
}
return 1;
} 
Agora Final GM: 


pawn Code:comandos(const string[], &amp;index)//essa é a strtok modificada para não dar complicados com outras
{
new length = strlen(string);
while ((index &lt; length) &amp;&amp; (string[index] &lt;= ' '))
{
index++;
}

new offset = index;
new result[20];
while ((index &lt; length) &amp;&amp; (string[index] &gt; ' ') &amp;&amp; ((index - offset) &lt; (sizeof(result) - 1)))
{
result[index - offset] = string[index];
index++;
}
result[index - offset] = EOS;
return result;
} 

Pois bem este é o Fim, espero que tenham gostado, 
Créditos a DraKoN  

Se quiserem saber como faz as Gang Zones Dominaives basta acessar aqui: 

http://forum.sa-mp.com/showthread.php?t=143646 

Eu Fiz o TUTO Usando gTeams para ser compactível com outros assim como do andmeida10