Um amigo me pediu pra mim fazer um tutorial para ele de como criar gangzones domináveis (sei que ja tem inъmeros, mas nunca vi um que mostre o nome da gang ), entгo resolvi postar aqui para todos Farei esse tutorial em 4 partes pra ninguйm
endoidar
Parte 1
peão Код:endoidar
Parte 1
- Código:
#include <cpstream> // include para que os checkpoints funcionem
#define MAX_GANGS 3 // maximo de gangs, aqui no caso serгo 3 gangs
#define ZONE_TIME 20 // tempo para dominar em segundos
forward ZoneCheckpointChecker ( ) ; // declara o callback para checar as gangzones
static cpzone [ MAX_PLAYERS ] [ MAX_GANGS + 1 ] ,lastcp [ MAX_PLAYERS ] ; // getar checkpoint e salvar o ultimo checkpoint em que você passou
new gang1,gang2,gang3,cpgang1,cpgang2,cpgang3; // declaração dos checkpoints e das gangzones
new GangNames [ 3 ] [ ] = // nome das gangues para aparecer 'A gangue X doiminou mais um território'
{
"Gang 1" ,
"Gang 2" ,
"Gang 3"
} ;
new pgzcolor [ MAX_GANGS + 1 ] = // cores para os jogadores
0x007900AA, 0xFF0080AA, 0x400040AA // igual
} ;
new gzcolor [ MAX_GANGS + 1 ] = // núcleos para as gangzones
{
0x007900AA, 0xFF0080AA, 0x400040AA // igual
} ;
Explicação parte 1:
1- As cores para as gangzones e para os players devem ser as mesmas nas duas arrays para não bugar.
2- É nescessário esses dois arrarys, pois na callback a coré setada pelo player que domina, ai caso o player saia do server a gangzone ainda
estará com a mesma cor e nгo a original.
3- Caso for add mais gangs atualize o MAX_GANGS de acordo com a quantidade de gangs e os nomes delas na array GangNames.
4- Para alterar o tempo que levará para dominar a área, basta alterar o valor de ZONE_TIME em segundos.
Parte 2
peão Код:1- As cores para as gangzones e para os players devem ser as mesmas nas duas arrays para não bugar.
2- É nescessário esses dois arrarys, pois na callback a coré setada pelo player que domina, ai caso o player saia do server a gangzone ainda
estará com a mesma cor e nгo a original.
3- Caso for add mais gangs atualize o MAX_GANGS de acordo com a quantidade de gangs e os nomes delas na array GangNames.
4- Para alterar o tempo que levará para dominar a área, basta alterar o valor de ZONE_TIME em segundos.
Parte 2
- Código:
public OnGameModeInit ( )
{
SetTimer ( "ZoneCheckpointChecker" , 1000 , true ) ; // timer para um callback
//gang 1
AddPlayerClass ( 101 , 2303.6819 , - 1630.4944 , 14.5754 , 189.4422 , 0 , 0 , 0 , 0 , 0 , 0 ) ; // skin para uma gangue 1
//gang 2
AddPlayerClass ( 105 ,2532.4045 , - 1667.5391 , 15.1688 , 83.0852 , 0 , 0 , 0 , 0 , 0 , 0 ) ; // skin paga a gang 2
// gang 3
AddPlayerClass ( 108 , 2155.7913 , - 1665.1510 , 15.0859 , 36.2461 , 0 , 0 , 0 , 0 , 0 , 0 ) ; // pele para uma gangue 3
gang1 = GangZoneCreate ( 2406.349 , -1764.764 , 2573.673 , -1606.855 ) ; _ _ // cria gangzone para uma gangue 1 gang2 = GangZoneCreate ( 1584.936 , - 1745.026 , 1828.318 , - 1516.057 ) ; // cria gangzone para uma gangue 2 gang3 = GangZoneCreate ( 1835.923 , - 1267.349 , 2075.502 , - 1121.283
) ; // cria gangzone para uma gangue 3
cpgang1 = CPS_AddCheckpoint ( 2495.0383 , -1686.9420 , 13.5140 , 2.0 , 80 ) ; // cria checkpoint para gangue 1 cpgang2 = CPS_AddCheckpoint ( 1722.3857 , -1607.7697 , 13.5469 , 2.0 , 80 ) ; // cria checkpoint para gang 2 cpgang3 = CPS_AddCheckpoint ( 1976.1494 , -
1234.6455 , 20.0469 , 2.0 , 80 ) ; // cria checkpoint para gangue 3
#pragma não utilizado cpgang1,cpgang2,cpgang3 // declaraзгo de nгo uso para nгo dar warning
return 1 ;
}
Explicação parte 2 :
1- Mantenha sempre a mesma ordem entre os checkpoints e as gangzones e os GangZoneShowForPlayer para que sejam dominadas corretamente.
2- Adicione as Classes sempre dividindo as gangues para você não se enrolar depois.
3- O pragma ali serve para nгo ficar warning de item nгo usado, sempre que for add uma gangue declare ali o checkpoint para nгo dar warning.
Parte 3
peão Код:1- Mantenha sempre a mesma ordem entre os checkpoints e as gangzones e os GangZoneShowForPlayer para que sejam dominadas corretamente.
2- Adicione as Classes sempre dividindo as gangues para você não se enrolar depois.
3- O pragma ali serve para nгo ficar warning de item nгo usado, sempre que for add uma gangue declare ali o checkpoint para nгo dar warning.
Parte 3
- Código:
public OnPlayerRequestClass ( playerid, classid )
{
switch ( classid )
{
case 0 :
{
GameTextForPlayer ( playerid, GangNames [ 0 ] , 2000 , 3 ) ; // nome da gangue
SetPlayerTeam ( playerid, 0 ) ; // define o tempo para nгo ocorrer teamkill
}
case 1 :
{
GameTextForPlayer ( playerid, GangNames [1 ] , 2000 , 3 ) ; // nome da gangue
SetPlayerTeam ( playerid, 1 ) ; // define o tempo para nгo ocorrer teamkill
}
case 2 :
{
GameTextForPlayer ( playerid, GangNames [ 2 ] , 2000 , 3 ) ; // nome da gangue
SetPlayerTeam ( playerid, 2 ) ; // seta o tempo para nгo ocorrer teamkill
}
}
return 1 ;
}
- Código:
public OnPlayerLeaveCheckpoint ( playerid )
{
if ( lastcp [ playerid ] > 0 && lastcp [ playerid ] <= MAX_GANGS + 1 )
{
cpzone [ playerid ] [ lastcp [ playerid ] ] = 0 ; // quando o player sai do checkpoint a contagem é reiniciada e o dominio é abortado
GangZoneStopFlashForAll (lastcp [ playerid ] -1 ) ; _ } retorna 1 ; } public OnPlayerSpawn ( playerid ) { if ( GetPlayerTeam ( playerid ) == 0 ) SetPlayerColor ( playerid, pgzcolor [ 0 ] ) ; // seta o player com a cor da gangue 1 if ( GetPlayerTeam ( playerid ) == 1 ) SetPlayerColor (
- Código:
ID do jogador, pgzcolor [ 1 ] ) ; // define o jogador com a cor da gangue 2
if ( GetPlayerTeam ( playerid ) == 2 ) SetPlayerColor ( playerid, pgzcolor [ 2 ] ) ; // define o player com a cor da gangue 3
GangZoneShowForPlayer ( playerid, gang1, gzcolor [ 0 ] ) ; // mostra a gangzone da gangue 1
GangZoneShowForPlayer ( playerid, gang2, gzcolor [ 1 ] ) ;// mostra a gangzone da gang 2
GangZoneShowForPlayer ( playerid, gang3, gzcolor [ 2 ] ) ; // mostra a gangzone da gang 3
return 1 ;
}
Explicação parte 3:
1- Em OnPlayerRequestClass caso tenha mais de uma class para a mesma gangue, você coloca por exemplo: "case 0 .. 5" caso a classid for de 0 à 5 elas pertencem à gangue X, sempre aumentando os números do SetPlayerTeam de acordo com o número de gangues e ajustando o nome das gangues na matriz GangNames.
2- A ordem das classids (skins) deve ser a mesma da array GangNames.
3- Em OnPlayerSpawn mantenha sempre a mesma ordem entre as GangZoneShowForPlayer e os os itens da OnGameModeInit para que sejam dominadas corretamente.
4- Em GetPlayerTeam e SetPlayerColor as cores são definidas pela array 'pgzcolor' (mantenha sempre na mesma ordem das gangues).
5- Em GangZoneShowForPlayer as cores são definidas pela array 'gzcolor'
Parte 4
peão Код:1- Em OnPlayerRequestClass caso tenha mais de uma class para a mesma gangue, você coloca por exemplo: "case 0 .. 5" caso a classid for de 0 à 5 elas pertencem à gangue X, sempre aumentando os números do SetPlayerTeam de acordo com o número de gangues e ajustando o nome das gangues na matriz GangNames.
2- A ordem das classids (skins) deve ser a mesma da array GangNames.
3- Em OnPlayerSpawn mantenha sempre a mesma ordem entre as GangZoneShowForPlayer e os os itens da OnGameModeInit para que sejam dominadas corretamente.
4- Em GetPlayerTeam e SetPlayerColor as cores são definidas pela array 'pgzcolor' (mantenha sempre na mesma ordem das gangues).
5- Em GangZoneShowForPlayer as cores são definidas pela array 'gzcolor'
Parte 4
- Código:
public ZoneCheckpointChecker ( ) // callback para checar as gangzones
{
new string [ 75 ] ,tmp [ 10 ] ;
for ( new i; i != MAX_PLAYERS; ++ i )
{
if ( ! IsPlayerConnected ( i ) ) continue ;
if ( CPS_GetPlayerCheckpoint ( i ) > 0 && CPS_GetPlayerCheckpoint ( i ) <= MAX_GANGS + 1 && gzcolor [ CPS_GetPlayerCheckpoint ( i ) - 1 ] != GetPlayerColor ( i ) )
{
if ( cpzone [ i ] [ CPS_GetPlayerCheckpoint ( i ) ] < ZONE_TIME )
{
cpzone [ i ] [ CPS_GetPlayerCheckpoint ( i ) ] + + ;
formato (tmp, sizeof tmp, "~g~%2d/20" , cpzone [ i ] [ CPS_GetPlayerCheckpoint ( i ) ] ) ;
GameTextForPlayer ( i, tmp, 1001 , 4 ) ;
GangZoneFlashForAll ( CPS_GetPlayerCheckpoint ( i ) -1 , GetPlayerColor ( i ) ) ;
}
senão se ( cpzone [ i ] [CPS_GetPlayerCheckpoint ( i ) ] == ZONE_TIME )
{
GameTextForPlayer ( i, "~r~Area ~w~Conquistada" , 4000 , 1 ) ;
GivePlayerMoney ( i,GetPlayerMoney ( i ) + 100000 ) ;
gzcolor [ CPS_GetPlayerCheckpoint ( i ) -1 ] = GetPlayerColor ( i ) ; _
GangZoneStopFlashForAll ( CPS_GetPlayerCheckpoint ( i ) -1 ) ; _ GangZoneHideForAll ( CPS_GetPlayerCheckpoint ( i ) -1 ) ; _ GangZoneShowForAll ( CPS_GetPlayerCheckpoint ( i ) -1 , GetPlayerColor ( i ) ) ; formato ( string, sizeof ( string ) ,
"*>> [GANGZONES]: Uma gangue '{00FF00}%s{FFFF00}' domina mais um territуrio!" ,GangNames [ GetPlayerTeam ( i ) ] [ 0 ] ) ;
PlayerPlaySound ( i, 1058 , 0 , 0 , 0 ) ;
SendClientMessageToAll ( 0xFFFF00AA, " " ) ;
SendClientMessageToAll ( 0xFFFF00AA, string ) ;
SendClientMessageToAll ( 0xFFFF00AA, " " );
}
}
}
retorna 0 ;
}
Explicação parte 4:
1- Quando for mudar o tempo de dominio coloque o mesmo valor no format da callback em ~g~%2d/20, caso for por, por exemplo, 15 segundos, você escreve ~g~%2d/15.
2- Caso queria mudar a mensagem de dominio apenas mude o formato das gangzones (sem esquecer os parâmeros %s, %d, etc).
#edit
3- Caso queria mudar a quantia de dinheiro quando dominar a área é so alterar GivePlayerMoney(i,GetPlayerMoney(i) + 100000) para o valor desejado se
falei algum absurdo ai me corrijam , thx - Crueliz0n
1- Quando for mudar o tempo de dominio coloque o mesmo valor no format da callback em ~g~%2d/20, caso for por, por exemplo, 15 segundos, você escreve ~g~%2d/15.
2- Caso queria mudar a mensagem de dominio apenas mude o formato das gangzones (sem esquecer os parâmeros %s, %d, etc).
#edit
3- Caso queria mudar a quantia de dinheiro quando dominar a área é so alterar GivePlayerMoney(i,GetPlayerMoney(i) + 100000) para o valor desejado se
falei algum absurdo ai me corrijam , thx - Crueliz0n