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). /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. Now genuinely 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 (used after the next restart)
/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 installAnyApplies the official EternalTD resource-pack setup
/etd reloadAnyRestarts EternalTD in place (full disable, load, enable cycle)

Admin note:

  • EternalTD's plugin.yml declares a single permission node, eternaltd.* (default: op), described as granting access to the admin, setup, and debug commands.
  • Everything admin-facing resolves to that one node: setup, recommendedplugins, downloadall, downloadallcontent, downloadpluginupdate, 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>PlayerStarts a new level session from a loaded level file. The template world is copied off the main thread, so the command replies "Preparing world - hang tight!" first and "Created your world! We're ready to go." once the instance is live. Running it again while a copy is in flight is refused with "Your level is already being prepared. Please wait!"
/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 hubPlayerTeleports you back to the EternalTD hub spawn. If run mid-run, the active session is ended cleanly first (inventory restored, towers removed, instance world deleted). Requires the hub spawn to be configured in config.yml; if the server rejects the teleport, the command reports that failure instead of claiming success.
/etd lobbyPlayerAlias for /etd hub

Debug and Admin Gameplay Commands

CommandSenderCurrent purpose
/etd cheatPlayerToggles cheat mode for the active session
/etd setwave <wave>PlayerSkips the active session to a specific wave

These are not normal player setup commands. They are session/debug tools.

Map Authoring Commands

These commands are still present in the current codebase for floor selection and level registration work.

CommandSenderCurrent purpose
/etd selectfloorPlayerStarts or stops floor-corner selection with clicks
/etd selectfloorcoordinates <x1> <y1> <z1> <x2> <y2> <z2>PlayerSets the selection region directly from coordinates
/etd showselection <level>PlayerChecks the current floor selection and keeps it. The particle visualizer is disabled in the current implementation.
/etd register <level>PlayerChecks the current floor selection, then clears it. It neither displays particles nor saves levelLocations; write the floor region into the level YAML manually.
/etd register <level> startPlayerAdds the player's current standing block to the level's startLocation list
/etd register <level> endPlayerAdds the player's current standing block to the level's endLocation list

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.* permission. Subcommands are registered through the command manager at runtime.
  • /etd reload is a real plugin restart: it calls the plugin's disable, load, and enable path rather than a lightweight content re-import. Everything that startup does (folder migration, importer, content packages, waves, levels, world templates, NPCs, resource-pack helper) runs again. It does not call FreeMinecraftModels' reload path — the method that would do that is present in the source but nothing invokes it.
  • Level-name arguments on join, showselection, and the register commands are resolved when you tab-complete, not when the plugin starts, so levels added by a download or a reload show up without a restart.