Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

Трекинг бафов


Altair

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

Давайте обсудим, кто как трекает бафы?

 

В первую очередь интересно было бы послушать Slashuur, havendv, logg, Saionaro, AcProg (как авторов наиболее популярных закрытых аддонов, трекающих в том или ином виде бафы), но и другим тушеваться не надо ;)

 

Озвучу сразу проблематику вопроса.

 

Во-первых, бафов обычно много. ОЧЕНЬ много. Особенно в массовых всяких замесах (ПВЕ/ПВП рейды). Самый "в лоб" способ определить, что определенный баф повесился на персонаже - это по имени бафа. Имхо, если по имени проверять все бафы в рейде - комп расплавит стол. Хотя я вполне допускаю, что некоторые из аддонов именно так и поступают.

 

Вторая проблема - нет четкого способа для определения факта исчезания (спадания) бафа, кроме перебора всех бафов, которые висят на персонаже. Тоже тяжело с вычислительной точки зрения. Если трекается N бафов, а на персонаже висит M бафов, то надо выполнить в худшем случае N*M проверок на соответствие.

 

Третья проблема - если проверять баф просто по имени, то возможны ситуации, когда разные фактически бафы будут светиться не там, где надо. К примеру, в астрале есть островной какой-то модификатор, который вешает баф "Горение", но с таким же именем есть еще целая пачка разных бафов в разных местах Сарнаута. Дизайнеры не заморачиваются уникальностью имен, да и не пристало им. Как в таком случае можно различить бафы друг от друга?

 

Возвращаясь к началу сообщения, давайте таки обсудим, как "правильно" следить за появлением/исчезанием бафов? Умные мысли приветствуются :)

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

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

 

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

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

1) Главное не проверять постоянно все бафы на всех юнитах, как в некоторых корявых аддонах, которые ищут всё и вся по СЕКОНД_ТАЙМЕРУ. Имя бафа сравнивать с нужным только при навешивании этого бафа, в событии EVENT_OBJECT_BUFF_ADDED. Но да, бафов очень много и сравнивать их названия, а именно строки - не самая быстрая операция и тут ничего не поделать, производительность страдает. Ну, например, в бафанонсе я храню все отслеживаемые бафы так: Таблица[id юнита][id бафа], а элементы этой таблицы - виджеты-иконки бафов

 

2) И эта проблема есть. Приходится в событии EVENT_OBJECT_BUFFS_CHANGED для юнита, от которого оно приходит перебирать все бафы, остались ли там бафы с такаими id, которые у меня отслеживаются, ну и если нет, то удалять виджет и элемент таблицы. Ну тут хотя бы сравниваются просто числа (id бафов) и это в разы быстрее сравнения строк, но тоже не есть хорошо

 

3) Ну да, кроме имени никак не различить :)

 

Вообще я раньше тоже думал об этом всём, были некие идеи, но лень заниматься и проверять их :) У бафа можно получить его ресурс object.GetBuffInfo(Id).buffId и он должен быть всегда одинаковым для одинаковых бафов. Сравнение ресурсов бафов ResourceId:IsEqual(resource) тоже должно быть  куда быстрее сравнения строк. Хотя я не проверял это и может оно и не имеет смысла. Также ресурс бафа можно сохранять в конфиг и загружать (как и любой ресурс). Также это решит и третью проблему, т.к. хоть имена бафов и одинаковые, ресурсы - разные. Но есть одно Но: откуда обычному рядовому пользователю аддона узнать этот самый ресурс бафа, чтобы прописать его в конфиге или настройках аддона? Юзеру проще же тупо написать название бафа и не париться. Можно конечно запоминать все появляющиеся бафы в округе и выводить пользователю список для выбора (типа как в PowerAuras). Или можно сделать некий совмещенный вариант: только что введенный пользователем баф ищется по названию, а когда впервые поймается, то в конфиг сохраняется его ресурс и дальнейший поиск этого бафа уже идёт по ресурсу

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

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

 

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

 

 

Вообще я раньше тоже думал об этом всём, были некие идеи, но лень заниматься и проверять их :) У бафа можно получить его ресурс object.GetBuffInfo(Id).buffId и он должен быть всегда одинаковым для одинаковых бафов. Сравнение ресурсов бафов ResourceId:IsEqual(resource) тоже должно быть  куда быстрее сравнения строк. Хотя я не проверял это и может оно и не имеет смысла. Также ресурс бафа можно сохранять в конфиг и загружать (как и любой ресурс).

Я на эту тему тоже думал, даже реализовал некий runtime-cache, который был словариком с ключами buffResourceId:GetInstanceId(), а значением была ссылка на структуру трекаемого бафа из конфига аддона. Подробно на цифры не смотрел, но заметил, что даже так во всяких рейдах при включеном аддоне как-то подтормаживать игра начинает.

Недавно вот пришла мысль, что можно попробовать написать что-то типа библиотеки, которая бы одна занималась треканием бафов, а пользовательским аддонам бы рассылала кастомные сообщения о том, что баф появился/изменился/пропал.

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

 

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

 

 

В бафе от модификатора скорей всего не указан producer.casterId. Остальные бафы с данным именем чаще всего вешаются мобами и имеют эти данные.

В любом случае, думаю, крутиться нужно вокруг этой таблицы(Для фильтрации)

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

Важная информация

Пользуясь сайтом, вы принимаете Условия использования