Dota 2 Mod ManagerСкачатьКаталог

Что нового

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

2.16.0

ПоследняяРелиз на GitHub

Хеллоуинское обновление

В приложении кое-что поселилось, а у dota2modmanager.com появилась своя тайна. Где искать, никто не скажет. Дорогу знают восемь героев.

Сайт

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

2.15.0

Релиз на GitHub

Ссылка на один мод

Ссылка вида d2mm://mod/heroes/Tidehunter%20Arcana/Style%20II теперь открывает окно этого мода в каталоге, сразу на нужном стиле, с какой бы вкладки ты ни пришёл. Как и ссылка на пресет, она ничего не ставит сама. Если приложение было закрыто, ссылка его запустит, и окно откроется, как только загрузится каталог. Кнопка «Открыть в Mod Manager» на странице мода на dota2modmanager.com открывает его именно так.

Аркана Террорблейда держит твой цвет

Цвет, который ты выбрал для арканы Террорблейда в «Каталог → Инструменты», теперь сохраняется и тогда, когда аркану надевает конструктор. Раньше копия конструктора возвращалась к Reflection's Shade везде, где игра читала её. Фиолетовая или зелёная аркана теперь такого цвета целиком: раньше большая часть её частиц оставалась красной, какой её сделали. Спасибо J0nathan550.

Все недавно добавленные

На главной каталога было двенадцать недавно добавленных модов и никакого пути к остальным. Теперь «Показать все» в этой полосе открывает их все сеткой, сначала новые, с обычной сортировкой и фильтрами «Установленные» и «Избранное». Спасибо solanafl1pper за просьбу.

Исправлено

  • На Linux снова грузятся картинки предметов и портреты героев. Приложение качало Source2Viewer для Windows, Linux его не запускал, и каждая картинка молча не получалась. Теперь качается сборка для Linux. Спасибо J0nathan550.
  • На Linux у окна приложения в доке и в меню приложений теперь его собственная иконка.
  • Предмет, который конструктор ставит в слот, где у стандартного предмета нет своей модели (например, голова Earthshaker), теперь предупреждает: его видно только до переподключения к матчу, а после переподключения игра рисует на его месте ERROR. Остальные предметы из конструктора после переподключения сохраняют модели, а раньше некоторые откатывались к обычному герою. Спасибо J0nathan550.

Сайт

dota2modmanager.com переделан вокруг каталога. У каждого мода теперь своя страница, и в превью ссылки в чате видна его картинка, а свои страницы есть и у героев, и у авторов модов. Каталог ищет, фильтрует и листается страницами по всем модам, а моды, которые ты там отметил, открываются в приложении одним пресетом. Поиск в шапке находит моды, героев (и по прозвищам) и авторов. В гайдах теперь снимки самого приложения, а «Что нового» показывает все версии.

2.14.0

Релиз на GitHub

Пресеты помнят виды из игры

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

Больше никакого чёрного окна при запуске

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

Исправлено

  • На китайском названия с Search Bar и Top Bar в каталоге больше не переводятся как «посох», а у Planetfall, Pandora the Packwyrm и Shroomy теперь официальные китайские имена. Спасибо F21HGG.

2.13.0

Сломанные арканы починены и ещё 2

Релиз на GitHub

Сломанные арканы починены

J0nathan550 вручную пересобрал арканы, которые ломались в конструкторе, и теперь конструктор ставит его исправленные версии: Razor бегает лицом вперёд, у Pudge целая спина, у Juggernaut все бег и атаки на месте. Это Crystal Maiden, Drow Ranger, Earthshaker, Juggernaut, Legion Commander, Pudge, Razor, Rubick, Skywrath Mage, второй стиль Spectre, Terrorblade и Windranger, и метки «Есть баги» и «Сломана» с них сняты. У Crystal Maiden и Rubick исправлен первый стиль, остальные их стили собираются из файлов игры, как раньше.

Исправленную аркану приложение скачивает, когда ты надеваешь её в первый раз, и хранит у себя. Пока загрузка не закончилась, аркана собирается из файлов игры, а потом сама заменяется исправленной. Если на один из слотов арканы ты выбрал другой предмет, в этом слоте останется он. Аркана Террорблейда в «Каталог → Инструменты» тоже собирается из исправленной версии, в выбранном цвете.

Io проверен

Предметы Io, вместе с его арканой Benevolent Companion, прогнали через конструктор, всё работает, и метки «Не проверено» на них больше нет.

Конструктор больше не тормозит

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

В «Настройки → О программе» теперь указан J0nathan550 как автор аркан в конструкторе. Спасибо, J0nathan550.

2.12.0

Арканы в конструкторе предметов и ещё 4

Релиз на GitHub

Арканы в конструкторе предметов

С выключенным безопасным режимом в «Косметика → Предметы» теперь есть арканы всех героев, вместе с остальными их предметами. У предмета с несколькими стилями можно выбрать стиль, а конструктор подтягивает его звуки и реплики, портрет героя, иконку на миникарте и иконки способностей. Пара аркан пока работает не идеально. На их карточке написано «Есть баги» или «Сломана», и до того, как ты наденешь такую аркану, окно скажет, что именно не так: например, Razor ходит задом наперёд. Io впервые есть в конструкторе, вместе со своей арканой, и его предметы помечены «Не проверено», пока их кто-нибудь не посмотрит в игре.

Уже выбранные предметы после этого обновления один раз пересоберутся, и так же после любого следующего, которое меняет их сборку, так что исправление дойдёт до них без повторного выбора. Спасибо J0nathan550: он это написал и прогнал через конструктор каждую аркану.

Приложение на упрощённом китайском

Выбери 简体中文 при первом запуске или в настройках. Названия героев и предметов берутся из китайских текстов твоей же игры, а в каталоге можно искать и по-китайски, и по оригинальным названиям. Всё новое будет на английском, пока его не переведут. Спасибо F21HGG.

Прокси для загрузок

В «Настройки → Кэш загрузок» появилось поле для HTTP- или HTTPS-прокси. Проверь его, сохрани, и каталог, моды и инструменты будут качаться через него; оставь поле пустым, чтобы качать напрямую. Обновления самого приложения по-прежнему идут напрямую. Если загрузка падает из-за сети, ошибка теперь подскажет настроить прокси или включить VPN. Спасибо ezvacss.

Экранный диктор слышит больше

Всплывающие сообщения, например «мод установлен» или ошибка, теперь зачитываются, в том числе внутри окна мода, а диктор знает, какой раздел и какая категория сейчас открыты.

Исправлено

  • В «Моих модах» мод, у которого не загрузилась картинка, больше не ломает свою строку.
  • Серые подписи, например категория под названием карточки, стали чуть ярче и читаются даже на светлой части фона.
  • Кружки стилей на карточке стоят на пиксель дальше друг от друга, так что в каждый проще попасть.
  • Установленное приложение больше нельзя запустить как обычный Node.js или подключить к нему отладчик, и оно загружает только свой собственный код.

2.11.0

Сбой больше не оставляет полмода и ещё 3

Релиз на GitHub

Сбой больше не оставляет полмода

Установка мода пишет в игру несколько файлов, и теперь приложение записывает каждый шаг до того, как его сделать. Если приложение закроется посередине (диспетчер задач, обновление Windows, выключили свет), при следующем запуске оно либо доведёт дело до конца, либо откатит. Мод окажется в игре целиком или не окажется вовсе, и «Мои моды» совпадут с папкой игры.

Библиотеку и настройки приложение теперь тоже сохраняет одним шагом. Раньше оборванное сохранение оставляло «Мои моды» пустыми, а твои моды показывались как чужие файлы. А если запись падала на середине, например на полном диске, заменённый мод мог остаться с окончанием .mmtx. Теперь приложение возвращает его на место.

Всё делается с клавиатуры

Название на карточке в каталоге теперь кнопка: дойди до неё Tab'ом и нажми Enter, мод откроется. Оттуда его можно поставить, а в «Моих модах» удалить, не трогая мышь. Окно при открытии забирает фокус, Tab не выходит за его пределы, а после закрытия ты возвращаешься туда, откуда открыл. Экранный диктор теперь слышит названия списков сортировки, героев и языка и больше не зачитывает иконки словами вроде check_circle.

Окно может просить только то, что делают его кнопки

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

Каждый релиз сначала пробуется как обновление

Перед выходом релиза CI ставит предыдущую версию, даёт ей мод и избранное, ставит новую поверх и проверяет, что и то и другое на месте.

2.10.0

Аркана Террорблейда в любом цвете и ещё 2

Релиз на GitHub

Аркана Террорблейда в любом цвете

Каталог → Инструменты теперь начинается с арканы Террорблейда. Наведи на цвет, и картинка арканы сразу его покажет, ещё до сборки. «Поставить аркану целиком» кладёт её в «Мои моды». Приложение собирает аркану из файлов твоей игры: модель, рога, свечение и иконки способностей, так что увидишь её и без покупки. Если аркана у тебя есть, «Аркана уже куплена? Только цвет» перекрасит твою.

Эффект убийства и звуки арканы даёт сам предмет, в мод они не попадают. Мод грузится раньше модов на героев из каталога, так что аркана оттуда не перебьёт твой цвет. Если обновление Доты поменяет файлы, из которых она собрана, приложение соберёт её заново в том же цвете. Другой цвет потом выбирается пунктом «Перекрасить» в её меню в «Моих модах».

Моды из каталога говорят, что вышла новая версия

Когда автор заменяет мод в каталоге, «Мои моды» помечают твой «новая версия» и предлагают «Обновить все». Обновление сохраняет место мода в порядке загрузки, и включённый мод остаётся включённым, а выключенный выключенным.

Метку «до патча» можно снять из меню

Если мод с меткой «до патча» у тебя работает, сними метку из его меню в «Моих модах».

2.9.0

Моды снова грузятся после обновления Доты 7 октября и ещё 2

Релиз на GitHub

Моды снова грузятся после обновления Доты 7 октября

С выключенным безопасным режимом обновление Доты 7 октября могло отключить моды из языковой папки. Погода и предметы работали, остальное нет.

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

Теперь приложение сверяет свою копию с файлом Доты при каждом запуске и пока открыто, и переписывает её, если они расходятся. Достаточно открыть эту версию. С включённым безопасным режимом ничего не ломалось.

«Мои моды» называют моды, которые задел патч Доты

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

С этой версии приложение запоминает, какие файлы Доты подменяют твои моды. После следующего обновления Доты мод, чьи файлы оно поменяло или убрало, получит в «Моих модах» метку «до патча», а баннер про обновление назовёт его. Если после патча в игре что-то выглядит не так, начни с этих модов. Метка пропадёт, когда автор обновит мод и ты поставишь новую версию.

«Что нового» показывает абзацы раздельно

Окно склеивало второй абзац раздела с первым, это было видно в заметках к 2.8.0. Теперь каждый абзац идёт отдельно.

2.8.0

Предметы: стандартные вещи героя в виде любых его предметов и ещё 9

Релиз на GitHub

Всё, что принесли четыре беты 2.8.0, теперь у всех.

Предметы: стандартные вещи героя в виде любых его предметов

В «Косметика → Предметы» есть все герои. Открой героя, выбери слот и любой из его предметов: стандартная вещь в этом слоте примет его вид. Видно это только тебе, файлы модов не меняются. Сверху можно добавить эффекты, один или несколько: огонь, молнии, иней, снег, пузыри, песчаная буря и призрак. Иней и снег держатся не на всех моделях.

В игру ничего не пишется, пока не нажмёшь «Надеть». Каждый надетый предмет становится строкой в «Моих модах» с названиями эффектов и выключается, как любой мод. Окно героя начинается с «Наборов»: «Надеть весь набор» наденет все детали сразу, каждую отдельной строкой. Деталь, которую конструктор не меняет, например аркана, остаётся в окне тусклой, с причиной.

«Герои» открываются сеткой героев

Раньше «Герои» в каталоге были лентой из 463 карточек модов. Теперь там плитка на каждого героя: портрет, сколько у него модов и стоит ли у тебя какой-то из них. Нажми на героя, и увидишь его моды. Переключатель на панели возвращает список.

Окно в движении

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

Шейдеры, деревья и река грузятся первыми

Слоты 02-29 теперь отданы шейдерам, деревьям, реке, эффектам героев, дальним атакам, предметам героев и оптимизации, а остальные моды начинаются с 30. Раньше мод на героя, поднятый выше шейдера, мог поменяться с ним слотами. Теперь перемещение и перетаскивание держат мод в его части. Если порядок остался от прошлой версии, приложение один раз разложит его при запуске, пока Dota закрыта: порядок внутри каждой части сохранится, и ты увидишь сообщение, что он поменялся.

Окно античита говорит, что делать

Когда Дота не может проверить игру перед поиском матча, она показывает окно Valve Anti-Cheat: компьютер не прошёл проверку. С модами это выглядит как бан на подходе, а обычно дело в повреждённых файлах игры или в Steam, который пора перезапустить. Теперь приложение заменяет текст этого окна тем, что помогает: проверь целостность файлов в Steam, перезапусти Steam и выключи моды переключателем «Моды». Текст на языке игры, на всех 28.

Он лежит в одном файле самого приложения, pak64 в языковой папке. Это не мод: в «Моих модах» его нет, переключатель «Моды» его не выключает, а при удалении приложения он удаляется. Если на слоте 64 стоял твой мод, он переедет на следующий свободный слот.

Ландшафты-карты, собранные под старую карту

Некоторые ландшафты каталога, в том числе TI и Dota+, заменяют карту целиком, и каждый несёт карту Valve такой, какой она была в день сборки. После обновления карты такой ландшафт может убрать деревья, съесть кадры и довести до отказа в поиске матча. Теперь каталог и «Мои моды» помечают такие ландшафты «старая карта». Когда карта в игре меняется, приложение один раз выключает старый ландшафт и говорит об этом. Если включишь его обратно, он останется включённым до следующего обновления карты.

Моды 18+ скрыты, пока ты не скажешь «да»

Каталог помечает пять модов как 18+: откровенные модели героев. Приложение один раз спрашивает, есть ли тебе 18 и показывать ли их. До ответа «да» их нет в каталоге, поиске, «Недавно добавленных» и «Избранном». Поменять ответ можно переключателем в «Настройки → Каталог». Уже установленные моды остаются в «Моих модах» как были.

Все авторы мода

Окно мода называет всех, кого каталог указал у мода: авторов, тех, кто его переделал, и тех, кто его прислал, каждого со ссылкой на его страницу. Раньше там был только первый автор, а две другие ссылки вели на страницу, которой нет.

Исправлено

  • Проверка файлов игры в Steam при открытом приложении выключала моды до перезапуска. Теперь приложение замечает проверку и возвращает свой патч.
  • Если двигать мод в порядке загрузки, пока Dota или антивирус держит один из его файлов, мод мог разорваться между двумя слотами, а обмен двух модов в такой момент мог удалить один из них. Теперь перенос проходит целиком или не проходит вовсе.
  • Файл настроек, сохранённый с меткой порядка байтов (так сохраняет Блокнот), при следующем запуске терял все настройки, включая путь к игре. Теперь он читается.
  • При первом запуске без интернета и без кэша пресеты нельзя было ни посмотреть, ни отправить, ни применить. Теперь работают.
  • Рядом с Minify «Мои моды» показывали жёлтое предупреждение, которое само себе противоречило, даже когда всё было в порядке, и могли назвать папку «dota_null». Теперь там сказано, какую папку читает игра, а предупреждение появляется, только если не грузятся твои моды.
  • Когда вики отвечала ошибкой сервера на картинку косметики, приложение принимало это за «картинки нет» и не показывало её неделю. Теперь в следующий раз спрашивает снова.
  • В невысоком окне, например на ноутбуке 1366x768 с масштабом 125%, у окна безопасного режима обрезались заголовок и обе кнопки. Теперь оно помещается.
  • После переключения на английский кнопка входа и переключатель модов оставались русскими до перезапуска.
  • Нажатие на вкладку сразу после смены экрана могло потеряться, а поиск, набранный в другом разделе, открывал главную без результатов.
  • Полоса загрузки оставалась на экране после скачивания Source 2 Viewer.
  • Превью, поставленное на паузу в первую секунду, всё равно запускалось. Теперь остаётся на паузе.
  • Применение пресета с модом, у которого в каталоге нет файла, больше не пытается скачать файл «undefined».
  • Отчёт для поддержки из настроек теперь говорит, отказывают ли зеркала загрузки, какие инструменты установлены и ждут ли правки таблицы предметов пересборки.

Спасибо

Конструктор предметов написал h6rd, дальше его развивают h6rd и TheFleece. Спасибо тестерам, которые прогнали четыре беты.

2.7.1

Проект переехал на github.com/dota2modmanager и ещё 3

Релиз на GitHub

Проект переехал на github.com/dota2modmanager

Репозиторий теперь принадлежит организации с двумя мейнтейнерами, и каждое изменение перед выпуском читает тот из них, кто его не писал. Эта версия ищет обновления и объявления проекта уже по новому адресу, и ссылка на GitHub ведёт туда же. Старые версии продолжают работать: GitHub сам перенаправляет со старого адреса, делать ничего не нужно.

Кнопка «Скачать» в твоём статусе Discord теперь открывает dota2modmanager.com, а не старую страницу на GitHub.

Имя пользователя Windows больше не попадает в отчёт диагностики

Отчёт показывал папки полным путём, а путь внутри домашней папки несёт имя пользователя Windows. Теперь эта часть пишется как %USERPROFILE% (на Linux ~), и отчёт, который ты кидаешь в Discord, показывает папку, а не то, кто ты.

Electron 44.4.3

Движок, на котором работает приложение, обновлён с 44.3.0 до 44.4.3, со всеми исправлениями, которые Electron выпустил за это время.

Спасибо

Изменение с отчётом диагностики сделал Omkar Nikam. Это уже его второй PR сюда.

2.7.0

Бета-канал, для тех, кто просился первым и ещё 5

Релиз на GitHub

Бета-канал, для тех, кто просился первым

Несколько аккаунтов теперь получают сборки раньше остальных. Если твой из них, в настройках под блоком Discord появился переключатель; если нет, там пусто и пропустить нечего. Выйдешь из Discord - бета уйдёт вместе с ним.

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

Поэтапную раскатку мы тут не делаем осознанно: срочная правка должна доезжать до всех сразу. Это вторая половина того же разговора - несколько человек, которые знают, что у них стоит ещё не выпущенное.

В портативной сборке снова работает кнопка «Скачать»

Портативная копия находила обновление, а на «Скачать» отвечала «Нет обновления», и так с версии 2.3.0. Она читала номер версии один раз при запуске, до того как проверка вообще успевала пройти, поэтому читать было нечего. Установленных копий это не касалось: они обновляются сами.

Шрифты и курсоры перестали возвращаться после удаления

С версии 2.0.0 приложение возвращало шрифт или курсор, если проверка файлов Steam их заменила, и решало сравнением файлов. Мод, который везёт часть валвовских файлов без изменений, выглядел одинаково сразу: одна установка в августе 29 раз записала «restored after verify» про один и тот же набор курсоров, а после удаления такого мода его файлы могли остаться как будто игровые.

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

Косметика называется тем, чем является

В окне и на сайте было написано «бесплатная косметика». Это и неправда, и прячет главное: приложение берёт стандартный предмет, который есть у любого аккаунта, и рисует его как другой, в своей копии игровой таблицы предметов. Ничего не покупается, в инвентарь ничего не приходит, и видно это только тебе. Все тексты теперь говорят именно так.

Каждый релиз проверяется антивирусами, и результат публикуется

Два ложных срабатывания дошли до людей раньше, чем мы узнали, что на это нужно отвечать. Теперь каждый релиз ищется на VirusTotal по той же контрольной сумме, что уже лежит рядом с файлами, а вердикт попадает в описание релиза таблицей со ссылкой на каждый файл, каким бы он ни был.

По мелочи

  • Приложению можно указать ещё одно место, откуда качать моды, без выпуска новой версии. Это важно в день, когда GitHub недоступен.
  • Повреждённое дерево VPK или архив теперь получают отказ словами приложения, а не падением и не сообщением чужой библиотеки.
  • Языковая папка, если её нужно создать, создаётся за один шаг: на медленном диске она больше не остаётся полусделанной.

2.6.12

Техническое обновление и ещё 4

Релиз на GitHub

Техническое обновление

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

Релиз сначала ставят и прокликивают, и только потом отдают тебе

Раньше CI собирал установщик и тут же публиковал его. Два сентябрьских релиза вышли со сломанной установкой: все проверки были зелёные, потому что кнопку никто ни разу не нажимал.

Теперь релиз создаётся черновиком, на который ни одна установленная копия обновиться не может. CI берёт из черновика установщик и AppImage, ставит их и прокликивает: установить мод, выключить, перезапустить, включить, удалить, сверяя папку игры на диске после каждого шага. Только когда оба прошли, релиз становится публичным, сразу для всех.

Любой файл релиза можно проверить

У каждого релиза теперь есть SHA256SUMS с SHA-256 всех файлов и подпись этого списка, сделанная самим релизным воркфлоу. Если хочешь убедиться, что скачанный установщик собран именно из этого репозитория, через GitHub CLI:

``` gh attestation verify Dota-2-Mod-Manager-Setup.exe --repo TheFleece/dota2-mod-manager ```

Рядом лежит список того, что приложение несёт внутри. Остальные способы проверки описаны в README и SECURITY.md.

Объявления в приложении гаснут сами

Приложение умеет показать тебе объявление с датой, и раньше оно висело, пока кто-нибудь не вспомнит его убрать. Благодарность за видео hanta должна была провисеть неделю в августе, а висела до середины сентября. Теперь у объявления есть последний день показа, а это убрано.

На старте одним лишним запросом меньше

Приложение спрашивало у GitHub файл настроек, который никогда не публиковался, получало 404 и работало дальше с тем, что зашито в сборку. Больше не спрашивает.

2.6.11

Под капотом Electron 44 и ещё 1

Релиз на GitHub

Под капотом Electron 44

Приложение переехало с Electron 43 на 44, а с ним на свежий Chromium с исправлениями безопасности за последний месяц. Внешне ничего не должно поменяться. Перед выпуском мод из каталога поставили через окно на новой версии, и он лёг на диск так же, как на старой.

Библиотека для zip обновлена из-за уязвимости

В adm-zip, которой приложение читает архивы модов, нашли уязвимость: при распаковке на диск она идёт по ссылкам, которые уже лежат в папке, и подготовленный архив мог записать файл за её пределами. Приложение никогда не даёт adm-zip распаковывать на диск: каждый файл читается в память, путь и размер проверяются, а записывает его само приложение. Так что установленный мод этой дырой воспользоваться не мог. Исправленная версия всё равно поставлена, вместе с обновлённым разборщиком YAML для проверки обновлений.

2.6.10

После обновления Доты снова пускает в матчмейкинг и ещё 1

Релиз на GitHub

После обновления Доты снова пускает в матчмейкинг

С включёнными модами обновление Доты могло привести к тому, что игра переставала искать матч. При этом в приложении всё выглядело правильно: патч включён, подписан, порядок.

Дота держит список хешей тех файлов, которые проверяет, и с каждой сборкой выкладывает новый. Приложение дописывает в этот список одну строку про файл, который правит. Ошибка была в том, откуда бралась остальная часть списка: из копии, сохранённой в первый раз, когда ты включил моды. На одной машине этой копии было шесть недель и с десяток патчей Доты. После обновления приложение клало этот старый список обратно, клиент сверял свои сегодняшние файлы с хешами многонедельной давности и в матч не пускал.

Теперь берётся список той сборки, которая установлена, плюс та же одна строка. Сохранённая копия больше не читается.

Если в матч всё ещё не пускает после обновления: старый список может до сих пор лежать в папке игры, и узнать, каким он был правильный, приложение не может. Steam, Dota 2, Свойства, Установленные файлы, Проверить целостность файлов игры — это ставит его на место за минуту. Следующий патч Доты тоже его заменит.

Пресет возвращает свои моды

Если модов из пресета уже не было, «Применить» выключало все остальные моды, включало только те, что остались, и писало «Пресет применён». При этом карточка над кнопкой и так показывала, сколько модов не установлено, просто кнопка с этим ничего не делала.

Теперь то, что ещё есть в каталоге, сначала ставится, а потом пресет применяется. Свой мод, которого нет на этом компьютере, взять неоткуда, поэтому приложение его называет, а не пропускает молча.

2.6.9

На Linux можно выключить безопасный режим и ещё 1

Релиз на GitHub

На Linux можно выключить безопасный режим

Раньше нельзя. Переключатель отвечал dota.signatures не найден и на этом всё, а значит игра не подхватывала вообще ни один мод.

Файла, который он искал, там нет. На Windows клиент держит список хешей в bin/win64/dota.signatures и сверяет с ним то, что грузит, поэтому приложение дописывает туда свою строку. В линуксовой сборке Valve в bin/linuxsteamrt64/ лежат клиент, четыре десятка библиотек и никакого списка, а приложение считало это сломанной установкой, а не другой.

Подписывать там нечего, поэтому патч просто пишется, и это вся работа. Заодно пропала точка предупреждения про список, которого никогда не было, и приложение перестало переставлять патч, который считало неудавшимся.

Нашлось по фотографии этой папки: на ней всё и видно.

У обновлений на Linux тоже появился второй источник

Он должен был появиться ещё в 2.6.5, но для Linux так и не появился: зеркало наполнялось раньше, чем собиралась линуксовая версия, поэтому на нём лежали только виндовые файлы. Так вышло четыре релиза подряд. Теперь оба линуксовых файла на месте, а релиз, который что-то из шести не довёз, падает громко, а не тихо.

2.6.8

Пресет, которым с тобой поделились, доходит до конца и ещё 1

Релиз на GitHub

Пресет, которым с тобой поделились, доходит до конца

Открытый файл пресета ставил всё, что в нём есть, записывал это в библиотеку и останавливался за строку до того, как включить моды. Об этом никто не сообщал: окно продолжало ждать ответа, который уже не придёт. Сломало это то же самое разделение файлов, что сломало установку в 2.6.5, и ровно так же, а не заметили потому, что для этого нужен файл пресета от другого игрока.

Если действие не получилось, оно об этом говорит

Любой сбой в процессе за окном оставлял кнопку висеть на «Установка…», а причина попадала только в лог-файл. Именно так обычная ошибка две версии подряд выглядела зависанием. Теперь кнопка возвращается, а причина видна на экране.

2.6.7

Установка модов снова работает

Релиз на GitHub

Установка модов снова работает

В 2.6.5 и 2.6.6 она не работала. Кнопка «Установить» не делала ничего: надпись менялась на «Установка…» и висела так, без прогресса, без ошибки, и на диск ничего не попадало. Любой мод, у всех.

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

Ничего этим не сломано: ни один файл не записан, ни один мод не установился наполовину. Кнопка просто врала, что занята.

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

2.6.6

Моды, которые не ставились, снова ставятся и ещё 1

Релиз на GitHub

Моды, которые не ставились, снова ставятся

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

Одно зеркало отдавало старые копии. Задача, которая его наполняет, пропускала файл, если он уже лежал там под тем же именем, поэтому мод, заменённый автором, оставался в старом виде сколько угодно долго. Таких набралось двадцать четыре, один с августа. Кто не достаёт до GitHub, тому сначала отвечает как раз это зеркало: приходил старый файл, и проверка его не пропускала.

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

Сам список тоже бывает неправ. Его пересобирает бот, и 10 сентября он назвал для одного мода сумму, которой у этого файла никогда не было, так что мод перестал ставиться у всех подряд, независимо от связи. Если не сходится ничего, приложение берёт то, что отдаёт хост, который каталог называет своим, вместо того чтобы отказывать из-за списка, который отстал. С зеркал по-прежнему принимается только совпавшее: ни одно из них не подсунет байты, которых не отдавал GitHub.

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

И говорит об этом по-человечески

Отказ выглядел как checksum mismatch for Some Mod.zip, по-английски, посреди русского интерфейса. Теперь пишет, что файл не совпадает с тем, что опубликовал автор мода, и предлагает попробовать позже.

2.6.5

Приложение работает, даже когда не работает GitHub и ещё 5

Релиз на GitHub

Приложение работает, даже когда не работает GitHub

Оттуда бралось всё: каталог, моды, превью, обновления. 17 августа GitHub лежал три часа, и не работало ничего, а у части людей он не открывается и в обычный день. Теперь у каждой из этих вещей есть второй источник.

Сами моды: четверть каталога никогда не доезжала до копии, на которую приложение переключается. Пять категорий хранятся не так, как остальные, и задача, наполняющая копию, проходила мимо них - 313 модов (эффекты предметов, предметы героев, крипы, денай и башни) ставились только пока отвечал GitHub. Теперь на месте все.

Превью: они качались прямо с GitHub, поэтому у заблокированных каталог выглядел сеткой пустых квадратов. Картинка, которая не пришла, перезапрашивается с копии, а если и там нет - плитка честно это показывает вместо серого прямоугольника.

Обновления: приложение смотрело только в GitHub Releases. Теперь при отказе оно берёт их с нашей копии - и установленная сборка, и портативная, - и возвращается к GitHub, как только тот отвечает. Манифест и файл, который он описывает, всегда приходят из одного места, поэтому нельзя подсунуть контрольную сумму от одной версии со сборкой от другой.

И тулчейн иконок, те самые 50 МБ, из-за которых видно картинки бесплатной косметики, тоже скопирован.

Оно говорит, что случилось

Если открыть приложение без интернета, пока оно ничего не успело закэшировать, на месте каталога раньше было вот это:

Не удалось загрузить каталог: fetch failed

Так Node называет невозможность открыть сокет, и это показывали человеку. Теперь там написано, что связи нет, что уже установленные моды работают и что каталог вернётся вместе со связью. Если сервер ответил, но плохо, текст другой: советовать проверить интернет тому, у кого он работает, значит отправить его чинить исправное.

Каталог подписан, а моды сверяются с тем, что выложил автор

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

Архивы модов проверяются так же. Раньше архив принимался на веру при первой загрузке и потом сверялся с этой же копией - то есть подмену ловили при любой загрузке, кроме той единственной, которая имеет значение. Теперь каталог публикует контрольную сумму каждого архива, и каждая загрузка сверяется с ней до того, как что-то попадёт в папку игры.

Окно открывается по размеру экрана

На ноутбуке 1366x768 и на любом экране с масштабом Windows 125% или 150% приложение просило окно больше рабочего стола и получало его. За нижним краем оставались панель запуска и конец каждого списка, и выглядело это не как поломка: список прокручивался, просто строки уезжали за экран. Перезапуск не помогал, потому что размер запрашивался заново, а не запоминался.

Падение на части Windows

Слежка за обновлением Доты могла уронить всё приложение - без ошибки и без записи в логе. Так случалось, когда путь к игре записан коротким именем в формате 8.3 или ведёт к папке через junction, а это как раз то, что остаётся после переезда библиотеки Steam. Нашлось, когда тесты впервые прогнали на Windows.

Мелочи

  • У английского интерфейса категория каталога называлась «Sound» вместо «Audio». Тринадцать ключей перевода были записаны дважды, и две пары противоречили друг другу; дубликаты убраны, а сборка теперь падает, если появится новый.
  • Пресет, которым ты делишься, открывается страницей-обёрткой, и жила она на GitHub Pages - значит ссылка не открывалась у тех, кто до GitHub не достаёт. Новые ссылки ведут на dota2modmanager.com. Те, что ты уже отправил, продолжают работать.
  • На сайте больше не крутится анимация, из-за которой Safari на телефоне мог бросить вкладку после нескольких секунд прокрутки, и картинки грузятся по размеру экрана, на котором их видно.
  • «Мои моды» ещё релиз после отмены резерва писали, что Minify оставлены pak65-67 и pak99. Резервируются 65-67, теперь так и написано; лежащий на диске pak99 по-прежнему опознаётся как его и остаётся на месте.

2.6.4

Моды снова попадают в папку, которую читает игра, если у тебя свежий Minify и ещё 4

Релиз на GitHub

Моды снова попадают в папку, которую читает игра, если у тебя свежий Minify

Minify v1.14rc7 ставит перед Дотой свою команду в параметрах запуска Steam, чтобы кнопка Play сначала прогоняла патч. При сохранении кавычки вокруг его пути экранируются, а приложение читало параметры запуска до первой кавычки и на ней останавливалось. Оно теряло -language, стоящий за ней, решало, что параметра нет, и возвращалось к папке по языку озвучки - которую Дота не монтирует, пока параметр стоит. Моды лежали на диске, включённые, в папке, куда никто не смотрит.

Теперь параметры запуска разбираются так, как их пишет Steam. Если после обновления Minify моды у тебя замолчали, они вернутся при следующем запуске приложения, ставить заново ничего не надо.

Когда Дота не стартует, «Мои моды» объясняют почему

Та самая настройка Minify называется «Run patches upon launch if required» и включена по умолчанию. Она умеет съесть запуск: если патч решит поправить параметры запуска, он закрывает Steam и ждёт его, а вместе со Steam уходит и твой запуск. Приложение в этой цепочке не участвует - кнопка «Играть» здесь открывает ту же ссылку steam://, что и Play в самом Steam. Но окно открыто именно у тебя, поэтому теперь оно говорит, что обёртка стоит, чья это настройка и где её выключить.

pak99 снова в обороте

Minify перенёс свою английскую локализацию в pak66, значит в pak99 он больше не пишет и слот можно раздавать. Уже лежащий у тебя pak99 приложение по-прежнему считает его файлом и не трогает.

Цвета менялись один раз, а потом переставали

Если в Windows выключены анимации, маскот в шапке срабатывал на первый клик за сессию и не реагировал на все следующие. Теперь оборот заканчивает таймер, а не анимация, которой нет.

Удаление модов больше не выглядит как удаление пресетов

Очистишь вкладку «Мои моды» - и каждый пресет показывал «0 модов» над надписью «пусто (всё будет выключено)». Ничего не пропадало: пресет помнит моды, а не установки, поэтому сборка переживает переустановку, - карточка считала только те, что нашла на диске. Теперь пресет показывает весь свой состав, а моды, которых у тебя нет, нарисованы контуром.

2.6.3

Интерфейсу больше не нужен интернет, чтобы нарисоваться

Релиз на GitHub

Интерфейсу больше не нужен интернет, чтобы нарисоваться

Каждая иконка в приложении - это глиф в шрифте, а шрифт скачивался с Google при запуске, вместе с двумя текстовыми. Когда он не приезжал - соединения ещё нет, сеть медленная или заблокирована, кэш очистило обновление - каждая иконка откатывалась на слово, которое за ней стоит, и окно заполнялось надписями campaign, shield и play_arrow вместо картинок.

Теперь шрифты лежат внутри приложения и читаются с диска. Рисование окна больше не трогает сеть вообще, и политика безопасности окна ей этого уже не разрешает.

2.6.2

Обновление больше не спрашивает, удалять ли твои моды

Релиз на GitHub

Обновление больше не спрашивает, удалять ли твои моды

В 2.6.1 приехал деинсталлятор, который спрашивает, что забрать вместе с программой: моды в папке игры и её собственные данные. Он должен был появляться, когда программу удаляют. Появлялся он и при обновлении, причём с уже поставленными галочками, потому что обновление заменяет версию через запуск старого деинсталлятора, а проверки на это не было.

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

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

2.6.1

Моды теперь попадают туда, куда игра действительно смотрит и ещё 2

Релиз на GitHub

Моды теперь попадают туда, куда игра действительно смотрит

-language в параметрах запуска Steam стоит выше языковой настройки внутри Доты. Приложение этого не знало и на машине с таким параметром делало худшее из возможного: каждый запуск переписывало язык озвучки обратно, каждый раз проигрывало и оставляло моды в папке, которую игра не открывает, при этом уверяя, что всё в порядке. Ничего не ломалось и не пропадало, моды просто лежали там, куда никто не смотрит.

Теперь приложение следует за параметром. Если он называет язык, который Дота знает, моды идут в эту папку, а уже поставленные переезжают туда сами при следующем запуске. Уберёшь параметр - переедут обратно. У кого параметра нет, для того ничего не изменилось.

Это же и делает работу рядом с Minify настоящей, а не просто описанной: параметр ставит именно он, поэтому следование за параметром означает, что моды обеих программ оказываются в одной папке, которую игра читает.

Всё, что приложение говорило про Minify, исправлено

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

Minify отдельно записывает язык, который у него попросили, и папку, в которую он пишет: просишь английский, он помечает «english», а собирает в dota_dutch. Приложение читало не то поле, поэтому называло папку, которой нигде нет, и делало вывод, что не грузятся моды ни одной программы, тогда как моды Minify грузились. Ещё оно предлагало кнопку, переносящую его моды к себе, вообще не имело формулировки для случая «игра не читает ни одну из папок» и советовало поставить в Minify русский язык - что любому, у кого игра не на русском, захардкодило бы её на русском.

pak99 добавлен к pak65-pak67 в список слотов, которые приложение не занимает: туда Minify пишет свой английский фикс, а 99 - последний слот, который приложение выдаёт, то есть до него первым добрался бы человек с большой библиотекой.

Мелочи

«Мои моды» больше не показывают dota_mods - собственную папку приложения под бесплатную косметику - как будто это язык. Уже существующая языковая папка остаётся как есть, ей больше не подкладывается gameinfo.gi, который ей не нужен. А перенос модов между папками обходит стороной всё, что принадлежит другой программе, в какую бы папку он ни был направлен.

2.6.0

Выключение безопасного режима теперь объясняет себя и ещё 6

Релиз на GitHub

Выключение безопасного режима теперь объясняет себя

Раньше это была строка с именами файлов, и её никто не читал. Теперь нормальное окно: что программа делает сейчас (кладёт свои .vpk в папку, которую Dota и так читает, файлы игры не трогает) и что начнёт делать вместо этого, с обоими файлами по именам и с тем, что в каждый добавится. Оригиналы сохраняются до первой правки, поэтому возврат ставит их на место байт в байт, без следов. Dota стирает эту правку каждым обновлением, а программа вписывает её заново сама, и про это окно тоже говорит. И главная фраза: правку файлов игры в моддинге Dota считают небезопасной, за 8+ лет мы не знаем ни одного бана за это, но гарантий не даём.

Переключение вкладок и импорт большой пачки

Открытие вкладки собирало экран с нуля. Возврат в «Героев» это 513 карточек заново и примерно 90 мс замороженного окна, каждый раз. Теперь экраны сохраняются: около 30 мс, и число больше не растёт вместе с размером категории. Ещё каждый экран помнит, где был прокручен, а не открывается на отступе предыдущего.

Импорт пачки не отпускал программу всё время работы, поэтому Windows писала «не отвечает» на те несколько минут, которые занимает большой пак. Теперь он отдаёт управление между модами, а полоска считает: «Разбор модов 31 / 60» вместо одной ширины до самого конца.

Удаление модов

Удаление файла никогда и не было медленным, оно занимает пару миллисекунд. Ждать приходилось пересборку таблицы предметов после него, и на выделении она шла по разу на каждый мод. Теперь одна пересборка на всю пачку, и сама пересборка ускорилась с 2.6 секунды до полусекунды. Двадцать модов удаляются примерно за шесть десятых секунды, а те же двадцать раньше занимали около минуты.

Пресеты сохраняют то, что ты сохранил

Пресет держал свои моды ровно столько, сколько они оставались установленными: удалил мод, и он вырезался из всех пресетов, а переустановка его не возвращала. Теперь пресет помнит, что это за мод, а не какая именно копия лежала на диске, поэтому удаление сборку не трогает, а поставишь мод заново где угодно, и он встанет на своё место сам. На карточке видно, скольких модов сейчас нет.

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

Картинки предметов берутся из твоей игры

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

Рядом с Minify

Minify грузит моды так же, как эта программа: называет языковую папку, а Dota монтирует ровно одну. Поэтому приложение теперь читает конфиг самого Minify, разбирается, чью папку игра читает на самом деле, и говорит об этом. В том числе про случай, когда его папку игра не читает вовсе, и к нам это отношения не имеет.

И не лезет к нему: слоты паков, в которые пишет Minify, мы не занимаем, переключатель «выключить все моды» больше не переименовывает его файлы, а его моды не предлагаются в «Моих модах» как что-то, что можно привязать или удалить. Его файлы узнаются по метке, которую он сам кладёт внутрь того, что собирает, а мы оставляем рядом dota2modmanager.json со списком своих, чтобы любая из сторон могла понять, чей файл. Ничего его не двигаем, не переименовываем и не удаляем.

Там, где обе программы победить не могут, приложение спрашивает: Dota читает один файл карт, поэтому ландшафт и мод карт Minify это один и тот же файл. Установка одного заменяет другой, и теперь ты узнаёшь об этом заранее.

Параметр запуска, который перебивает всё

Старые гайды раздают -language что-нибудь не задумываясь. Пока он стоит, Dota берёт обе языковые настройки из него и монтирует названную им папку, что бы приложение ни делало. Теперь «Мои моды» об этом говорят и подсказывают, где его убрать.

2.5.1

Скин, который занял чужую вещь, ставится целиком и ещё 2

Релиз на GitHub

Скин, который занял чужую вещь, ставится целиком

Кого одевает мод, программа читает по моделям внутри него, и путались две вещи. Персона лежит в своей папке: models/heroes/antimage_female это Вэй у Анти-Мага, invoker_kid это Аколит у Инвокера, так что набор на одного героя выглядел как набор на двух. А ещё скины вешают на себя чужие вещи: у сета на Клинкза на луке иммортал Феникса, у сета на Свена наспинник Дизраптора. Одна такая модель считалась вторым героем.

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

Теперь персона читается как её герой, вместе со старыми именами папок, которые Дота держит с прошлых переименований (bard, lanaya, drow, gyro, tuskarr и остальные), а герой, у которого моделей меньше четверти от главного, читается как одолженный, а не одетый. Имя и разрезание спрашивают одно и то же, так что мод, приехавший под правильным именем, приезжает и целиком. На 75 модах, нарезанных из одного пака Skinchanger, число разваливающихся упало с трёх до нуля.

Кусок, на который предмет показывает, а не везёт

Мод может показать дефолтным слотом на валвовскую модель и всё равно быть работой автора: он перекрашивает этот предмет своими текстурами, а запись называет только модель. Спина Тинкера Deep Sea Robot ровно такая, и импорт выбрасывал запись, потому что от названной модели в моде ничего нет. Спина не появлялась на герое вообще.

Теперь такая запись опознаётся по папке предмета, в которой лежат собственные текстуры мода.

Спасибо

hanta снял разбор менеджера. Его канал теперь строкой в разделе «О программе», рядом с версией и лицензией.

2.5.0

Падение GitHub больше не твоя проблема и ещё 1

Релиз на GitHub

Падение GitHub больше не твоя проблема

17 августа GitHub лежал три часа. Всё, что читает программа, живёт там: каталог, архивы модов, файл, по которому опознаются моды, поставленные руками. Зеркала, которые уже были, это прокси перед тем же GitHub, поэтому они легли вместе с ним. Окно открывалось, каталог был пустой, поставить нельзя было ничего.

Теперь есть ещё два места, и оба не GitHub. Каталог и его данные копируются на сайт программы при каждой его сборке. Все 915 архивов модов лежат в объектном хранилище за адресом cdn.dota2modmanager.com и обновляются каждую ночь. GitHub по-прежнему спрашивается первым, он источник, а остальные отвечают, когда он не может.

Каталог, который не обновился, больше не исчезает

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

2.4.0

Теперь работает на Linux и ещё 1

Релиз на GitHub

Теперь работает на Linux

В релизе появился AppImage. Сделал файл исполняемым, запустил, всё, установка на этом кончилась.

Линуксовая Дота держит моды в тех же папках, что и виндовая, поэтому про сами моды знать ничего нового не нужно. Учиться второй платформе пришлось всему вокруг них. Steam приложение ищет там, где его держит твой дистрибутив, а не в реестре винды: симлинк ~/.steam, папка XDG, домик flatpak и оба написания папки steamapps, разницу между которыми винда прощает, а линукс нет. Про запущенную игру оно спрашивает у системы процесс, а не зовёт виндовую утилиту. И говорит рабочему столу, что ссылки d2mm:// открывает оно, так что присланный другом пресет открывается как везде.

Честно про то, насколько это новое: каждое изменение у нас собирается и запускается на линуксе против выбрасываемого дерева игры, и эту сборку человек проверил на настоящем рабочем столе перед выпуском. Но это неделя линукса против года винды. Заметишь странность - пиши в issue, починим быстрее, чем ты её нашёл.

По мелочи

Мод на Shadow Shaman, у которого папка называется shadowshaman, представлялся «Shadowshaman». Теперь Shadow Shaman.

2.3.0

Портативная сборка, для тех кто не хочет ничего ставить в систему и ещё 2

Релиз на GitHub

Портативная сборка, для тех кто не хочет ничего ставить в систему

В релизе появился второй файл, Dota-2-Mod-Manager-Portable.exe. Запускается откуда угодно, хоть с флешки, и ничего в систему не пишет.

Портативная здесь значит, что данные едут вместе с ней. Настройки, библиотека модов и кэш загрузок лежат в папке рядом с exe, поэтому та же флешка на другом компьютере открывается со всем, что у тебя уже было. Если писать рядом нельзя, например ты положил exe в Program Files, она вернётся к обычной папке и продолжит работать.

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

Моды больше не ставятся туда, где игры нет

Человек перенёс библиотеку Steam с диска C на F. Steam оставил на C пустое дерево папок, как он всегда делает. Приложение проверяло, есть ли папка с именем dota, решило, что нашло игру, и установило туда сорок три мода. Все сорок три числились установленными. Ни одного из них не было там, где игра могла бы их увидеть.

Теперь проверяются настоящие файлы Valve, а не имя папки, и делается это в трёх местах: при запуске, где путь, переставший быть установкой, сам заменяется на настоящий; при выборе папки вручную; и до начала загрузки, поэтому мод, которому некуда встать, больше не стоит тебе 300 МБ трафика.

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

По мелочи

Страницу релиза не удалось обновить в первые минуты после выхода 2.2.0, из-за чего её файл обновления разъехался по двум страницам. Оба случая починены, и теперь релиз проверяет сам себя, прежде чем считаться готовым.

Появились SECURITY.md и security.txt, чтобы нашедший дыру мог написать приватно, а не открывать публичный issue.

2.2.0

Приложение стало меньше доверять каталогу и ещё 3

Релиз на GitHub

Почти всё здесь ты не увидишь. Обновись всё равно.

Приложение стало меньше доверять каталогу

Моды, превью и гайды приезжают из репозитория, который нам не принадлежит, а когда GitHub недоступен, они идут через публичные прокси. Раньше весь этот путь считался дружелюбным. Он не дружелюбный, и с этой версии приложение так к нему и относится.

Текст гайда теперь проходит через список разрешённых тегов, поэтому гайд несёт слова и ссылки и ничего больше. Окно отказывается уходить со своей страницы. Имя файла, приехавшее с записью каталога, используется как имя и больше не может превратиться в путь. Единственная программа, которую приложение скачивает и запускает, читалка Source 2, теперь берётся только из релизов её собственного проекта, а файл с её версией качается напрямую с GitHub, без прокси посередине.

В интерфейсе ничего не изменилось. Кому интересны детали, всё расписано в истории коммитов.

Свежий движок под капотом

Окно рисуется тем же движком, что и браузер, а он отстал на десять больших версий, то есть на два года уже опубликованных исправлений. Теперь это Electron 43, и установщик пересобран целиком, чтобы убедиться, что по дороге ничего не отвалилось.

Моды идут за языком озвучки твоей игры

Дота монтирует папку, названную по языку озвучки, а приложение раньше отвечало на это тем, что прописывало всем «russian» прямо в игру. Теперь при корейской озвучке моды ложатся в dota_koreana, при китайской в dota_schinese, при русской туда же, куда и всегда. Ничего не спрашивается и ничего в твоей игре не меняется.

Английский единственный, для которого Valve не монтирует папку, поэтому его моды идут в dota_russian, и разницы ты не услышишь: что скачано, решает Steam, что смонтировано, решает Дота, а папка без озвучки внутри отдаёт моды, пока речь продолжает играть из файлов самой игры. Тумблер английских голосов вместе с этим убран. Английский ставится в Steam, там ему и место.

Программа называет своего автора

Файл NOTICE, строка в настройках под «О программе» и два дополнительных условия, которые разрешает §7 GPL: сохранять указание авторства и давать своей версии собственное имя. Лицензия прежняя, приложение остаётся свободным. Форкай, продавай, разбирай на части. Скажи, чьё это было.

2.1.0

Мод перетаскивается туда, где должен грузиться и ещё 6

Релиз на GitHub

Всё, что здесь есть, пришло из того, что вы написали после 2.0.

Мод перетаскивается туда, где должен грузиться

Стрелки двигали мод на один слот за нажатие, поэтому поднять мод выше тридцати других стоило тридцати кликов. Теперь у строки есть ручка. Список перестраивается прямо под курсором, соседние строки расступаются, а у края списка он прокручивается сам. В папку игры ничего не пишется, пока ты не отпустишь.

У каждого мода видно его файл

В строке теперь написано имя файла ровно так, как он называется в папке модов, и с суффиксом .off, если мод выключен. Иначе понять, какой из сорока pak-файлов чей, было нечем.

Пресет выглядит тем, что в нём лежит

Раньше пресет был списком названий через точку, а это при восьмидесяти модах абзац, который никто не читает. Теперь сначала обложки модов и строка с числами по категориям, а полный состав — под раскрывашкой и по группам. Пресет на восемьдесят выглядит так же, как на десять.

Окно ведёт себя как окно

Текст больше не выделяется, когда тянешь по списку, а картинки не подхватываются мышкой. И то и другое случалось при обычной прокрутке, а второе заканчивалось тем, что приложение предлагало импортировать картинку, которую ты только что стянул с его же карточки. Поля ввода выделяются по-прежнему, и имя файла в строке мода тоже: это там единственное, что копируют.

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

Приложение говорит, где оно живёт

В меню помощи появился сайт, рядом с вики и Discord, на языке окна. Раньше программа нигде о нём не упоминала.

Отчёт для поддержки говорит, что не так

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

Собирается и больше данных: два файла игры, которые правит наш патч, консольный лог Доты, если ты когда-нибудь запускал её с -condebug, и содержимое папок самого приложения.

Исправлено

  • У плашки «перекрыт» иконка стояла криво относительно собственного текста.
  • «Сколько модов перекрыто» было пустым во всех отчётах, которые когда-либо присылали: отчёт запрашивал то, чего не существует, и молча писал пустоту.
  • Ошибки обновления выбрасывались совсем, а это неудобно, когда жалоба как раз в том, что оно не обновляется. Для тебя они по-прежнему молчат, а в отчёт теперь попадают.

2.0.0

Четыре раздела вместо шести и ещё 12

Релиз на GitHub

Приложение переделано целиком. Шесть вкладок стали четырьмя, каталог перерисован, а на большинство вопросов, которые программа раньше задавала тебе, она теперь отвечает сама.

Четыре раздела вместо шести

Каталог, Мои моды, Пресеты, Настройки. Гайды переехали внутрь мода, который объясняют: открыл мод - гайд там же, на той же карточке. Инструменты стали тем, чем и были, категорией каталога, и стоят в рельсе вместе со всем остальным.

Каталог перерисован

  • Пять колонок вместо четырёх, и карточка, которая начинается с картинки. Чипы говорят, что мод меняет; слот предмета стал выпадающим списком, потому что это один ответ, а не набор. И то и другое теперь переведено.
  • У мода с несколькими вариантами они показаны цветными кнопками с названиями, и переключить их можно прямо на карточке, ничего не открывая.
  • Установленный мод носит зелёную рамку, которую видно через всю сетку.
  • «Герои» разбиты по героям от A до Z и прокручиваются вчетверо быстрее, чем раньше.
  • Мод открывается за треть секунды и вылетает из той карточки, по которой ты нажал.
  • Цифры убраны из рельса, с плиток и из заголовков. Это была статистика каталога, а ты пришёл поставить мод.

Список установки

Нажми плюс на карточке, чтобы отложить мод, листай дальше, а потом поставь всё разом. У списка свой поиск, поэтому список из восьмидесяти модов остаётся списком, с которым можно работать. Это была самая частая просьба в Discord: люди ставили по восемьдесят модов по одному.

Приложение носит того героя, которого выберешь

Восемь палитр из артов каталога и маленький анимированный маскот рядом с логотипом, который их переключает. Кликни по нему, и всё окно поедет следом.

«Мои моды» снова список

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

Поделиться сборкой это одна кнопка

Одна кнопка «Поделиться» открывает один лист: ссылка уже готова, файл лежит рядом. Там же написано, что несёт каждый из двух способов, чтобы никто не отправлял ссылку в расчёте на мод, которого в каталоге нет.

Программа перестала спрашивать про языки

Приложение больше не трогает язык текста Доты, само держит озвучку русской и кладёт моды туда, куда игра действительно смотрит. Если твои моды застряли в другой папке от старой версии, они переедут при первом запуске. Английские голоса это один тумблер в Настройках, и при его включении все моды остаются на месте.

Переживает патчи Доты

Приложение замечает обновление игры в момент, когда оно приходит, а не при следующем запуске, и возвращает на место то, что патч стёр. Пока Дота запущена, оно вообще не пишет в папку игры: говорит об этом и ждёт, пока ты выйдешь.

Либо всё изменение, либо ничего

Установка, импорт, переключение и удаление теперь пишут в папку игры одной транзакцией. Если что-то сорвётся на середине, всё вернётся как было, включая файлы, которые подвинули, чтобы освободить место.

Закачки, которые доходят

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

Возвращает то, что отобрала проверка файлов Steam

Проверка целостности в Steam сносит патч, таблицу предметов, настройку озвучки, шрифты и курсоры. Приложение это замечает и возвращает всё обратно, ничего не спрашивая.

Читает игру, а не гадает

  • Картинки предметов берутся из файлов самой Доты, поэтому новое от Valve появляется без обновления приложения и без закачки 48 МБ с вики.
  • Мод, пришедший без картинки, получает её из себя самого, из артов, которые автор положил внутрь.
  • Приложение спрашивает у игры, какие предметы заменяет мод и кто их носит, поэтому мод называется тем, что он делает на самом деле. «Сборка на 8 героев» оказалась одним героем.
  • Мод, чьи файлы поставляет другой мод, помечается как перекрытый, и приложение говорит, чей файл грузит игра. Решают сами файлы, поэтому два мода, случайно везущие один и тот же стоковый файл, ни в чём не обвиняются.
  • Папку с файлами игры можно превратить в мод, а мод распаковать обратно в папку. Брось папку на окно, и это просто сработает.

Исправлено

  • Клик по сердечку мог сломать установку модов. Сохранение любой настройки заставляло приложение забыть, что оно нашло Доту: каталог писал, что игра не установлена, и любая установка отказывалась работать до перезапуска. Баг был с версии 1.15.0.
  • Архив больше не может соврать о своём размере и заставить приложение распаковать бомбу, а файл внутри архива больше не может записаться мимо своей папки. Это касалось любого архива, который принимает приложение, включая пресет, который тебе кто-то прислал.
  • Чипы на карточке держатся в одну строку и не разваливают её вёрстку.
  • После перехода между экранами карточки и кнопки могли перестать отвечать. Теперь приложение дожидается, пока экран появится, и только потом его оживляет.
  • «Мои моды» больше не ломаются, если в папке модов лежат файлы, которые приложение туда не клало.

1.15.0

Порядок загрузки теперь твой и ещё 4

Релиз на GitHub

Порядок загрузки теперь твой

Дота монтирует файлы модов по порядку, и работает та копия общего файла, что загрузилась первой. Раньше приложение само вычисляло, кто кого перекрывает: сравнивало, что везёт каждый мод, и предлагало поменять их местами. Ошибалось оно слишком часто: два мода, случайно везущие одну и ту же стоковую текстуру, ни за что не спорят, а плашка «перекрыт» на рабочем моде не помогает никому.

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

Файл, который ты сам положил в папку модов, это мод

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

  • Приложение читает файл и называет его по содержимому, рядом ставит портрет героя, для которого он оказался.
  • «Принять» работает с любым файлом, а не только с тем, что нашёлся в каталоге. Файл, которого никто не знает, попадает в библиотеку как импорт.
  • Файл, побайтово совпадающий с уже установленным модом, помечается копией: его можно удалить, а не держать две строки на один мод.
  • Тома данных (pak90_000.vpk) теперь принадлежат своему индексу. Они больше не висят отдельными безымянными строками, и удаление мода забирает их с собой.

У сетов, аркан и предметов появились имя и картинка

Приложение знало, где Дота держит модели героев, и не знало, где она держит косметику: models/items/<герой>, materials/models/heroes и папки эффектов econ. Поэтому сет или аркана приезжали без героя, без имени, без категории и без картинки. Теперь всё это читается, вплоть до того, какие слоты закрывает сет.

Заодно приложение считало разные написания папки героя разными героями, из-за чего скин на одного героя мог объявить себя сборкой из трёх и предложить разобрать себя на бессмысленные части. crystalmaiden и crystal_maiden снова один герой, как и nyx с nerubian_assassin.

Пресеты

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

Исправлено

  • Безопасный режим оставлял Доту с требованием проверить файлы, а матчмейкинг не запускался: ровно наоборот к тому, зачем этот режим нужен. Его включение возвращает на место единственный файл игры, который приложение правит, и приложение собирало этот файл на один символ табуляции короче того, что шипает Дота. Файл при этом грузился, поэтому ничего не выглядело сломанным, но он больше не совпадал с подписью, по которой Дота его проверяет. Теперь приложение собирает файл точно, сверяет результат с собственным списком подписей Доты до записи и починит копию, сохранённую неправильно раньше. Если починить нечем, оно скажет об этом и отправит тебя в проверку файлов Steam, а не оставит догадываться.
  • При отправке пресета девять модов, поставленных из каталога, считались своими: они уезжали в файл целиком и выпадали из ссылки. Пять разделов каталога держат моды группами (крипы, башни, предметы героев, эффекты предметов, денай крипов), а приложение читало только негруппированные. Сборка, которая весила 111 МБ, теперь полмегабайта.
  • Выключение мода или мастер-переключателя стоило импортированным модам имени, тега по содержимому и картинки, пока не включишь обратно. Приложение искало файл мода под обычным именем, а выключенный мод на диске переименован.

1.14.3

Исправлено

Релиз на GitHub

Исправлено

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

1.14.2

Исправлено

Релиз на GitHub

Исправлено

  • Экспортированный или отправленный в пресете мод переносил модели, но не блоки схемы предметов, которые дают ему эффекты и иконки: те же блоки, что приложение снимает при установке и хранит на записи. Теперь экспорт кладёт их компактную копию, и на другой стороне она читается тем же способом.
  • Привязка мода, который другой инструмент уже положил в папку модов, пропускала этот же шаг: запись в библиотеке появлялась, а блоки предметов оставались непрочитанными, и эффекты не показывались.

1.14.1

Больше картинок у косметики, меньше пустых строк в библиотеке

Релиз на GitHub

Больше картинок у косметики, меньше пустых строк в библиотеке

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

1.14.0

Отчёт для поддержки одним файлом вместо скриншотов и ещё 1

Релиз на GitHub

Отчёт для поддержки одним файлом вместо скриншотов

В Настройках появилась кнопка «Экспортировать отчёт». Она собирает один .zip: путь и языковые настройки Dota, настройки самого приложения, список установленных модов, состояние патча, листинг файлов в папке модов и свежий журнал приложения. Присылай его вместо скриншота и копии settings.json.

  • Приложение теперь ведёт свой небольшой журнал на диске не только во время тестов: если что-то упало без объяснений, останется что посмотреть.
  • Из личных данных в отчёте только имя в Discord, если ты вошёл: ни id, ни картинки, а токен входа на диск и раньше не попадал.

Исправлено

  • Три HUD, о которых 1.13.0 говорила, что у вики нет для них картинки, теперь её получили: Liquipedia хранит картинки для нескольких десятков видов, которых нет у Fandom (в том числе Battle Pass 2022 HUD), и приложение спрашивает её, когда Fandom не находит совсем ничего.

1.13.0

Исправлено

Релиз на GitHub

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

Исправлено

  • Косметика, которую вики хранит под другим написанием, оставалась пустой плашкой: игра пишет Aghanim's Labryinth 2021 HUD, а два HUD называет Hud Skin там, где вики не называет. Теперь приложение спрашивает у вики, под каким файлом лежит такой вид. Три HUD остаются пустыми, потому что у вики для них нет картинки совсем.
  • Мод, у которого превью было видео, показывал в Библиотеке пустой прямоугольник. Теперь виден первый кадр, а мод, установленный без картинки, берёт её из каталога.
  • При установке пака терялась картинка у любого мода с несколькими стилями.

1.12.0

Моды с общими файлами больше не конфликтуют, а ложатся стопкой и ещё 2

Релиз на GitHub

Моды с общими файлами больше не конфликтуют, а ложатся стопкой

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

  • В Библиотеке видно, кто сверху, а кто перекрыт. Кнопка «Наверх» меняет их местами.
  • Свежеустановленный мод встаёт наверх сам.
  • Раньше приложение писало, что загрузится только один из пары, и предлагало выключить второй. Это было неправдой.

Исправлено

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

Косметика работает как обычные моды

  • Избранное и поиск показывают её отдельной секцией.
  • Клик открывает карточку, а не ставит вещь сразу.
  • В Библиотеке у секции косметики свои «Выбрать всё» и «Выключить все», и она попадает в массовые действия.

1.11.0

Релиз на GitHub

  • Ctrl + колесо смотрит, над чем курсор: панели меняют свой размер, всё остальное масштаб контента.
  • Все масштабы собраны в Настройках: одна ручка на всё плюс блок по частям.
  • Строка вкладок прокручивается и свайпается, ни одна вкладка больше не пропадает.
  • Пак сохраняется одним .vpk файлом.
  • Исправлено: границы панелей не тянулись, а масштабирование колесом дёргалось.

1.10.0

Релиз на GitHub

  • Язык текста и озвучки Dota переключается прямо из приложения.
  • Моды переехали в папку языка озвучки: после обновления доты от 24 июля игра перестала подхватывать выдуманные языковые папки.

1.9.1

Релиз на GitHub

  • Починены значок статуса в Discord и общий переключатель модов.

1.9.0

Релиз на GitHub

  • Discord Rich Presence: друзья видят, что приложение открыто.
  • Страницы политики конфиденциальности и условий.

1.8.1

Релиз на GitHub

  • Вход переехал в заголовок окна, ссылка на пресет копируется без лишнего окна.

1.8.0

Релиз на GitHub

  • Пресет отправляется файлом .d2mm или ссылкой, а вход через Discord подписывает сборку твоим ником.
  • Импорт из нескольких томов склеивается в один VPK.
  • Проверка конфликтов перестала считать служебные файлы, которые есть в каждом моде, и теперь предупреждает только про настоящие пересечения.

Ctrl K или / открывает поиск с любой страницы.