EternalTD Commands
EternalTD registers the root command:
/eternaltd
/etd
The Nightbreak account commands used during setup are separate top-level commands registered by MagmaCore:
/nightbreaklogin [token]
/nightbreaklogout
Both are gated behind nightbreak.login (default: op). /nightbreaklogin without a token prints a nightbreak.io link; once you approve it there, the server is linked. /nightbreaklogout clears the stored Nightbreak account token from the server.
MagmaCore also registers a per-plugin changelog command, /etdchangelog, as its own top-level command (see Release changelog).
Setup and Content Management
Most of these subcommands are registered by MagmaCore through NightbreakPluginBootstrap.registerStandardCommands. They are shared across all Nightbreak plugins and ship inside EternalTD because MagmaCore is shaded into the plugin.
| Command | Sender | Current purpose |
|---|---|---|
/etd | Any | Prints the current setup/content quick-start help. Requires eternaltd.* — a sender without it gets "You do not have permission to run this command!" |
/etd initialize | Player | Opens the first-time setup menu. Requires eternaltd.*. |
/etd setup | Player | Opens the EternalTD setup menu (package browser plus the shared plugin-update, recommended-plugins, and automatic-update controls) |
/etd recommendedplugins | Any | Opens (player) or prints (console) the recommended companion plugins for EternalTD |
/etd downloadpluginupdate | Any | Downloads an EternalTD plugin update if one is available. It is used after the next restart unless nightbreak.applyPluginUpdatesWithoutRestart applies it sooner |
/etd applypluginupdate | Any | Applies a downloaded EternalTD plugin update without a restart. EternalTD is disabled and enabled again on the new jar, so running levels end. Refused when no newer update is waiting, when another plugin swap is running, or when a plugin from another author depends on EternalTD; if the new jar does not enable, the previous jar is loaded again |
/etd downloadall | Any | Downloads the EternalTD plugin update and all available content |
/etd downloadallcontent | Any | Downloads all available EternalTD content (no plugin update) |
/etd updatecontent | Any | Downloads updates for outdated EternalTD content |
/etd updateallcontent | Any | Alias for /etd updatecontent |
/etd forcereinstallcontent <package|all> | Any | Re-downloads content through the normal authenticated import/reload pipeline even when the installed version is already current. all covers every package detected as downloaded; a Nightbreak slug (tab-completed) targets one package and works even if its files are completely missing. Use this to repair a package whose files were deleted or corrupted. |
/etd install | Any | Registers the official pack with ResourcePackManager and requests its reload when available. Otherwise downloads and hashes the pack, then updates server.properties; that route needs a server restart. Registration failure also falls back to server.properties. |
/etd reload | Any | Restarts EternalTD in place (full disable, load, enable cycle) |
Admin note:
- EternalTD's
plugin.ymldeclares two permission nodes, bothdefault: op.eternaltd.*grants the admin, setup, and debug commands.eternaltd.match.bypasslets a player teleport into another player's running level world without being sent out (see Match Rules). - Every admin-facing command resolves to
eternaltd.*:setup,recommendedplugins,downloadall,downloadallcontent,downloadpluginupdate,applypluginupdate,updatecontent/updateallcontent,forcereinstallcontent,install,reload,cheat,setwave,selectfloor,selectfloorcoordinates,showselection,register,register start,register end, and the bare/etd. (The shared MagmaCore commands split this into "admin", "setup" and "initialize" permissions, but EternalTD passeseternaltd.*for all three, so the effective requirement is identical.) - The two Nightbreak account commands use their own node,
nightbreak.login(default: op), which MagmaCore registers at runtime rather than through EternalTD'splugin.yml. initializeis registered by the shared bootstrap and also requireseternaltd.*; preset modes do not control its registration.- Only the player-facing commands are unrestricted:
hub/lobby,join,start/go, andquit/stop. - Tab completion for the first argument is also filtered by permission, so players without
eternaltd.*only see the player-facing subcommands.
Gameplay Commands
| Command | Sender | Current purpose |
|---|---|---|
/etd join <level> | Player | Requests a session from a loaded level file. The world template is copied off the main thread. Wait for "Created your world! We're ready to go." before starting; the command's earlier "Joined level!" message does not establish success and can appear even after a preparation error. A second pending request is refused, and so is a player already in a match, including another Nightbreak plugin's match. Disconnecting, or 10 minutes without a ready world, cancels the preparation. |
/etd start | Player | Starts the active session's first wave |
/etd go | Player | Alias for /etd start |
/etd quit | Player | Ends your current level session |
/etd stop | Player | Alias for /etd quit |
/etd hub | Player | Returns you to the configured EternalTD hub spawn. An active session ends first, restoring player state, removing towers and requesting instance cleanup. If the hub is not configured, the command stops before ending the session. A rejected teleport is reported. |
/etd lobby | Player | Alias for /etd hub |
Debug and Admin Gameplay Commands
| Command | Sender | Current purpose |
|---|---|---|
/etd cheat | Player | Toggles cheat mode and sets currency to 10,000,000 and lives to 1,000,000 on every invocation, including when switching it off. Marks the run as cheated permanently, excluding it from highscores. |
/etd setwave <wave> | Player | Sets the stored wave counter and marks the run as cheated. Does not replace current enemies or immediately start the requested wave; the next normal transition uses the counter plus one. |
These are session/debug tools. While cheat mode is active, building and upgrading do not deduct currency, although the affordability checks still run. Turning it off does not restore highscore eligibility. setwave accepts an integer without validating that a matching wave exists.
Map Authoring Commands
These commands are still present in the current codebase for floor selection and level registration work.
| Command | Sender | Current purpose |
|---|---|---|
/etd selectfloor | Player | Toggles floor selection. Left-click a block for corner 1 and right-click for corner 2, as the command's introductory message says. Turning selection off discards it. |
/etd selectfloorcoordinates <x1> <y1> <z1> <x2> <y2> <z2> | Player | Sets integer corners in your current world, subtracting 1 from each supplied Y value to select the floor below. Both corners must have the same Y, and inclusive X/Z lengths must be multiples of 3. |
/etd showselection <level> | Player | Checks the current floor selection and keeps it. Shows one END_ROD particle, visible only to you, above each floor square the selection would register. Saves nothing. |
/etd register <level> | Player | Writes one levelLocations entry per floor square in the current selection into the level file, replacing the existing list, then clears the selection. An invalid selection, or one with no floor squares, writes nothing and keeps the selection. |
/etd register <level> start | Player | Appends the player's current integer block coordinates to startLocation and saves. Requires an active selection entry; does not subtract 1 from Y. |
/etd register <level> end | Player | Appends the player's current integer block coordinates to endLocation and saves. Requires an active selection entry; does not subtract 1 from Y. |
Release changelog
MagmaCore registers one extra top-level command per Nightbreak plugin, named after the root command plus changelog:
/etdchangelog
/etdchangelog dismiss
/etdchangelog disable
| Form | Effect |
|---|---|
/etdchangelog | Opens the release notes for the EternalTD versions (and tracked content packages) you have not read yet |
/etdchangelog dismiss | Marks the currently shown releases as read and jumps to the next unread batch, if any |
/etdchangelog disable | Permanently stops the changelog notice for that player |
Behavior worth knowing:
- The command is player-only and admin-only. "Admin" here means op,
eternaltd.*, or any of the spec's admin/setup/initialize permissions — all three of which EternalTD sets toeternaltd.*. - Admins who join the server get a chat notice with a clickable view button roughly 2 seconds after login, but only when there is something unread and they have not run
disable. - Read/dismissed state, the version the tracking started from, and the cached release text live in
plugins/EternalTD/nightbreak-changelogs.yml. - If another plugin already owns the
etdchangeloglabel, MagmaCore registers a namespaced fallback (eternaltd:etdchangelog) instead.
Notes
- EternalTD's
plugin.ymlonly declares the root command and theeternaltd.*andeternaltd.match.bypasspermissions. Subcommands are registered through the command manager at runtime. /etd reloadrestarts EternalTD through disable, load and enable. Folder migration, imports, packages, waves, levels, world templates, NPCs and resource-pack setup run again. FreeMinecraftModels is not reloaded unconditionally: if the importer installs models or other files into FMM's folders while FMM is enabled, the shared model-installation event invokes FMM's content reload.- Level-name completion on
join,showselection, and theregistercommands reads the current loaded registry, so newly loaded levels appear without rebuilding the command manager. Execution also checks that the named level is present.