[Vanilla] фикс фильтра у классового тренера

Кому интересно, чтобы фильтр у классового тренера запоминал своё состояние,
ссылка на готовый аддон: https://disk.yandex.ru/d/WOYchZma909CfA

Как устанавливать
  1. выделяете текст ссылки и выбираете пункт “Перейти по ссылке”;
  2. в открывшемся окне жмёте кнопку “Скачать”;
  3. по окончании загрузки в браузере выбираете пункт “Показать в папке”, после чего должно открыться окно проводника с папкой, куда браузер скачал архив;
4. распаковываете архив в папку c WoW;

Путь к папке имеет вид %World_of_Warcraft%\%client_type%\Interface\AddOns, где
a) %World_of_Warcraft% - общая папка для всех типов WoW;
б) %client_type% - папка конкретного типа WoW:

  • _classic_ - для Катаклизм классик
  • _classic_era_ - для Ваниллы/Эры/Хардкора
  • _retail_ - для современного клиента
4.1 распаковка, если установлен WinRar
  • перенесите архив в папку %World_of_Warcraft%\%client_type%\Interface\AddOns, кликните по нему правой кнопкой мыши для появления контекстного меню
  • в появившемся меню выберите пункт “Извлечь в текущую папку”
4.2 распаковка, если установлен 7-Zip
  • перенесите архив в папку %World_of_Warcraft%\%client_type%\Interface\AddOns, кликните по нему правой кнопкой мыши для появления контекстного меню
  • в появившемся меню выберите подменю “7-Zip”
  • в подменю выберите пункт “Распаковать здесь”
4.3 если для распаковки использовать проводник Windows
  • кликните по скачанному архиву правой кнопкой мыши для появления контекстного меню
  • в появившемся меню выберите пункт “Извлечь всё…”
  • в появившемся окне жмите кнопку “Обзор…”
  • в появившемся окне переходите в папку %World_of_Warcraft%\%client_type%\Interface\AddOns и жмёте кнопку “Выбор папки”
  • после того, как окно с выбором папки закроется, жмите кнопку “Извлечь”
Кому не интересно качать готовое, а интересно `сделать самому`
  1. создайте в папке %WOW%\_classic_era\Interface\AddOns новую папку и переименуйте её в FixBlizzardTrainerFilter
  2. перейдите в папку FixBlizzardTrainerFilter
  3. создайте новый текстовой файл и назовите его FixBlizzardTrainerFilter.toc со следующим содержимым:
## Interface: 11505
## Title: FixBlizzardTrainerFilter
## Notes: Fix for Blizzard ClassTrainerFrame.FilterDropdown state saving.
## Notes-ruRU: Фикс для запоминания состояния фильтра классового тренера.
## Author: Мимоцели@Хроми
## Dependencies: Blizzard_TrainerUI
## SavedVariables: FixBlizzardTrainerFilter_Vars
FixBlizzardTrainerFilter.xml
  1. создайте новый текстовой файл и назовите его FixBlizzardTrainerFilter.xml со следующим содержимым:
<Ui>
  <Script file="FixBlizzardTrainerFilter.lua"/>
  <Frame name="FixBlizzardTrainerFilter_Frame">
    <Scripts>
      <OnLoad  function="FixBlizzardTrainerFilter_Frame_OnLoad"/>
      <OnEvent function="FixBlizzardTrainerFilter_Frame_OnEvent"/>
    </Scripts>
  </Frame>
</Ui>
  1. создайте новый текстовой файл и назовите его FixBlizzardTrainerFilter.lua со следующим содержимым:
local vars
-----------------------------------------------------------------------------
FixBlizzardTrainerFilter_Frame_OnEvent=function(self,event,...)
    if type(FixBlizzardTrainerFilter_Vars)~="table" then FixBlizzardTrainerFilter_Vars={} end
    vars=FixBlizzardTrainerFilter_Vars
    -- load defaults (1st load after install addon or after delete saved variables)
    if type(vars.available)=="nil"	then vars.available=true end
    if type(vars.unavailable)=="nil"	then vars.unavailable=true end
    if type(vars.used)=="nil"		then vars.used=false end
    -- apply saved values 
    TRAINER_FILTER_AVAILABLE_BOOL	 =vars.available
    TRAINER_FILTER_UNAVAILABLE_BOOL=vars.unavailable
    TRAINER_FILTER_USED_BOOL	 =vars.used
    -- set post-hook for filter changing function
    hooksecurefunc("SetTrainerServiceTypeFilter",function(entry,value)
      vars[entry]=value
      if    entry=="unavailable" then TRAINER_FILTER_UNAVAILABLE_BOOL=value
       elseif entry=="available" then TRAINER_FILTER_AVAILABLE_BOOL=value
       elseif entry=="used"	 then TRAINER_FILTER_USED_BOOL=value
      end
    end)
end
-----------------------------------------------------------------------------
FixBlizzardTrainerFilter_Frame_OnLoad=function(self) self:RegisterEvent("VARIABLES_LOADED") end

ВАЖНО! Файлы необходимо сохранять в кодировке UTF-8. (Я для этой цели использую AkelPad).
Если для создания файлов используется проводник Windows, то для правильного задания имени файла в проводнике должно быть включено отображение расширений файлов (файлы необходимо переименовывать вместе с расширениями, иначе работать не будет).

UPD: фиксанул косячок в пост-хуке, из-за которого изменения сохранялись только если сразу выйти из игры (или перезагрузить интерфейс) после изменения фильтра.

UPD: Добавил ссылку на готовый аддон, остальное убрал под кат.

Лайков: 1

Похоже, что пора делать аддон FixBlizzardBugs. Печально это всё.

Если перепишешь свой аддон без использования XML, то можно его генерировать через https://addon.bool.no/ юзерам может быть проще.

Проще не будет, ибо придётся объяснять , как править toc-файл, ведь генератор под ритейл, плюс сохранение переменных .