PDA

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



Kazoox
09.03.2016, 23:25
Приветствую. Есть у меня около 50-ти шлагбаумов/ворот и т.п. На данный момент в секундном таймере проверяется находится ли игрок хотя бы на одной из 50-ти координат и если да - создаёт чекпоинт (CreateDynamicCP), если игрок наступит на чекопинт идёт повторная проверка по 50-ти координатам и открывает уже нужные ворота и тд. Честно говоря, мне не очень нравится такая "схема", так как думаю что слишком много лишней работы поступает серверу. Есть вариант убрать проверки с секундного таймера и сделать на нажатие клавиши. В общем, посоветуйте как лучше сделать, координат собственно довольно много и результаты профилирования "кусаются" за счёт функции IsPlayerInRangeOfPoint.

DeimoS
10.03.2016, 00:01
Ну можешь для всех этих 50-и координат, например, создать пикап и потом перенести проверку координат из чекпоинта на кнопку, а проверки в таймере удалить

vovandolg
10.03.2016, 00:06
Конечно на кнопку лучше,
+ в оптимизации
+ в том что не будут открываться шлагбаумы и ворота если случайно туда наступите

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys == KEY_CROUCH) //Клавиша бибип
{
//Чтобы пешком не могли открыть можно проверку на нахождение в авто залепить
if(тут_проверка_на_координаты_что_мы_у_шлагбаума)
{
//Открываем ворота + Запуск таймера закрывания
}
}
return 1;
}

Kazoox
10.03.2016, 00:31
Ну можешь для всех этих 50-и координат, например, создать пикап и потом перенести проверку координат из чекпоинта на кнопку, а проверки в таймере удалить

На пикапы было бы хорошо всё перенести, но это довольно много времени уйдёт. А если на кнопку? И поставить там антифлудилку (с помощью gettime) на секунду-две чтобы не баловались? И опять же лучше ведь делать проверку == чем &, ведь если использовать & то будет очень много "лишних" срабатываний, например когда игрок будет идти зажимая левый альт, куча срабатываний. Посоветуйте что и как.

vovandolg
10.03.2016, 02:01
Выше дал же вариант, там не каких пикапов не надо создавать,
антифлуд туда припаять и нахождение в машине и будёт всё как по маслу..

ziggi
10.03.2016, 04:30
Зачем каждый раз создавать чекпоинт? CreateDynamicCP придуман как раз для того, чтобы этого не делать. Зачем проверять координаты при поднятии? Запиши в массив шлагбаумов ID каждого чекпоинта и сравнивай его с ID поднятого чекпоинта.

DeimoS
10.03.2016, 10:52
На пикапы было бы хорошо всё перенести, но это довольно много времени уйдёт. А если на кнопку? И поставить там антифлудилку (с помощью gettime) на секунду-две чтобы не баловались? И опять же лучше ведь делать проверку == чем &, ведь если использовать & то будет очень много "лишних" срабатываний, например когда игрок будет идти зажимая левый альт, куча срабатываний. Посоветуйте что и как.

Пикап там нужен только для того, чтоб люди видели где нажать кнопку для открытия шлакбаума. Всё остальное уже через OnPlayerKeyStateChange делается

Kazoox
10.03.2016, 12:17
Зачем каждый раз создавать чекпоинт? CreateDynamicCP придуман как раз для того, чтобы этого не делать. Зачем проверять координаты при поднятии? Запиши в массив шлагбаумов ID каждого чекпоинта и сравнивай его с ID поднятого чекпоинта.

А собственно сама функция CreateDynamicCP при использовании в таком количестве (в общем там до 100 чекпоинтов может выйти) не сильно будет нагружать систему? В общем какой вариант будет более "приятен" для системы, с кнопкой или с чекпоинтами? Как работает CreateDynamicCp? Я так понимаю с помощью данной функции мы вбиваем в список чекпоинтов чекпоинт, а потом уже система там через какой-то промежуток времени пробегает по этому списку сверяя координаты.

ziggi
10.03.2016, 15:08
А собственно сама функция CreateDynamicCP при использовании в таком количестве (в общем там до 100 чекпоинтов может выйти) не сильно будет нагружать систему? В общем какой вариант будет более "приятен" для системы, с кнопкой или с чекпоинтами? Как работает CreateDynamicCp? Я так понимаю с помощью данной функции мы вбиваем в список чекпоинтов чекпоинт, а потом уже система там через какой-то промежуток времени пробегает по этому списку сверяя координаты.
Streamer плагин тоже проверяет координаты игрока и чекпоинта, но он это делает намного эффективнее. Плагин делит карту на ячейки и проверяет позицию не всех элементов, а только тех, которые находятся в одной ячейке с игроком. Также, это всё реализовано на C++, что быстрее любой реализации стримера на Pawn.

Kazoox
11.03.2016, 18:06
Streamer плагин тоже проверяет координаты игрока и чекпоинта, но он это делает намного эффективнее. Плагин делит карту на ячейки и проверяет позицию не всех элементов, а только тех, которые находятся в одной ячейке с игроком. Также, это всё реализовано на C++, что быстрее любой реализации стримера на Pawn.

Я использую CreateDynamicCp при загрузке мода, с пропуском параметра playerid, то есть для всех игроков. Может лучше их как-нибудь поделить группы этак на 2: чекпоинты которые появляются когда игрок пешком (если это допустим вход в здание) и чекпоинты которые появляются когда игрок в машине? Но все равно ведь придется каждую секунду создавать и удалять туда-сюда эти чекпоинты. В общем стоит ли оно того в плане оптимизации или нет? Я про то стоит ли делить на такие "группы". Еще как вариант можно чекпоинты использовать для выхода/входа и для открытия/закрытия ворот, а для всего остального, ну к примеру вызов меню банкомата или окончание рабочего дня использовать вызов кода на кнопку, тот же альт? Посоветуйте.
P.S собственно в OnGamemeModeInit у меня около 200 чекпоинтов.

Kazoox
11.03.2016, 22:29
Актуально-актуально

Kazoox
12.03.2016, 14:50
Актуально

Я использую CreateDynamicCp при загрузке мода, с пропуском параметра playerid, то есть для всех игроков. Может лучше их как-нибудь поделить группы этак на 2: чекпоинты которые появляются когда игрок пешком (если это допустим вход в здание) и чекпоинты которые появляются когда игрок в машине? Но все равно ведь придется каждую секунду создавать и удалять туда-сюда эти чекпоинты. В общем стоит ли оно того в плане оптимизации или нет? Я про то стоит ли делить на такие "группы". Еще как вариант можно чекпоинты использовать для выхода/входа и для открытия/закрытия ворот, а для всего остального, ну к примеру вызов меню банкомата или окончание рабочего дня использовать вызов кода на кнопку, тот же альт? Посоветуйте.
P.S собственно в OnGamemeModeInit у меня около 200 чекпоинтов.