PDA

Просмотр полной версии : [Вопрос] PlayerToKvadrat



lonin
15.09.2014, 01:26
Здравствуйте уважаемые форумчане!

Возникла проблема с использованием функции PlayerToKvadrat(playerid,Float:min_x,Float:min_y,Float:max_x,Float:max_y)

В общем у меня есть 3 глобальные переменные координат, в которые неважно каким образом, записываются координаты зараженной радиацией зоны:



new Float:posJad[MAX_PLAYERS][3];


Где posJad[playerid][0] - ось Х, posJad[playerid][1] - ось У и posJad[playerid][2] - ось Z.

Сделал системку которая при попадании человека в зону Хmin, Ymin, Xmax, Ymax будет отниматься по 0,5 ХП в секунду (использую паблик OnPlayerUpdate):



for(new x = 0; x < MAX_PLAYERS; x++)
{
if(PlayerToKvadrat(x,posJad[x][0]+30, posJad[x][1]+30,posJad[x][0]-30, posJad[x][1]-30) && radionucT > 0)
{
new Float:health;
radionucT -=1;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health - 0.5);
}
}


Результат равен нулю, помогите советом! Благодарность обеспечена!

#Vito
15.09.2014, 01:42
паблик OnPlayerUpdate обновляется 25 раз в секунду, а Вы там еще цикл всех игроков используете

lonin
15.09.2014, 01:47
паблик OnPlayerUpdate обновляется 25 раз в секунду, а Вы там еще цикл всех игроков используете

Спасибо за помощь! :thank_you: Но я не спрашивал, сколько он раз обновляется в секунду :D Я не использую его, для примера написал)

#Vito
15.09.2014, 01:50
Ну тогда, в
PlayerToKvadrat нужно вводить координаты не игрока, а GangZone

lonin
15.09.2014, 01:56
Ты вообще мой первый пост читал? :help: У меня там не координаты игрока :D

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

И да, PlayerToKvadrat это не обязательно GangZona, это просто ф-ция проверяющая игрока в квадрате.

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

там координаты минимальные по Х,У и максимальные по тем же осям.

#Vito
15.09.2014, 02:01
А что тогда?

new Float:posJad[MAX_PLAYERS][3];
if(PlayerToKvadrat(x,posJad[x][0]+30, posJad[x][1]+30,posJad[x][0]-30, posJad[x][1]-30) && radionucT > 0)
И, мб, ты квадрат не создал..

lonin
15.09.2014, 03:08
А что тогда?

new Float:posJad[MAX_PLAYERS][3];
if(PlayerToKvadrat(x,posJad[x][0]+30, posJad[x][1]+30,posJad[x][0]-30, posJad[x][1]-30) && radionucT > 0)
И, мб, ты квадрат не создал..

posJad[playerid][0] - ось Х, posJad[playerid][1] - ось У и posJad[playerid][2] - ось Z.

В PlayerToKvadrat:

posJad[x][0]+30 - Xmin, posJad[x][1]+30 - Ymin, posJad[x][0]-30 - Xmax, posJad[x][1]-30 - Ymax; Это глобальные переменные в которые, ранние были записаны координаты...

На сколько я помню для функции PlayerToKvadrat, не нужно создавать никаких "квадратов", вот сток:


stock PlayerToKvadrat(playerid,Float:min_x,Float:min_y,Float:max_x,Float:max_y)
{
new Float:xxp,Float:yyp,Float:zzp;
GetPlayerPos(playerid, xxp, yyp, zzp);
if((xxp <= max_x && xxp >= min_x) && (yyp <= max_y && yyp >= min_y)) return 1;
return 0;
}

Вот какие нужны координаты(верхняя левая и нижняя правая квадрата) :
http://i.imgur.com/Tr3Y5Wx.png?1
Вот пример применения:



if(strcmp(cmdtext,"/primer",true)==0)
{
if(!PlayerToKvadrat(playerid,-322.671722, -1436.344726, -154.671722, -1308.344726)) return SendClientMessage(playerid, COLOR_WHITE, "Вы не в квадрате!");
}

DeimoS
15.09.2014, 07:23
Эмм, разве не так должно быть?

for(new x = 0; x < MAX_PLAYERS; x++)
{
if(PlayerToKvadrat(x, posJad[x][0]-30, posJad[x][1]+30, posJad[x][0]-30, posJad[x][1]+30) && radionucT > 0)
{
new Float:health;
radionucT -=1;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health - 0.5);
}
}
Если не сработает, просто сделайте логирование и посмотрите какие значения выдаёт массив

for(new x = 0; x < MAX_PLAYERS; x++)
{
printf("%f, %f, %f, %f", posJad[x][0]-30, posJad[x][1]+30, posJad[x][0]-30, posJad[x][1]+30);
if(PlayerToKvadrat(x, posJad[x][0]-30, posJad[x][1]+30, posJad[x][0]-30, posJad[x][1]+30) && radionucT > 0)
{
new Float:health;
radionucT -=1;
GetPlayerHealth(playerid, health);
SetPlayerHealth(playerid, health - 0.5);
}
}
И логи уже скиньте нам. Ибо дело явно в вашем массиве. Не может же функция, которая у остальных работает, у вас вдруг перестать работать.

P.S. И да, надеюсь вы и правда не собирались вставлять цикл на всех игроков в коллбэк, который вызывается индивидуально для каждого игрока туеву тучу раз.

lonin
15.09.2014, 12:15
Проблема решена, ответы в теме были пустые :stop: Всем спасибо, все свободны :wacko:

OKStyle
15.09.2014, 13:19
http://i.imgur.com/Tr3Y5Wx.png?1
maxY будет вверху.

DeimoS
15.09.2014, 15:22
Проблема решена, ответы в теме были пустые :stop: Всем спасибо, все свободны :wacko:

Ну так поделитесь со всеми тем, как всё исправили. Не жадничайте =(