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.
Every row is an analogy
No row is a drop-in replacement, because mcrs has no Bukkit-like API, as This is not the Paper API explains. A row marked wip is a planned feature that has an issue and no code yet. A row marked undecided has no issue and no decision.
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
Partial shutdown.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)
Works runner.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
Works ability.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
Works ban.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.