Skip to content

Repository files navigation

SNDoctor

Проверяет, что из твоих плагинов сломается при переходе на Minecraft 26.x — до того, как ты обновишься.

Бесплатно, открытый исходный код, GPL-3.0. Без обфускации, без «премиум-версии», без телеметрии.

Автор — Somikyy · t.me/somikyy · разработка плагинов и 3D-моделей.

License: GPL v3 Java 17+ Paper 1.21+ Зависимостей: 0


Зачем это нужно

С версии 26.1 Mojang перестал отдавать обфусцированные server-jar'ы, а Paper выкинул внутренний ремаппер. Формулировка PaperMC: плагин со Spigot-маппингами «не будет работать на 26.1, независимо от того, Paper у вас или нет».

По данным Modrinth на 1 августа 2026: под 1.21.4 — 12 631 плагин, под 26.2 — 2 532 из 16 482. Примерно 85% экосистемы ещё не перешло рубеж.

Раньше узнать, что именно у тебя отвалится, можно было одним способом: обновиться и смотреть.


Установка

  1. Скачай SNDoctor-26.8.1.jar из релизов
  2. Положи в plugins/
  3. Перезапусти сервер

Конфиг создастся сам при первом запуске. Никаких зависимостей ставить не нужно.

Требования: Java 17 или новее. Плагин собран под api-version: 1.21.

Отдельно ставить ничего не надо и для режима командной строки — это тот же самый файл.


Как пользоваться

Перед обновлением — из командной строки

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

java -jar SNDoctor.jar plugins --java 25

На живом сервере — командой

/sndoctor scan

Сканирование идёт асинхронно, главный поток не трогается. В чат уходит сводка, полный отчёт пишется в plugins/SNDoctor/reports/.

Само, при запуске сервера

По умолчанию SNDoctor проверяет плагины через пять секунд после старта и пишет итог в консоль. Ради этого его и ставят: обновил ядро, поднял сервер — и сразу видно, что не завелось, вместо чтения стектрейсов по одному. Отключается в config.yml.


Что видно в отчёте

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.

Вердикты: красный — не запустится, жёлтый — запустится, но что-то сломано или устарело, зелёный — проблем не найдено.

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


Команды и права

команда что делает право
/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

Алиасы: /snd, /sndoc, /снд. Флаги --lang ru|en и --full работают и в игре: /snd scan --lang en --full. Автодополнение по Tab есть у подкоманд, флагов и значений --lang.

Оба права по умолчанию только у операторов. Вся команда закрыта правом sndoctor.use на уровне plugin.yml, поэтому одного sndoctor.reload не хватит — без sndoctor.use команда не введётся вообще.


Настройка

Весь конфиг — plugins/SNDoctor/config.yml, десяток строк. Значения по умолчанию рассчитаны на то, чтобы плагин был полезен сразу после установки.

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 = не удалять

--lang в команде перекрывает language для одного запуска.


Флаги CLI

Флаг Смысл
--java <N> Java, на которой будет крутиться сервер. Без неё SNDoctor не может сказать «плагину нужна Java новее».
--json <файл> машинный отчёт для бота, панели или CI
--out <файл> полный текстовый отчёт
--names <файл> свой список Spigot-имён поверх встроенного
--lang ru|en язык вывода, по умолчанию русский
--full показывать справочные находки и перечислять зелёные плагины
--no-color без ANSI-цветов
--color включить цвета принудительно

Код возврата: 2 — есть красные, 1 — есть жёлтые, 0 — чисто.

Про консоль Windows

Отчёт печатается в той кодировке, которую консоль действительно понимает, а не вслепую в UTF-8: русская консоль Windows работает на cp866, и UTF-8 в ней превращается в иероглифы. Символы, которых в кодировке нет, заменяются на понятные аналоги (*, >), а не на вопросительные знаки. Ставить chcp 65001 перед запуском не нужно.

Цвета в обычной консоли Windows по умолчанию выключены: PowerShell печатает сами escape-коды вместо того, чтобы им подчиняться. В Windows Terminal и Git Bash цвет включается сам, а --color включает его принудительно где угодно.

java -jar SNDoctor.jar plugins --java 25 || echo "не обновляемся"

Что именно он проверяет

23 правила совместимости и 5 эвристик безопасности. Полная таблица со ссылками на первоисточники — в docs/SPEC-SNDoctor.md, раздел 4.

Коротко:

  • Не запустится: Spigot-маппинги NMS, версионные пакеты net.minecraft.server.v1_XX_RX и org.bukkit.craftbukkit.v1_XX_RX, отсутствующий в архиве главный класс, требование Java новее, чем на сервере.
  • Сломано или устарело: TeleportFlag.EntityState (больше не работает), Conversation API, Metadata API, PlayerSpawnLocationEvent, легаси-API предметов до 1.13, отсутствие api-version, зависимость от ProtocolLib.
  • На ручную проверку: запуск внешних процессов, загрузка кода во время работы, обращения к сырым IP и вебхукам, чтение rcon.password и ops.json, одиночные классы внутри пакета известной библиотеки.

Политика правил

Каждое правило опирается на первоисточник — анонс PaperMC, пометку deprecated в javadoc или наблюдаемое свойство самого jar.

Два кандидата проверены и не добавлены, потому что подтверждения не нашлось: смена идентификаторов геймрулов с camelCase на snake_case и переход методов длительности WorldBorder с миллисекунд на тики. Ни того, ни другого нет в анонсе Paper 1.21.9/1.21.10.

Одно ложное «не запустится» стоит дороже десяти пропущенных проблем: оно ломает доверие ко всему отчёту.


Безопасность

SNDoctor не запускает и не загружает код плагинов. Каждый jar читается как zip-архив, каждый class-файл — как поток байт. Плагин, который SNDoctor проверяет, никогда не оказывается в JVM.

Ноль runtime-зависимостей. Ни ASM, ни SnakeYAML, ни JSON-библиотеки — свой ридер class-файлов и свой ридер YAML. Итоговый jar — около 70 КБ. Инструмент, который кладут на уже сломанный сервер, не должен приносить с собой ещё один способ конфликтовать с classpath. И плагин на 70 КБ с открытым кодом проверяется глазами за вечер.

В сеть плагин ходит ровно один раз и только за номером последней версии — это отключается строкой update-check: false. Никакой статистики, никакой телеметрии.


Совместимость

  • Ядро. Из серверного API используются пять классов Bukkit: JavaPlugin, Command, CommandSender, TabCompleter и планировщик. Ни одного Paper-only API в коде нет — можешь убедиться сам, весь список импортов виден грепом по src/.
  • Folia — нет. В plugin.yml честно стоит folia-supported: false: сканирование планируется через BukkitScheduler, а он на Folia бросает исключение. Ставить флаг «на всякий случай» — это обещать то, чего нет. На Folia пользуйся режимом командной строки, ему сервер вообще не нужен.
  • Java. Плагин собран под 17, потому что должен запускаться на тех самых старых серверах, которые он и диагностирует. На 21 и 25 работает.

Сборка из исходников

Нужен только JDK 17 или новее:

git clone https://github.com/Somikyy/SNDoctor.git && cd SNDoctor && bash tools/offline/verify.sh

Готовый jar появится в build/offline/jar/. Скрипт собирает плагин без доступа в интернет и прогоняет 39 утверждений на синтетических jar-ах. Компиляция идёт против крошечных заглушек Bukkit из tools/offline/bukkit-stubs, которые не попадают в jar — настоящие классы даёт сервер.

Это не экзотика, а основной путь: repo.papermc.io и Maven Central для машины в РФ бывают недоступны, и сборка инструмента для сломанного сервера не должна от этого зависеть.

Обычная сборка через Gradle тоже есть, ей нужен доступ к repo.papermc.io и JDK 21 — paper-api опубликован как Java 21, и Gradle не отдаст его на classpath под 17. Байт-код при этом остаётся 17-м, так что готовый jar по-прежнему запускается на старых серверах:

gradle build

Jar в релизах собран именно ею — против настоящего paper-api, а не против заглушек. Заглушка, у которой разошёлся хотя бы возвращаемый тип, компилируется молча и роняет плагин на сервере с NoSuchMethodError: в JVM возвращаемый тип входит в дескриптор метода, так что запрошенного метода просто нет. Поэтому дескрипторы каждой сборки сверяются с записанным tools/offline/bukkit-api-surface.txt, а CI дополнительно сравнивает офлайн-сборку с собранной против настоящего API. Подробности — в спеке, раздел 8.1.


Расширение таблицы имён

Список Spigot-имён (105 записей) лежит в sndoctor/spigot-names.txt внутри jar. Расширяется без пересборки:

  • режим плагина: plugins/SNDoctor/spigot-names.txt
  • режим CLI: --names my-names.txt

Формат — SpigotName=MojangName, строки с # игнорируются. Твои записи добавляются поверх встроенных.

Нашёл имя, которого не хватает? Присылай PR — это самый простой способ помочь проекту, подробности в CONTRIBUTING.md.


Автор

Somikyyt.me/somikyy

Разработка плагинов и 3D-моделей. В канале выходят новые плагины линейки SN — все бесплатные и с открытым исходным кодом.

Лицензия

GPL-3.0-or-later. См. LICENSE.

Часть линейки SN (Somikyy Network) — бесплатных open-source плагинов для Minecraft-серверов.


Готовый текст для публикации на форумах:

About

Показывает, что из твоих плагинов сломается при переходе на Minecraft 26.x — до обновления, а не после. Читает байткод, не запуская чужой код. 23 правила, режим CLI без сервера. Paper 1.21+, GPL-3.0.

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages