ZioHik | Дата: Пятница, 24.08.2012, 21:27 | Сообщение # 1 |
.::Offline::.
http://u.to/N46EAw
Сообщений: 831
[ 82 ]
Награды: 29
Статус
отсутствует
| Война за ганг зоны.
Если у вас уже есть созданные команды то читаем дальше если нет,то 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
|
|
| |
SeryogaPlus | Дата: Вторник, 18.12.2012, 13:49 | Сообщение # 2 |
.::Offline::.
Разбойник
Сообщений: 39
[ 0 ]
Награды: 0
Статус
отсутствует
| Не кто не знает где нибуть есть Ганг Зоны так же для TDM Но с сохранением их ? Или их тут как то можно сделать что бы они сохранялись с рестартом
|
|
| |
ZioHik | Дата: Вторник, 18.12.2012, 14:43 | Сообщение # 3 |
.::Offline::.
http://u.to/N46EAw
Сообщений: 831
[ 82 ]
Награды: 29
Статус
отсутствует
| Сохраняйте в файл их ид и прочее а потом загружайте,вот и сохранение.
|
|
| |
SeryogaPlus | Дата: Вторник, 18.12.2012, 18:10 | Сообщение # 4 |
.::Offline::.
Разбойник
Сообщений: 39
[ 0 ]
Награды: 0
Статус
отсутствует
|
|
|
| |