PDA

Просмотр полной версии : [Вопрос] Ограничение игровой зоны



Profyan
03.08.2016, 22:46
Всем привет.На повестке дня(ночи?) такая проблема:
Есть массив из точек на карте,который потом используется для создания полигона.
Мне нужно,чтобы игроки,когда выходили за пределы границы полигона, возвращались обратно.

Сначала я решил задачу "в лоб" - каждую секунду сохранял позицию игрока,если он не в интерьере и в игровой зоне.Если он выходит за пределы границы полигона,то его возвращает на последние сохранившиеся координаты. Но как оказалось, через этот "барьер" легко пройти.

Возникла еще идея: когда игрок вышел из игровой зоны,то его телепортировать к ближайшей точке полигона.Но было бы не совсем разумно телепортировать игрока в то место,где он не был(т.к. точки полигона - это его вершины, а если,допустим, игрок вышел между двумя вершинами,то его телепортнет к ближайшей,т.е. там где его не было). И тут тогда еще один вопрос возникает: как узнать промежуточные точки полигона? Т.е точки прямой,которая соединяет две вершины полигона.


UPD: Только сейчас понял,что точки для полигона представлены только координатами X и Y(без Z). Поэтому мой вариант наверняка отметается,либо подключать ColAndreas или MapAndreas,что не очень хорошо. Поэтому жду идею)
Ну а если у вас есть более разумная идея,то рад буду ее услышать.

Battista
04.08.2016, 04:37
Кстати да, тоже бы хотел услышать решение
Т.к тоже нашел точки полигона нашел и хочу ограничить для игрока остальные территории

Роуди.
06.08.2016, 00:49
Для меня так же актуально.

vovandolg
06.08.2016, 01:02
Может быть каждую секунду чекать координаты игрока когда он на полигоне,
а когда за ним не чекать и делать телепорт на последние сейвы координат?
Я вот к каждому своему серву всегда пишу античит и там есть запись чтобы ловить NOP и прочюю ерунду на телепорты/аиры
У меня бы допустим это был изи код, а Вам не знаю...:smoke:

Profyan
06.08.2016, 05:25
Может быть каждую секунду чекать координаты игрока когда он на полигоне,
а когда за ним не чекать и делать телепорт на последние сейвы координат?
Я вот к каждому своему серву всегда пишу античит и там есть запись чтобы ловить NOP и прочюю ерунду на телепорты/аиры
У меня бы допустим это был изи код, а Вам не знаю...:smoke:


Сначала я решил задачу "в лоб" - каждую секунду сохранял позицию игрока,если он не в интерьере и в игровой зоне.Если он выходит за пределы границы полигона,то его возвращает на последние сохранившиеся координаты. Но как оказалось, через этот "барьер" легко пройти.

На данный момент поставил сохранение координат раз в 5 секунд и в эти же 5 секунд проверяю флаг(игрок в полигоне или нет). Если в полигоне,то сохраняем координаты,иначе телепортируем на предыдущие сохраненные и никто не отменял код в колбеках OnPlayerEnterDynamicArea и OnPlayerLeaveDynamicArea.. Пришлось еще в OnPlayerInteriorChange делать флаг,если игрок в стандартном интерьере,то его не трогать.И пришлось в каждый телепорт в самописный интерьер,который находится вне границы полигона, тоже добавлять этот флаг.

Не знаю на сколько это профитный вариант решения проблемы,но обычным способом не смог обойти. За читеров отвечает античит... И так же не знаю,на сколько этот способ оптимизирован и вообще имеет ли место быть?! Ибо столько костылей,но если это принять как должное для SA:MP, то все отлично)

Seregamil
06.08.2016, 06:23
Дааа, давайте, записывайте каждую секунду координаты, майтесь неведомой фигней, а потом спрашивайте, А ШО ТАК ВСЁ ТУПИТ!!!?!

Делал уже такую систему. Объясню.
Смотри. У тебя пользователь находится в границах полигона. Ты заранее можешь узнать центр полигона. При выходе с него - разворачиваешь игрока к центру полигона(SetPlayerFacingAngle / SetVehicleZAngle) и выталкиваешь с границ функцией Set(Player/Vehicle)Pos. Никаких таймеров и записей не надо.

vovandolg
06.08.2016, 12:37
А ШО ТАК ВСЁ ТУПИТ!!!?!

У меня что то не тупило не чего, хотя с моим то буком всё возможно
А если у тебя винда 98 и пентиум первый это твои проблемы:crazy:

Seregamil
06.08.2016, 13:16
У меня что то не тупило не чего, хотя с моим то буком всё возможно
А если у тебя винда 98 и пентиум первый это твои проблемы:crazy:

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

Нужно делать для всех игроков, а не для тех, у кого мощные пекарни.

Profyan
06.08.2016, 20:09
Дааа, давайте, записывайте каждую секунду координаты, майтесь неведомой фигней, а потом спрашивайте, А ШО ТАК ВСЁ ТУПИТ!!!?!

Делал уже такую систему. Объясню.
Смотри. У тебя пользователь находится в границах полигона. Ты заранее можешь узнать центр полигона. При выходе с него - разворачиваешь игрока к центру полигона(SetPlayerFacingAngle / SetVehicleZAngle) и выталкиваешь с границ функцией Set(Player/Vehicle)Pos. Никаких таймеров и записей не надо.

Отличный вариант,но если допустим игрок телепортнулся очень далеко от полигона,то откуда я узнаю,на какое мне кол-во координат сдвигать?

И еще: как узнать центр полигона?

vovandolg
06.08.2016, 23:05
Да, у меня пентиум и 2гб оперативы.
И да. при таких жутких лагах я выберу другой сервер и буду переманивать своих друзей туда. И эта логика у многих людей.

Нужно делать для всех игроков, а не для тех, у кого мощные пекарни.

Знаешь я тоже так говорил когда то и тут и ещё кое где в соц сети,
но опять же какие друзья реальные? пойди в бар пивка с ними разлей и гуляйте
виртуальные? боюсь что не все будут ради одного пипла играть с ним на малофункциональном сервере
то что тут тебя лайкают поддерживают это не значит что вот так вот прям и будет, нет, я это уже прошёл,
такие виртуозы сливаются толпой в один интересный серв потому что у них тянет и им там норм,
а ты 1 тот который не смог там нормально играть и они тебе вечно говорят:
- "обнови железо что ты как .... не знаю кто там"

Sp1ke
07.08.2016, 01:53
Знаешь я тоже так говорил когда то и тут и ещё кое где в соц сети,
но опять же какие друзья реальные? пойди в бар пивка с ними разлей и гуляйте
виртуальные? боюсь что не все будут ради одного пипла играть с ним на малофункциональном сервере
то что тут тебя лайкают поддерживают это не значит что вот так вот прям и будет, нет, я это уже прошёл,
такие виртуозы сливаются толпой в один интересный серв потому что у них тянет и им там норм,
а ты 1 тот который не смог там нормально играть и они тебе вечно говорят:
- "обнови железо что ты как .... не знаю кто там"

Ты можешь читать, что пишешь перед тем как отправлять посты на форуме? Люди многие твои посты просто не понимают из-за неправильной формулировки и подачи текста.

vovandolg
07.08.2016, 02:22
Ты можешь читать, что пишешь перед тем как отправлять посты на форуме? Люди многие твои посты просто не понимают из-за неправильной формулировки и подачи текста.

Знаки препинания расставил вроде как надо, что ты не уловил в том тексте?)

Seregamil
07.08.2016, 07:08
Отличный вариант,но если допустим игрок телепортнулся очень далеко от полигона,то откуда я узнаю,на какое мне кол-во координат сдвигать?

И еще: как узнать центр полигона?

Центр полигона. Думаю разберешься.
http://www.codeproject.com/Questions/403154/Finding-Middle-point-of-Polygon

Если игрок телепортнулся очень далеко от полигона, то так же и ставь его к границе
Абстрактно, но вроде понятно. http://image.prntscr.com/image/beca7cef3a2643189c8185cf52ad1cc1.png


Знаешь я тоже так говорил когда то и тут и ещё кое где в соц сети,
но опять же какие друзья реальные? пойди в бар пивка с ними разлей и гуляйте
виртуальные? боюсь что не все будут ради одного пипла играть с ним на малофункциональном сервере
то что тут тебя лайкают поддерживают это не значит что вот так вот прям и будет, нет, я это уже прошёл,
такие виртуозы сливаются толпой в один интересный серв потому что у них тянет и им там норм,
а ты 1 тот который не смог там нормально играть и они тебе вечно говорят:
- "обнови железо что ты как .... не знаю кто там"
Кто сказал, что альтернативный твоему сервер будет малофункциональным?
На альтернативном сервере могут быть разработчики не рукожопые и думающие о наиболее практичной и нересурсоемкой системе, не то, что некоторые, абы как, лишь бы работало. И да, даже на мощном компе могут быть дикие лаги при наличии онлайна. И это всё потому, что такие разрабы, как ты, делают всё так, чтобы работало.

А по поводу "обнови железо": не у всех богатые родители, чтобы по первому зову подогнать мощный аппарат.

Нужно делать для всех. А не так, чтобы "у меня работает, и насрать на остальных".

Profyan
07.08.2016, 10:13
Центр полигона. Думаю разберешься.
http://www.codeproject.com/Questions/403154/Finding-Middle-point-of-Polygon

Если игрок телепортнулся очень далеко от полигона, то так же и ставь его к границе
Абстрактно, но вроде понятно. http://image.prntscr.com/image/beca7cef3a2643189c8185cf52ad1cc1.png


Кто сказал, что альтернативный твоему сервер будет малофункциональным?
На альтернативном сервере могут быть разработчики не рукожопые и думающие о наиболее практичной и нересурсоемкой системе, не то, что некоторые, абы как, лишь бы работало. И да, даже на мощном компе могут быть дикие лаги при наличии онлайна. И это всё потому, что такие разрабы, как ты, делают всё так, чтобы работало.

А по поводу "обнови железо": не у всех богатые родители, чтобы по первому зову подогнать мощный аппарат.

Нужно делать для всех. А не так, чтобы "у меня работает, и насрать на остальных".

С центром как-нибудь разберусь. Но вот с координатами понять не могу. У меня полигон задается несколькими точками по 2ум осям - X и Y.
Знаю я только вершины полигона и то без координат по оси Z. Как я смогу переместить игрока в полигон,если я не знаю всех его координат .(См.рисунок)
http://ihost.pro-pawn.ru/image.php?di=BXM0
Либо я слишком туплю и узнать координаты отрезков,соединяющих вершины полигона, очень легко, либо я что-то упустил.
В топике темы я уже написал,что мне нужно узнать координаты точек на этих отрезках.Но я не знаю как

Seregamil
07.08.2016, 11:57
http://pro-pawn.ru/showthread.php?9237-processLineOfSight

Убери Z координаты и препятствия из цикла, получишь каждую точку линии от А до Б

Profyan
07.08.2016, 14:37
http://pro-pawn.ru/showthread.php?9237-processLineOfSight

Убери Z координаты и препятствия из цикла, получишь каждую точку линии от А до Б

В любом случае мне придется использовать MapAndreas. А я где-то слышал,что он сильно нагружает?!

Seregamil
07.08.2016, 14:48
В любом случае мне придется использовать MapAndreas. А я где-то слышал,что он сильно нагружает?!

Зачем MapAndreas?
MapAndreas в моем коде используется для других целей. Тебе он не нужен, как и Z координата.

Profyan
07.08.2016, 15:05
Зачем MapAndreas?
MapAndreas в моем коде используется для других целей. Тебе он не нужен, как и Z координата.

как это не нужен?А как я игрока перемещу,не зная Z координаты в этой точке.
Как я хотел сделать: нахожу ближайшие к игроку вершины полигона. Перебираю все точки отрезка,соединяющего найденные вершины, и нахожу ближайшую(хотел двоичным поиском),а дальше телепортирую туда игрока ну и поворачиваю соответственно.Но мне для перемещения нужна же и Z координата,верно?!

Seregamil
07.08.2016, 15:17
как это не нужен?А как я игрока перемещу,не зная Z координаты в этой точке.
Как я хотел сделать: нахожу ближайшие к игроку вершины полигона. Перебираю все точки отрезка,соединяющего найденные вершины, и нахожу ближайшую(хотел двоичным поиском),а дальше телепортирую туда игрока ну и поворачиваю соответственно.Но мне для перемещения нужна же и Z координата,верно?!
Полигонов сколько?

Daniel_Cortez
07.08.2016, 15:26
А как я игрока перемещу,не зная Z координаты в этой точке.
SetPlayerPosFindZ

Seregamil
07.08.2016, 15:43
SetPlayerPosFindZ

Погоду частенько делает. Запихивает под карту и отсылает в нулевые координаты.
Повторюсь:
Полигонов сколько?

Profyan
07.08.2016, 16:54
Погоду частенько делает. Запихивает под карту и отсылает в нулевые координаты.
Повторюсь:


Полигон один,точек примерно 40-50.

Да,эта функция работает некорректно,если участок карты,в который мы телепортируемся,не погрузился.

Seregamil
07.08.2016, 17:16
Полигон один,точек примерно 40-50.

Да,эта функция работает некорректно,если участок карты,в который мы телепортируемся,не погрузился.

Ну тогда MapAndreas юзай.
Находишь сначала XY координаты, куда отправить человека, и только тогда ищи Z
Можно, конечно, если полигон один, координаты все достать и закинуть в память, а там искать уже, MapAndreas понадобится только для создания массива координат.
А можно загружать MapAndreas только для определенной территории/полигона, кушает мало, работает только в нужном тебе месте

p.s. это мои мюсли.

$continue$
07.08.2016, 17:16
z координата вычисляется не точно (в вики об этом сказано):
http://i.imgur.com/EVhEPhk.png

vovandolg
07.08.2016, 17:40
Полигон один,точек примерно 40-50.

Да,эта функция работает некорректно,если участок карты,в который мы телепортируемся,не погрузился.

Так ты фризани игрока до спавна на Z и разфризь потом в течении 2-3 сек

Profyan
07.08.2016, 19:17
Ну тогда MapAndreas юзай.
Находишь сначала XY координаты, куда отправить человека, и только тогда ищи Z
Можно, конечно, если полигон один, координаты все достать и закинуть в память, а там искать уже, MapAndreas понадобится только для создания массива координат.
А можно загружать MapAndreas только для определенной территории/полигона, кушает мало, работает только в нужном тебе месте

p.s. это мои мюсли.

Ну я так и хотел.И в общем итоге этот вариант будет оптимизированней,нежели сохранение координат каждые 5 сек?

Seregamil
08.08.2016, 05:44
Ну я так и хотел.И в общем итоге этот вариант будет оптимизированней,нежели сохранение координат каждые 5 сек?

естестно
А лучше запрети тп за границу полигона и не парься.


Так ты фризани игрока до спавна на Z и разфризь потом в течении 2-3 сек
И снова улетит на нулевые координаты

Profyan
08.08.2016, 07:23
естестно
А лучше запрети тп за границу полигона и не парься.


И снова улетит на нулевые координаты

Ну а если такой случай:игрок будет постоянно бежать за границу,его будет телепортировать и разворачивать.Но при этом будут не хилые вычисления.Во-первых перебор вершин полигона,а потом уже и точек.Измеряя при этом расстояние между игроком и точкой -это около 50 итераций,потом еще нахождение ближайшей точки,но т.к. сложность двоичного поиска - это логарифм по основанию 2,то это еще не так много,но еще же и MapAndreas.Микрофризов не будет?Мне кажется стабильная нагрузка лучше в некотором плане чем сильная и непостоянная.Хотя постараюсь проверить это опытным путем.