[Tutorial] Criando gangzone dominбvel por checkpoint
#1

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

pawn Код:
#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 da 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 gangs para aparecer 'A gang X doiminou mais um territуrio'
{
    "Gang 1",
    "Gang 2",
    "Gang 3"
};

new pgzcolor[MAX_GANGS+1] = // cores para os plaeyrs
    0x007900AA, 0xFF0080AA, 0x400040AA  // igual
};
new gzcolor[MAX_GANGS+1] = // cores 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 essas duas arrarys, pois na callback a cor й setada pelo player que dominou, 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, sу altere o valor de ZONE_TIME em segundos.

Parte 2

pawn Код:
public OnGameModeInit()
{
    SetTimer("ZoneCheckpointChecker", 1000, true); // timer para a callback
    //gang 1
    AddPlayerClass(101,2303.6819,-1630.4944,14.5754,189.4422,0,0,0,0,0,0); // skin para a gang 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); //skin para a gang 3

    gang1 = GangZoneCreate(2406.349, -1764.764, 2573.673, -1606.855); // cria gangzone para a gang 1
    gang2 = GangZoneCreate(1584.936, -1745.026, 1828.318, -1516.057); // cria gangzone para a gang 2
    gang3 = GangZoneCreate(1835.923, -1267.349, 2075.502, -1121.283); // cria gangzone para a gang 3

    cpgang1 = CPS_AddCheckpoint(2495.0383,-1686.9420,13.5140,2.0,80); // cria checkpoint para gang 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 gang 3
    #pragma unused 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 gangs para vocк nгo se enrolar depois.

3- O pragma ali serve para nгo ficar dando warning de item nгo usado, sempre que for add uma gang declare ali o checkpoint para nгo dar warning.

Parte 3

pawn Код:
public OnPlayerRequestClass(playerid, classid)
{
    switch(classid)
    {
        case 0:
        {
            GameTextForPlayer(playerid, GangNames[0], 2000, 3);  // nome da gang
            SetPlayerTeam(playerid, 0); // seta o time para nгo ocorrer teamkill
        }
        case 1:
        {
            GameTextForPlayer(playerid, GangNames[1], 2000, 3); // nome da gang
            SetPlayerTeam(playerid, 1); // seta o time para nгo ocorrer teamkill
        }
        case 2:
        {
            GameTextForPlayer(playerid, GangNames[2], 2000, 3); // nome da gang
            SetPlayerTeam(playerid, 2); // seta o time para nгo ocorrer teamkill
        }
     }
     return 1;
}

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);
    }
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if(GetPlayerTeam(playerid) == 0) SetPlayerColor(playerid, pgzcolor[0]); // seta o player com a cor da gang 1
    if(GetPlayerTeam(playerid) == 1) SetPlayerColor(playerid, pgzcolor[1]); // seta o player com a cor da gang 2
    if(GetPlayerTeam(playerid) == 2) SetPlayerColor(playerid, pgzcolor[2]); // seta o player com a cor da gang 3

    GangZoneShowForPlayer(playerid, gang1, gzcolor[0]); // mostra a gangzone da gang 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 gang, vocк coloca por exemplo: "case 0 .. 5" caso a classid for de 0 а 5 elas pertencem а gang X, sempre aumentendo os numeros do SetPlayerTeam de acordo com o numero de gangs e ajustando o nome das gangs na array GangNames.

2- A ordem das classids (skins) devem ser as mesmas 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 setadas pela array 'pgzcolor' (mantenha sempre na mesma ordem das gangs).

5- Em GangZoneShowForPlayer as cores sгo setadas pela array 'gzcolor' (mantenha sempre na mesma ordem das gangs).


Parte 4

pawn Код:
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)]++;
                format(tmp, sizeof tmp, "~g~%2d/20", cpzone[i][CPS_GetPlayerCheckpoint(i)]);
                GameTextForPlayer(i, tmp, 1001, 4);
                GangZoneFlashForAll(CPS_GetPlayerCheckpoint(i)-1, GetPlayerColor(i));
            }
            else if(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));
                format(string, sizeof(string), "*>> [GANGZONES]: A gang '{00FF00}%s{FFFF00}' dominou mais um territуrio!",GangNames[GetPlayerTeam(i)][0]);
                PlayerPlaySound(i, 1058, 0, 0, 0);
                SendClientMessageToAll(0xFFFF00AA, " ");
                SendClientMessageToAll(0xFFFF00AA, string);
                SendClientMessageToAll(0xFFFF00AA, " ");
            }
        }
    }
    return 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 format das gangzones (sem esquecer os parвmeros %s, %d, etc ).

#edit

3- Caso queria mudar a quantia de dinheiro quando dominar a area й so alterar GivePlayerMoney(i,GetPlayerMoney(i) + 100000) para o valor desejado

se falei algum absurdo ai me corrijam , thx
Reply
#2

Nada mal! Parabйns. Mas ainda prefiro o bom /do(minar) ^^
Reply
#3

Nice Tutorial!
Reply
#4

Quote:
Originally Posted by @Riichard
Посмотреть сообщение
Nada mal! Parabйns. Mas ainda prefiro o bom /do(minar) ^^
thx

Quote:
Originally Posted by jpeg
Посмотреть сообщение
Nice Tutorial!
thx
Reply
#5

parabens pelo tutorial bem explicado!
Reply
#6

Parabens Manow
Reply
#7

Legal, ah um bom tempo que ninguйm fazia um tutorial desse. Parabйns.
Reply
#8

thx
Reply
#9

Parabйns.
Reply
#10

EU TENTO COMPILAR DA NISSO.

sv.png
Reply
#11

ja descobri, escrevi errado ali, aqui a correзгo:


pawn Код:
new GangNames[3][] = // nome das gangs para aparecer 'A gang X doiminou mais um territуrio'
{
    "Gang 1",
    "Gang 2",
    "Gang 3"
};
Reply
#12

Seria melhor criares com IsPlayerInArea, checar quando player entrar na GangZone
pawn Код:
stock IsPlayerInArea(playerid, Float:MinX, Float:MinY, Float:MaxX, Float:MaxY) {
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(X >= MinX && X <= MaxX && Y >= MinY && Y <= MaxY) {
        return true;
    }
    return false;
}
Reply
#13

Quote:
Originally Posted by Miqueias Barros
Посмотреть сообщение
Seria melhor criares com IsPlayerInArea, checar quando player entrar na GangZone
pawn Код:
stock IsPlayerInArea(playerid, Float:MinX, Float:MinY, Float:MaxX, Float:MaxY) {
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    if(X >= MinX && X <= MaxX && Y >= MinY && Y <= MaxY) {
        return true;
    }
    return false;
}
nгo porque ai seria muito facil de dominar
Reply
#14

Bom tutorial, mas vocк poderia postar as includes necessбrias no fim do tуpico pois alguns players nгo a include
cspstream. Como eu
Reply
#15

very nice ..

muito bom sera util para quem quer abrir servidores de tdm (mata-mata).
Reply
#16

Quote:
Originally Posted by GhosT_[]
Посмотреть сообщение
Bom tutorial, mas vocк poderia postar as includes necessбrias no fim do tуpico pois alguns players nгo a include
cspstream. Como eu
essa й uma das includes mais pъblicas que existem , so buscar no ****** que acha rapidinho *-*
Reply
#17

tem o link de download da cpstream que funfa ai?
Reply
#18

Quote:
Originally Posted by pedro0098
Посмотреть сообщение
tem o link de download da cpstream que funfa ai?
Se Tem Problema?
Fica revivendo Tуpico, Olha a ъltima mensagem que o cara Postou e olha a sua
Ъltima == 31/08/2012, 11:14 PM
Sua == 16/11/2012, 02:05 PM
Reply
#19

Quote:
Originally Posted by FusyoN01
Посмотреть сообщение
EU TENTO COMPILAR DA NISSO.

Вложение 4479
Sгo As Include Vocк Baixou Todas ?
Reply
#20

Quote:
Originally Posted by TUIDAN
Посмотреть сообщение
Sгo As Include Vocк Baixou Todas ?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)