Эта страница - справочная таблица для тех, кто знает Paper, Velocity или Minestom. Найдите знакомое название, и строка покажет, что ближе всего к нему в mcrs и в каком это состоянии сегодня. Если слова “сущность” и “система” вам незнакомы, сначала прочтите От объектов к данным .
Каждая строка - аналогия
Ни одна строка не дает готовой замены, потому что Bukkit-подобного API в mcrs нет, как объясняет страница Это не Paper API . Строка со статусом wip - это запланированная возможность, на которую есть issue, но еще нет кода. У строки со статусом undecided нет ни issue, ни решения.
JVM
mcrs
Состояние
Заметки
JavaPlugin, onEnable
impl Plugin for X с fn build(&self, app: &mut App)
Работает #279
Как и в Minestom, свой main пишете вы, см. src/main.rs . Ни plugin.yml, ни отдельного jar нет
onDisable
Хука нет. Остановка идет через сообщение ShutdownRequest
Частично shutdown.rs
Запрос отправляет код, который встраивает сервер. Обработчик сигналов не устанавливается
depend: и softdepend:
Группа плагинов: если плагину нужен другой, он падает в build и называет недостающий
Работает #279
См. MinecraftServerPlugins в lib.rs
Отключить встроенную часть
server.disable::<SomePlugin>() на группе плагинов
Работает #282
Используется в main.rs , чтобы выключить мозг мобов
/reload, PlugMan
Нет. Код не перезагружается
В работе #316
Планируется только перезагрузка датапаков
NMS, CraftBukkit
Любой публичный крейт библиотечных слоев
Не планируется #437
Фасада между вашим кодом и движком нет, поэтому эти крейты - одновременно NMS и API
Статический Bukkit.getServer()
Нет. Res<T>, Query<..> и Commands берутся как параметры системы
Не планируется #437
Статический доступ отклонили
Зависимость от paper-api
Git-зависимость от крейтов mcrs
Решения нет #321
Одна версия игры за раз, без обратной совместимости (Не планируется #412 )
JVM
mcrs
Состояние
Заметки
Listener, @EventHandler
Наблюдатель app.add_observer(f) с f: fn(On<Event>) или MessageReader<M> для буфера сообщений
Частично #283
Публичные события есть только для чата. Наблюдатели пакетов есть как Received<P>
setCancelled(true)
Поле cancelled события, которое меняет наблюдатель с параметром mut
Частично #636
Только PlayerChatEvent. Общий механизм с откатом предсказания клиента - это Частично #283
AsyncChatEvent
PlayerChatEvent { player, text, cancelled }
Работает #636
text - компонент Text, а не String. Событие срабатывает до рассылки
EventPriority
Порядок систем: .before(), .after(), SystemSet, например TickSet
Работает #323
У наблюдателей приоритета нет. Неупорядоченный конфликт ломает тест
PlayerJoinEvent, PlayerQuitEvent
Внутренние сообщения шины InboundPlayerSpawn и InboundPlayerDespawn
Частично #283
Публичного события пока нет. Публичные события входа и выхода запланированы
BlockBreakEvent, BlockPlaceEvent
Внутреннее сообщение BlockActionRequest
Частично #283
Публичные отменяемые события запланированы
ProtocolLib, слушатели пакетов
On<Received<P>> над типизированными игровыми пакетами
Частично
Типизирована примерно половина пакетов, см. README. Единый путь типизированного приема: Частично #57
Дерево EventNode в Minestom
Дерева событий нет, есть только наблюдатели и расписания Bevy
Решения нет
Issue нет. Этот паттерн не копируйте
JVM
mcrs
Состояние
Заметки
runTaskTimer
Система в FixedUpdate, по умолчанию 20 тиков в секунду (DEFAULT_TPS)
Работает runner.rs
Состояние храните в ресурсе или Local<T>. Планированием занимается Bevy, собственного планировщика в mcrs нет
runTaskLater
Счетчик или таймер в ресурсе или компоненте, либо Res<Time<Fixed>>
Работает
Пишется вручную, готовых хелперов нет
runTask для возврата в главный поток
Не нужен. Главного потока в смысле Bukkit нет
Работает #357
См. От объектов к данным
runTaskAsynchronously
Пулы задач Bevy есть, но документированного паттерна для плагинов нет
Частично
Issue нет. Параллельность обеспечивает планировщик
JVM
mcrs
Состояние
Заметки
Player, Entity как объекты
Id Entity плюс компоненты Player, GameProfile, PlayerGameMode, Transform
Работает ability.rs
У игрока три идентификатора: Entity из Bevy, PlayerSession, который живет между измерениями, и сетевой id (В работе #158 )
player.sendMessage(Component)
Сообщение OutboundPlayerPacket, собранное через bus::to и хелпер system_chat
Частично
Это низкий уровень, и player.send() нет
Bukkit.getOnlinePlayers()
Query<&GameProfile, With<Player>> внутри измерения
Частично
Игроки живут в мирах измерений, общей коллекции нет (В работе #154 )
world.getBlockAt(..).setType(..)
Сообщение BlockSetRequest и API томов WorldView
Частично
Работает внутри одного измерения. Единый API доступа к миру - это Частично #486
World и createWorld для мини-игр
Миры измерений фиксируются на старте
В работе #546
Создание и удаление мира во время работы запланировано
Instance из Minestom
Мир измерения (sub-app)
Работает #280
Плагины добавляйте через add_dimension_plugin, а не через add_plugins
ChunkGenerator
Заменяемый источник чанков
В работе #281
Сегодня генератор ванильный
Сохранение мира, world.save()
Нет. Чтение Anvil работает, запись - нет
В работе #78
Сервер не сохраняет чанки
Boss bar
Нет
В работе #247
Scoreboard
Нет. Scoreboard упоминает только запланированный владелец глобального состояния
В работе #154
Issue про scoreboard нет, и кода мы не нашли
JVM
mcrs
Состояние
Заметки
Brigadier, registerCommand
add_command, типизированное дерево команд, узлы литералов и аргументов
Работает #579
Эталон - ванильные команды
Tab-дополнение и пакет команд с уровнями
Дерево команд с уровнями прав и пакет команд
Частично #285
Issue открыт
hasPermission("x.y")
PermissionCheck::Require(CommandLevel::..), уровень оператора 0-4 в PlayerOpLevel
Частично #285
Строковых узлов прав нет, плагина вроде LuckPerms тоже нет
Whitelist, бан-лист
Ресурс бан-листа и команды /ban и /whitelist
Работает ban.rs
Покрыто тестами ban.rs и whitelist.rs
Свой тип аргумента
Добавляется только при компиляции, как часть набора команд
Частично #285
JVM
mcrs
Состояние
Заметки
config.yml, saveDefaultConfig()
Поля структуры плагина. Бинарник читает переменные окружения MCRS_*
Частично
Настройка идет только через плагин (Работает #278 ). Настройки бинарника описаны в server_settings.rs . Формата конфигурационного файла для плагина пока нет
PersistentDataContainer
Собственный компонент плюс реестр сохраняемых компонентов
В работе #159
Нужно сохранение мира, В работе #78
JVM
mcrs
Состояние
Заметки
ProxyServer, @Subscribe из Velocity
Библиотека прокси без Bevy: маршрутизация, online mode, modern forwarding, смена бэкенда
В работе #296
В коде пока нет
Online mode, аутентификация Mojang
Нет. Сервер работает только в offline-режиме
В работе #82
Не открывайте порт наружу
ViaVersion
Трансляция протокола на границе сети, вниз до 1.21.6
В работе #537
Решение еще не принято
JVM
mcrs
Состояние
Заметки
MockBukkit
Интеграционные тесты с PlayServer и host_app в crates/mcrs_minecraft_server/tests/it/
В работе #266
Около 45 файлов тестов. Тестовое окружение не вынесено в отдельный крейт
Состояние каждой области показано на странице Статус .