вторник, 1 ноября 2011 г.

Кастомизация аддона Shock&Awe


Здесь я раскажу основные принципы как добавлять новые приоритеты в этот аддон.
Как простые так и сложные.

Аддон Shock&Awe был создан в октябре 2008года автором Pericles. Для постоянных читателей ресурса elitistjerks он известен как- Levva. Данный человек стоял у истоков создания EnhSim (симулятор энх. шамана) и вообще вёл очень глубокую проработку механики нашего класса. К сожалению, с недавнего времени он, насколько я понял, прекратил свою деятельность в этом направлении, но его творчество успешно используется до сих пор, и думаю, будет продолжать использоваться и далее.
От себя лично я выражаю благодарность этому человеку за всё что он сделал для энханс сообщества.
К сожалению я не смог связаться с ним лично, поэтому надеюсь что он не будет против всего того что я напишу ниже.
Thank you Levva!

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

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

По моему мнению, самая главная и полезная часть S&A это фрейм приоритетов а всё остальное- приятное дополнение. Вот именно его я и буду рассматривать в этом материале.


Фрейм приоритетов- Говоря простым языком, это свободно редактирующееся окошко (можно менять расположение, величину), в котором показываются иконки абилок в предопределённом пользователем порядке.

Настройки фрейма приоритетов.
Если вспомнить а том о чём я говорил в "Ротации" до этого. То вы получаете в игре фрейм в котором в зависимости от состояния показываются иконки абилок из вашей ротации.

Предопределение того что и когда показывать(приоритетов) происходит в меню настроек:


Собственно все интуитивно понятно- 
Priority Group- Это набор группы приоритетов. Очень полезная вещь. Вы можете создать несколько групп заданных вами приоритетов (AOE, Single) и переключаться между ними во время боя. Для переключения между группами просто забинтите нужные клавиши в меню общих настроек биндов WoW.

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

Попытки долбить автора, по этому поводу- к сожалению результатов не приносили, поэтому пришлось немного по разбираться в LUA и принципе написания аддонов WoW. На самом деле все оказалось довольно просто.
Итак вот свежий набор приоритетов для текущего патча:
Searing Totem if not present
Stormstrike
Lava Lash
Maelstrom Weapon x5 Lightning Bolt
Maelstrom Weapon x4 Lightning Bolt with Spirit Wolves
Flame Shock with Unleash Flame buff
Unleash Elements
Earth Shock
Feral Spirit
Searing Totem if <5 ticks left
Maelstrom Weapon x1 Lightning Bolt
 (стырено отсюда)


В текущей версии аддона мы не найдем следующих приоритетов из списка выше:
Maelstrom Weapon x4 Lightning Bolt with Spirit Wolves
Searing Totem if <5 ticks left
Maelstrom Weapon x1 Lightning Bolt

Далее, я расскажу как добавить эти приоритеты в текущую версию аддона.

Кастомизация 

В составе файлов аддона нас, в первую очередь будет интересовать файлы:
ShockAndAwe.lua и Priority.lua
 по сути- это текстовые файлы. Редактировать и сохранять их можно в любом текстовом редакторе. Я пользуюсь Notepad++ (рекомендую). Для навигации по этим файлам в своем рассказе я буду использовать номера строк.

ShockAndAwe.lua.
Со строки №834 начинается определение констант. Это набор используемых аддоном заклинаний которые в том или ином виде будут использоваться при работе.


Принцип описания константы прост:
ShockAndAwe.constants["Название абилки(англ.)"], _, ShockAndAwe.constants["Название абилки(англ.) Icon"] = GetSpellInfo(SpellId)
Всю информацию можно взять с wowhead.
В таком виде сюда добавляются отсутствующие в списке абилки которые мы планируем использовать в аддоне.
Яркий пример был в предыдущем патче когда в цикл включалась Lava Burst.

Для реализации нужных нам приоритетов этот файл можно не трогать, но на будущее полезно знать.

Priority.lua
Описание самих приоритетов начинается со строки №102
 



 Итак, у нас три приоритета, поддержку которых необходимо реализовать в аддоне. Если разобрать их по сложности, то у нас два легких


Searing Totem if <5 ticks left
Maelstrom Weapon x1 Lightning Bolt
и один "тяжелый"
Maelstrom Weapon x4 Lightning Bolt with Spirit Wolves

Первые два приоритета реализуются довольно легко. Просто надо добавить новые  на основе существующих:
Для "Searing Totem if <5 ticks left" будем использовать ненужный в текущих реалиях приоритет "Lava lash 5 searing flames". В файле Priority.lu он выглядит так:


    ShockAndAwe.priorityTable.name["ll_sf5"] = L["Lava lash 5 searing flames"]
    ShockAndAwe.priorityTable.icon["ll_sf5"] = ShockAndAwe.constants["Lava Lash Icon"]
    ShockAndAwe.priorityTable.test["ll_sf5"] = 
        function ()
        local _, _, sfstacks = ShockAndAwe:GetDebuffInfo(ShockAndAwe.constants["Searing Flames"])
          return ShockAndAwe:SpellAvailable(ShockAndAwe.constants["Lava Lash"]) and sfstacks == 5
        end

"ll_sf5"-аббревиатура приоритета. Можно задавать в любой свободной форме придерживаясь формата. Для нашего нового приоритета пишем например- "st_sf5".

 L["Lava lash 5 searing flames"]-название приоритета которое будет отображаться в аддоне.
Так же можно придумать любое название, главное потом не забыть что оно означает. Новый приоритет называем например- "ST if less 5"

Буква "L" в начале означает, что это название будет использовать параметры локализации аддона которые определены в отдельном файле \Interface\AddOns\ShockAndAwe\Locales\Locale-ruRU.lua
Короче говоря, если вы хотите что бы название вашего нового приоритета в аддоне отображалось на русском языке, надо добавить в Locale-ruRU.lua:
L["ST if less 5"] = "Опаляющий тотем если меньше 5"

Если не заморачиваться таким правильным оформлением то просто убираем L и квадратные скобки (кавычки оставляем) и используем английское название.
У нас получается:
ShockAndAwe.priorityTable.name["st_sf5"] = "ST if less 5"
Что менять в следующих двух строках я думаю должно быть интуитивно понятно. Получаем:
    ShockAndAwe.priorityTable.icon["st_sf5"] = ShockAndAwe.constants["Searing Totem Icon"]
    ShockAndAwe.priorityTable.test["st_sf5"] = 



Модификация функции приоритета так же не должно составить труда.
Итак, новый приоритет:
    ShockAndAwe.priorityTable.name["st_sf5"] = "ST if less 5"
    ShockAndAwe.priorityTable.icon["st_sf5"] = ShockAndAwe.constants["Searing Totem Icon"]
    ShockAndAwe.priorityTable.test["st_sf5"] = 
        function ()
            local _, _, sfstacks = ShockAndAwe:GetDebuffInfo(ShockAndAwe.constants["Searing Flames"])
            return ShockAndAwe:SpellAvailable(ShockAndAwe.constants["Searing Totem Icon"]) and sfstacks < 5
        end

Все это дело вставляем в любое место в файл Priority.lua после строки №102.

 
Maelstrom Weapon x1 Lightning Bolt - ещё проще. Можно просто заменить пару знаков в существующем Maelstrom Weapon x2 Lightning Bolt:

    ShockAndAwe.priorityTable.name["mw1_lb"] = L["MW1 Lightning Bolt"]
    ShockAndAwe.priorityTable.icon["mw1_lb"] = ShockAndAwe.constants["Lightning Bolt Icon"]
    ShockAndAwe.priorityTable.test["mw1_lb"] =
        function ()
            return ShockAndAwe.db.char.msstacks >= 1
        end

Сложнее с Maelstrom Weapon x4 Lightning Bolt with Spirit Wolves. Аналогов в текущей версии-нет, и собрать из кусков- не получится. Волки не дают никакого баффа и отследить момент из вызова и исчезновения довольно- не тривиальная задача.



Выручит нас WoW API GetSpellCooldown. Логика простая. Так как общий кулдаун волков и время когда они активны-фиксированные значения и не меняются, можно без особого труда идентифицировать момент их вызова и моент когда их уже нет.
Приоритет будет выглядеть вот так:


       ShockAndAwe.priorityTable.name["mw_if_fs"] = "MW4 + Feral Spirit"
       ShockAndAwe.priorityTable.icon["mw_if_fs"] = ShockAndAwe.constants["
Lightning Bolt Icon"]
       ShockAndAwe.priorityTable.test["mw_if_fs"] =
               function ()
                       local start, duration, _ = GetSpellCooldown(51533)
                       local mwX = 4
                       if start> 0 and duration > 0 then
                       local FeralSpiritActive = start + duration - GetTime()
                               if FeralSpiritActive > 90 then
                                       -- волки активные
                                       return ShockAndAwe.db.char.msstacks >= mwX
                               else
                                       -- волки закончились
                                       return false
                               end
                       else
                               -- волки не на кд
                               return false
                       end
               end



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

Отвечу на все вопросы в комментариях.


(Выражаю благодарность моему другу Грелкину за большую помощь в освноении кастомизации аддона)



































Экзорсус (продолжение)

Собственно, более ничего уникального из терминов я не запомнил.


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

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

Для новичков гильдии может быть несколько непривычно слышать как РЛа мейн рейда (он же ГМ) могут довольно часто посылать в далёкий крестовый поход. Но тем самым, новичку легче определить основной костяк гильдии.Привыкнуть к голосам основных игроков и никам.

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

Задачи рейда 
 ТОП1 РУ в любом случае. Хотя иногда и будут звучать темы что то вида 
-"Карфаген убили!"
-"Давайте поздравим их! Они наши друзья."
в любой момент освоения чего то нового цель- быть ТОП1. Это было будет всегда.
Есть три состояния рейда:
1. Рейд на освоении нового контента. Самая тяжёлая и утомительная часть. Её ещё называют-гонкой. Рейды примерно по 5-7 часов. (Хотя на освоении ОП я помню что кто то говорил о 13ти часах.. может быть слухи конечно я не был свидетелем так как уехал в это время). 
Рейд начинается раньше обычного установленного РТ. Всвязи с этим поступет указание о взятии отпуска либо отгулов. Вполне серъёзная просьба к которой так же относятся вполне серъёзно.
Обработка хардмодов после быстрой зачистки нормалов. Из себя это представляет поиск оптимальной тактики методом тыка, то есть вайпов, анализ логов (включая логи других гильдий (если есть), подбор оптимального состава.
2. Зачистка. Первый период после окончания освоения. То есть после убийства последнего босса контента в хардмоде. Основной состав с течением времени и насыщением лутом постепенно разбавляется другими рейдерами для набора шмота и подготовки к следующему контенту.
3. Твинко-рейды. Создаются паралельные рейды с перемешиванием мейнов и альтов. Цель та же что и в п.2, ну и просто уже мало что остаётся делать в игре.

Распределение Лута
В основном рейде лут всегда распределяет РЛ(ГМ). Руководствоваться он может чем угодно, но в любом случае лично мне всегда нравилось как он это делает. Естественно бывают недовольные начинают "бованить" и т.д. но дальше небольшой тирады по поводу несправедливости мира и ГМа дело никогда не доходило.
В своё время подобное я наблюдал к сожалению только в одной гильдии- "Зайцы".

Вот наверное и всё. Напоследок хочу сказать, что Экзорсус для меня гильдия уникальная. Я никогда ранее не играл в гильдии подобного формата и очень благодарен всем тем, кто предоставил мне такую возможность.

Да! Забыл упомянуть, что довольно часто (раз в 5-6 месяцев) проходит сходка гильдии (в Москве). Я был на двух, и там было очень весело.