Jump to content
Alloder.pro  about Allods with love 😱
Search In
  • More options...
Find results that contain...
Find results in...

Servers monitoring and the Addons Editor

We present you two legends. All dreams come true.

Servers monitoring The Addons Editor

Digest April

We talk about what was done and updated in the past month. We help keep abreast of events.

Read more

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

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


Altair
 Share

Recommended Posts

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

 

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

 

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

 

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

 

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

 

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

 

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

Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

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

 

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

 

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

 

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

Link to comment
Share on other sites

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

 

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

 

 

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

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

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

Link to comment
Share on other sites

 

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

 

 

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

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

Link to comment
Share on other sites

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use