Skip to content

Paper and Minestom in mcrs terms

Changing. Follow: #283, #285, #281, #546, #78, #82, #296, #321, #537, #266, #159, #154

This page is a lookup table for people who know Paper, Velocity or Minestom. Find the name you know, and the row shows the nearest thing in mcrs and its state today. If “entity” and “system” are new words, read From objects to data first.

JVM mcrs State Notes
JavaPlugin, onEnable impl Plugin for X with fn build(&self, app: &mut App) Works#279 As in Minestom, you write your own main, see src/main.rs. There is no plugin.yml and no separate jar
onDisable No hook. Shutdown goes through a ShutdownRequest message Partialshutdown.rs The embedder writes the request. No signal handler is installed
depend: and softdepend: A plugin group: a member that needs another fails in build and names the missing one Works#279 See MinecraftServerPlugins in lib.rs
Disabling a bundled feature server.disable::<SomePlugin>() on the plugin group Works#282 Used in main.rs to switch the mob brain off
/reload, PlugMan None. Code is not reloaded WIP#316 Only data pack reload is planned
NMS, CraftBukkit Any public crate of the library layers Not planned#437 There is no facade between you and the engine, so these crates are NMS and API at once
Static Bukkit.getServer() None. Take Res<T>, Query<..>, Commands as system parameters Not planned#437 The static accessor was rejected
Dependency on paper-api A git dependency on mcrs crates Undecided#321 One game version at a time, no backward compatibility (Not planned#412)
JVM mcrs State Notes
Listener, @EventHandler An observer app.add_observer(f) with f: fn(On<Event>), or MessageReader<M> for a message buffer Partial#283 Public events exist only for chat. Packet observers exist as Received<P>
setCancelled(true) The cancelled field of the event, set in an observer that takes mut Partial#636 Only PlayerChatEvent. A general mechanism with rollback of client prediction is Partial#283
AsyncChatEvent PlayerChatEvent { player, text, cancelled } Works#636 text is a Text component, not a String. It fires before the broadcast
EventPriority System order: .before(), .after(), SystemSet such as TickSet Works#323 Observers have no priority. An unordered conflict fails a test
PlayerJoinEvent, PlayerQuitEvent Internal bus messages InboundPlayerSpawn and InboundPlayerDespawn Partial#283 Not a public event yet. Public join and leave events are planned
BlockBreakEvent, BlockPlaceEvent The message BlockActionRequest, internal Partial#283 Public cancellable events are planned
ProtocolLib, packet listeners On<Received<P>> over the typed game packets Partial About half of the packets are typed, see the README. One typed receive path: Partial#57
Minestom EventNode tree No event tree, only Bevy observers and schedules Undecided There is no issue. Do not copy the pattern
JVM mcrs State Notes
runTaskTimer A system in FixedUpdate, 20 ticks per second by default (DEFAULT_TPS) Worksrunner.rs Keep state in a resource or Local<T>. Bevy does the scheduling, and mcrs has no scheduler of its own
runTaskLater A counter or timer in a resource or component, or Res<Time<Fixed>> Works You write it by hand, there are no helpers
runTask to return to the main thread Not needed. There is no main thread in the Bukkit sense Works#357 See From objects to data
runTaskAsynchronously Bevy task pools exist, but there is no documented pattern for plugins Partial There is no issue. Parallelism comes from the scheduler
JVM mcrs State Notes
Player, Entity as objects An Entity id plus components Player, GameProfile, PlayerGameMode, Transform Worksability.rs A player has three ids: the Bevy Entity, the PlayerSession, which lives across dimensions, and the network id (WIP#158)
player.sendMessage(Component) An OutboundPlayerPacket message, built with bus::to and the system_chat helper Partial This is low level, and there is no player.send()
Bukkit.getOnlinePlayers() Query<&GameProfile, With<Player>> inside a dimension Partial Players live in dimension worlds, and there is no global collection (WIP#154)
world.getBlockAt(..).setType(..) The BlockSetRequest message and the WorldView volume API Partial Works inside one dimension. One API for world access is Partial#486
World and createWorld for mini games Dimension worlds are fixed at start WIP#546 Creating and removing a world at run time is planned
Minestom Instance A dimension world (a sub-app) Works#280 Add plugins with add_dimension_plugin, not add_plugins
ChunkGenerator A replaceable chunk source WIP#281 Today the generator is the vanilla one
Saving the world, world.save() None. Reading Anvil works, writing does not WIP#78 The server does not save chunks
Boss bar None WIP#247
Scoreboard None. Only the planned owner of global state names scoreboards WIP#154 There is no scoreboard issue, and we found no code
JVM mcrs State Notes
Brigadier, registerCommand add_command, a typed command tree, literal and argument nodes Works#579 The vanilla commands are the reference
Tab completion and the commands packet with levels The command tree with permission levels and the commands packet Partial#285 The issue is open
hasPermission("x.y") PermissionCheck::Require(CommandLevel::..), operator level 0-4 in PlayerOpLevel Partial#285 No string permission nodes, no LuckPerms-like plugin
Whitelist, ban list A ban list resource and the /ban and /whitelist commands Worksban.rs Covered by tests in ban.rs and whitelist.rs
A custom argument type Added only at compile time, as part of the command set Partial#285
JVM mcrs State Notes
config.yml, saveDefaultConfig() Fields on the plugin struct. The binary reads MCRS_* environment variables Partial Configuration comes only through the plugin (Works#278). The settings of the binary are in server_settings.rs. There is no config file format for a plugin yet
PersistentDataContainer Your own component plus a registry of persisted components WIP#159 Needs world saving, WIP#78
JVM mcrs State Notes
Velocity ProxyServer, @Subscribe A proxy library without Bevy: routing, online mode, modern forwarding, backend switch WIP#296 Not in the code yet
Online mode, Mojang authentication None. The server is offline only WIP#82 Do not expose the port
ViaVersion Protocol translation at the network edge, down to 1.21.6 WIP#537 The decision is open
JVM mcrs State Notes
MockBukkit Integration tests with PlayServer and host_app in crates/mcrs_minecraft_server/tests/it/ WIP#266 About 45 test files. The test harness is not a separate crate

The page Status shows the state of each area.

Sources and verification

Verified: 26.4-snapshot-7, 51d45c26a, 2026-11-09

Tracking: #283, #285, #281, #546, #78, #82, #296, #321, #537, #266, #159, #154