promotional bannermobile promotional banner

PremadeIQ

Epic Battleground match-statistics collector for World of Warcraft, with an optional community Uploader.
Back to Files

addon-v0.9.51

File namePremadeIQ-addon-v0.9.51.zip
Uploader
RezalLegendRezalLegend
Uploaded
Sep 16, 2026
Downloads
28
Size
172.6 KB
Flavors
Retail
File ID
8895340
Type
R
Release
Supported game versions
  • 12.1.0

What's new

Changelog

Все заметные изменения документируются здесь. Формат — Keep a Changelog, версионирование — SemVer.

[0.9.51] — 2026-09-16

Added

  • Бой теперь уносит с собой прогноз, который вы видели. В момент, когда строка шансов перестаёт пересчитываться, аддон записывает: показанный процент, минуту боя, сколько строк было на каждой стороне и сколько из них нашлось в таблице винрейтов. Запись уходит на сервер вместе с боем. Имён в ней нет — только числа, которые и так были на экране.

    Зачем: проверить, насколько часто сбываются проценты, которые аддон показывает на самом деле, и понять, стоит ли учитывать в прогнозе перевес в числе игроков. Сейчас точность оценивается по составу, снятому позже, и именно в тот момент, когда вы видите число, её никто не мерил. Если показ шансов выключен, записи нет. Внешне в аддоне ничего не изменилось.

[0.9.50] — 2026-09-12

Fixed

  • Приветственное окно больше не предлагает платный тир — его нет. В тексте при первом запуске говорилось, что тир King of EBG на Patreon добавляет разбор на сайте. С 12 сентября это неправда: платного доступа не осталось, а остальной сайт — поиск игрока, разбор матчей, вражеские лидеры — открывают пять боёв за неделю. Текст поправлен на всех шести языках; кроме него в аддоне ничего не изменилось.

[0.9.49] — 2026-09-09

Fixed

  • Шансы теперь считаются только в эпических полях боя. Раньше строка появлялась в любом бою, включая обычные 15×15 — а винрейты в кеше собраны исключительно на эпиках, и заявленная точность измерялась там же. В обычном бою число выглядело так же уверенно, но за ним не стояло ничего.
  • Зафиксированный прогноз больше не портится в момент фиксации. Когда табло начинало пустеть, число сначала пересчитывалось по составу уже без ушедших и только потом замораживалось — то есть замораживалось именно испорченное. Теперь при первых потерях фиксируется то, что было посчитано на полном составе. Заодно «заполненность» табло меряется по меньшей из двух команд: раньше своя половина догружалась, вражеская таяла, сумма не менялась — и прогноз замирал раньше времени.
  • Выключатель «Показывать шансы» гасит все три места показа. Он убирал строку в панели игроков, но всплывающая плашка и строка на премейд-баннере продолжали появляться. Прямой запрос /piq odds работает по-прежнему: это вопрос, заданный вслух.
  • Аддон отказывается считать по непригодному кешу винрейтов. Файл чужой версии, старше 45 дней или без коэффициентов теперь читается как «данных нет». Раньше пустая модель давала не молчание, а ровное «50% — 50%» с подписью «точность 0%» — ноль, умноженный на что угодно, это монетка.

[0.9.48] — 2026-09-07

Changed

  • Шансы больше не меняются по ходу боя. Раньше они пересчитывались на каждом скане табло, а состав в бою меняется — и число незаметно ползло вслед за уже наметившимся исходом, выглядя прозорливее, чем есть. Теперь расчёт идёт, пока табло заполняется, и фиксируется, как только рост прекратился. Прогноз считается по стартовому составу — тому самому, на котором его точность и измеряли.
  • Видно, что происходит: строка сообщает «читаю табло», затем «считаю», а зафиксированный результат помечен как «итог».
  • Строки прогноза переведены на все языки аддона. Английскими остаются только предупреждение о премейде и текст для копирования — их читают в чате разноязычного боя.

Added

  • Переключатель «Показывать шансы на победу» в настройках (/piq options), по умолчанию включён. Не ради производительности: весь кеш винрейтов — около 1 МБ памяти, а один расчёт занимает сотые доли миллисекунды на строках, которые панель и так прочитала.

[0.9.47] — 2026-09-06

Changed

  • Панель игроков не прячется до конца боя. Раньше она исчезала, если на табло не нашлось ни премейдеров, ни отмеченных тобой людей — а вместе с ней исчезала и строка шансов, которой есть что показать в любом бою. Пока табло дозагружается, в строке написано, что она ждёт данные. Вне боя панель по-прежнему убирается.
  • Шансы обновляются и во время боя: раньше строка замирала, потому что весь блок обновления панели останавливался в бою из-за защищённых кнопок.

Fixed

  • Разделители в строке шансов больше не показываются пустыми квадратиками: шрифт интерфейса не рисует символ, который там стоял.

[0.9.46] — 2026-09-06

Fixed

  • После /reload в бою аддон снова подхватывает матч. Перезагрузка интерфейса посреди боя стирала контекст матча, а восстановить его не получалось: отпечаток боя записывался в момент попадания на поле, за одну-две минуты до открытия ворот, и потом не сходился с настоящим началом боя ровно на длительность подготовки. На эпических полях это значило, что восстановление не срабатывало никогда. Из-за этого после /reload пропадали и время начала матча в статистике, и предупреждение о премейде, и строка шансов.
  • Уведомление «обычно берёт лид рейда» больше не молчит из-за пустого каталога. Такие игроки живут в отдельном списке, но проверка «каталог пуст» смотрела только на список премейд-лидеров и отбрасывала матч раньше, чем дело доходило до них. Если ты отметил только рейд-лидов и ни одного премейда, уведомление не появлялось вовсе.
  • Заголовок окна копирования больше не застывает на языке, который был выбран при запуске игры.

[0.9.45] — 2026-09-06

Added

  • Шансы на победу в бою. Аддон берёт обе команды с табло, сверяет их с таблицей винрейтов от Uploader'а и показывает, у кого перевес — до того, как бой решится. Строка живёт в панели отслеживаемых игроков и обновляется по ходу заполнения табло; наведи курсор — увидишь, из чего сложилось число (средний винрейт сторон и доля игроков, которых база ни разу не видела), клик копирует это для чата. Команда /piq odds отвечает в любой момент и честно говорит, если данных не хватает.
  • Всё считается в самой игре, без запросов к серверу: WoW отдаёт данные наружу только при перезагрузке интерфейса, поэтому спросить сервер посреди боя невозможно в принципе.

Notes

  • Прогноз угадывает примерно 72% боёв — это подсказка, а не приговор: каждый третий-четвёртый раз он ошибается, о чём написано прямо под числом. Цифра измерена на стартовых составах, то есть на том же неполном табло, которое видит аддон.
  • Нужен Uploader 0.9.2 или новее — таблицу винрейтов приносит он. Персональные винрейты в игре не показываются: только сводка по командам.

[0.9.44] — 2026-09-04

Added

  • Аддон предупреждает, когда список премейдов устарел. Список приходит от Uploader'а, и если тот давно не запускался, аддон продолжает работать молча — на данных двухнедельной давности. Хуже всего то, как это выглядит: тишина на входе в бой читается как «премейдов нет», хотя на самом деле «мы не знаем». Теперь при входе на эпическое поле боя, если списку больше двух недель, будет сказано прямо: сколько дней назад он обновлялся и что с этим делать. Не чаще раза в неделю, отключается там же, где предупреждения о премейдах.
  • /piq status показывает возраст списка. Пассивная подсказка срабатывает только в бою и только после двух недель молчания, то есть проверить её намеренно было нельзя. Эта строка отвечает сразу — в том числе когда всё свежее.
  • Третий уровень уверенности в панели целей: «возможный участник». Раньше человек был либо участником премейда, либо никем — между ними пустота. Из-за этого один сыгранный бой мог убрать его из панели, а следующий — вернуть, хотя сам он ничего не менял. Теперь тот, по кому история есть, но её пока недостаточно для уверенной пометки, показывается со знаком ? и подписью «Possible premade member», а в подсказке видно, рядом с чьим премейдом его замечали. Знак нарочно отличается от * (лидер) и ~ (водит рейд, но не премейд): это вопрос, а не утверждение. Такие игроки идут отдельным списком и никогда не попадают в состав подтверждённых — ни в панели, ни в объявлениях.

[0.9.43] — 2026-08-26

Added

  • Аддон замечает, когда бои перестали уходить. Uploader — отдельная программа, и ломается она тихо: аддон продолжает записывать бои, наружу не уходит ничего, а человек узнаёт об этом, когда у него отключается доступ к каталогу премейдов. Прошлая подсказка тут помочь не могла — она говорила только тем, у кого каталог пустой, то есть как раз молчала для всех, у кого он уже наполнен. Теперь при входе на эпическое поле боя аддон считает, сколько боёв записано после последней выгрузки, и если Uploader не запускался три дня и больше — говорит об этом. Не чаще раза в три дня, отключается там же, где предупреждения о премейдах.
  • И сразу говорит, чем это грозит. Доступ к каталогу держится на выгрузке раз в семь дней. Если тишина меньше недели — аддон подскажет, сколько осталось; если больше — что доступ, скорее всего, уже протух и как его вернуть. Раньше это выяснялось постфактум и без объяснений.
  • /piq теперь показывает состояние выгрузки — сколько боёв ждут отправки и когда Uploader работал в последний раз. Пассивная подсказка появляется только после нескольких дней тишины и только на поле боя, так что проверить её намеренно было нельзя. Эта строка отвечает сразу, в том числе когда всё в порядке.

Changed

  • Адрес страницы установки стал короче. В WoW ссылки некликабельны, и в чате текст даже не выделяется: адрес переписывают руками. Короткий набирать легче, а ведёт он туда же.

[0.9.42] — 2026-08-16

Fixed

  • Ссылка на Uploader вела в никуда — с самого первого публичного релиза. Команда /piq uploader печатала адрес репозитория, которого не существует: каждый, кто хотел отдавать свои бои, упирался в страницу «404». Теперь она ведёт на страницу установки: https://premadeiq.duckdns.org/install — и открывает окошко, где адрес уже выделен, чтобы его можно было скопировать (в чате WoW текст не выделяется, и переписывать адрес руками — так себе занятие).

Added

  • Аддон больше не молчит о том, что список премейдов пуст. Он ставится с пустым списком и сам ничего скачать не может: список — это данные сообщества, и приносит их Uploader. Раньше это выглядело так, будто предупреждения просто не работают. Теперь при входе на эпическое поле боя аддон один раз (не чаще раза в неделю) говорит, чего не хватает, и чем это лечится. Если Uploader уже стоял, а доступ протух, текст другой — «выгрузи один бой», а не «поставь приложение»: это разные ситуации, и путать их нечестно.
  • После записанного боя — напоминание про /reload. Строка «Матч записан» означает «запомнен в памяти», а не «отправлен»: игра сбрасывает SavedVariables на диск только при /reload или выходе. Пока этого не случилось, Uploader честно не видит ничего — и выглядит сломанным. Строка показывается только тем, у кого выгрузок ещё не было.

Changed

  • Приветственное окно переписано. Раньше третьим шагом стояло «привяжи Discord к Patreon», и всё вместе читалось как «дальше платно». Платно — не дальше: один доигранный эпический бой в неделю открывает предупреждения о премейдах, полный лидерборд и дезертиров, и это бесплатно. Вступать в Discord-сервер тоже больше не нужно — хватает самого аккаунта Discord. Patreon остался, но там, где ему место: отдельной необязательной строкой.
  • /piq status на пустом каталоге теперь показывает, куда идти за ним.

[0.9.41] — 2026-08-15

Fixed

  • У кнопки на миникарте появилась своя эмблема. Вчерашняя кнопка рисовалась зелёным знаком вопроса — картинкой, которой игра заменяет любую текстуру, которую не нашла. Путь к иконке был указан на несуществующий значок Blizzard, а игра о таком не сообщает никак: ни ошибки, ни предупреждения, просто вопрос. Теперь кнопка показывает логотип PremadeIQ — он же стоит и в списке аддонов, и в штатном меню на миникарте.

[0.9.40] — 2026-08-14

Added

  • Свой список отслеживаемых игроков. В настройках аддона появилось поле: скопируй имя персонажа в игре, вставь — и этот человек будет помечен в панели участников, когда окажется с тобой в бою. Список личный: он хранится в отдельном файле только на твоём компьютере, никуда не отправляется и никому, кроме тебя, не виден. На определение премейдов он тоже никак не влияет — это твоя пометка, а не наши данные. Строка такого игрока подписана «в твоём личном списке», а не «участник премейда»: аддон не утверждает того, чего не знает. Имя сверяется точно, поэтому после переименования запись перестанет срабатывать, и её нужно добавить заново.
  • Одиночные лидеры рейда теперь видны в панели. Тех, кто водит рейд, но премейд не собирает, аддон отмечал только строкой в предупреждении — в панели участников их не было вовсе. Теперь они там есть, с меткой ~ и подписью «водит рейд, премейда нет». Это отдельная категория, а не премейд: звезды лидера такой игрок не получает никогда. А если человек одновременно водит рейд и состоит в чьём-то премейде — так примерно у половины из них — панель скажет и то и другое, а не выберет одно из двух.
  • Кнопка на миникарте. Открывает настройки аддона, перетаскивается по краю миникарты, выключается галкой в тех же настройках. Заодно PremadeIQ появился в штатном меню аддонов на миникарте — тем, кто кнопки не любит, туда и дорога.
  • Выбор языка аддона. В настройках появилась строка «Язык»: по умолчанию как в игровом клиенте, но можно принудительно выбрать любой из шести. Нужно это было в первую очередь для проверки — на русском клиенте невозможно было увидеть, что читают англоговорящие, а их среди игроков в нашей базе 45%. Предупреждения в бою остаются английскими при любом выборе: их читает поле боя, где говорят на разных языках.
  • Немецкий, французский и испанский наконец переведены полностью. Аддон заявлял пять языков, но три из них были переведены на 22%: всё окно настроек, подсказки и ссылки показывались по-английски. Немцев среди наших игроков 22% — вторая по величине группа после англоговорящих.
  • Добавлен итальянский — шестой язык, переведён целиком.

Fixed

  • Настройки перестали разъезжаться. Строка «Колонки», блоки статистики и ссылок уползали вправо и налезали на соседнюю колонку, а ссылки обрезались по краю окна. Причина была в раскладке: каждая строка настроек цеплялась не за начало колонки, а за кнопку внутри предыдущей строки, и сдвиг копился.
  • Панель больше не могла умолкнуть до перезагрузки интерфейса. Ошибка при разборе списка премейдов оставляла внутренний флаг «идёт сканирование» поднятым, и все последующие обновления панели молча пропускались. Теперь такая ошибка обрабатывается и на следующем обновлении всё восстанавливается само.
  • Заголовок панели стал точным — «Tracked players» вместо «Known premade targets»: панель давно показывает не только участников премейдов.

[0.9.39] — 2026-08-14

Fixed

  • Игроков, чей идентификатор не удалось прочитать, больше не принимают за ушедших с поля боя. Строку финального табло с нечитаемым идентификатором аддон пропускал молча, и на сервере она выглядела точно так же, как строка человека, который покинул бой. Теперь аддон отмечает игрока по ИМЕНИ (имя игра скрывать не умеет) до того, как строка может быть отброшена, и отдельно сообщает серверу, сколько строк пришлось отбросить.

Added

  • Сайт теперь показывает, кто не дошёл до конца боя. Данных для этого хватало и раньше, но использовалась только обратная половина — отметка «вступил позже». Секция «Покинули поле боя» на странице матча больше не пустует: в эпических боях состав перебирается наполовину, и теперь видно обе стороны обмена.

[0.9.38] — 2026-08-12

Fixed

  • Аддон больше не ломает системные предупреждения боя. Заголовок про премейд выводился в ту же рамку по центру экрана, которой игра пользуется для своих объявлений («Ворота разрушены» и подобных). В 12.1 это стало опасно: после нашего сообщения рамка оставалась «помеченной» аддоном и потом падала с ошибкой — причём не только на нашем тексте, но и на объявлениях самой игры. Ошибку было невозможно перехватить: она возникала уже после того, как аддон отработал. Теперь эта рамка не используется вовсе. Ничего не потеряно: собственный баннер PremadeIQ показывает тот же заголовок теми же цветами (красный — премейд подтверждён, жёлтый — возможен) и вдобавок расписывает лидеров, чего однострочная рамка никогда не умела.

[0.9.37] — 2026-08-12

Changed

  • Поддержка патча 12.1 «Проклятие Ула'тека». Аддон больше не помечается как устаревший.

Fixed

  • «Корон» у врага теперь не показывается ноль там, где на самом деле «не видно». В 12.1 игра перестала сообщать аддонам, кто из противников ведёт группу, — и прежний счётчик честно возвращал ноль просто потому, что смотреть ему больше не дают. На сайте это выглядело бы как «у вражеской команды не было ни одной сгруппированной пачки» — утверждение, которого аддон не делал. Теперь он отдельно считает противников, о которых игра отказалась отвечать, и сервер в таком случае не публикует оценку вовсе вместо того, чтобы публиковать ноль. Замеченные короны (если игра всё же ответит) по-прежнему идут в зачёт как нижняя граница, а свои — определяются как и раньше: по своей стороне игра ограничений не ставит, поэтому лидеры вражеских групп продолжают восстанавливаться из отчётов игроков противоположной фракции.

[0.9.36] — 2026-08-08

Fixed

  • Игрок, отмеченный как «берёт лид рейда», больше не пропадает из предупреждения, если в бою есть ещё и премейд. Строка о нём печаталась только когда премейдов не было вовсе — то есть ровно в тех боях, где она нужна меньше всего. Теперь она идёт последней строкой обычного предупреждения и дублируется в баннере, а вердикт про премейд не меняется.

Changed

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

[0.9.35] — 2026-08-08

Fixed

  • /reload посреди боя больше не стоит тебе матча. Аддон запоминал время своего входа в бой только в момент старта, и перезагрузка интерфейса стирала его без возможности восстановить. Сервер в таких случаях считал, что ты был в двух боях одновременно, и отправлял матч в карантин — на сайте он просто пропадал. Теперь время входа переживает /reload: оно сохраняется вместе с отпечатком самого боя, и восстанавливается только если отпечаток совпал, то есть перепутать соседние бои на одной карте невозможно.
  • Состав «кто был в бою с самого начала» больше не подменяется итоговой таблицей. После перезагрузки интерфейса аддон мог зафиксировать стартовый состав уже по финальному табло. Такой список содержит всех, кто доиграл до конца, поэтому зашедшие на замену переставали считаться зашедшими позже — а именно это защищает их от метки «ушёл из боя». Стартовый состав теперь никогда не берётся после окончания матча.

[0.9.34] — 2026-08-08

Added

  • Панель участников премейдов теперь показывает обе команды. Раньше в ней были только известные премейдеры противника; появилась вторая секция — «Твоя команда». Кнопки работают одинаково в обеих: ЛКМ — взять в цель, ПКМ — назначить фокусом. Пустая секция не рисуется.
  • Панель сворачивается в маленькую кнопку. Крестик в правом верхнем углу убирает панель целиком и оставляет вместо неё компактную кнопку со счётчиками — её можно перетащить куда угодно, клик разворачивает панель обратно. Работает в бою, а не только вне его.
  • Настройки размера (Esc → Настройки → Аддоны → PremadeIQ): масштаб панели 70–150% и число колонок 1–6.

Fixed

  • Метка лидера больше не рисуется пустым квадратом. Звёздочки в списке (и разделители в заголовке) заменены на символы, которые игровой шрифт действительно умеет отображать.
  • Длинные имена больше не обрезаются. Ширина колонки считается по самому длинному имени на экране, поэтому Имя-Реалм целиком помещается в плашку.
  • Своя команда определяется правильно в режиме наёмника. Сторона берётся из того же battlefield-API, которым пользуется само табло, а не из фракции персонажа — иначе в режиме наёмника секции менялись бы местами.

[0.9.33] — 2026-08-07

Fixed

  • Бои с поздним входом больше не пропадают. Если вы зашли в уже идущий бой (Озеро Ледяных Оков, Альтерак, Ашран это позволяют), сервер считал, что вы были в двух боях одновременно, и выбрасывал бой целиком: его не было ни на сайте, ни в определении премейдов. Причина — длительность, которую отдаёт игра, меряет саму битву, а не то, сколько в ней пробыли вы. Аддон теперь сообщает время своего входа. На проде так терялось 2,5% всех боёв.

Added

  • Отдельная пометка для тех, кто водит рейд, но не премейд. Такие игроки больше не поднимают тревогу о премейде — про них выводится одна нейтральная строка «Usually takes raid lead». Ни состава, ни счётчика, ни вердикта: метрика, по которой их отмечают, ловит и обычных рейд-лидеров тоже.
  • Аддон запоминает состав табло до замен. Боевые числа ушедших игроков в 12.0.x восстановить нельзя, а вот имена читаются всегда — снимок берётся один раз, когда табло заведомо догрузилось. Благодаря этому сайт снова отличает пришедших на замену, а пометка «дезертир» перестаёт цепляться к тем, кто просто зашёл позже. Снимок берётся на уже идущих обновлениях табло и выключается сразу после захвата — лишней нагрузки нет.

[0.9.32] — 2026-08-03

Fixed

  • Итоговая таблица очков больше не уезжает пустой. В 12.0.x боевые числа (урон, лечение, добивания, смерти) иногда отдаются как «секретные значения»: прочитать их нельзя, а проверка или 0 их не ловит, потому что секрет в Lua истинен. В результате строка сохранялась пустой, и игрок, отыгравший весь бой, выглядел как ничего не сделавший. Теперь перед сохранением аддон ждёт, пока числа станут читаемыми (до 4 попыток), и явно обнуляет только то, что прочитать не удалось.
  • Сумма очков за задачи считалась на потенциально секретном значении — это могло оборвать весь захват боя на середине.

Added

  • Аддон сообщает серверу, сколько строк таблицы очков остались нечитаемыми. Сервер по такому бою больше не делает выводов о том, кто из игроков вышел раньше времени.

[0.9.31] — 2026-08-01

Fixed

  • Панель больше не могла «откатиться» к устаревшему составу. Если во время боя состав менялся, а затем возвращался к тому, что уже на экране, старое отложенное обновление не сбрасывалось — и после выхода из боя применялось поверх корректного списка. Теперь совпадение с текущим составом снимает отложенное обновление.
  • Таймеры сканирования, запланированные на старте матча, больше не доживают до следующего боя: вместо неотменяемых таймеров используются отменяемые, и каждый проверяет «поколение» матча.
  • Флаг внутреннего сканирования сбрасывается даже при ошибке — раньше сбой фильтрации мог навсегда заблокировать все последующие обновления панели.

Added

  • Метка «•» в заголовке, пока обновление ждёт выхода из боя: список на экране не врёт о своей свежести. Метка гаснет, как только состав применён.
  • Периодическая проверка состава раз в 2 секунды вне боя — короткие паузы между стычками теперь используются для применения отложенного, не дожидаясь следующего события таблицы очков.

Changed

  • Запрос данных таблицы очков отделён от чтения кеша: обработчик события больше не шлёт повторный запрос, из-за которого ответ сервера мог попасть под собственный троттлинг.
  • Стартовая серия сканирований укорочена (0.5–10 с) — дальше работает периодическая проверка.
  • Панель полностью на английском: всплывающие подсказки (роль игрока, список премейдов, подсказка по кликам) переведены на английский вслед за заголовком.

[0.9.30] — 2026-08-01

Fixed

  • Клики по панели известных участников заработали. Кнопки не реагировали ни на ЛКМ, ни на ПКМ: игра решает, какой клик выполняет действие, по атрибуту useOnKeyDown, а без него — по настройке ActionButtonUseKeyDown. Она включена по умолчанию, то есть действие ждали на нажатии, а кнопка была подписана только на отпускание — клик проваливался молча, без ошибки. Теперь атрибут задаётся явно и всегда совпадает с тем краем клика, на который кнопка подписана.

Added

  • ПКМ по кнопке назначает игрока фокусом, не сбрасывая текущую цель (раньше правая кнопка не была подключена вовсе). Подсказка в тултипе обновлена.

Changed

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

[0.9.29] — 2026-07-17

Fixed

  • Счётчик вражеских лидеров групп («короны») больше не срабатывает ложно в открытом мире после аварийного выхода из боя (кик / разрыв связи / выход без завершения матча): при таком выходе Collector теперь корректно останавливает свои таймеры, а не продолжает опрашивать неймплейты со старым флагом «это EBG».

[0.9.28] — 2026-07-17

Fixed

  • Панель известных участников теперь использует только строгий подтверждённый состав из базы: минимум пять совместных боёв и доля строго больше 25%. Слабый список members больше не добавляет случайных попутчиков.
  • Если игрок связан с несколькими премейдами, сайт, каталог и аддон используют одного победителя. Совместные входы наёмниками имеют тройной вес.

[0.9.27] — 2026-07-16

Added

  • Кликабельная панель известных участников премейдов. Во время поля боя PremadeIQ показывает только тех противников, которые есть в каталоге как лидеры или участники премейдов. ЛКМ по компактной кнопке безопасно выбирает игрока через точный /targetexact; лидеры отмечены звездой, цвет имени соответствует классу, а подсказка показывает связанные премейды.
  • Панель можно перетаскивать вне боя. Защищённые кнопки создаются заранее, а изменения состава и раскладки во время combat lockdown откладываются до выхода из боя — без taint и blocked-action ошибок.

[0.9.26] — 2026-07-15

Changed

  • Скопированное предупреждение о премейде теперь начинается с [PremadeIQ], чтобы в чате сразу был виден источник сообщения.

[0.9.25] — 2026-07-04

Added

  • Счётчик лидеров групп противника. Каждая группа, зашедшая в очередь вместе, сохраняет корону своего лидера внутри рейда — поэтому несколько корон одновременно у противника означают заранее собранные группы. Аддон считает такие короны по видимым неймплейтам врагов, и если их две или больше, к предупреждению добавляется строка «Замечено лидеров групп у противника: N» (появляется и без премейда из каталога). Учитываются только видимые неймплейты, так что реальное число групп всегда ≥ показанного; для работы нужно включённое отображение неймплейтов врагов (клавиша V).
  • Лидеры групп в статистике матча. В запись матча теперь входят лидеры групп вашей команды и максимум одновременно видимых корон противника — ещё один сигнал премейда для общей базы и сайта.

[0.9.24] — 2026-06-28

Changed

  • Уведомление о премейде теперь многострочное. Предупреждение на экране показывает полный расклад — каждого вражеского лидера премейда и сколько его игроков в бою (топ-3 плюс строка «…and N more») — в отдельной панели, так что больше не нужно вылавливать это из чата. Панель сама гаснет через несколько секунд и никогда не перехватывает клик или клавиши движения.

[0.9.23] — 2026-06-23

Changed

  • Оптимизация. Удалён неиспользуемый устаревший код и настройки, упрощена панель опций. Обработка данных не изменилась — PremadeIQ по-прежнему пишет статистику матчей только в локальные SavedVariables и ничего не отправляет наружу сам; вклад в общую базу остаётся отдельным опциональным шагом через PremadeIQ Uploader.

[0.9.22] — 2026-06-21

Added

  • Алерт о премейде без лидера. Предупреждение в начале боя теперь срабатывает и когда отмеченного лидера премейда нет в поле боя, но шесть или больше его подтверждённых регуляров — во вражеской команде. Ловит премейд, чей лидер не зашёл или играет на неотмеченном альте. Показывает отдельную формулировку «лидера нет» и считается подтверждённым премейдом. Нужен полный доступ (подтверждённый ростер уходит только патронам) и свежий Uploader; на старом каталоге алерт работает как раньше (только при наличии лидера).

Changed

  • Премейды отслеживаются по стабильному id, а не по имени. Альты лидера больше не дробят и не задваивают один премейд; присутствие считается по группе.

[0.9.21] — 2026-06-18

Fixed

  • Молчащий premade-алерт в начале боя. Спурьёзный Reset() от PLAYER_ENTERING_WORLD (когда IsBattleground() ещё false на догрузке мира) глушил оба авто-канала скана до конца матча. Добавлен 15-секундный grace-гейт от PVP_MATCH_ACTIVE: ложное «вышел из БГ» в первые секунды больше не сбрасывает состояние. Закоммичено 03ea999, верифицировано в бою 2026-06-18. (Релиз 0.9.21 ещё не нарезан/не опубликован — фикс есть только в исходнике.)

[0.9.20] — 2026-06-14

Added

  • Точная очистка по рукопожатию с Uploader'ом (Database.lua, новый UploadState.lua). Uploader пишет в папку аддона файл с курсором «сэмплы подтверждены сервером до момента X» (на аккаунт, по installId), а аддон на входе в мир удаляет ровно подтверждённые сэмплы (PruneUploaded), а не угадывает по возрасту. Эвристика 0.9.19 (окно 30 дней + cap 4000) остаётся backstop'ом на случай, когда курсора нет/он протух. Безопасность: при отсутствии/несовпадении installId, протухшем, заниженном или будущем курсоре аддон удаляет меньше, никогда не теряя невыгруженное; свой персонаж не трогается; сэмплы без endedAt не удаляются. Курсор монотонен (lastSamplesUploadedThrough) и обрезается от будущих значений. Первое рукопожатие требует одного /reload-цикла (аддон генерит installId, Uploader видит его после сброса SavedVariables на диск).

Fixed

  • Краш при генерации installId (Database.lua): код вызывал math.randomseed, которого нет в песочнице WoW, и падал. Исправлено (вошло в опубликованный 0.9.20-zip).

[0.9.19] — 2026-06-14

Fixed

  • SavedVariables больше не растёт без предела (Database.lua). Таблица players копила каждого встреченного в эпике игрока навсегда (на проде — 29 587 записей, файл PremadeIQ.lua ≈46 МБ), из-за чего WoW долго писал его на логауте (медленное закрытие) и долго грузил на входе. Теперь действует скользящее окно: игроки, не виденные дольше 30 дней, вытесняются, а общее число ограничено 4000 (LRU по lastSeen); свой персонаж не трогается. Свип идёт на входе в мир (когда известен UnitGUID("player")) и после каждого матча. Эти данные нужны только для выгрузки Uploader'ом — в самой игре премейд-алерт читает KnownPremades.lua, а не эту таблицу. rawStats не трогается (вынесено во второй заход). Маркер PremadeIQ_DB.pruneVersion, одна диагностическая строка в collectorLog.

[0.9.18] — 2026-06-14

Changed

  • ## Interface поднят 120000 → 120005 под актуальный live-клиент 12.0.5 (build 67823) — без пометки «out of date» в менеджерах аддонов.
  • Понятнее текст первого запуска: приветственный диалог теперь явно поясняет, что аддон пишет статистику матчей локально в SavedVariables, а вклад в общую базу — отдельный опциональный шаг через приложение Uploader. Текст локализован (en/ruRU).

Added

  • LICENSE (All Rights Reserved) в комплекте; vendored-библиотеки сохраняют свои лицензии.

[0.9.17] — 2026-06-13

Changed

  • Кнопка «Copy premade alert» и её строки — теперь на английском даже на ruRU-клиенте (Locales.lua). Call-out по премейду вставляется в англоязычное комьюнити (/rw, Discord), поэтому копи-флоу (кнопка, её tooltip, подсказки PremadeCopyTip/PremadeCopyHint/PremadeCopyNone) зафиксирован на английском вне зависимости от языка клиента. Сам алерт о премейде (PremadeDetected и т.д.) остаётся локализованным.

[0.9.16] — 2026-06-06

Added

  • EBG-фильтр: аддон собирает только эпические BG (план: docs/ebg-map-filter-plan.md, прошёл внешнее ревью). Whitelist instance map id (ns.EBG_INSTANCE_IDS — зеркало серверного EBG_MAP_NAMES): Альтерак, Остров Завоеваний, Ашран, Битва за озеро Ледяных Оков, Месть Коррака, Зубец убийцы. Арены / обычные BG / blitz больше не пишутся в SavedVariables и не едут на сервер (раньше ~17% аплоадов уходило в карантин как non_ebg_map). Гейт трёхуровневый: PVP_MATCH_ACTIVE (Deserter/PremadeAlert не стартуют), UPDATE_BATTLEFIELD_SCORE (stale-окна прошлого эпика не сканируют чужой скорборд), PVP_MATCH_COMPLETE + hard guard в самом SnapshotMatch (закрывает и ручной /piq snapshot).
  • Диагностический ring-buffer PremadeIQ_DB.collectorLog (50 строк) — решения гейта восстановимы из SavedVariables.

Fixed

  • Реальные эпики больше не теряются из-за коллизии id-пространств (Collector.lua). Если к моменту снапшота GetInstanceInfo() уже не отдавал instance id (телепорт в столицу), код подставлял UiMapID из C_Map.GetBestMapForUnit — другое id-пространство, которое серверный whitelist не знает → ~3% настоящих эпиков (30 матчей на проде) уезжали в карантин с map_name вроде «Луносвет». Теперь instance id снимается на PVP_MATCH_ACTIVE и используется как fallback; UiMapID-фоллбэк удалён.
  • /piq version и строка загрузки показывали захардкоженный 0.9.2 — версия теперь читается из toc (C_AddOns.GetAddOnMetadata).

[0.9.15] — 2026-06-06

Security

  • Дистрибутивный zip больше не несёт живой каталог премейдов (package_addon.py). Рабочая копия KnownPremades.lua — это GOD-tier данные, которые Uploader владельца перезаписывает каждый час; они попадали в публичный архив и обходили серверный tier-гейтинг. Теперь в zip всегда кладётся нейтральный стаб (leaders = {}), плюс hard-guard, который роняет сборку, если в архив просочилось что-то кроме стаба. Каталог по своему tier каждый пользователь получает только через свой Uploader.

[0.9.14] — 2026-06-04

Changed

  • Детекция дезертиров перестаёт перезахватывать ростер, как только собрана вся своя группа (Deserter.lua). Раньше порог ранней остановки был жёстко 60, но после перехода на raid-токены (≤40 в эпике) он стал недостижим, и event-перезахват крутился все 30с впустую. Теперь порог = текущий размер группы (GetNumGroupMembers); скорборд врага — опциональный бонус.

[0.9.13] — 2026-06-04

Fixed

  • Детекция дезертиров: стартовый ростер теперь снимается со своей команды через raid/party unit-токены, а не со скорборда (Deserter.lua). GUID'ы на живом скорборде в 12.0.x становятся secret-значениями и выпадают при сериализации в SavedVariables, из-за чего серверный дифф «старт vs финал» не находил никого (на проде: 0 дезертиров из этого источника на 909 матчах). Raid-GUID'ы — plain и переживают сериализацию. Скорборд по-прежнему читается как доп. источник имён, пока его GUID'ы ещё plain.
  • Финальный снимок скорборда снимает фильтр по фракции перед чтением (SetBattlefieldScoreFaction(-1) в Collector.lua). Один лишь RequestBattlefieldScoreData фильтр не снимает — без этого ~1% матчей приезжали только с одной фракцией.

[0.9.12] — 2026-06-02

Fixed

  • Текст премейд-алерта теперь всегда английский (заголовок + строки про лидеров). Алерт бродкастится в /rw, который читает разноязычный BG, — английский как lingua franca, та же логика, что и на сервере. Раньше на русском клиенте предупреждение было русским.
  • Кнопку копирования можно закрыть правым кликом (раньше она не исчезала, если алерт сработал вне обычного боя — например, при ручной проверке через /piq premade: события входа/выхода из BG не срабатывали, и кнопка висела). В обычном бою по-прежнему прячется при выходе из BG. Подсказка обновлена: ЛКМ — копировать, ПКМ — скрыть, перетаскивание — переместить.

[0.9.11] — 2026-06-02

Added

  • Кнопка «Скопировать уведомление» появляется вместе с премейд-алертом. Когда алерт срабатывает, под центральным баннером всплывает кнопка — клик открывает окошко с последней строкой про вражеский премейд (Ctrl+C → вставка в /rw или Discord). Раньше нужно было набирать /piq copy. Кнопка в основном аддоне (его скачивают все игроки), а не в owner-only тулбаре PremadeIQ_Leader — иначе фичу получил бы только владелец. Это кнопка, а не авто-окно: сам диалог фокусирует поле ввода, и авто-всплытие в бою отобрало бы WASD-управление; клик по кнопке открывает его в нужный момент. Кнопку можно перетащить, позиция сохраняется (PremadeIQ_DB.copyBtnPos), прячется при выходе из боя.

[0.9.10] — 2026-05-31

Changed

  • Премейд определяется по лидеру, с градацией уверенности. Раньше алерт кричал «Premade» на любого игрока из каталога — включая одиночного регуляра. Новое определение: премейд без лидера — не премейд. Известный лидер на вражеской стороне = «возможный премейд» (жёлтый), лидер + >5 его регуляров (CONFIRM_MIN_MEMBERS = 6) рядом = «ПРЕМЕЙД» (красный). Одиночные участники без лидера больше не флагуются.
  • Вывод по сути: строка на каждого лидера — «Лидер X — с ним игроков: N», где N — сколько его известных регуляров присутствует. Баннер/чат/копия и звук используют тот же текст. Каталог-матчинг переписан на мультичленство (игрок может числиться у нескольких лидеров — каждому идёт в зачёт). Диагностическая строка alertLog получила поле ldr (число лидеров на вражеской стороне).

[0.9.9] — 2026-05-31

Fixed

  • Лаг в бою — троттлинг сканов. UPDATE_BATTLEFIELD_SCORE на 80-человечном эпике стреляет много раз в секунду, и на каждый мы сканировали весь scoreboard И звали SetBattlefieldScoreFaction(-1), который сам стреляет синхронный score-update, переобрабатываемый всем UI (тяжёлая перестройка родного scoreboard Blizzard на 80 игроков) и аддонами — шторм по кадру. Добавлен троттлинг: autoScan выполняется не чаще раза в SCAN_THROTTLE_SEC = 1.5 с (lastScanAt/GetTime, сброс в OnMatchActive/Reset). Одного скана в ~1.5с с запасом хватает, чтобы поймать ростер, который грузится секундами; ручной /piq premade троттлинг игнорирует.

[0.9.8] — 2026-05-31

Changed

  • Окно сканирования продлено под позднюю загрузку вражеской команды. Вражеский ростер не показывается до начала боя и появляется только через несколько секунд после старта, а на 80-человечном эпике scoreboard грузится постепенно (в alertLog даже своя половина росла 16→35 за ~50с). Прежнее окно 60с / таймеры до 45с могли закончиться раньше, чем появлялась вражеская половина. Теперь таймеры {4,8,14,22,32,45,60,80,105,135,170} и SCAN_WINDOW_SEC = 180. Анонс одноразовый (fired), поэтому при попадании сканы сразу прекращаются — длинное окно стоит чего-то только когда премейда нет. Имена NeverSecret, так что чтение «вглубь» матча безопасно.

[0.9.7] — 2026-05-31

Fixed

  • Разфильтровка фракций не работала — неверный аргумент. В 0.9.4–0.9.6 detect() звал SetBattlefieldScoreFaction() без аргумента (nil), но nil НЕ показывает обе фракции — alertLog это доказал: n застревал на ≈35 (только своя команда), enemy=0, хотя сервер подтверждал вражеских премейдов в большинстве боёв. Вкладка «Все» в родном scoreboard Blizzard передаёт factionEnum = -1 (PVPMatchResults.xml; 1 = Alliance, 0 = Horde). Теперь зовём SetBattlefieldScoreFaction(-1) — и на каждом скане, т.к. вызов на раннем тике n=0 не «прилипал». Re-entrancy guard из 0.9.6 делает повторный вызов безопасным; флаг factionUnfiltered убран.

[0.9.6] — 2026-05-31

Fixed

  • C stack overflow в бою (краш из 0.9.4). SetBattlefieldScoreFaction(), добавленный в detect(), стреляет UPDATE_BATTLEFIELD_SCORE синхронно; наш обработчик OnBattlefieldScoreUpdateautoScandetect() входил заново, и так до переполнения C-стека (RequestBattlefieldScoreData был async, потому раньше не рекурсировал). Добавлен guard от ре-энтрантности: detect() теперь обёртка над detectImpl с флагом scanning (внутренний повторный вход — no-op) и pcall (флаг всегда сбрасывается). Плюс SetBattlefieldScoreFaction зовётся максимум один раз за бой (factionUnfiltered, сброс в OnMatchActive/Reset) — фильтр и так персистентный, не нужно дёргать событие на каждом скане.

[0.9.5] — 2026-05-31

Added

  • Заметный premade-алерт + копирование. Помимо строк в чате, алерт теперь выводит крупный баннер по центру экрана через RaidWarningFrame (RaidNotice_AddMessage, как родной /rw) — не пропустить в спаме эпика. Новая команда /piq copy открывает диалог с готовой к вставке строкой («Во вражеской команде премейд! — Лидеры: … — Участники: …»), текст выделен, жмёшь Ctrl+C и вставляешь в /rw или рейд-чат сам. Чат из insecure-кода в 12.0.x отправлять нельзя (ADDON_ACTION_BLOCKED), поэтому копирование — ручное; диалог не всплывает сам (не перехватывает WASD в бою), а вызывается командой. После каждого алерта в чат добавляется подсказка про /piq copy.

[0.9.4] — 2026-05-31

Fixed

  • Алерт видел только свою половину scoreboard. После name-фикса (0.9.3) премейды на СВОЕЙ стороне находились, но вражеские — нет. Ground-truth по серверу: премейды были на вражеской стороне в 13 из 15 последних боёв, а alertLog давал enemy=0. Корень: GetScoreInfo/GetNumBattlefieldScores возвращают строки только для фракции, выбранной последним SetBattlefieldScoreFaction; дефолт после PVP_MATCH_ACTIVE — локальная фракция, поэтому вражеская половина (ровно та, что мы ищем) не видна. В логе это n≈38 на промахах против n≈75 в единственном сработавшем бою. Теперь detect() вызывает SetBattlefieldScoreFaction() без аргумента (= обе фракции) перед чтением — тот же вызов, что делает родной scoreboard Blizzard при переключении вкладок команд (PVPMatchScoreboard.lua).

[0.9.3] — 2026-05-30

Fixed

  • Premade alert не срабатывал вообще — матчинг по secret GUID. Диагностика alertLog показала корень: в live-эпиках C_PvP.GetScoreInfo(i).guid приходит как secret value уже в opening window (str=0 sec=77 hit=0), а detect() искал только lookup[guid] → пропускал каждую строку. Поля name, faction, className, raceName в структуре PVPScoreInfo помечены NeverSecret = true (Blizzard_APIDocumentationGenerated/ PvpInfoDocumentation.lua), т.е. остаются plain даже в активном бою. Теперь detect() матчит вражеский ростер по нормализованному Name-Realm (guid — только как точный shortcut, пока он plain), а вражескую сторону определяет по faction. ensureLookup строит второй индекс name→entry; normName достраивает реалм зрителя к голым именам своего реалма. Дедуп по имени записи каталога. taint-safe: secret-значения никогда не сравниваются.

Changed

  • Строка alertLog теперь содержит поле nm (число plain-имён на scoreboard) рядом с str/sec — позволяет подтвердить читаемость имён в одном бою.

[0.9.2] — 2026-05-27

Added

  • Диагностика premade-алерта в SavedVariables. PremadeAlert пишет кольцевой лог в PremadeIQ_DB.alertLog (100 строк): на PVP_MATCH_ACTIVE — состояние каталога (catalog_leaders, lookup, tier), на каждом скане — bg / cat / n / str / sec / hit / enemy / mine (в BG ли, размер каталога, строк scoreboard, читаемых guid vs secret, совпадений с каталогом, врагов, своя фракция), и ANNOUNCE при срабатывании. Строки дедуплицируются. При /piq debug on дублируются в чат серым. Цель — диагностировать «алерт не срабатывает» по дампу с диска, не полагаясь на чтение чата вживую.

[0.9.1] — 2026-05-26

Fixed

  • Premade alert не срабатывал в эпиках. Три фиксированных скана (4/8/14с) часто все приходились на момент, когда вражеская половина scoreboard на 80-человечном эпике ещё не прогрузилась (или guid врагов читались как secret и detect() их пропускал) → промах каждый раз. Теперь PremadeAlert ловит событие UPDATE_BATTLEFIELD_SCORE и пере-сканирует на каждом апдейте в окне 60с (накопительная стратегия, та же что делает Deserter надёжным), плюс таймеры продлены до {4,8,14,22,32,45}. Один анонс на бой сохраняется.

Added

  • /piq теперь печатает строку статуса каталога (загружен / не загружен, сколько лидеров, тир) — проверить фид алерта можно в любой момент, не дожидаясь строки при входе. Новый локализованный текст PremadeCatalogMissing.

[0.9.0] — 2026-05-25

Added

  • In-game premade alert. При заходе на поле боя аддон сверяет вражеский ростер с известными премейдами и предупреждает игрока в чат + звук.
    • Новый модуль PremadeAlert.lua: на PVP_MATCH_ACTIVE запускает мульти-шот захват ростера (4/8/14с — раннее окно, где имена/guid ещё читаются в чистом виде, как у Deserter; deep-match они secret, но туда не лезем). Сверяет вражескую сторону (faction ≠ своей → ловит и наёмников) с каталогом. Каждый read защищён issecretvalue.
    • Данные — из нового каталога, который Uploader скачивает с сервера (GET /api/addon/known-premades) и пишет в KnownPremades.lua; аддон грузит его на login//reload.
    • Ярусность серверная. Контрибьютор получает список лидеров, патрон — лидеров + составы. Форма данных в KnownPremades.lua диктует, что показать (есть members → состав, иначе только лидер); логики яруса в аддоне нет. Подделать апгрейд правкой файла нельзя — сервер не кладёт в файл того, что ярус не заслужил.
    • /piq premade — ручная проверка текущего боя.
    • Опции: тумблеры «предупреждать о премейдах» и «звук» (по умолчанию вкл).
  • KnownPremades.lua — shipped-заглушка, перезаписывается Uploader'ом. toc-data-файл (не SavedVariable): WoW грузит при загрузке и не пишет в неё, поэтому обновление Uploader'а никогда не клоббится клиентом.

Сопутствующее (сервер / uploader)

  • Сервер: GET /api/addon/known-premades (tier-gated, catalog.py с TTL-кешем 30 мин). Собирает лидеров из enemy_leaders + co-players (≥3 совм. чистых матчей на домашней стороне) для патрона. +1 тест (test_addon_catalog).
  • Uploader: ApiClient.fetch_catalog() + catalog_writer.py + resolve_addon_dir, пишет файл в папку аддона раз в час после загрузки. +6 тестов (test_catalog_writer).

Pending

  • Live-тест в EBG (подтвердить чтение guid в раннем окне на реале).
  • Деплой сервера + пересборка Uploader (Nuitka --standalone).

[0.8.2] — 2026-05-23

Disabled

  • Mid-match snapshots отключены (MID_SNAPSHOT_INTERVAL = 0). Эмпирическая проверка на реальном матче (retail 12.0.x): не только числовые поля (damageDone и т.д.) защищены как secret values, но и info.guid — а Lua serializer молча выбрасывает secret strings из SavedVariables. Результат: snapshot'ы приходили на сервер без guid и с нулевыми метриками, бесполезно для off-board metric recovery. Хуже — без guid сервер отбивал весь upload как 422 validation error, и backlog матчей застревал.

    Код снапшотов оставлен на месте: когда найдём альтернативный источник (combat log parser или secure-context hook), просто вернём ненулевой интервал.

[0.8.1] — 2026-05-23

Fixed

  • Secret-value taint в mid-snapshot. Retail 12.0.x защищает живые scoreboard-числа (pvpStatValue, damageDone, healingDone, …) во время активного матча — арифметика на них роняла TakeMidSnapshot() ошибкой attempt to perform arithmetic on a secret number value. Финальный snapshot из PVP_MATCH_COMPLETE это переживал, потому что Blizzard снимает защиту по событию завершения; mid-snapshot работает посреди матча и попадал в guard. Обёрнут каждый числовой read в safeNum() helper, который через issecretvalue возвращает 0 для защищённых значений вместо краша. Часть полей в snapshot'е будут нулевыми (защищённые), но snapshot сохраняется и хотя бы guid+faction даёт сигнал о присутствии игрока в этот тик.

[0.8.0] — 2026-05-23

Added

  • Mid-match snapshots каждые 300с. Новый Collector:TakeMidSnapshot() через C_Timer.NewTicker периодически снимает scoreboard в процессе матча. Сохраняется как snapshots = {{takenAt, players = [...]}, ...} внутри matchLog entry. Это позволяет восстановить метрики игроков, которые ушли до финала и были заменены — в финальном scoreboard от Blizzard их уже нет (всегда 40 на сторону).
  • Schema v3. Поле snapshots добавлено в matchLog entries. Старые v2-записи без snapshots — нормально, сервер трактует отсутствие как «timeline недоступна для этого матча».

Why

В длинных Epic BG (стол-вары 30-90 мин) ротация игроков обычна. До этого релиза мы видели только тех 40, кто закончил матч; ушедшие до конца имели лишь имя в deserters таблице, без dmg/heal/etc. Теперь у нас есть точки данных каждые 5 минут, и off-board дезертир обычно попадает хотя бы в один снапшот.

[0.7.3] — 2026-05-04

Added

  • Capture our raid leader's GUID at scoreboard snapshot. New findRaidLeaderGUID() in Collector.lua iterates GetRaidRosterInfo for rank=2 (raid) or UnitIsGroupLeader (party) and stashes the GUID on the match payload as leaderGUID. Server stores it on Match.leader_guid and recomputes per-player leader_count like desertion_count is recomputed.

[0.7.2] — 2026-05-04

Removed

  • Удалён мёртвый устаревший каркас. Вычищены неиспользуемые библиотеки межаддонной связи и оставшаяся отладочная slash-команда, которая больше ничего не делала; список загрузки в Libs.xml и .toc подрезан соответственно. LibSerialize и LibDeflate оставлены — могут пригодиться позже, лежат как одна загрузка LibStub-модуля каждый, без активной работы.

[0.7.0] — 2026-05-01

Added

  • Детекция дезертиров через сравнение start vs end. Новый модуль Deserter.lua (~80 строк) делает один replay-of-the-data приём: на +6s после PVP_MATCH_ACTIVE берёт snapshot scoreboard'а — кто кого зашёл воевать; финальный scoreboard на PVP_MATCH_COMPLETE уже снимает Collector. Сервер на ingest диффит set'ы и для каждого «был в начале / нет в конце» проверяет фракцию vs match.winner — если фракция проиграла, флагает игрока как дезертира.
  • Late-join guard: если C_PvP.GetActiveMatchDuration() > 60 сек на момент PVP_MATCH_ACTIVE, помечаем lateJoin=true и сервер пропускает diff для этого матча (нельзя false-positive'нуть всех, кто ушёл до нашего захода).
  • В матч-payload добавлено поле startRoster: { lateJoin, takenAt, players: [{guid, name, faction}] }. Сервер вычисляет дезертиров; в БД они идут в таблицу deserters с натуральным ключом (reporter_id, ended_at, guid) для дедупликации между репортами.

Changed

  • Версия: 0.6.2 → 0.7.0.
  • Никаких новых событий в Main.lua не регистрируется — обходимся теми же PVP_MATCH_ACTIVE / PVP_MATCH_COMPLETE / PLAYER_ENTERING_WORLD / UPDATE_BATTLEFIELD_SCORE. Никакого парсинга чата, никаких локалей, никакого слежения за дебаффами.

Design notes

  • Эвристика «фракция проиграла» сознательно несимметрична: ливнул в выигранном матче — не флагается. Это точечно отрезает дисконнекты (которые нам неотличимы от десертации технически), а серийных AFK'еров всё равно ловит благодаря закону больших чисел: они уходят с проигрышных матчей чаще, чем с выигранных, и каждый встреченный участник с аддоном независимо вносит запись в общую базу.
  • Самодесертация (когда репортер сам ушёл) не детектируется напрямую — для нас этот матч просто не существует. Но другие репортеры в том же матче увидят и зафиксируют. Pattern over time из multiple reporters покрывает дыру без ауры-watch'а.

[0.6.2] — 2026-04-29

Fixed

  • На AV/IoC матч-эндовский скорборд содержал только свою команду (40 строк вместо 80), из-за чего данные по противоположной фракции не попадали на сервер. Причина: WoW заполняет клиентский кэш скорборда лениво — только для тех вкладок, которые игрок реально открывал по ходу боя, а на этих картах быстрый телепорт после капа не оставляет шанса на ручной просмотр. Добавил Collector:ScheduleSnapshotMatch: два вызова RequestBattlefieldScoreData() с разрывом 0.7 сек гарантируют, что обе стороны окажутся в кэше до итерации. Total задержка перед снапшотом — 1.4 сек (было 1.0). Та же логика применяется к ручной команде /piq snapshot.

[0.6.1] — 2026-04-27

Fixed

  • /piq options падал с ошибкой bad argument #1 to 'OpenSettingsPanel' (outside of expected range). В коде стояло category.ID = "PremadeIQ", что перезаписывало автогенерируемый numeric ID строкой; OpenSettingsPanel принимает только integer. Убрал ручное присваивание, держим category-объект и передаём category:GetID().

[0.6.0] — 2026-04-27

Added

  • GUI-панель настроек: Esc → Options → AddOns → PremadeIQ. Чекбокс debug, статистика по локальной базе, кнопка "Стереть базу" с подтверждением, ссылки на Uploader/Discord, версия аддона. Регистрируется через Settings.RegisterCanvasLayoutCategory (retail 11.0+).
  • Slash-команда /piq options (алиасы /piq config, /piq settings) — открыть панель программно.
  • Локализация панели: ru / en (остальные локали fallback'ятся на en).

[0.5.1] — 2026-04-27

Fixed

  • Игроки с твоего собственного реалма попадали на сервер без realm-суффикса (WoW API возвращает короткое имя для same-realm игроков). Из-за этого ~7 игроков в нашей базе висели в enrichment_status='error'. Теперь коллектор всегда дописывает локальный реалм через GetRealmName(), если его нет в info.name.

[0.5.0] — 2026-04-27

Added

  • Раса игрока (info.raceName) теперь шипится в каждый sample. Сервер использует её для определения наёмников: в карточке матча будет видно «играл за Альянс, реально Орда» и наоборот.

[0.4.0] — 2026-04-23

Added

  • Welcome-dialog при первом запуске с инструкциями по подключению к общей базе (Uploader + Discord + Patreon)
  • Унифицированные slash-команды: /piq status | uploader | snapshot | debug on|off | reset confirm | version
  • SavedVariables schema version 2 + автоматическая миграция с v1
  • Таблица PremadeIQ_DB.settings для пользовательских настроек (debug flag, hints)
  • Helper-методы Database:GetSetting/SetSetting, Database:CountSamples
  • Полные ruRU / enUS локали с fallback на enUS

Changed

  • Версия .toc → 0.4.0, добавлены IconTexture, X-Website, X-Curse-Project-ID placeholder
  • /piq reset теперь требует confirm для защиты от опечатки
  • Debug-дамп спрятан за флагом /piq debug on — не спамит чат обычным игрокам
  • Отладочный вывод сведён под этот единственный флаг

Fixed

  • Доступ к настройкам теперь защищён от nil-доступа до инициализации

[0.3.0] — 2026-04-21

  • Сбор PvP scoreboard на PVP_MATCH_COMPLETE
  • Поддержка чтения objective-ownership из Leader-модуля
  • Ring buffer: 30 сэмплов на чужих игроков, 500 для собственного персонажа
  • Трекер дезертиров: chat-parsing + UPDATE_BATTLEFIELD_SCORE fallback
  • i18n для chat-текстов objective trackera (ruRU/enUS)

[0.2.0] — 2026-04-15

  • Instance mapID resolver через select(8, GetInstanceInfo())
  • C_PvP.GetActiveMatchWinner вместо GetBattlefieldWinner
  • Исправлен баг с won = nil для проигранных матчей

[0.1.0] — 2026-04-10

  • Первая внутренняя версия: базовый Collector, Database, Comm

This mod has no additional files