Skip to main content

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.

CommandSenderCurrent purpose
/etdAnyPrints the current setup/content quick-start help. Requires eternaltd.* — a sender without it gets "You do not have permission to run this command!"
/etd initializePlayerOpens the first-time setup menu. Requires eternaltd.*.
/etd setupPlayerOpens the EternalTD setup menu (package browser plus the shared plugin-update, recommended-plugins, and automatic-update controls)
/etd recommendedpluginsAnyOpens (player) or prints (console) the recommended companion plugins for EternalTD
/etd downloadpluginupdateAnyDownloads an EternalTD plugin update if one is available. It is used after the next restart unless nightbreak.applyPluginUpdatesWithoutRestart applies it sooner
/etd applypluginupdateAnyApplies 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 downloadallAnyDownloads the EternalTD plugin update and all available content
/etd downloadallcontentAnyDownloads all available EternalTD content (no plugin update)
/etd updatecontentAnyDownloads updates for outdated EternalTD content
/etd updateallcontentAnyAlias for /etd updatecontent
/etd forcereinstallcontent <package&#124;all>AnyRe-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 installAnyRegisters 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 reloadAnyRestarts EternalTD in place (full disable, load, enable cycle)

Admin note:

  • EternalTD's plugin.yml declares two permission nodes, both default: op. eternaltd.* grants the admin, setup, and debug commands. eternaltd.match.bypass lets 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 passes eternaltd.* 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's plugin.yml.
  • initialize is registered by the shared bootstrap and also requires eternaltd.*; preset modes do not control its registration.
  • Only the player-facing commands are unrestricted: hub/lobby, join, start/go, and quit/stop.
  • Tab completion for the first argument is also filtered by permission, so players without eternaltd.* only see the player-facing subcommands.

Gameplay Commands​

CommandSenderCurrent purpose
/etd join <level>PlayerRequests 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 startPlayerStarts the active session's first wave
/etd goPlayerAlias for /etd start
/etd quitPlayerEnds your current level session
/etd stopPlayerAlias for /etd quit
/etd hubPlayerReturns 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 lobbyPlayerAlias for /etd hub

Debug and Admin Gameplay Commands​

CommandSenderCurrent purpose
/etd cheatPlayerToggles 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>PlayerSets 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.

CommandSenderCurrent purpose
/etd selectfloorPlayerToggles 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>PlayerSets 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>PlayerChecks 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>PlayerWrites 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> startPlayerAppends 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> endPlayerAppends 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
FormEffect
/etdchangelogOpens the release notes for the EternalTD versions (and tracked content packages) you have not read yet
/etdchangelog dismissMarks the currently shown releases as read and jumps to the next unread batch, if any
/etdchangelog disablePermanently 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 to eternaltd.*.
  • 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 etdchangelog label, MagmaCore registers a namespaced fallback (eternaltd:etdchangelog) instead.

Notes​

  • EternalTD's plugin.yml only declares the root command and the eternaltd.* and eternaltd.match.bypass permissions. Subcommands are registered through the command manager at runtime.
  • /etd reload restarts 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 the register commands reads the current loaded registry, so newly loaded levels appear without rebuilding the command manager. Execution also checks that the named level is present.