PDA

Просмотр полной версии : [Вопрос] Довести до ума.



Redo
04.12.2016, 22:44
Помогите доделать систему каптов,хуть я и знаю математику на базе 9 классов,но мне это еще как-то сложно..,а именно: Я пытался сделать проверку на близ стоящие территории..То есть что бы когда игрок писал команду /capture в квадрате который не соприкасается с территорий его банды ему писала типо "Данную территорию нельзя завоевать. Нужно находиться возле своей территории!"
Вот код

CMD:capture(playerid, params[])
{
if(!pTemp[playerid][pLogined]) return 1;
new string[256];
if(IsAGang(playerid))
{
new h, ZonePos[MAX_PLAYERS]; gettime(h);
if(h < 13 || h > 23 ) return SendClientMessage(playerid, CGRAY, "Использовать команду можно только с 13:00 до 23:00");
if(pData[playerid][pRank] < 7) return SendClientMessage(playerid,COLOR_LIGHTRED,"Функция доступна с 7 ранга и выше!");
new faction = pData[playerid][pFraction];
if(!IsInAllowed(playerid)) return SendClientMessage(playerid, COLOR_GREY, "Ваша банда уже учавствует в захвате зон!");
if(zGangTime[faction] <= 0) return SendClientMessage(playerid, -1, "Сегодня ваша банда больше не может учавствовать в захвате");
new bool: dostup = false;
for(new i; i < MAX_GZONE;i++)
{
if(PlayerToKvadrat(playerid,GZMZ[i][gCoords][0], GZMZ[i][gCoords][1],GZMZ[i][gCoords][2],GZMZ[i][gCoords][3]) && ZoneOnBattle[i] == 0)
{
ZonePos[playerid] = i;
switch(i)
{
case 1, 2, 3, 4, 5: dostup = true;
}
if(dostup == true) return SendClientMessage(playerid, COLOR_GREY, "Эта основная территория банды её нельзя захватить");
}
}
for(new i; i < MAX_GZONE;i++)
{
if ((PlayerToKvadrat(playerid,GZMZ[ZonePos[playerid]][gCoords][0], GZMZ[ZonePos[playerid]][gCoords][1],GZMZ[i][gCoords][2],GZMZ[i][gCoords][3]) || PlayerToKvadrat(playerid,GZMZ[i][gCoords][0], GZMZ[i][gCoords][1],GZMZ[ZonePos[playerid]][gCoords][2],GZMZ[ZonePos[playerid]][gCoords][3]))&& ZoneOnBattle[i] == 0)
{

if(GZMZ[i][gFrak] != pData[playerid][pFraction]) return SendClientMessage(playerid, COLOR_GREY, "Данную территорию нельзя завоевать. Нужно находится возле своей территории!");
}
}
if(FrakCD > 0)
{
new fd[128];
format(fd,128,"До следующего захвата территори %d минут.", floatround(FrakCD/60));
SendClientMessage(playerid,CGRAY,fd);
return 1;
}
for(new i=1;i<=TOTALGZ;i++)
{
if(PlayerToKvadrat(playerid,GZMZ[i][gCoords][0], GZMZ[i][gCoords][1],GZMZ[i][gCoords][2],GZMZ[i][gCoords][3]) && ZoneOnBattle[i] == 0)
{
if(IsPlayerInBandOnline(faction) < 1) return SendMes(playerid,COLOR_GREY, "В вашей банде мало игроков онлайн!");
if(IsPlayerInBandOnline(GZMZ[i][gFrak]) < 1) return SendMes(playerid,COLOR_GREY, "У банды \"%s\" мало игроков!", GetGangName(GZMZ[i][gFrak]));
if(IsCapture == 1) return SendClientMessage(playerid, COLOR_GREY, "Уже происходит захват одной из зон. Дождитесь окончания!");
format(string, 2024, ""W"Эта территория принадлежит %s\nВы уверены что хотите её захватить?",GetGangName(GZMZ[i][gFrak]));
ShowPlayerDialog(playerid,dZaxvat,DIALOG_STYLE_MSGBOX,"{F3FF02}Захват территории",string,"Да","Нет");
}
}
}
return true;
}


Конкретно сейчас фразу "Данную территорию нельзя завоевать. Нужно находиться возле своей территории!" пишет когда я пытаюсь захватить любой квадрат..даже своей банды...

vovandolg
05.12.2016, 15:14
#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;
}


Радиус только сам настрой и фсё.

Обновил.

Redo
05.12.2016, 17:49
Огромное спасибо!
Только вот жалуется на эти строки


Float:qX, Float:qY, Float:pZ, //строка 13637
GetPlayerPos(playerid, pZ, pZ, pZ); //строка 13644
if(IsPlayerInRangeOfPoint(playerid, DISTANCE_CAPTURE, qX, qY, pZ) == 1) //строка 13655
format(string, 256, ""W"Эта территория принадлежит %s\nВы уверены что хотите её захватить?", GetGangName(GZMZ[i][gFrak])); //строка 13677

(13637) : warning 219: local variable "pZ" shadows a variable at a preceding level
(13644) : error 035: argument type mismatch (argument 2)
(13655) : error 001: expected token: ";", but found "if"
(13655) : warning 213: tag mismatch
(13677) : error 017: undefined symbol "i"
(13637) : warning 203: symbol is never used: "pZ"

StevenH
05.12.2016, 20:26
Float:qX, Float:qY, Float:qZ, //строка 13637
GetPlayerPos(playerid, qX, qY, qZ); //строка 13644
if(IsPlayerInRangeOfPoint(playerid, DISTANCE_CAPTURE, qX, qY, qZ) == 1)

Redo
05.12.2016, 20:37
Теперь вот что
(13653) : error 001: expected token: ";", but found "if"
(13675) : error 017: undefined symbol "i"


if(IsPlayerInRangeOfPoint(playerid, DISTANCE_CAPTURE, qX, qY, qZ) == 1) // строка (13653)
format(string, 256, ""W"Эта территория принадлежит %s\nВы уверены что хотите её захватить?", GetGangName(GZMZ[i][gFrak])); // строка (13675)

Redo
05.12.2016, 22:07
Вообщем ничего хорошего из этого всего не вышло...
Когда пишу /capture в любом месте даже не в гетто.. Пишет вы не можете захватить Ацтеков..
И еще всякой хрени там куча..Перепутано все!:sad:
Ну все ровно большое спасибо всем за старание..Буду ломать голова дальше..С меня + :good:

vovandolg
05.12.2016, 23:35
Я тебе дал готовый примерочный код, но ты его видимо перековырял на свой лад и сделал это не правильно, вставь ещё раз мой код без всяких изменений и попробуй скомпилируй!

Redo
06.12.2016, 00:46
Я тебе дал готовый примерочный код, но ты его видимо перековырял на свой лад и сделал это не правильно, вставь ещё раз мой код без всяких изменений и попробуй скомпилируй!

Вставил вот это ко всем дефайнам #define DISTANCE_CAPTURE (20.0)
и код вставил без всяких изменений..и вот что вышло..


warning 219: local variable "pZ" shadows a variable at a preceding level
error 035: argument type mismatch (argument 2)
error 001: expected token: ";", but found "if"
warning 213: tag mismatch
error 017: undefined symbol "i"
warning 203: symbol is never used: "pZ"

Redo
06.12.2016, 02:00
И можно ли вот это вставить как то в код?Только оно не совсем правильно работает...



for(new i; i < MAX_GZONE;i++)
{
if ((PlayerToKvadrat(playerid,GZMZ[ZonePos[playerid]][gCoords][0], GZMZ[ZonePos[playerid]][gCoords][1],GZMZ[i][gCoords][


2],GZMZ[i][gCoords][3]) || PlayerToKvadrat(playerid,GZMZ[i][gCoords][0], GZMZ[i][gCoords][1],GZMZ[ZonePos[playerid]][gCoords][


2],GZMZ[ZonePos[playerid]][gCoords][3]))&& ZoneOnBattle[i] == 0)
{

if(GZMZ[i][gFrak] != pData[playerid][pFraction]) return SendClientMessage(playerid, COLOR_GREY, "Данную территорию нельзя завоевать. Нужно находится возле своей территории!");
}
}

vovandolg
06.12.2016, 05:16
И можно ли вот это вставить как то в код?Только оно не совсем правильно работает...



for(new i; i < MAX_GZONE;i++)
{
if ((PlayerToKvadrat(playerid,GZMZ[ZonePos[playerid]][gCoords][0], GZMZ[ZonePos[playerid]][gCoords][1],GZMZ[i][gCoords][


2],GZMZ[i][gCoords][3]) || PlayerToKvadrat(playerid,GZMZ[i][gCoords][0], GZMZ[i][gCoords][1],GZMZ[ZonePos[playerid]][gCoords][


2],GZMZ[ZonePos[playerid]][gCoords][3]))&& ZoneOnBattle[i] == 0)
{

if(GZMZ[i][gFrak] != pData[playerid][pFraction]) return SendClientMessage(playerid, COLOR_GREY, "Данную территорию нельзя завоевать. Нужно находится возле своей территории!");
}
}


Обновил свой код который выше, попробуй.

- - - Добавлено - - -




Float:qX, Float:qY, Float:qZ, //строка 13637
GetPlayerPos(playerid, qX, qY, qZ); //строка 13644
if(IsPlayerInRangeOfPoint(playerid, DISTANCE_CAPTURE, qX, qY, qZ) == 1)


Тут не путайте координаты квадрата и игрока, от квадрата X и Y всего лишь нужны, а от игрока Z.

StevenH
06.12.2016, 19:21
Обновил свой код который выше, попробуй.

- - - Добавлено - - -



Тут не путайте координаты квадрата и игрока, от квадрата X и Y всего лишь нужны, а от игрока Z.

Извиняюсь, у человека были ошибки, какие он строки предоставил, те я и исправил). Весь код не смотрел.. :clapping:

Redo
06.12.2016, 19:41
Обновил свой код который выше, попробуй.

- - - Добавлено - - -



Тут не путайте координаты квадрата и игрока, от квадрата X и Y всего лишь нужны, а от игрока Z.

Все почти хорошо только одну ошибку выдает
(13681) : error 017: undefined symbol "i"
На эту строку


format(string, 256, ""W"Эта территория принадлежит %s\nВы уверены что хотите её захватить?", GetGangName(GZMZ[i][gFrak]));

vovandolg
12.12.2016, 18:49
Все почти хорошо только одну ошибку выдает
(13681) : error 017: undefined symbol "i"
На эту строку


format(string, 256, ""W"Эта территория принадлежит %s\nВы уверены что хотите её захватить?", GetGangName(GZMZ[i][gFrak]));


Угу, исправил, ещё раз посмотри код)