Mostrando postagens com marcador tutoriais. Mostrar todas as postagens
Mostrando postagens com marcador tutoriais. Mostrar todas as postagens
Olá pessoal, como estou fazendo meu GM do zero, usando Fini, vim ajudar o pessoal do fórum que não sabem usar a Fini.
Este é meu 1º tutorial, pode CRITIAR porque eu preciso saber o que eu errei para me aprimorar.
Então vamos começar:

Vá no topo do seu GM e coloque:


#include <fini> //vai carregar a include fini

#define DIALOG_LOGIN 1 //define nossa dialog de login e register

Depois coloque o seguinte no topo, mas perto de suas news.

enum pInfo{
    cKey[128],
    cLevel,
    cReg,
    cSkin,
    cLog,
    cGrana
}//define a variavel pInfo para diminiur nosso trabalho
new UserInfo[pInfo][MAX_PLAYERS];//acopla o pInfo a variavel UserInfo
new pName[MAX_PLAYER_NAME]; //define a variavel de nome, mas para todo o GM evitando repetições

Agora vamos as forwards:

//toda public que criamos precisa de uma forward :D
forward OnPlayerLogin(playerid,password[]); //para login
forward OnPlayerSave(playerid); //para salvar os dados
forward OnPlayerRegister(playerid, password[]); //para registrar

Agora vamos as publics nativas do SAMP:
public OnPlayerConnect(playerid)
{
//public para quando o player conecta
//vamos definir 2 string para nós usarmos no login
    new string[80];
    new string2[160];
    GetPlayerName(playerid, pName, sizeof(pName)); //pega o nome do player
    format(string, sizeof(string), "contas/%s.cfg",pName);//formata a string que verifica se existe o arquivo
    if(Fini_Exists(string))//verifica se existe o arquivo
    {
        //formata a string que aparecera no dialog para login
        format(string2, sizeof(string2), "{F5DEB3}Bem vindo ao Seu Servidor\n\n{B22222}Nome: {F5DEB3}%s\n{B22222}Status: {F5DEB3}Registrado\n\n Digite sua senha para logar:",pName);
        //mostra nossa dialog que formatamos a cima
        ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"{B22222}Logar",string2,"Logar","Cancelar");
    }
    else
    {
        //formata a string que aparecera no dialog para registro
        format(string2, sizeof(string2), "{F5DEB3}Bem vindo ao Seu Servido\n\n{B22222}Nome: {F5DEB3}%s\n{B22222}Status: {F5DEB3}Não registrado\n\n Digite sua senha para registrar:",pName);
        //mostra nossa dialog formatada a cima
        ShowPlayerDialog(playerid,DIALOG_LOGIN+1,DIALOG_STYLE_INPUT,"{B22222}Registro",string2,"Registrar","Cancelar");
        //preste atenção no id dessa diaog: "DIALOG_LOGIN+1"
        //como definimos o "DIALOG_LOGIN" como 1 aqui ele pegara 1+1 e dara um novo id para o registro
        //evitando muitas definições :D
    }
    return 1;
}

public OnPlayerDisconnect(playerid)
{
//public para quando o player sai do serv
    OnPlayerSave(playerid);//aki vai chamar a public q salva
    UserInfo[cLog][playerid] = 0;//desloga o player
    printf("Dados de ID: %d salvos com sucesso\n",playerid);//coloquei isso só para segurança pq mostra se salvou mesmo :P
    return 1;
}
public OnPlayerRequestSpawn(playerid)
{
//public nativa do samp para  quando o player clika em spawn
//aqui embaixo ele vai verificar se o player estiver logado vai pode dar spawn, caso contrário não vai acontecer o spawn
    if(UserInfo[cLog][playerid] == 0)
    {
        SendClientMessage(playerid, COLOR_WHITE, "Impossível ter spawn sem antes de logar.");//avisa o player
        return 0;//retorna 0 assim naum da spawn
     }
    //setiver logado efetua o spawn
     return 1;
}

public OnPlayerSpawn(playerid)
{
//puclic quando da spawn
//mais segurança
//se não tiver logado congela o player
//caso contrario descongela :D
    if(UserInfo[cLog][playerid] == 0)
    {
        TogglePlayerControllable(playerid, 0);//aki congela
        return 1;
    }
    else
    {
        TogglePlayerControllable(playerid, 1);//aki descongela
        return 1;
    }
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
//public nativa do samp para resposta de dialog
//vamos configurar os retornos do login e registro
//aki embaixo vai verificar o login
    if(dialogid == DIALOG_LOGIN) //DIALOG_LOGIN é o ID da dialog de login
    {
        if(strlen(inputtext) == 0) //caso naum escreva nada retorna o login informando o erro da senha
        {
            ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"{B22222}Registro","\n{B22222}Senha incorreta!\n{F5DEB3}Insira sua senha novamente:","Logar","Cancelar");
        }else{
            OnPlayerLogin(playerid,inputtext); //se escrever algo chama a public de login e passa a senha e o id da player
        }
        return 1;
    }
//aki embaixo vai verificar o registro
    if(dialogid == DIALOG_LOGIN+1) //DIALOG_LOGIN+1 é o ID da dialod de registro
    {
        if(strlen(inputtext) == 0) //caso naum escreva nada retorna o registro informando q precisa de senha
        {
            ShowPlayerDialog(playerid,DIALOG_LOGIN+1,DIALOG_STYLE_INPUT,"{B22222}Registro","\n{F5DEB3}Para registrar é necessário uma senha:","Registrar","Cancelar");
        }else{
            OnPlayerRegister(playerid,inputtext); //se escrever algo chama a public de registro e passa a senha e o id da player
        }
        return 1;
    }
   
    return 1;
}

Até aqui tudo entendido?
Caso não comente para que eu te ajude
Se as publics que eu citei a cima já existem no seu GM só coloque o que eu coloquei nelas aqui nas suas publics
Agora finalizando vamos as publics de login, registro e salvamento

public OnPlayerLogin(playerid,password[])
{
//public que efetua o login
    new string[80]; //string para o nome do player
    GetPlayerName(playerid, pName, sizeof(pName)); //pega o noem do player pelo ID que foi passado
    format(string, sizeof(string), "contas/%s.cfg",pName); //formata a onde esta o arquivo de registro, se quiser mudar o local de salvamento antere o contas só não apague o %s
    Fini_OpenFile(string);//abre o arquivo
    if(strcmp(password,Fini_GetStr("Senha"), true) == 0) //verifica se a senha q foi passada
    {
     //se a senha for igual faz isso aki embaixo
        UserInfo[cLevel][playerid] = Fini_GetValue("Level"); //Pega o level
        UserInfo[cReg][playerid] = Fini_GetValue("Reg"); //Pega a variavel de registro
        UserInfo[cSkin][playerid] = Fini_GetValue("Skin"); //Pega a skin
        UserInfo[cGrana][playerid] = Fini_GetValue("Grana"); //Pega o grana do player
        GivePlayerMoney(playerid, UserInfo[cGrana][playerid]); //devolve a grana salva
        UserInfo[cLog][playerid] = 1; //deixa como logado
    }
    else
    {
        //caso a senha não seja igual ele manda pro login de novo
        ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"{B22222}Logar","{B22222}Senha incorreta!\n{F5DEB3}Insira sua senha novamente:","Logar","Cancelar");
    }
    Fini_CloseFile();//fecha o arquivo do player
}
public OnPlayerSave(playerid)
{
//public q efetua o salvamento
//coisas que tem no login e aqui são iguais não vou repetir
    new string[80];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "contas/%s.cfg",pName);
    Fini_OpenFile(string);//abre o arquivo formatado a cima
    Fini_SetVal("Level", UserInfo[cLevel][playerid]);//salva o level
    Fini_SetVal("Reg", UserInfo[cReg][playerid]);//salva se foi registrado
    Fini_SetVal("Skin", UserInfo[cSkin][playerid]);//salva a skin
    Fini_SetVal("Grana", GetPlayerMoney(playerid));//salva a grana
    Fini_SaveFile(string);//salva o arquivo para efetuar as mudanças
    Fini_CloseFile();//fecha o arquivo, 1º salva depois fecha :@
}
public OnPlayerRegister(playerid, password[])
{
//por ultimo o registro
    new string[80];
    GetPlayerName(playerid, pName, sizeof(pName));
    format(string, sizeof(string), "contas/%s.cfg",pName);
    Fini_Create(string);//cria o arquivo do player
    Fini_OpenFile(string);//abre o arquivo do player
    Fini_SetStr("Senha", password);//salva a senha
    Fini_SetVal("Level", UserInfo[cLevel][playerid]);//salva o level, coloquei assim, pois vc pode querer dar level automaticamente
                                                    //, mas como eu naum coloquei nehum valor no GM ele vai salvar como 0
    Fini_SetVal("Reg", 1);//salva se foi registrado
    Fini_SetVal("Skin", 178);//salva a skin, eu coloquei essa pq eu gosto, mas vc pode trocar
    Fini_SetVal("Grana", GetPlayerMoney(playerid)); //salva a gran do player
    Fini_SaveFile(string);//salva o arquivo
    Fini_CloseFile();// fecha o arquivo
    new string2[160];//string para definir o login, pq apos registrar temos q logar :D
    // \/ formata o q aparecera no login
    format(string2, sizeof(string2), "{F5DEB3}Bem vindo ao Seu Servidor\n\n{B22222}Nome: {F5DEB3}%s\n{B22222}Status: {F5DEB3}Registrado\n\n Digite sua senha para logar:",pName);
    //Dialog que efetua o login :D
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_INPUT,"{B22222}Logar",string2,"Logar","Cancelar");

Ufaaa!

Acabou, espero que eu tenha ajudado vocês.

Comentem se precisar me manda MP e falem a nota do tutorial.



Todas as linhas estão comentadas, caso não intendo avise que eu te explico melhor.



Agradecimentos:



Falcon - Tutorial, Sherlock Holmes do Bugs(by drakins)


Drakins(banido) e KylePT pelo Desenvolvimento de Fini Cache File System

Jhony - Tester



Se mais detalhes sobre o Fini:

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




Download

http://pastebin.com/kwFCLKR1



Atenciosamente,

Deregudegu.

1. Criando as Gangs:

new TeamGang[MAX_PLAYERS];//Esta será a definição da Gang do Jogador.

1.1 Colocando as Skins:

Para ver as Skins vá a http://wiki.sa-mp.com/wiki/Skins.
Para pegar os ID's das Armas vá em http://wiki.sa-mp.com/wiki/Weapons.

public OnGameModeInit(){    //Skins dos Balas:    AddPlayerClass(102, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(103, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(104, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    //Skins da Grove:    AddPlayerClass(105, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(106, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(107, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    //Skins dos Los Aztecas:    AddPlayerClass(114, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(115, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(116, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    //Skins dos Los Vagos:    AddPlayerClass(108, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(109, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(110, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    //Skins da San Fierro Rifa:    AddPlayerClass(173, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(174, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    AddPlayerClass(175, 0, 0, 5, 0, 24, 300, 29, 300, 4, 1);
    return 1;//Fim}

Explicando o AddPlayerClass:

AddPlayerClass(Skin, Pos:X, Pos:Y, Pos:Z, Rot:Z, Arma1, Balas1, Arma2, Balas2, Arma3, Balas3);

1.2 Colocando o jogador na Gang:

public OnPlayerRequestClass(playerid, classid){    if(classid >= 0 && classid <= 2)//De 0 á 2 são so Numeros das Skins, ou seja, os três primeiros AddPlayerClass.    {        TeamGang[playerid] = 0;//Colocará o jogador na Gang 0, ou seja: Ballas.    }//Fim das Funções das skins dos ballas.    if(classid >= 3 && classid <= 5)//Grove    {        TeamGang[playerid] = 1;
    }    if(classid >= 6 && classid <= 8)//Los Aztecas    {        TeamGang[playerid] = 2;
    }    if(classid >= 9 && classid <= 12)//Los Vagos    {        TeamGang[playerid] = 3;
    }    if(classid >= 13 && classid <= 15)//San Fierro Rifa    {        TeamGang[playerid] = 4;
    }    SetPlayerTeam(playerid, TeamGang[playerid]+1);//Não permitirá que um parceiro mate o outro.    return 1;//Fim}

1.3 Colocando o Spawn da Gang:

public OnPlayerSpawn(playerid)//Quando o Jogador Spawna...{    if(TeamGang[playerid] == 0)//Se: Gang do Jogador for 0(Ballas)    {        SetPlayerPos(playerid, 1939.1229, -1114.7427, 27.4522);//Colocará o jogador na posição.        SetPlayerFacingAngle(playerid, 179.6596);//Colocará o jogador em uma rotação.    }    if(TeamGang[playerid] == 1)//Grove    {        SetPlayerPos(playerid, 2495.3671, -1688.4191, 13.7943);
        SetPlayerFacingAngle(playerid, 4.5339);
    }    if(TeamGang[playerid] == 2)//Los Aztecas    {        SetPlayerPos(playerid, 2512.6210, -1027.8750, 70.0859);
        SetPlayerFacingAngle(playerid, 180.7592);
    }    if(TeamGang[playerid] == 3)//Los Vagos    {        SetPlayerPos(playerid, 1832.0184, -1995.9156, 13.5468);
        SetPlayerFacingAngle(playerid, 82.2389);
    }    if(TeamGang[playerid] == 4)//San Fierro Rifa    {        SetPlayerPos(playerid, -2624.3217, 1411.1578, 7.0937);
        SetPlayerFacingAngle(playerid, 194.6358);
    }    return 1;//Fim}

Dicas:
Você pode colocar para as Gangs spawnarem com mais armas usando:

GivePlayerWeapon(playerid, ID, Balas);

Coloque este comando em seu GameMode para pegar posições:

if(strcmp(cmdtext, "/pos", true) == 0)
{
    new Float:POS[4], string[256];
    new vehicleid = GetPlayerVehicleID(playerid);
    if(!IsPlayerInAnyVehicle(playerid))
    {
        GetPlayerPos(playerid, POS[0], POS[1], POS[2]);
        GetPlayerFacingAngle(playerid, POS[3]);
    }
    else
    {
        GetVehiclePos(vehicleid, POS[0], POS[1], POS[2]);
        GetVehicleZAngle(vehicleid, POS[3]);
    }
    format(string, sizeof(string), "X = %f, {FFFFFF}Y = %f, {FF0000}Z = %f, {0066FF}R = %f, {FFFF00}INT: %d", POS[0], POS[1], POS[2], POS[3], GetPlayerInterior(playerid));
    SendClientMessage(playerid, 0x00FF00AA, string);
    return 1;
}

2. Criando as GangZones:

#define BALLAS_COLOR 0xFF00FFAA
#define GROVE_COLOR 0x00FF00AA
#define AZTECAS_COLOR 0x00FFFFAA
#define VAGOS_COLOR 0xFFFF00AA
#define RIFA_COLOR 0x0000FFAA
new GangName[5][] = {//Aqui irei colocar os nomes de 5 Gangs:
{"Ballas"},//Nome da Gang 1
{"Grove Street"},//Nome da Gang 2
{"Varios Los Aztecas"},//Nome da Gang 3
{"Los Santos Vagos"},//Nome da Gang 4
{"San Fierro Rifa"}//Nome da Gang 5
};//Fim dos Nomes
new GZParque,//Para definir a GangZone.
    GZPista;//Para definir a GangZone.
new Dominando[MAX_PLAYERS];//Para impedir o jogador de dominar 2 GangZones ao mesmo tempo.
new ParqueSendoDominado,//Para verificar se o parque glen já esta sendo dominado.
    PistaSendoDominada;//Para verificar se a pista de skate já esta sendo dominada.
new DonoParque = 99,//Para colocar a cor no parque.
    DonoPista = 99;//Para colocar a cor na pista.
forward DominarParque(playerid);
forward DominarPista(playerid);

2.1 Como pegar:

Use o comando de pegar posições e pegue:

1°: Baixo e do lado esquerdo.

2°: Cima e do lado Direito.

Como na Imagem:



2.2 Colocando-a no GameMode:


public OnGameModeInit()
{
    GZParque = GangZoneCreate(1876.7298, -1145.8150, 2056.8627, -1250.8861);//Parque Glen
    GZPista = GangZoneCreate(1862.1929, -1351.2478, 1976.6811, -1450.5447);//Pista de Skate
    return 1;//Fim
}

Explicando o GangZoneCreate:
GangZoneCreate(MIN_Pos:X, MIN_Pos:Y, MAX_Pos:X, MAX_Pos:Y);

Ou seja: Não inclui uma Pos:Z.

[pawn]

2.3 Criando um Verificador de Cor e de Posições:

stock GetGangColor(gang)
{
    if(gang == 0)
    {
        return BALLAS_COLOR;
    }
    if(gang == 1)
    {
        return GROVE_COLOR;
    }
    if(gang == 2)
    {
        return AZTECAS_COLOR;
    }
    if(gang == 3)
    {
        return VAGOS_COLOR;
    }
    if(gang == 4)
    {
        return RIFA_COLOR;
    }
    return 1;
}
stock IsPlayerInParqueGlen(playerid)
{
    new Float:X,
        Float:Y,
        Float:Z;
    GetPlayerPos(playerid, X, Y, Z);//Pega a Posição.
    if(X >= 1876.7298 && Y >= -1145.8150 && X <= 2056.8627 && Y <= -1250.8861)//Verifica se ele esta na GangZone.
    {
        return 1;//Isto significa que ele ESTA na GangZone.
    }
    return 0;//Isto significa que ele NÃO ESTA na GangZone.
}
stock IsPlayerInPistaDeSkate(playerid)
{
    new Float:X,
        Float:Y,
        Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(X >= 1862.1929 && Y >= -1351.2478 && X <= 1976.6811 && Y <= -1450.5447)
    {
        return 1;
    }
    return 0;
}

Como Fazer:


Pegue a Sua GangZone, Ex:
GangZoneCreate(1876.7298, -1145.8150, 2056.8627, -1250.8861);//Parque Glen

e copie esse codigo:

stock IsPlayerInGangZone(playerid)
{
    new Float:X,
        Float:Y,
        Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(X >= 1 && Y >= 2 && X <= 3 && Y <= 4)
    {
        return 1;
    }
    return 0;
}

Onde esta o 1, você ira pegar a 1° parte do GangZoneCreate, no caso, 1876.7298, onde esta o 2, você ira pegar a 2° parte do GangZoneCreate, no caso, -1145.8150. E assim por diante.

2.4 Mostrando a GangZone:

public OnPlayerSpawn(playerid)
{
    if(DonoParque == 99)
    {
        GangZoneShowForPlayer(playerid, GZParque, 0x666666AA);
    }
    if(DonoParque != 99)
    {
        GangZoneShowForPlayer(playerid, GZParque, GetGangColor(DonoParque));
    }
    if(DonoPista == 99)
    {
        GangZoneShowForPlayer(playerid, GZPista, 0x666666AA);
    }
    if(DonoPista != 99)
    {
        GangZoneShowForPlayer(playerid, GZPista, GetGangColor(DonoPista));
    }
    return 1;
}

2.5 Criando o Comando:

public OnPlayerCommandText(playerid, cmdtext[])
{
    new string[256], sendername[MAX_PLAYERS];
    GetPlayerName(playerid, sendername, sizeof(sendername));
    if(!strcmp("/do", cmdtext, true) || !strcmp("/dominar", cmdtext, true))//Se: O comando digitado for /do ou /dominar...
    {
        if(IsPlayerInParqueGlen(playerid))//Se: Jogador no Parque Glen...
        {
            if(Dominando[playerid] != 0)//Se: Dominando não for igual a 0.
            {
                SendClientMessage(playerid, 0x666666FF, "Você já esta dominando uma GangZone.");//Mensagem de Erro.
                return 1;//Termina o Comando.
            }
            if(ParqueSendoDominado != 0)//Se: O parque esta sendo dominado...
            {
                SendClientMessage(playerid, 0x666666FF, "O Parque Glen já esta sendo dominado.");//Mensagem de Erro.
                return 1;//Termina o Comando.
            }
            if(DonoParque == TeamGang[playerid])//Se: O Parque for da Gang do Jogador...
            {
                SendClientMessage(playerid, 0x666666FF, "O Parque Glen já é da sua Gang.");//Mensagem de Erro.
                return 1;//Termina o Comando.
            }
            format(string, sizeof(string), "O Jogador %s da Gang %s esta dominando o Parque Glen.", sendername, GangName[TeamGang[playerid]]);//Cria um Texto com o Nome e Gang do jogador
            SendClientMessageToAll(0x007700FF, string);//Envia o Texto para todos
            GangZoneFlashForAll(GZParque, GetGangColor(TeamGang[playerid]);//Faz a GangZone ficar piscando com a cor da gang do jogador que irá dominar
            SetTimerEx("DominarParque", 30000, false, "i", playerid);//Executar uma função depois de 30 segundos
            ParqueSendoDominada = 1;//Não permite o parque ser dominado
            Dominando[playerid] = 1;//Não permite o jogador dorminar outra gang zone
            return 1;//Termina o Comando.
        }
        else if(IsPlayerInPistaDeSkate(playerid))
        {
            if(Dominando[playerid] != 0)
            {
                SendClientMessage(playerid, 0x666666FF, "Você já esta dominando uma GangZone.");
                return 1;
            }
            if(PistaSendoDominada != 0)
            {
                SendClientMessage(playerid, 0x666666FF, "A Pista de Skate já esta sendo dominado.");
                return 1;
            }
            if(DonopPista == TeamGang[playerid])
            {
                SendClientMessage(playerid, 0x666666FF, "A Pista de Skate já é da sua Gang.");
                return 1;
            }
            format(string, sizeof(string), "O Jogador %s da Gang %s esta dominando a Pista de Skate.", sendername, GangName[TeamGang[playerid]]);
            SendClientMessageToAll(0x007700FF, string);
            GangZoneFlashForAll(GZPista, GetGangColor(TeamGang[playerid]);
            SetTimerEx("DominarPista", 30000, false, "i", playerid);
            PistaSendoDominada = 1;
            Dominando[playerid] = 1;
            return 1;  
        }
        else//Se o Jogador não estivem em nem uma gang zone...
        {
            SendClientMessage(playerid, 0x666666FF, "Você não esta em uma GangZone.");
            return 1;
        }
    }              
    return SendClientMessage(playerid, 0xFFFFFFFF, "Comando Invalido.");//Fim.
}

2.6 30 Segundos Depois do Comando:

public DominarParque(playerid)
{
    if(IsPlayerConnected(playerid))
    {
        new string[256], sendername[MAX_PLAYER_NAME];
        GetPlayerName(playerid, sendername, sizeof(sendername));
        if(IsPlayerInParqueGlen(playerid))
        {
            GangZoneShowForAll(GZParque, GetGangColor(TeamGang[playerid]));//Coloca a GangZona com a cor da Gang
            DonoParque = TeamGang[playerid];//Muda o Dono do Parque para a Gang do Jogador
            format(string, sizeof(string), "O Jogador %s da Gang %s dominou o Parque Glen.", sendername, GangName[TeamGang[playerid]]);//Cria um texto com o nome do jogador e a gang
            SendClientMessageToAll(0x007700FF, string);//Manda o texto para todos
        }
        else
        {
            format(string, sizeof(string), "O Jogador %s da Gang %s não dominou o Parque Glen.", sendername, GangName[TeamGang[playerid]]);
            SendClientMessageToAll(0x007700FF, string);
        }
    }
    ParqueSendoDominado = 0;//Permite o Parque ser dominado novamente
    Dominando[playerid] = 0;//Permite o Jogador dominar novamente
    GangZoneStopFlashForAll(GZParque);//Para de Piscar
    return 1;
}
public DominarPista(playerid)
{
    if(IsPlayerConnected(playerid))
    {
        new string[256], sendername[MAX_PLAYER_NAME];
        GetPlayerName(playerid, sendername, sizeof(sendername));
        if(IsPlayerInPistaDeSkate(playerid))
        {
            GangZoneShowForAll(GZPista, GetGangColor(TeamGang[playerid]));
            DonoPista = TeamGang[playerid];
            format(string, sizeof(string), "O Jogador %s da Gang %s dominou a Pista de Skate.", sendername, GangName[TeamGang[playerid]]);
            SendClientMessageToAll(0x007700FF, string);
        }
        else
        {
            format(string, sizeof(string), "O Jogador %s da Gang %s não dominou a Pista de Skate.", sendername, GangName[TeamGang[playerid]]);
            SendClientMessageToAll(0x007700FF, string);
        }
    }
    PistaSendoDominada = 0;
    Dominando[playerid] = 0;
    GangZoneStopFlashForAll(GZPista);
    return 1;
}

Caso esteja com preguiça de fazer todo esses sistema para testar baixe! (Link Abaixo)

https://rapidshare.com/files/3610642977/GangZone.RAR



Tutorial totalmente feito por Dr_Pawno.

Qualquer semelhança com outro tutorial será uma pura coincidência.

Google Pluss Youtube Google Pluss