• Страница 1 из 1
  • 1
Форум | www.SAMP-TEAM.com » Wiki SA-MP » Уроки скриптинга в Pawno » Ганг зоны
Ганг зоны
Война за ганг зоны.

Если у вас уже есть созданные команды то читаем дальше если нет,то http://wiki.sa-mp.com/wiki/PAWN_tutorial.

Code

#define TEAM_GROVE 1
#define TEAM_BALLAS 2
#define TEAM_VAGOS 3


Создаем зоны:

Code

enum eZone
{
      Float:zMinX,
      Float:zMinY,
      Float:zMaxX,
      Float:zMaxY,
      zTeam
}
new ZoneInfo[][eZone] = {
      {2337.9004,-1808.8383,2590.2043,-1610.3673,TEAM_GROVE},
      {2084.7,-1808.8383,2337.9004,-1610.3673,TEAM_BALLAS},
      {2590.2043,-1808.8383,2842.3,-1610.3673,TEAM_VAGOS}
};
new ZoneID[sizeof(ZoneInfo)];


Создаем 3 зоны.

Смотрим на эту строку:

Code

{2337.9004,-1808.8383,2590.2043,-1610.3673,TEAM_GROVE},


Code

2337.9004 - zMinX
-1808.8383 - zMinY
2590.2043 - zMaxX
-1610.3673 - zMaxY
TEAM_GROVE - zTeam


Координаты zMinX, zMinY, zMaxX, zMaxY нужны в функции GangZoneCreate.

В OnGameModeInit добавим:

Code

for(new i=0; i < sizeof(ZoneInfo); i++)
{
      ZoneID[i] = GangZoneCreate(ZoneInfo[i][zMinX], ZoneInfo[i][zMinY], ZoneInfo[i][zMaxX], ZoneInfo[i][zMaxY]);
}


Добавим паблик с цветами:

Code

stock GetTeamZoneColor(teamid)
{
      switch(teamid)
      {
          case TEAM_GROVE: return 0x00FF0088;
          case TEAM_BALLAS: return 0xFF00FF88;
          case TEAM_VAGOS: return 0xFFFF0088;
      }
      return -1;
}


В конце всех цветов цифра 88 она нужна для прозрачности.Если хотите сделать более прозрачными поставьте значение меньше 55 например.А если менее то AA.

Добавление зон:

Чтобы взять координаты зайдите на сервер или в дебаг мод.



Используйте /save в 2 точках,как на изображении:
1.Идите в 1 точку и введите "/save example min"
2.Идите в 2 точку и введите "/save example max"

Это можно найти в Мои документы\GTA San Andreas User Files\SAMP\savedpositions.txt

Там вы увидите:

Code

AddPlayerClass(107,1429.3770,-1732.4554,13.3828,355.2560,0,0,0,0,0,0); // example min
AddPlayerClass(107,1529.1932,-1592.1989,13.3828,90.5102,0,0,0,0,0,0); // example max


Вам нужны только:

Code

1429.3770,-1732.4554
1529.1932,-1592.1989


Теперь мы можем создать зону:

Code

1429.3770 - zMinX
-1732.4554 - zMinY
1529.1932 - zMaxX
-1592.1989 - zMaxY
TEAM_GROVE - zTeam


Добавьте в ZoneInfo:

Code

{1429.3770,-1732.4554,1529.1932,-1592.1989,TEAM_GROVE}


Должно выглядеть так:

Code

new ZoneInfo[][eZone] = {
      {2337.9004,-1808.8383,2590.2043,-1610.3673,TEAM_GROVE},
      {2084.7,-1808.8383,2337.9004,-1610.3673,TEAM_BALLAS},
      {2590.2043,-1808.8383,2842.3,-1610.3673,TEAM_VAGOS},
      {1429.3770,-1732.4554,1529.1932,-1592.1989,TEAM_GROVE}
};


Атака зоны:

Зоны готовы, теперь давайте сделаем их атакуемыми.

Добавляем вверху мода глобальные переменные:

Code

new ZoneAttacker[sizeof(ZoneInfo)] = {-1, ...};
new ZoneAttackTime[sizeof(ZoneInfo)];


Если война,то зона должна моргать.Добавим это в OnPlayerSpawn:

Code

for(new i=0; i < sizeof(ZoneInfo); i++)
{
      GangZoneShowForPlayer(playerid, ZoneID[i], GetTeamZoneColor(ZoneInfo[i][zTeam]));
      if(ZoneAttacker[i] != -1) GangZoneFlashForPlayer(playerid, ZoneID[i], GetTeamZoneColor(ZoneAttacker[i]));
}


Есть много способов начать войну на ганг зонах, но мы рассмотрим всего 2 способа.

Способ 1:

Для начала войны зайти на вражескую зону.

Code

#define TAKEOVER_TIME 120 // Сколько нужно секунд для захвата зоны
#define MIN_MEMBERS_TO_START_WAR 3 // Сколько нужно человек на вражеской зоне для начала захвата.


Это делаем для того чтобы было проще было регулировать настройки.

Code

new Teams[] = {
      TEAM_GROVE,
      TEAM_BALLAS,
      TEAM_VAGOS
};


Добавим функции:

Code

stock IsPlayerInZone(playerid, zoneid)
{
      new Float:x, Float:y, Float:z;
      GetPlayerPos(playerid, x, y, z);
      return (x > ZoneInfo[zoneid][zMinX] && x < ZoneInfo[zoneid][zMaxX] && y > ZoneInfo[zoneid][zMinY] && y < ZoneInfo[zoneid][zMaxY]);
}

stock GetPlayersInZone(zoneid, teamid)
{
      new count;
      for(new i=0; i < MAX_PLAYERS; i++)
      {
          if(IsPlayerConnected(i) && GetPlayerTeam(i) == teamid && IsPlayerInZone(i, zoneid))
          {
              count++;
          }
      }
      return count;
}


Добавим таймер в OnGameModeInit:

Code

SetTimer("ZoneTimer", 1000, true);


Добавляем паблик для таймера:

Code

public ZoneTimer()
{
      for(new i=0; i < sizeof(ZoneInfo); i++) // loop all zones
      {
          if(ZoneAttacker[i] != -1) // zone is being attacked
          {
              if(GetPlayersInZone(i, ZoneAttacker[i]) >= MIN_MEMBERS_TO_START_WAR) // team has enough members in the zone
              {
                  ZoneAttackTime[i]++;
                  if(ZoneAttackTime[i] == TAKEOVER_TIME) // zone has been under attack for enough time and attackers take over the zone
                  {
                      GangZoneStopFlashForAll(ZoneID[i]);
                      ZoneInfo[i][zTeam] = ZoneAttacker[i];
                      GangZoneShowForAll(ZoneID[i], GetTeamZoneColor(ZoneInfo[i][zTeam])); // update the zone color for new team
                      ZoneAttacker[i] = -1;
                  }
              }
              else // attackers failed to take over the zone
              {
                  GangZoneStopFlashForAll(ZoneID[i]);
                  ZoneAttacker[i] = -1;
              }
          }
          else // check if somebody is attacking
          {
              for(new t=0; t < sizeof(Teams); t++) // loop all teams
              {
                  if(Teams[t] != ZoneInfo[i][zTeam] && GetPlayersInZone(i, Teams[t]) >= MIN_MEMBERS_TO_START_WAR) // if there are enough enemies in the zone
                  {
                      ZoneAttacker[i] = Teams[t];
                      ZoneAttackTime[i] = 0;
                      GangZoneFlashForAll(ZoneID[i], GetTeamZoneColor(ZoneAttacker[i]));
                  }
              }
          }
      }
}


Готово. Теперь, если есть достаточно врагов в зоне, война начнется и продлится до того пока враги не останутся в зоне или были там достаточно времени, чтобы захватить ее.

Способ 2:

Чтобы начать войну, нужно убить несколько врагов на вражеской зоне.

Code

#define TAKEOVER_TIME 120 // Сколько нужно секунд для захвата зоны
#define MIN_MEMBERS_TO_START_WAR 3 // Сколько нужно убить игроков для начала захвата.


Это делаем для того чтобы было проще было регулировать настройки.

Добавим таймер в OnGameModeInit:

Code

SetTimer("ZoneTimer", 1000, true);


Добавляем паблик для таймера:

Code

public ZoneTimer()
{
      for(new i=0; i < sizeof(ZoneInfo); i++) // loop all zones
      {
          if(ZoneAttacker[i] != -1) // zone is being attacked
          {
              if(GetPlayersInZone(i, ZoneAttacker[i]) >= 1) // there must be at least 1 attacker left
              {
                  ZoneAttackTime[i]++;
                  if(ZoneAttackTime[i] == TAKEOVER_TIME) // zone has been under attack for enough time and attackers take over the zone
                  {
                      GangZoneStopFlashForAll(ZoneID[i]);
                      ZoneInfo[i][zTeam] = ZoneAttacker[i];
                      GangZoneShowForAll(ZoneID[i], GetTeamZoneColor(ZoneInfo[i][zTeam])); // update the zone color for new team
                      ZoneAttacker[i] = -1;
                  }
              }
              else // attackers failed to take over the zone
              {
                  GangZoneStopFlashForAll(ZoneID[i]);
                  ZoneAttacker[i] = -1;
              }
          }
      }
}


Теперь нужно вызвать атаку в OnPlayerDeath:

Code

if(IsPlayerConnected(killerid) && GetPlayerTeam(playerid) != GetPlayerTeam(killerid)) // not a suicide or team kill
{
      new zoneid = GetPlayerZone(playerid);
      if(zoneid != -1 && ZoneInfo[zoneid][zTeam] == GetPlayerTeam(playerid)) // zone member has been killed in the zone
      {
          ZoneDeaths[zoneid]++;
          if(ZoneDeaths[zoneid] == MIN_DEATHS_TO_START_WAR)
          {
              ZoneDeaths[zoneid] = 0;
              ZoneAttacker[zoneid] = GetPlayerTeam(killerid);
              ZoneAttackTime[zoneid] = 0;
              GangZoneFlashForAll(ZoneID[zoneid], GetTeamZoneColor(ZoneAttacker[zoneid]));
          }
      }
}


Добавляем вверх мода глобальную переменную:

Code

new ZoneDeaths[sizeof(ZoneInfo)];


Добавим функцию GetPlayerZone:

Code

stock GetPlayerZone(playerid)
{
      for(new i=0; i < sizeof(ZoneInfo); i++)
      {
          if(IsPlayerInZone(playerid, i))
          {
              return i;
          }
      }
      return -1;
}


Готово. Теперь, если достаточно убийств в зоне, война начнется и продлится до того пока враги не умрут или чтобы прошло достаточно времени чтобы она была захвачена.

Здесь используется GetPlayerTeam вы можете использовать другой способ.

Автор:MadeMan
Перевод:ZioHik
24.08.2012 в 21:27
Не кто не знает где нибуть есть Ганг Зоны так же для TDM Но с сохранением их ?
Или их тут как то можно сделать что бы они сохранялись с рестартом
18.12.2012 в 13:49
Сохраняйте в файл их ид и прочее а потом загружайте,вот и сохранение.
18.12.2012 в 14:43
Quote (ZioHik)
Сохраняйте в файл их ид и прочее а потом загружайте,вот и сохранени

извеняюсь smile
но можите описать как сохранить, а загрузить мы по примеру сделаем smile
через mxINI или ещё что нибуть smile
а то беда у нас с этими сохранениями cry
18.12.2012 в 18:10
Я сделал вообще крутяк))
04.06.2013 в 20:21
Форум | www.SAMP-TEAM.com » Wiki SA-MP » Уроки скриптинга в Pawno » Ганг зоны
  • Страница 1 из 1
  • 1
Поиск: