Перейти к содержанию
Авторизация  
Rozhek

Brawery - High Five

Рекомендуемые сообщения

Наконец решил восполнить большое упущение и разместить тут темку. Сборка нацелена на копирование птс механик и эмулирование аспектов птс сервера.


Хроники: High Five Part5
Основной функционал:
Переработанные движки GeoEngine, GeoMoving, PathFind
максимальное сходство с птс сервером. точность и плавность перемещения соответствуют птс серверу. минимизированы проблемы десинхрона координат. отсутствуют проблемы с движениями в воде, застреваниями
Новый AI движок
аи мобов парсятся из птс скриптов(ai.obj). необходимые параметры нпц\спавна\скиллов парсятся из птс файлов. 95% мобов работают на этом аи, остальные 5%(рб и спец. скриптовые мобы) временно собраны из из птс скриптов вручную
Статы
статы игроков\мобов\скиллов\спавна\трансформы\аугментация и др. парсятся из птс файлов и используются в механизмах сервера
Квесты
все квесты собраны из птс скриптов. исправлены, протестированы и функциональны
Система виталити
формулы расхода, роста. бафа невита. банки виталити
Инстанс зоны и локации
пайлаки, камалоки, лабиринты. зал иллюзий. sod,soi,soa,hellbound,citadel,tuly,naia
Эпик РБ
статы. ai. скрипты спавна и взаимодействия с игроком
AI питомцев
Механика работы скиллов

  Механика работы скиллов (Показать контент)

Олимпиада
геодвижок исправляет повсеместные проблемы с геодатой. волны по птс. периоды получения\просмотра результатов\участия по птс
Осады и ТВ
Эмуляция птс поведения персонажа
взаимодействие с мертвыми целями. -порядок и правила использования действий(как передвижение, использование скиллов, выбрасывание предметов, юз сосок и пр.)

Дополнительные механизмы

  Дополнительные механизмы (Показать контент)


Оптимизация пакетной рассылки
Исправление кучи мелких багов
Формула расчета дропа

Дополнительный функционал:
Новая евентовая система. 
7 евентов массовых евентов в инстанс зонах. один абсолютно уникальный.
Системы GvG (автоматическая и турнирная)
с внешним видом EventMatch и расширенными возможностями по настройке
Скины
предметная система скинов(типа вставки камней внешнего вида как на оффе) сетов\оружия вместе с паком предметов
Примерочная
Функция autocp (за премиум\сертификат)
Уникальная панель настроек (cfg)
Pvp community board
Премиум баффер
Групповая вставка аттрибута
Система вознаграждения

за пвп, в евентах, за захват замков, геройство, убийство мобов
Объединение талисманов
Периоды выдачи геройства, запуска осад и тв
Cтатический респ эпик боссов
Быстрый релог для очистки кэша
Защита от внутриигрового спама
Модификатор статов
Боты

Поддержка
пока что поддержка сборки полностью бесплатная
критические баги, при появлении, правятся в моменте
остальные баги, правятся в порядке очереди(кто успел поработать со мной, думаю смогут подтвердить насколько оперативно все фиксится)
доработки(с общим функционалом) выполняются бесплатно в порядке очереди\сложности
доработки(с уникальным\обособленным функционалом)обсуждаются отдельно и оплачиваются по дог-сти(оплата фиксированаая за чел\часы, оценки более чем адекватные)

Дополнительные модули
имеется расширенный xmlrpc API для общения с сайтом
имеется поддержка защит smartguard, strix
в комплекте геодата подготовленная под серверный геодвижок
антибру и проксислайдер для логинсервера

Тестовый сервер: тык (внимание, патч с допами 400Мб)

Покупка
Цена 12.000
skype: jenyajkee

Изменено пользователем Rozhek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Продам исходники от этой сборки за 10к

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 20.03.2019 в 20:52, Matey сказал:

Продам исходники от этой сборки за 10к

Не ну ты Г....Ноооо полное, создай отдельную тему и напиши, что продаёшь и зачем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 20.03.2019 в 20:52, Matey сказал:

Продам исходники от этой сборки за 10к

смешная шутка)

п.с. форумчане - не ведитесь, к исходникам ни у кого доступа не было

Изменено пользователем Rozhek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Голый жтс + кастом. Кроме импортов - что изменилось? Ворклог нормальный приложите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 20.03.2019 в 22:40, Khrome сказал:

Голый жтс + кастом. Кроме импортов - что изменилось? Ворклог нормальный приложите.

думаю этот калека даже импортов не менял ))

2-3 фикса и в дамках ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 20.03.2019 в 22:40, Khrome сказал:

Голый жтс + кастом. Кроме импортов - что изменилось? Ворклог нормальный приложите.

Вы заходили на тест? Раздел функционал в описании разве похож на жтс? 

Ворклог с 2014 года сюда не влезет. Но я постараюсь, сделаю какой то скомпонованный вид и приложу

и версию патча поменьше тоже

Изменено пользователем Rozhek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

давайте уже в шару кидайте, не получилося, не фортануло

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 21.03.2019 в 05:13, Rozhek сказал:

Вы заходили на тест? Раздел функционал в описании разве похож на жтс? 

Ворклог с 2014 года сюда не влезет. Но я постараюсь, сделаю какой то скомпонованный вид и приложу

и версию патча поменьше тоже

1 в 1, в фулл версии жтса ( не шаре) это все есть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я конечно понимаю, что в текущих реалиях пост от участника с 10 сообщениями не вызывает доверия.

И вы не обязаны выискивать информацию обо мне и этой сборке на других форумах.

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

  Архив (Показать контент)
  New rev (Показать контент)

И это сгруппированные исправления, а не декомпозированные. Плюс некоторые работы мелкие, некоторые просто не зафиксированы, крупных работ по декомпиляции аи движка, отладке, разработке тоже тут нет.
В жтс есть хорошо написанный парсер, исправлены некоторые проблемы овера\либо свои же. ВСЕГО этого в жтс нет, и тем более нет гео и нпц движка(поддерживающего ai.obj), которые являются отличительной особенностью моей разработки

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 21.03.2019 в 16:03, Khrome сказал:

1 в 1, в фулл версии жтса ( не шаре) это все есть

Имею данную сборь, ушло все далеко от jts и в лучшую сторону.

Конечно есть над чем работать, но на рынке ява считаю отличным продуктом.

И есть не шара jts.Мб чуть позже дополню к шаре скриптов.

Изменено пользователем donero
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Патч для тех, кто идет смотреть не на плащи(23Мб): тык

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вся последняя неделя была посвящена работам по геодвижку и геомувингу. Огромное количесво отладки и есть результаты: диагностировал все возможные проблемы десинхрона в условиях слабого соединения и\или слабой серверной машины , удалось найти и поправить неприятную опечатку, еще немного оптимизировал функции построения пути.

Если вы еще думаете какую сборку выбрать для своего сервера, попробуйте удивить игроков не уникальной концепцией или клиентом классика, а хорошей геодатой)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

жаль нет мультипроф функционала)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 31.03.2019 в 07:55, Rozhek сказал:

Если вы еще думаете какую сборку выбрать для своего сервера, попробуйте удивить игроков не уникальной концепцией или клиентом классика, а хорошей геодатой)

Рантайм изменения веса клеток для патчфинда есть? Это для процессинга avoidance, тобишь, обход других актеров во время поиска пути. Или сделано, как обычно, костылем?:)

Если есть, то как разрешили задачу многопоточного доступа на модификацию веса клетки? Потому-что в этих ваших l2j-ях по другому невозможно, из-за того что общего тика сервера вообще нету.

Что с перестроением уже найденных путей при изменении веса клеток? Или может быть запилен avoidance по столкновениям? В таком случае какой вид деревьев использовали и опять же, как решили задачу с многопоточным доступом модификации BVH дерева?

Поиск пути по прежнему выдает говно в случаях с трехмерными плоскостями? (Как пример лестница у кристала в замках)

Как делаете синхронизацию координат сервер-клиент в условиях авторитарного сервера, да еще и без снапшотов (общих тиков, то у сервера нет, чтобы их возможно было делать)?

Как экстраполируете координаты клиента, в условиях того, что получение пинга, это вообще отдельный пакет?

 

Касательно этого момента:

  Цитата

[x]Реорганизация гео-движка. Перемещение осуществляется по всем точкам мира, а не только центрам гео-клеток. off-like

Я понял, что имелось ввиду и что это за фикс. Но скажу к слову: в ретейле, непосредственно, векторное изменение координат идет по дискретным точкам, тобишь по гео-точкам. Результаты игнорирования этого можно посмотреть в любом l2j эмуляторе, со всякими ошибками координат около преград, из-за чего трассировщик высоты ломается и выдает неверный слой геодаты в многоуровневых локациях.

 

Хотели нормальных вопросов и дискаса - получите;)

Изменено пользователем PointerRage
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 19.04.2019 в 19:41, PointerRage сказал:

Рантайм изменения веса клеток для патчфинда есть? Это для процессинга avoidance, тобишь, обход других актеров во время поиска пути. Или сделано, как обычно, костылем?:)

Если есть, то как разрешили задачу многопоточного доступа на модификацию веса клетки? Потому-что в этих ваших l2j-ях по другому невозможно, из-за того что общего тика сервера вообще нету.

Что с перестроением уже найденных путей при изменении веса клеток? Или может быть запилен avoidance по столкновениям? В таком случае какой вид деревьев использовали и опять же, как решили задачу с многопоточным доступом модификации BVH дерева?

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

Сам алгоритм расчета веса клеток на l2j-ях слабый, расчет производится по т.Пифагора для прямых\диагональных перемещений, а для всех клеток где по соседству есть препятствие - просто статичный большой вес. Этого не достаточно.

  В 19.04.2019 в 19:41, PointerRage сказал:

Поиск пути по прежнему выдает говно в случаях с трехмерными плоскостями? (Как пример лестница у кристала в замках)

Поиск пути работает в соответствии со своим алгоритмом, с параметрами задающими вес клеткам). Если разница в высоте между лесенками позволяет присваивать вес клетке, предполагающий перемещение, то почему он должен выдасть гавно. Другое дело каким образом строится и воспроизводится мувинг по узлам построенного пути и учитывает ли он эти особенности)

  В 19.04.2019 в 19:41, PointerRage сказал:

Как делаете синхронизацию координат сервер-клиент в условиях авторитарного сервера, да еще и без снапшотов (общих тиков, то у сервера нет, чтобы их возможно было делать)?

Тут стоить начать с того что в клиенте векторное движение, на сервере декартовое. Точность сопадения координат в общем случае характеризуется точностью результата функции аппроксимации, т.е. в идеальном случае рассинхронизация не должна возникать из-за неверных математичеких расчетах. Поэтому необходимости синхронизации по тикам нет, а для всех остальных случаев в клиенте уже предусмотрен механизм оповещения сервера при рассинхроне(ValidateLocation). Проблемы в отсутствии аппроксимации, а синхронизация по тикам это про другие игры.

  В 19.04.2019 в 19:41, PointerRage сказал:

Как экстраполируете координаты клиента, в условиях того, что получение пинга, это вообще отдельный пакет?

Вы точно правильно употребляете термины?) Поясните подробнее, что имелось ввиду. Как связан пинг и координаты клиента я не совсем понял.

  В 19.04.2019 в 19:41, PointerRage сказал:

Я понял, что имелось ввиду и что это за фикс. Но скажу к слову: в ретейле, непосредственно, векторное изменение координат идет по дискретным точкам, тобишь по гео-точкам. Результаты игнорирования этого можно посмотреть в любом l2j эмуляторе, со всякими ошибками координат около преград, из-за чего трассировщик высоты ломается и выдает неверный слой геодаты в многоуровневых локациях.

Первая часть - все верно.

Вторая часть - не совсем так. Точнее, это происходит не из-за отличия способа изменения координат, а из-за неправильных расчетов координат и самих слоев. На l2j эмуляторах неправильно определяются слои геодаты, когда актор находится между ними. При правильном алгоритме определения слоя, проблем собственно и нет.

 

Спасибо большое за вопросы) Вижу вы изучаете тематику, много терминов связанных с общей и частными теориями работы с графами. Лучше их все пояснять, чтобы не гуглить) В заключении скажу, что большинство проблем с перемещением вызвано неправильными механизмами поклеточного построения дистанции по правильным узлам пути(ведь сами алгоритмы поиска давно придуманы непрограммистами и они одинаковые везде и не только в играх), отсутствии более точной функции аппроксимации координат, ну и тотальные и повсеместные опечатки программистов конечно же

 
  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 21.04.2019 в 09:39, Rozhek сказал:

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

Это понятно, ибо эвристика. Я говорю про саму реализацию avoidance динамических актеров, чтобы движущиеся актеры не сталкивались и рекалькулировали свой путь, для избежания столкновений. Очевидно, что это реализуется в рантайме:) 

Обычно такие задачи решаются отложенным пересчетом пути актера и динамическим изменением веса клетки, по которым, другие актеры двигаются (в случаях дискретной сетки). В более хороших и правильных реализациях используются BVH деревья (причем обычно достаточно балансного AABB дерева), чтобы реализовать приемлемый avoidance. Кстати говоря, второй подход также используется в физических движках, но это уже тема для иного разговора.

 

  В 21.04.2019 в 09:39, Rozhek сказал:

Поиск пути работает в соответствии со своим алгоритмом, с параметрами задающими вес клеткам). Если разница в высоте между лесенками позволяет присваивать вес клетке, предполагающий перемещение, то почему он должен выдасть гавно. Другое дело каким образом строится и воспроизводится мувинг по узлам построенного пути и учитывает ли он эти особенности)

Потому-что на моей памяти, во всех l2j-ях эврестическая стоимость клетки имеет вид: D(sqrt(x*x + y*y + (z*z) / modifier)) - или нечто похожее. Впрочем, даже выставляя "честную" эвристику по Z-оси, результат задастую выходит не таким, какой ожидается, из-за того, что вес клеток по "правильному" пути намного выше, чем вес до, условно, неверного пути. Сюда же можно добавить и то, что во всех l2j-ях реализация поиска пути работает по алгоритму "первый лучший".

 

  В 21.04.2019 в 09:39, Rozhek сказал:

Тут стоить начать с того что в клиенте векторное движение, на сервере декартовое. Точность сопадения координат в общем случае характеризуется точностью результата функции аппроксимации, т.е. в идеальном случае рассинхронизация не должна возникать из-за неверных математичеких расчетах. Поэтому необходимости синхронизации по тикам нет, а для всех остальных случаев в клиенте уже предусмотрен механизм оповещения сервера при рассинхроне(ValidateLocation). Проблемы в отсутствии аппроксимации, а синхронизация по тикам это про другие игры.

Не согласен. Рассинхронизация возникает только потому-что игра сетевая, а сеть имеет задержку. К тому же, сюда стоит еще добавить, что методы передвижения актеров на сервере и клиенте разные, из-за чего результаты получаются различными. В добавок, стоит добавить, то что на клиенте расчет движения осуществляется с помощью чисел с плавающей точкой, только этого достаточно, чтобы получать различные результаты на различных машинах. Я уже не говорю о том, что на сервере везде используются натуральные числа, которые еще из-за аппроксимации из/в дискретные координаты, ну совсем уж, не похожи на клиентский результат.

 

  В 21.04.2019 в 09:39, Rozhek сказал:

Вы точно правильно употребляете термины?) Поясните подробнее, что имелось ввиду. Как связан пинг и координаты клиента я не совсем понял.

Минутка шуток: администратор локалхоста недоумевает, как связаны координаты присылаемые клиентом серверу с пингом, потому-что у него нулевой пинг.

А если серьезно, то они непосредственно связаны тем, что:

1. Сервер по расчетам движения всегда впереди клиента, потому-что пакет MoveToLocation не доставляется моментально на клиент.

2. Клиент при отправке запроса ValidateLocation, отправляет координаты, которые актуальны на текущий момент. Пока пакет обработается в очереди, пока отправится, дойдет до сервера, сервер его обработает... Пройдет значительное время, чтобы процессинг на сервере сказал: "нифига, эти координаты неверны". А отсутствие снапшотов не дает заглянуть в прошлое и сверить правильность координат на момент времени отправки клиентом пакета. Именно поэтому я предположил, что может использоваться экстраполяция координат для их проверки, чтобы довести эти клиентские координаты до "текущей точки времени" и проверить, очевидно, их правильность.

3. Если актер движется и сервер меняет ему путь, то, очевидно, в пакете MoveToLocation должны быть указаны "начальные" координаты и "конечные". К "конечным" нет никаких вопросов, однако, начальные координаты следует экстраполировать по трип-тайму, тобишь, времени пакета в пути, либо, в ином случае, клиенту начинает быть довольно плохо.

 

  В 21.04.2019 в 09:39, Rozhek сказал:

Вторая часть - не совсем так. Точнее, это происходит не из-за отличия способа изменения координат, а из-за неправильных расчетов координат и самих слоев. На l2j эмуляторах неправильно определяются слои геодаты, когда актор находится между ними. При правильном алгоритме определения слоя, проблем собственно и нет.

Определение слоев, да, есть такая проблема, но я не о ней говорю на данный момент, потому-что это исправляется легко и быстро, да и обсуждать это как-то не очень интересно:)

Попробуйте на клиенте подойти очень близко к преграде, а после этого сконвертируйте координаты в дискретные. Вы будете неприятно удивлены, что в части кейсов, дискретные координаты будут указывать на "пустоту", тобишь, на внутренности, например, статик меша. Причем, это происходит из-за самой алгоритмики перевода реальных координат в дискретные. Соответственно, перевод таких дискретных координат в реальные, даст точку внутри статик-меша, там где клетка гео-даты вообще отсутствует.

Возможно Вы просто не замечали таких кейсов, но когда я еще занимался этими всеми l2j-ями, причем на довольно нагруженных проектах (от 1 200 онлайна до 2 000), такие проблемы всплывали, однако, не сразу. 

 

  В 21.04.2019 в 09:39, Rozhek сказал:

Спасибо большое за вопросы) Вижу вы изучаете тематику, много терминов связанных с общей и частными теориями работы с графами. Лучше их все пояснять, чтобы не гуглить) В заключении скажу, что большинство проблем с перемещением вызвано неправильными механизмами поклеточного построения дистанции по правильным узлам пути(ведь сами алгоритмы поиска давно придуманы непрограммистами и они одинаковые везде и не только в играх), отсутствии более точной функции аппроксимации координат, ну и тотальные и повсеместные опечатки программистов конечно же

Спасибо за ответ. Я, если честно, даже не надеялся на ответ. Всегда приятно обсудить интересные технические задачи и способы их решения:)

На счет терминов:

BVH дерево - дерево хранящее внутри себя набор геометрических фигур.

AABB дерево - дерево хранящее внутри себя "коробки" актеров. Если простыми словами, то "коробка" - прямоугольник (либо же куб, в случае хранения трехмерных коробок), который включает в себя полный размер актера.

AABB - "коробка", см. AABB  дерево.

Avoidance - механизм уклонения (обхода) от динамических актеров.

Балансное дерево - дерево, которое имеет сбалансированное количество количество веток и листов на них, на каждом уровне глубины/высоты.

Изменено пользователем PointerRage
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 21.04.2019 в 15:54, PointerRage сказал:

Это понятно, ибо эвристика. Я говорю про саму реализацию avoidance динамических актеров, чтобы движущиеся актеры не сталкивались и рекалькулировали свой путь, для избежания столкновений. Очевидно, что это реализуется в рантайме:) 

Обычно такие задачи решаются отложенным пересчетом пути актера и динамическим изменением веса клетки, по которым, другие актеры двигаются (в случаях дискретной сетки). В более хороших и правильных реализациях используются BVH деревья (причем обычно достаточно балансного AABB дерева), чтобы реализовать приемлемый avoidance. Кстати говоря, второй подход также используется в физических движках, но это уже тема для иного разговора.

Понял, что имелось ввиду, но такая задача в принципе не стоит. Такого функционала нет на офф сервере, и я об этом даже и не думал. Наверное в современных играх этот вопрос стоит достаточно остро.

  В 21.04.2019 в 15:54, PointerRage сказал:

Потому-что на моей памяти, во всех l2j-ях эврестическая стоимость клетки имеет вид: D(sqrt(x*x + y*y + (z*z) / modifier)) - или нечто похожее. Впрочем, даже выставляя "честную" эвристику по Z-оси, результат задастую выходит не таким, какой ожидается, из-за того, что вес клеток по "правильному" пути намного выше, чем вес до, условно, неверного пути. Сюда же можно добавить и то, что во всех l2j-ях реализация поиска пути работает по алгоритму "первый лучший".

Все так(в формуле только не координаты, а их разница). И функция все таки считает примерный естимейт, для того что бы быстрее путь найти, но не ограничивает сам поиск. И наверное, ее можно улучшить) Реальное ограничение на подъем по лестнице накладывается в расчете стоимости веса текущей клетки от старта. Там шлепается сразу вес*3, а если в соседней клетке есть подъем *2. А вот евристическая функция при подъеме по лестнице помогает определить что разница в z координате уменьшилась, и поднимает проверку этой клетки и ее соседей в очереди.

Насчет алгоритма: пробовал A* - работает очень медленно, IDA* - кажется будет что то ломать. Вообще текущий именно алгоритм поиска каких то проблем не вызывал, зато функцию очистки этого пути от лишних узлов переделал с последовательной проверки на синхронную с двух концов.

  В 21.04.2019 в 15:54, PointerRage сказал:

1. Сервер по расчетам движения всегда впереди клиента, потому-что пакет MoveToLocation не доставляется моментально на клиент.

2. Клиент при отправке запроса ValidateLocation, отправляет координаты, которые актуальны на текущий момент. Пока пакет обработается в очереди, пока отправится, дойдет до сервера, сервер его обработает... Пройдет значительное время, чтобы процессинг на сервере сказал: "нифига, эти координаты неверны". А отсутствие снапшотов не дает заглянуть в прошлое и сверить правильность координат на момент времени отправки клиентом пакета. Именно поэтому я предположил, что может использоваться экстраполяция координат для их проверки, чтобы довести эти клиентские координаты до "текущей точки времени" и проверить, очевидно, их правильность.

3. Если актер движется и сервер меняет ему путь, то, очевидно, в пакете MoveToLocation должны быть указаны "начальные" координаты и "конечные". К "конечным" нет никаких вопросов, однако, начальные координаты следует экстраполировать по трип-тайму, тобишь, времени пакета в пути, либо, в ином случае, клиенту начинает быть довольно плохо.

Опять же все так. Но) В клиенте есть удобный механизм, который сводит микрорассинхронизации на лету(ускоряя или замедляя). Остальной разницей возникающей в период 20-200мс можно принебречь - ведь эта разница не аккумулируется при движении: сервер считает позицию раньше клиента -> сервер получает новый запрос от клиента на смену координат -> пока сервер считает новую координату и отправляет пакет -> персонаж догоняет позицию и рассинхрона не происходит /если есть минимальные расхождения позиция подхватывается на лету  (тут даже до ValidateLocation не доходит, он начинает его слать от разницы в 50-100 координат что ли). 

Почему так не работает у всех, ведь вроде же все так же. Из-за того, что во время бега координата на сервере стоит то справа-сзади от линии движения, то слева-впереди по пол секунды(в центрах гео координат). При получении запроса на изменение пути, расчет начинается от середины той геоклетки(кроме того на всех l2jях банальный баг и первый тик бега считается путь от 0 точки до нее же) -> клиент замедляет скорость, потому что начальная координата ждет, потом ускоряет скорость потому что координата быстро уходит по центрам геоклеток -> потом поступает запрос на смену пути -> серверная координата уже на 30 координат впереди-справа от текущей точки, а клиент бежит не к ней а к конечной локации-> цикл начинается заного, но уже с расхождениями координат.

  В 21.04.2019 в 15:54, PointerRage сказал:

Определение слоев, да, есть такая проблема, но я не о ней говорю на данный момент, потому-что это исправляется легко и быстро, да и обсуждать это как-то не очень интересно:)

Попробуйте на клиенте подойти очень близко к преграде, а после этого сконвертируйте координаты в дискретные. Вы будете неприятно удивлены, что в части кейсов, дискретные координаты будут указывать на "пустоту", тобишь, на внутренности, например, статик меша. Причем, это происходит из-за самой алгоритмики перевода реальных координат в дискретные. Соответственно, перевод таких дискретных координат в реальные, даст точку внутри статик-меша, там где клетка гео-даты вообще отсутствует.

Возможно Вы просто не замечали таких кейсов, но когда я еще занимался этими всеми l2j-ями, причем на довольно нагруженных проектах (от 1 200 онлайна до 2 000), такие проблемы всплывали, однако, не сразу. 

Я примерно понимаю, в чем может быть проблема. Я тоже не по серверным точкам путь строю, а смещаю точку геоклетки внутри нее самой к вектору движения(т.е. использую дробную часть), геоклетка состоит из 16 точек и при неправильной конвертации можно попасть в соседнюю геоклетку. Правда не понимаю, откуда проблеме быть если конвертация работает правильно)

Изменено пользователем Rozhek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 21.04.2019 в 20:56, Rozhek сказал:

Понял, что имелось ввиду, но такая задача в принципе не стоит. Такого функционала нет на офф сервере, и я об этом даже и не думал. Наверное в современных играх этот вопрос стоит достаточно остро.

Одно время данный функционал был на официальном сервере, однако, позже его убрали по неизвестным причинам. Впрочем, его отголоски до сих пор можно заметить, допустим: использовать большую трансформацию и перегородить вход куда-либо. Это до сих пор актуально на текущей версии NA-сервера. В HF-версиях, клиент может послать пакет CannotMoveAnymore (или как-то так), но сервер в силах и без этого пакета все правильно обработать и забраковать путь.

Раньше в ретейле использовалось не BVH-дерево, а дискретный метод (специальная хеш-таблица) для определения столкновений. Но в таком подходе минусов целая коробка и маленький контейнер.

 

  В 21.04.2019 в 20:56, Rozhek сказал:

Насчет алгоритма: пробовал A* - работает очень медленно, IDA* - кажется будет что то ломать. Вообще текущий именно алгоритм поиска каких то проблем не вызывал, зато функцию очистки этого пути от лишних узлов переделал с последовательной проверки на синхронную с двух концов.

Я раньше эксперементировал с различными алгоритмами поиска пути, в контексте lineage 2: руки, двусторонний поиск, различные вариации жадных алгоритмов и различные направленные версии. В общем, лично я, остановился на направленном A*. А потом вообще плюнул на все это и выкинул геодату, и просто вгрузил все коллайдеры с карт. Прогнал их через оптимизатор вершин и получился вполне нормальный граф, по которому можно искать путь (причем в большинстве случаев он легковеснее той же геодаты), как плюс, можно делать нормальные "физические" рейкасты (на самом деле, они реально нормальные, а не то говно, которое трассируется через геодату) для проверки видимости. В теории, можно вообще психануть и написать BSP для тех же рейкастов, но производительность BVH меня вполне устраивает.

 

  В 21.04.2019 в 20:56, Rozhek сказал:

Почему так не работает у всех, ведь вроде же все так же. Из-за того, что во время бега координата на сервере стоит то справа-сзади от линии движения, то слева-впереди по пол секунды(в центрах гео координат). При получении запроса на изменение пути, расчет начинается от середины той геоклетки(кроме того на всех l2jях банальный баг и первый тик бега считается путь от 0 точки до нее же) -> клиент замедляет скорость, потому что начальная координата ждет, потом ускоряет скорость потому что координата быстро уходит по центрам геоклеток -> потом поступает запрос на смену пути -> серверная координата уже на 30 координат впереди-справа от текущей точки, а клиент бежит не к ней а к конечной локации-> цикл начинается заного, но уже с расхождениями координат.

Там считается время движения до нулевой точки, чтобы компенсировать линейное увеличение скорости движения персонажа при беге, которое отлично видно в начале движения. Это не правильно, я согласен. Но чтобы сделать правильно - необходимы тики, в ином случае, на маленьких дистанция рассинхронизация будет вполне заметна, а если таким методом двигаться почти беспрерывно, то разница координат может достигать в несколько сотен точек.

 

  В 21.04.2019 в 20:56, Rozhek сказал:

Опять же все так. Но) В клиенте есть удобный механизм, который сводит микрорассинхронизации на лету(ускоряя или замедляя). Остальной разницей возникающей в период 20-200мс можно принебречь - ведь эта разница не аккумулируется при движении: сервер считает позицию раньше клиента -> сервер получает новый запрос от клиента на смену координат -> пока сервер считает новую координату и отправляет пакет -> персонаж догоняет позицию и рассинхрона не происходит /если есть минимальные расхождения позиция подхватывается на лету  (тут даже до ValidateLocation не доходит, он начинает его слать от разницы в 50-100 координат что ли). 

Ага, знаю такой механизм, это синхронизация клиентской экстраполяции. Но, если честно, мне было лень ее разбирать на клиенте, поэтому я на это успешно забил:)

На счет "забить на 20-200мс" - мне не кажется это хорошей идеей, так как при увеличении нагрузки на сервер, время самого серверного процессинга будет увеличиваться без роста сетевой задержки, из-за чего итоговая задержка запроса может быть намного выше 200мс и это следует учитывать. Нечто вроде: delay = trip time + processing time.

 

Извиняюсь за столь долгий ответ, впредь постараюсь отвечать быстрее:)

Изменено пользователем PointerRage

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 27.04.2019 в 16:47, PointerRage сказал:

Одно время данный функционал был на официальном сервере, однако, позже его убрали по неизвестным причинам. Впрочем, его отголоски до сих пор можно заметить, допустим: использовать большую трансформацию и перегородить вход куда-либо. Это до сих пор актуально на текущей версии NA-сервера. В HF-версиях, клиент может послать пакет CannotMoveAnymore (или как-то так), но сервер в силах и без этого пакета все правильно обработать и забраковать путь.

 Раньше в ретейле использовалось не BVH-дерево, а дискретный метод (специальная хеш-таблица) для определения столкновений. Но в таком подходе минусов целая коробка и маленький контейнер.

Если честно нигде ни на каком сервере не видел, чтобы путь строился в обход коллизии. Проверка проходимости через коллизии - да, но построение пути в зависимости от них - нет. Тем более в динамике с их пересечением) Представьте как бы игроки двигались, например, на валакасе - мало того что вокруг куча игроков, которых нужно оббегать, так еще и гигантский босс, которого оббежать с его скоростью невозможно - выглядело бы все это не очень адекватно.

 

  В 27.04.2019 в 16:47, PointerRage сказал:

Там считается время движения до нулевой точки, чтобы компенсировать линейное увеличение скорости движения персонажа при беге, которое отлично видно в начале движения. Это не правильно, я согласен. Но чтобы сделать правильно - необходимы тики, в ином случае, на маленьких дистанция рассинхронизация будет вполне заметна, а если таким методом двигаться почти беспрерывно, то разница координат может достигать в несколько сотен точек.

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

Еще раз говорю, если уметь считать координаты точно в любой нужный момент времени, то проблема рассинхронизации исчезает. Это мой best practice. Сетевой лаг или тикрейт в совокупности составляют около 20-30% проблемы и те решаются просто хорошей сетью.

Когда решена основная проблема, можно повышать тикрейт расчета позиции. Но не тики синхронизации координат с клиентом) Они в л2 не нужны.

 

  В 27.04.2019 в 16:47, PointerRage сказал:

На счет "забить на 20-200мс" - мне не кажется это хорошей идеей, так как при увеличении нагрузки на сервер, время самого серверного процессинга будет увеличиваться без роста сетевой задержки, из-за чего итоговая задержка запроса может быть намного выше 200мс и это следует учитывать. Нечто вроде: delay = trip time + processing time.

Но этот показатель все равно будет статичным, клиент будет статично отставать от сервера и при получении новых пакетов с той же примерно задержкой будет успевать догонять координаты сервера. Кстати 200мс - с точки зрения любых игр уже выходит за рамки комфортной игры, а в л2 это отставание клиента от сервера при средней скорости бега всего на 30-40 координат, которые при стабильном пинге превращаются всего в 1-2 координаты рассинхрона. Реальное плохая ситуация это когда пинг прыгает, например, разброс пинга в +-100мс при той же средней скорости(брал 170 коорд в сек) может вызывать рассинхронизацию до 20 координат в точке смены направления движения и это уже будет заметно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 28.04.2019 в 11:53, Rozhek сказал:

Если честно нигде ни на каком сервере не видел, чтобы путь строился в обход коллизии. Проверка проходимости через коллизии - да, но построение пути в зависимости от них - нет. Тем более в динамике с их пересечением)

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

 

  В 28.04.2019 в 11:53, Rozhek сказал:

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

В более ранних версиях игроки не были проходимы;)

 

  В 28.04.2019 в 11:53, Rozhek сказал:

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

Дело не в анимации, она далеко не root motion, чтобы она играла какую-то роль, а именно в изменении скорости движения. Сделать "это правильно" - применить линейную интерполяцию на каждый тик движения, в зависимости от времени. Впрочем, подойдет и любой метод получения координат, который будет экстраполировать/интерполировать координаты, в зависимости от времени. В ином случае, с текущей трединговой моделью, расчет попросту будет неверным.

А кто говорил про решение проблемы увеличением тикрейта? У меня вообще на одном сервере (не lineage 2, к счастью) тикрейт самого сервера (а это, на секундочку, вообще все серверные геймплейные операции, куда входит и движение) выставлен в 15 раз в секунду, что очень и очень низко, особенно, смотря на некоторые сервера, которые имеют тикрейт в 60 фреймов.

 

  В 28.04.2019 в 11:53, Rozhek сказал:

 Еще раз говорю, если уметь считать координаты точно в любой нужный момент времени, то проблема рассинхронизации исчезает. Это мой best practice. Сетевой лаг или тикрейт в совокупности составляют около 20-30% проблемы и те решаются просто хорошей сетью.

С этого и следовало начинать! Вы считаете координаты по запросу. Вопросов в этом плане больше не имею:)

 

  В 28.04.2019 в 11:53, Rozhek сказал:

Но этот показатель все равно будет статичным, клиент будет статично отставать от сервера и при получении новых пакетов с той же примерно задержкой будет успевать догонять координаты сервера. Кстати 200мс - с точки зрения любых игр уже выходит за рамки комфортной игры, а в л2 это отставание клиента от сервера при средней скорости бега всего на 30-40 координат, которые при стабильном пинге превращаются всего в 1-2 координаты рассинхрона. Реальное плохая ситуация это когда пинг прыгает, например, разброс пинга в +-100мс при той же средней скорости(брал 170 коорд в сек) может вызывать рассинхронизацию до 20 координат в точке смены направления движения и это уже будет заметно.

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

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  В 20.03.2019 в 18:56, Rozhek сказал:

Новый AI движок
аи мобов парсятся из птс скриптов(ai.obj). необходимые параметры нпц\спавна\скиллов парсятся из птс файлов. 95% мобов работают на этом аи, остальные 5%(рб и спец. скриптовые мобы) временно собраны из из птс скриптов вручную

Можно пример привести, что именно распарс с AI.obj идет, а не как с квестами которые вы пересобирали из ai.obj

Вы написали свою VM или как это происходит, если не сложно очень был бы рад услышать ваш ответ.

 

UPD: Вопросов более нет

7f6f6394ec5a5f8a5409ec878d505ba2.png

a7819138f3b4479509c7f728c0de5581.png

Ни о каких формулах речи и нет, все АИ стандартные. Это шляпа.

 

Пацаны взяли просто JTS и что-то там допилили и тот кто описывал выше видимо вообще не знает что он в тиме или же его не плохо так контузило.

 

Если у кого будут вопросы - могу выложить фул переписку. Там так не плохо ударенный об угол человек и это не о форме общения, а в целом о понимании и то что у него на сервере.

Изменено пользователем Deazer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ab8d1a643abf0468595d3edca080b932.jpg

Коротко:

Сначала я объяснял почему нет тех аи куда он тыкался, посмотрел на его пруфы - вспомнил что аи сейчас нет на тесте. Комментатора ничего из этого не интересовало, он продолжал свои дешевые выпады игнорируя ответы. Устал, попытался закончить разговор, вышел из себя, забил хер. 

Манера общения за гранью реальности, там же примерно желание самоутвердиться. Крайне не советую вести с ним какой либо диалог.

По итогу: Сборку пересобрал с АИ, залил - можно тестить. Теперь все на месте.

 

И не надо грозиться перепиской, я твою клоунаду сам с удовольствием предоставлю для общего чтива:

Снимок1.PNG

Снимок2.PNG

Снимок3.PNG

Снимок4.PNG

Снимок5.PNG

Снимок6.PNG

Снимок7.PNG

Снимок8.PNG

Снимок9.PNG

Снимок10.PNG

Снимок11.PNG

Снимок12.PNG

Снимок13.PNG

- Д: Сервер не работает!

- Я: Нет, работает

- Д: Квесты не работают!

- Я: Да нет же, работают

-Д: АИ стандартные

-Я: Мм, да, я ошибся и выложил не тот архив. Завтра выложу правильный, приходите тестировать

-Д: Нет! Просто у тебя их нет!

-Я: Но..

-Д: Нету! Их нету! Их не может быть1 Нету, нету, нету, нету.8P

-Я: (скриншот с аи)

-Д: Что это!? ИХ нету! И вообще все формулы кривые..:vava:

Изменено пользователем Rozhek

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

он тебя забанит на форуме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...