- Поддерживаемые версии
- 1.21
- 26
- Ядра и Прокси
- Bukkit
- Spigot
- Paper
- Минимальная версия Java
- 17
- Исходный код
- https://github.com/Somikyy/SNDoctor
SNDoctor
Покажет, что сломается при обновлении на 26.x — до того, как ты обновишься
Бесплатно · Открытый исходный код · GPL-3.0 · Ноль зависимостей
────────────────────────────────────────────────────────────
Покажет, что сломается при обновлении на 26.x — до того, как ты обновишься
Бесплатно · Открытый исходный код · GPL-3.0 · Ноль зависимостей
────────────────────────────────────────────────────────────
В чём проблема
С версии 26.1 Mojang перестал отдавать обфусцированные server-jar'ы, а Paper полностью выкинул внутренний ремаппер. Формулировка PaperMC дословно: плагин со Spigot-маппингами «не будет работать на 26.1, независимо от того, Paper у вас или нет».
Масштаб последствий — данные Modrinth на 1 августа 2026:
| версия | плагинов с поддержкой |
|---|---|
| 1.21.4 | 12 631 |
| 26.1 | 4 264 |
| 26.2 | 2 532 |
| всего плагинов на Modrinth | 16 482 |
Примерно 85% экосистемы ещё не перешло рубеж. А узнать, что именно сломается на твоей сборке, до сих пор можно было ровно одним способом: обновиться и смотреть, что упало.
Что делает SNDoctor
Читает каждый jar в папке
plugins как zip-архив, каждый class-файл — как поток байт, и выносит вердикт по каждому плагину:- красный — не запустится
- жёлтый — запустится, но что-то сломано или устарело
- зелёный — проблем не найдено
Главное: сервер запускать не нужно. Проверять надо тогда, когда сервер ещё работает на старой версии или уже не стартует на новой.
Код:
java -jar SNDoctor.jar plugins --java 25
Как выглядит отчёт
Код:
SNDoctor 26.8.1 — проверка плагинов на совместимость с Minecraft 26.1+
Папка: /srv/mc/plugins
Найдено jar: 37 Java сервера: 21 Время: 180 ms
КРАСНЫЙ 12 ЖЁЛТЫЙ 9 ЗЕЛЁНЫЙ 15 НА ПРОВЕРКУ 1
КРАСНЫЕ — не запустятся (12)
───────────────────────────────────────────
● LegacyPlugin 1.0 LegacyPlugin.jar Java 17
✗ Spigot-маппинги NMS [EntityPlayer → ServerPlayer, NBTTagCompound → CompoundTag]
С 26.1 Mojang не отдаёт обфусцированные server-jar'ы, а Paper полностью убрал
внутренний ремаппер. Формулировка PaperMC: плагин со Spigot-маппингами «не будет
работать на 26.1, независимо от того, Paper у вас или нет».
→ Пересобрать плагин на Mojang-маппингах (paperweight-userdev) или найти замену.
✗ Версионный пакет CraftBukkit [org.bukkit.craftbukkit.v1_20_R3]
Paper убрал релокацию org.bukkit.craftbukkit.vX_Y_RZ ещё в 1.20.5. Такие ссылки
приводят к NoClassDefFoundError при загрузке.
→ Заменить на неверсионные org.bukkit.craftbukkit.* или на публичный API.
Каждая находка — это не просто «плохо», а три вещи: что нашли, почему это ломается и что с этим делать.
Чем отличается от того, что уже есть
Прямого аналога я не нашёл. Ближайшее по смыслу — платные решения про автообновление плагинов, но обновление и совместимость с новой мажорной версией это разные задачи: автообновление подтянет новую версию плагина, если она есть, и промолчит про плагин, который просто заброшен.
Канонический совет комьюнити по диагностике до сих пор звучит как «читай логи и убирай плагины по одному». Работает, но занимает вечер и требует запущенного сервера — а сервер как раз и не стартует.
Три правила, на которых он построен
1. Чужой код никогда не выполняется.
SNDoctor не загружает и не запускает проверяемые плагины. Jar читается как архив, class — как байты. Проверяемый плагин не оказывается в JVM ни на секунду. Для инструмента, которому дают папку с непроверенными jar-ами, это не опция, а обязательное условие.
2. Ноль зависимостей.
Ни ASM, ни SnakeYAML, ни JSON-библиотеки — свой ридер class-файлов и свой ридер YAML. Итоговый jar — около 70 КБ. Инструмент, который кладут на уже сломанный сервер, не должен приносить с собой ещё один способ конфликтовать с classpath. И 70 КБ открытого кода проверяются глазами за вечер — после истории с бэкдором в мае 2026 это не лишнее.
3. Ни одного правила «по ощущениям».
Каждое опирается на первоисточник: анонс PaperMC, пометку deprecated в javadoc или наблюдаемое свойство самого jar.
Два правила-кандидата проверены и намеренно не добавлены, потому что подтверждения не нашлось: смена идентификаторов геймрулов с camelCase на snake_case и переход методов длительности WorldBorder с миллисекунд на тики. Ни того, ни другого нет в анонсе Paper 1.21.9/1.21.10 — значит, правила нет.
Одно ложное «не запустится» стоит дороже десяти пропущенных проблем: админ, которому соврали про рабочий плагин, дальше не поверит ни одной строчке отчёта. И будет прав.
Что проверяется
23 правила совместимости и 5 эвристик безопасности.
Не запустится:
- Spigot-маппинги NMS — по таблице из 105 имён
- версионные пакеты
net.minecraft.server.v1_XX_RXиorg.bukkit.craftbukkit.v1_XX_RX - главный класс из plugin.yml отсутствует в архиве
- плагину нужна Java новее, чем на сервере
Сломано или устарело:
TeleportFlag.EntityState— больше не имеет функциональности- Conversation API, Metadata API,
PlayerSpawnLocationEvent - легаси-API предметов до 1.13, отсутствие или древний
api-version - зависимость от ProtocolLib
На ручную проверку — на вердикт не влияет:
- запуск внешних процессов, загрузка кода во время работы
- обращения к сырым IP, пейстбинам и вебхукам
- чтение
rcon.password,ops.json,usercache.json - одиночные классы внутри пакета известной библиотеки
Настоящий шейдинг библиотеки приносит сотни её классов. Если внутри
Секция безопасности не влияет на вердикт совместимости: «стоит посмотреть глазами» и «запустится ли» — разные вопросы, и смешивать их значило бы врать светофором.
org/apache/commons/lang3/ лежит один класс — это не шейдинг, это чужой код в чужом пакете. Ровно такой формы был бэкдор, разобранный в RU-комьюнити в мае 2026.Секция безопасности не влияет на вердикт совместимости: «стоит посмотреть глазами» и «запустится ли» — разные вопросы, и смешивать их значило бы врать светофором.
Три режима работы
1. До обновления, из командной строки. Основной сценарий, сервер не нужен.
Код:
java -jar SNDoctor.jar plugins --java 25
Код возврата:
2 — есть красные, 1 — есть жёлтые, 0 — чисто. Годится для скрипта:
Код:
java -jar SNDoctor.jar plugins --java 25 || echo "не обновляемся"
2. На живом сервере, командой.
/sndoctor scan — сводка в чат, полный отчёт в файл. Сканирование асинхронное, главный поток не трогается.3. Само, при запуске сервера. По умолчанию проверка идёт через пять секунд после старта, итог пишется в консоль. Обновил ядро, поднял сервер — и сразу видно, что не завелось.
Флаги командной строки
| флаг | смысл |
|---|---|
--java <N> | Java, на которой будет крутиться сервер |
--json <файл> | машинный отчёт для бота, панели или CI |
--out <файл> | полный текстовый отчёт в файл |
--names <файл> | свой список Spigot-имён поверх встроенного |
--lang ru|en | язык вывода, по умолчанию русский |
--full | показывать справочные находки и зелёные плагины |
--no-color | без ANSI-цветов |
Настройка
Весь конфиг — десяток строк в
plugins/SNDoctor/config.yml:
Форматирование (BB-код):
general:
language: ru # язык отчёта: ru или en
update-check: true # один async-запрос к api.github.com при старте
# false = плагин не ходит в сеть вообще никогда
scan:
on-start: true # проверять плагины при запуске сервера
start-delay: 100 # задержка перед автопроверкой, в тиках
full: false # включать ли справочные находки
reports:
enabled: true # писать отчёты в plugins/SNDoctor/reports/
json: true # дополнительно писать машиночитаемый .json
keep: 20 # сколько последних проверок хранить, 0 = не удалять
Никакой телеметрии и никакой статистики плагин не собирает и не отправляет.
Расширение таблицы имён
Список Spigot-имён — 105 записей — лежит внутри jar и расширяется без пересборки:
- режим плагина:
plugins/SNDoctor/spigot-names.txt - режим CLI:
--names my-names.txt
Формат —
SpigotName=MojangName, строки с # игнорируются. Твои записи добавляются поверх встроенных.Нашёл имя, которого не хватает? Присылай на GitHub — это самый простой способ помочь проекту.
Где запускается
| где | статус |
|---|---|
| Режим командной строки | Любая ОС с Java 17+. Сервер не нужен вообще |
| Плагин на Paper 1.21+ | Собрано под api-version 1.21 |
| Spigot, Purpur, Pufferfish и прочие форки | Из серверного API используются пять базовых классов Bukkit, Paper-only API в коде нет |
| Folia | folia-supported: false — честно. Пользуйся режимом командной строки |
Минимальная Java — 17. Ниже, чем у большинства современных плагинов, и это осознанно: SNDoctor должен запускаться на тех самых старых серверах, которые он и диагностирует. На 21 и 25 работает.
Зависимости
Обязательных нет. Опциональных тоже нет. Плагин самодостаточен: ни одной библиотеки внутри, ни одного депенда снаружи. Единственная зависимость сборки — API сервера, и та compileOnly.
Команды
Основная команда:
/sndoctor · Алиасы: /snd, /sndoc, /снд| команда | описание | право |
|---|---|---|
/sndoctor scan | сводка в чат, полный отчёт в файл | sndoctor.use |
/sndoctor full | то же плюс справочные находки и список зелёных | sndoctor.use |
/sndoctor scan --lang en | отчёт на английском | sndoctor.use |
/sndoctor version | версия и цель проверки | sndoctor.use |
/sndoctor reload | перечитать config.yml без рестарта | sndoctor.reload |
Права
| право | по умолчанию | что даёт |
|---|---|---|
sndoctor.use | оператор | запуск проверки и просмотр отчёта |
sndoctor.reload | оператор | перезагрузка config.yml |
Автодополнение по Tab работает у всех аргументов.
Установка
- Скачай
SNDoctor-26.8.1.jar - Положи в папку
plugins/ - Перезапусти сервер
Конфиг создастся сам при первом запуске. Ставить рядом ничего не надо.
Для проверки без запуска сервера тот же самый файл запускается напрямую:
Код:
java -jar SNDoctor-26.8.1.jar plugins --java 25
Исходный код
You must be logged in to see this link.
Собирается без доступа в интернет одной командой —
bash tools/offline/verify.sh — и прогоняет 39 утверждений на синтетических jar-ах, собранных так, чтобы содержать ровно те байты, которые ищет каждое правило. Правило без фикстуры в этом проекте не считается сделанным.────────────────────────────────────────────────────────────
Somikyy
You must be logged in to see this link.
Разработка плагинов и 3D-моделей
В канале выходят новые плагины линейки SN — все бесплатные и с открытым исходным кодом.
Там же можно заказать плагин или модель под свой проект.
Лицензия GPL-3.0-or-later: пользуйся где угодно, включая коммерческие серверы, правь под себя.
Если распространяешь изменённую версию — открывай исходники, как и я.
You must be logged in to see this link.
Разработка плагинов и 3D-моделей
В канале выходят новые плагины линейки SN — все бесплатные и с открытым исходным кодом.
Там же можно заказать плагин или модель под свой проект.
Лицензия GPL-3.0-or-later: пользуйся где угодно, включая коммерческие серверы, правь под себя.
Если распространяешь изменённую версию — открывай исходники, как и я.
Понравился плагин? Загляни в You must be logged in to see this link.
- Зависимости
- Нет. Ни обязательных, ни опциональных.
- Команды и права
- Команды
Основная команда:/sndoctor· Алиасы:/snd,/sndoc,/снд
команда что делает право /sndoctorбез аргументов сразу запускает проверку — то же, что scan sndoctor.use/sndoctor scanсводка в чат, полный отчёт в файл sndoctor.use/sndoctor fullто же плюс справочные находки и список зелёных плагинов sndoctor.use/sndoctor versionверсия плагина и цель проверки sndoctor.use/sndoctor reloadперечитать config.yml без рестарта сервера sndoctor.reload/sndoctor helpсписок команд sndoctor.use
Флаги
Работают и в игре, не только в командной строке.
флаг смысл --lang ru|enязык отчёта на один запуск, перекрывает config.yml --fullто же, что подкоманда full
Например:/snd scan --lang en --full
Автодополнение по Tab работает и у подкоманд, и у флагов, и у значений--lang.
Проверка идёт асинхронно, главный поток не трогается. В чат уходит сводка и первые десять красных, полный отчёт пишется вplugins/SNDoctor/reports/. Пока проверка идёт, повторный запуск вторую не стартует.
Права
право по умолчанию что даёт sndoctor.useоператор доступ к команде: запуск проверки, просмотр отчёта, версия sndoctor.reloadоператор перезагрузка config.yml
Важная деталь. Вся команда закрыта правомsndoctor.useна уровне plugin.yml, поэтому одногоsndoctor.reloadне хватит: безsndoctor.useигрок не сможет ввести команду вообще.
Хелперу — только смотреть, без права менять настройки:
Код:/lp group helper permission set sndoctor.use true
Администратору — всё:
Код:/lp group admin permission set sndoctor.use true /lp group admin permission set sndoctor.reload true
Если раздавать права никому не нужно — не делай ничего: оба права по умолчанию есть только у операторов.