Завтра напишу)
Вид для печати
Завтра напишу)
Что ж, если верить тому набору координат, порядок расположения гангзон следующий:
Итого получаем матрицу 10x13.Код:
0 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
...
120 121 122 123 124 125 126 127 128 129
Для начала введём константы под кол-во гангзон в ширину и в высоту:
Теперь представим ситуацию, когда происходит захват территории.PHP код:
const
GZ_GRID_WIDTH = 10,
GZ_GRID_HEIGHT = 13;
ID банды захватчиков будет записан в переменной attacker.
ID захватываемой гангзоны будет записан в переменной zoneid.
Теперь нужно проверить, принадлежат ли захватчику территории вокруг места захвата:
Но что делать, если захватываемая территория находится на самом краю матрицы?PHP код:
if( (gz_info[zoneid-GZ_GRID_WIDTH][gzOwner] == attacker)// север
|| (gz_info[zoneid+GZ_GRID_WIDTH][gzOwner] == attacker)// юг
|| (gz_info[zoneid+1][gzOwner] == attacker) // восток
|| (gz_info[zoneid-1][gzOwner] == attacker)) // запад
Например, возьмём территорию под номером 4. При проверке территории со стороны севера получим территорию с номером -4 и словим выход за пределы массива.
Поэтому усложним проверку, чтобы учесть такой вариант:
PHP код:
if( (zoneid / GZ_GRID_WIDTH != 0) // если территория не на северной крайней линии
&& (gz_info[zoneid-GZ_GRID_WIDTH][gzOwner] == attacker) // проверим соседнюю территорию на севере
|| (zoneid / GZ_GRID_WIDTH != GZ_GRID_HEIGHT-1) // ...
&& (gz_info[zoneid+GZ_GRID_WIDTH][gzOwner] == attacker) // юг
|| (zoneid % GZ_GRID_WIDTH != GZ_GRID_WIDTH-1)
&& (gz_info[zoneid-1][gzOwner] == attacker) // восток
|| (zoneid % GZ_GRID_WIDTH != 0)
&& (gz_info[zoneid-1][gzOwner] == attacker)) // запад
Ну вот с мода команда /capture...
PHP код:
CMD:capture(playerid, params[])
{
if(CaptureTime > 0 && CaptureStatus == true) return SendClientMessage(playerid,0xAFAFAFAA, "На данный момент уже идет захват территории!");
new Float:Xcoord, Float:Ycoord, Float:Zcoord;
GetPlayerPos(playerid, Xcoord,Ycoord,Zcoord);
new i =-1;
while(++i < sizeof(GZInfo)) if((Xcoord >= GZInfo[i][pX_coord_zone1] && Xcoord <= GZInfo[i][pX_coord_zone2]) && (Ycoord >= GZInfo[i][pY_coord_zone1] && Ycoord <= GZInfo[i][pY_coord_zone2])) break;
if(GZInfo[i][pGang] == GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Данная территория пренадлежит вам!");
switch(GZInfo[i][pID])
{
case 28,34,46,56,98,102,103,108: return SendClientMessage(playerid,0xAFAFAFAA, "Данную территорию каптить нельзя! Выберите другую зону!");
case 0: if(GZInfo[i+1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i+10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
case 9: if(GZInfo[i-1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i+10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
case 120: if(GZInfo[i+1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
case 129: if(GZInfo[i-1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
case 1..8: if(GZInfo[i+1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i+10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
case 121..128: if(GZInfo[i+1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
case 19,29,39,49,59,69,79,89,99,109,119: if(GZInfo[i-1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
case 10,20,30,40,50,60,70,80,90,100,110: if(GZInfo[i+1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
default: if(GZInfo[i+1][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-1][pGang] != GetPVarInt(playerid,"Gang")&& GZInfo[i+10][pGang] != GetPVarInt(playerid,"Gang") && GZInfo[i-10][pGang] != GetPVarInt(playerid,"Gang")) return SendClientMessage(playerid,0xAFAFAFAA, "Выберите другую зону, которая соединена с вашей территорией!");
}
А что ты хотел, когда взялся программировать? -_- Чтоб всё за тебя писалось, а ты лишь сидел и чаёк попивал? Можешь написать свою систему гангзон с нуля и там учесть новые потребности, придумав особый тип записи захваченных территорий. Нужно лишь включить голову и всё обязательно получится.
P.S. Самое простое - поиграться с одним массивом и циклом. Кажется, Стас именно это и предлагает (не читал весь его пост).