PHP код:
#define DISTANCE_CAPTURE (20.0) //Максимальный радиус до определения ближайшей дружественной терры
CMD:capture(playerid, params[])
{
if(!pTemp[playerid][pLogined] || !IsAGang(playerid)) return 1;
if(pData[playerid][pRank] < 7)
return SendClientMessage(playerid, COLOR_LIGHTRED, "Функция доступна с 7 ранга и выше!");
new faction = pData[playerid][pFraction];
if(IsPlayerInBandOnline(faction) < 1)
return SendClientMessage(playerid, COLOR_GREY, "В вашей банде мало игроков онлайн!");
if(!IsInAllowed(playerid))
return SendClientMessage(playerid, COLOR_GREY, "Ваша банда уже участвует в захвате зон!");
if(zGangTime[faction] <= 0)
return SendClientMessage(playerid, -1, "Сегодня ваша банда больше не может участвовать в захвате");
if(IsCapture == 1)
return SendClientMessage(playerid, COLOR_GREY, "Уже происходит захват одной из зон. Дождитесь окончания!");
new string[256], h,
Float:qX, Float:qY, Float:pZZ,
bool:dostup = false,
bool:guadro_find = false
terraid;
gettime(h);
if(!(13 <= h <= 23))
return SendClientMessage(playerid, CGRAY, "Использовать команду можно только с 13:00 до 23:00");
GetPlayerPos(playerid, pZZ, pZZ, pZZ);
//с какого ID начинается терра укажи в "new i"
//как правильно называется максимальная константа ганг зон?
for(new i = 0; i < MAX_GZONE; i++)
{
//Если под итерацию попала дружественная терра
//то чекаем каптёра в её радиусе
if(dostup == false && GZMZ[i][gFrak] == pData[playerid][pFraction])
{
GetCenterOfSquare(GZMZ[i][gCoords][0], GZMZ[i][gCoords][1], GZMZ[i][gCoords][2], GZMZ[i][gCoords][3], qX, qY);
if(IsPlayerInRangeOfPoint(playerid, DISTANCE_CAPTURE, qX, qY, pZZ) == 1)
dostup = true; //найдена ближайшая дружественная терра
}
//поиск вражеской терры(на которой стоит каптёр) для капта
if(guadro_find == false && ZoneOnBattle[i] == 0
&& PlayerToKvadrat(playerid, GZMZ[i][gCoords][0], GZMZ[i][gCoords][1], GZMZ[i][gCoords][2], GZMZ[i][gCoords][3]))
{
switch(i)
{
case 1..5:
return SendClientMessage(playerid, COLOR_GREY, "Эта основная территория банды её нельзя захватить");
default:
{
if(IsPlayerInBandOnline(GZMZ[i][gFrak]) < 1)
return SendMes(playerid, COLOR_GREY, "У банды \"%s\" мало игроков!", GetGangName(GZMZ[i][gFrak]));
guadro_find = true;
terraid = i;
}
}
}
if(dostup == true && guadro_find == true)
break; //всё готово, выходим из этой путаны и идём дальше
}
//терры могли пройти все и без доступа, но теперь запасная проверка и всё под контролем
if(dostup == false && guadro_find == true)
return SendClientMessage(playerid, COLOR_GREY, "Данную территорию нельзя завоевать. Нужно находится возле своей территории!");
format(string, 256, ""W"Эта территория принадлежит %s\nВы уверены что хотите её захватить?", GetGangName(GZMZ[terraid][gFrak]));
ShowPlayerDialog(playerid, dZaxvat, DIALOG_STYLE_MSGBOX, "{F3FF02}Захват территории", string, "Да", "Нет");
//это я так и не понял до каптура или после
if(FrakCD > 0)
{
format(string, 128, "До следующего захвата территории %d минут.", floatround(FrakCD/60));
SendClientMessage(playerid, CGRAY, string);
return 1;
}
return 1;
}
//функция для нахождения центра в прямоугольнике/квадрате(спасибо ziggi)
stock GetCenterOfSquare(Float:x1, Float:y1, Float:x2, Float:y2, &Float:cx, &Float:cy)
{
cx = (x1 + x2) / 2.0;
cy = (y1 + y2) / 2.0;
}