]Tutorial/GameMode] Sistema de Gang e GangZone + GameMode
1. Criando as Gangs:
Code:
- Código:
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.
Code:
- Código:
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:
Code:
- Código:
AddPlayerClass(Skin, Pos:X, Pos:Y, Pos:Z, Rot:Z, Arma1, Balas1, Arma2, Balas2, Arma3, Balas3);
1.2 Colocando o jogador na Gang:
Code:
- Código:
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:
Code:
- Código:
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:
Code:
- Código:
[size=13]GivePlayerWeapon(playerid, ID, Balas);[/size]
[size=13]Coloque este comando em seu GameMode para pegar posições:[/size]
[size=13][size=11]Code:[/size]
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;
}
[/size]
2. Criando as GangZones:
GangZoneCreate(1876.7298, -1145.8150, 2056.8627, -1250.8861);//Parque Glen
E copie este codigo:
Code:
#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.
2.2 Colocando-a no GameMode:
Code:
- Código:
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:
Code:
- Código:
GangZoneCreate(MIN_Pos:X, MIN_Pos:Y, MAX_Pos:X, MAX_Pos:Y);
Ou seja: Não inclui uma Pos:Z.
2.3 Criando um Verificador de Cor e de Posições:
Code:
- Código:
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:
Code:
- Código:
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;
}[/size]
2.4 Mostrando a GangZone:
Code:
- Código:
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:
Code:
- Código:
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:
Code:
- Código:
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
Creditos: Dr_Pawno