Skip to main content

Dungeon

Instanced dungeons, fixed or generated, with isolated runs, party lobbies, GUI menus, loot chests, per-run NPCs and mobs.

Paidv1.2Combat & mobs
RequiresTypeWriter0.9Quest (TypeWriter extension)GUIMMOCoreoptionalPartiesoptionalAdvanced Slime PaperoptionalPlaceholderAPIoptional

Overview​

Dungeon lets a party play a private copy of a dungeon. Each play-through is a run: it has its own world (or its own slot of a shared world), its own members, its own time limit, its own chests, NPCs and mobs, and it ends cleanly, sending everybody back to where they came from.

A dungeon is described by one Dungeon Instance entry. Players pick it in a global menu (a browser of dungeons grouped in a category), join a lobby in the party menu, mark themselves ready, and are teleported in when the countdown ends. Staff and quests can also send a player straight in with the Dungeon Enter action or a command.

There are two kinds of dungeon:

  • Fixed: you build the dungeon once in a template world. Rooms are zones you draw in game, and everything happens at the places you set. This is the classic dungeon.
  • Generated: you build room templates (small structures with doors and markers) and a generator assembles a new layout for each run, from start room to boss room. The same seed always gives the same dungeon. See Generated dungeons.

Both kinds share the same runs, menus, chests, NPCs, mobs, events and facts.

Paper only

Dungeon targets Paper. It is not supported on Folia: the official Typewriter plugin does not run there.

Features​

  • Runs and groups: one run per group, several runs of the same dungeon at the same time (maxSimultaneousInstances), a time limit, entry costs, run end on completion, time out, empty run or admin close. See Runs and world isolation.
  • Three isolation modes: SLIME_CLONE, WORLD_PER_RUN and SHARED_WORLD_SLOTS, chosen per dungeon with the isolation field.
  • Fixed dungeons: rooms with onEnter / onLeave triggers, modifiers, criteria and priority.
  • Generated dungeons: room templates, connector types, room pools, a generator, affixes, and an in-game editor to capture rooms and place doors and markers.
  • Global menu and party menu: layouts of the GUI extension, refreshed live while players join and leave lobbies.
  • Loot chests: block chests or NPC-anchored chests, real or client-side, one inventory per player or shared, weighted or independent loot.
  • Per-run NPCs: an NPC shown only to the members of one run, from any Typewriter entity definition. See Entities in dungeons.
  • Combat mobs: real vanilla mobs that appear once per run, with equipment, attributes, drop rules and triggers on death, bounded by a cap.
  • Events, facts and actions: start, complete, room enter, room leave and mob death events; facts for "is in a dungeon" and "mobs alive"; actions to complete a run, clear a room and spawn a wave.
  • Statistics: 22 statistics per player (runs, best time, mob kills, damage dealt and taken, deaths, waves cleared...), readable with placeholders and a fact and ranked in a GUI leaderboard. See Statistics.
  • Reload safe: a typewriter reload or a Publish keeps the runs going. A server restart ends them.
  • Parties of other plugins: reads the party of MMOCore, Parties or the Typewriter party extension so friends enter together.

Installation​

  1. Install the GUI extension from its page. Both Dungeon menus use its layouts.
  2. Make sure the TypeWriter Quest extension is installed.
  3. Prepare what your isolation mode needs (see Runs and world isolation):
    • Fixed dungeon: a template world, as a folder in your server root (next to world), for example dungeon_temple. The name may use letters, digits, _ and -, up to 64 characters.
    • Generated dungeon: no template world. The extension creates an empty world for each run.
    • Slime clone: Advanced Slime Paper with the template as a loaded slime world.
  4. Download Dungeon from the stores (see the buttons in the panel above) and put the JAR in plugins/Typewriter/extensions/.
  5. Restart the server.
  6. Optional: install MMOCore or Parties for external party support, and PlaceholderAPI for the placeholders.

Upgrading from 0.10? Read the migration note first.

Getting started​

This walkthrough builds one fixed dungeon with a lobby menu and a chest. For a generated dungeon, start with Generated dungeons.

  1. In the web panel, open a manifest page and add a Dungeon Room Config. Stand where players should arrive, click the spawnPoint content editor, and confirm. The world, coordinates and view direction are captured.
  2. Add a Dungeon Instance. Set templateWorld to the world folder name, add the room config to roomConfigurations, and set minPartySize and maxPartySize.
  3. Add a Dungeon Artifact (statistics) and an Active Dungeon Instance Artifact (state of the runs), and link them in artifact and runtimeArtifact. Without the second one, runs are kept in a runs.json file of the extension and a warning is logged at load. The partyLobbyArtifact field is no longer used: leave it empty.
  4. Add a Dungeon Category. In instances, add a slot, set dungeonInstance, and choose the unlocked and locked items.
  5. On a sequence page, add a Dungeon Global Menu and a Dungeon Party Menu. Design both layouts as described in Menus.
  6. Fire the global menu from an NPC dialogue, a command event or any other trigger. Publish.
  7. Add a Dungeon Loot Chest for the instance. Stand where the chest should be, capture location, and fill lootTable.
  8. Add a Dungeon Complete action where the dungeon should end (for example at the end of a dialogue after the last chest).
  9. Test: open the menu, click the dungeon, click the lobby, press the ready button.
tip

To skip menus and send one player straight in, use Dungeon Enter or /typewriter dungeon enter <instance>. It skips the lobby but not the rules: the group size (one player must be allowed by minPartySize), the criteria, the entry cost and the number of simultaneous runs are all checked.

How it works​

A run starts when a lobby launches or when a Dungeon Enter action runs. The extension checks the criteria and the group size of every player, reserves a place (a double click makes one run), prepares the world, takes the entry cost (all or nothing), teleports the players, then fires onStart and applies modifiers for each member. If anything fails on the way, nothing is kept: the players stay where they were, the cost is refunded and the world is thrown away.

A run ends when Dungeon Complete runs, when the time limit reaches zero, when Dungeon Close or /typewriter dungeon close runs, or when the last player leaves, changes world or disconnects. onEnd fires for each member, the chests, NPCs and mobs of the run are removed, players are teleported to the exit point (or to where they came from), and the world is released.

Only one end wins when several happen at once, so you never get two onEnd or a double refund.

Reloads and restarts​

A typewriter reload or a Publish does not lose the runs: they are adopted again with their members, world, deadline, room state (a once room stays spent), opened chests and the mobs already spawned. onStart, modifiers and chests are not replayed. A generated dungeon is rebuilt in memory from its seed.

A server restart ends the runs: the worlds of the runs are gone, players are sent home at their next join and the leftover world folders are purged. Lobbies are not restored by either.

Disconnections​

A member who disconnects from a running dungeon keeps their place for the reconnectGrace of the Dungeon Instance (2 minutes by default). Meanwhile the run does not close and the statistics of that member are not paid out. A member who comes back in time reappears where they were, with their sidebar, their hidden slots and their game mode as before. When the delay runs out they leave the run, and at their next join they are sent back to where they entered from. The time limit of the run keeps counting.

A member who is waited for is still a member: if the run ends meanwhile, they get its outcome like the others, a completion and its best time included, while the onEnd triggers only run for the members who are online. 0 means no grace: a disconnection removes the player at once. A typewriter reload during the delay ends it for the players waited for.

With MMOProfiles installed, the return is checked again once the player has chosen a profile. A player who is in no run and whom the profile puts in a dungeon world is sent back to where they entered from, and the game mode that a dungeon had changed is given back, whatever mode the profile restored. A player who is in their run (in grace) simply resumes. Without MMOProfiles nothing changes.

Dungeon has two menus. Both are actions with a GUI layoutPool and a mainLayoutId. Items in the layouts work like any GUI item. The items whose buttonType is one of the values below are filled in by Dungeon: your item (material, name, lore) is kept and a click behaviour is added. Write buttonType in capitals, exactly as listed. Leave buttonPrefix empty.

Both menus repaint every autoRefreshTicks (20 by default, kept between 10 and 1200) and at once, for every player who has them open, whenever a lobby of the dungeons they show changes. A player sees another player join without clicking.

For the layout types, item fields (x, y, count, direction, gap, repeatY) and click actions, read the GUI guide. A step-by-step build is in Designing the menus.

The Dungeon Global Menu shows the dungeons of one category. It opens when the action is triggered, or with /typewriter dungeon global-menu <category>.

buttonTypeBehaviour
DUNGEON_INSTANCE_SLOTMarks where a dungeon appears. Place one per dungeon, or use count, direction, gap and repeatY to mark a row or a block. Each marker is replaced by the next dungeon of the category. Extra markers stay empty.
DUNGEON_FIND_PARTYLeft click joins the first non-empty lobby that still has room, among the unlocked dungeons of the category, and opens the party menu. If the player is already in a lobby of the category, it leaves it instead.
DUNGEON_INFODisplay only. Use it for a help item.

How dungeons are drawn:

  • Dungeons are ordered by their categoryPriority (lowest first), then by entry id.
  • A slot is shown with unlockedItem, unlockedName and unlockLore when its criteria match the player (an empty list always matches). Clicking it opens the party menu for that dungeon.
  • A slot whose criteria do not match is shown with the locked look and cannot be opened. The criteria are evaluated for each player who opens the menu, and again when the player clicks.
  • Names and lore can use {dungeon_name}, {players} and {max}, plus PlaceholderAPI placeholders. {players} is the size of the first lobby of the dungeon.
  • Put the DUNGEON_INSTANCE_SLOT markers in simple, paginated or scrollable layouts. If the base layout is scrollable, dungeons scroll with it.
  • Without any DUNGEON_INSTANCE_SLOT marker, no dungeon is displayed.

Party menu​

The Dungeon Party Menu is the lobby. It opens when a player clicks a dungeon in the global menu, and with /typewriter dungeon instance-menu <instance>. Triggering the action itself does nothing except print a hint, so do not wire it to an NPC.

Which menu serves which dungeon. A party menu whose dungeonInstance names the dungeon serves it. A party menu with an empty dungeonInstance serves every dungeon no other menu names. A menu written for another dungeon is never opened instead: when none fits, the player is told and the server log says No dungeon_party_menu serves '<instance>'. So you can have one menu per dungeon, one shared menu, or both.

A dungeon has as many lobbies as its maxSimultaneousInstances. Each lobby is an item: lobbyItem named with lobbyName and described with lobbyLore. Where the lobbies are drawn:

  • With DUNGEON_LOBBY_SLOT markers in a simple layout (the same way as DUNGEON_INSTANCE_SLOT, use count, direction and gap to mark several), each marker is replaced by the next lobby.
  • Without any marker, lobby n is placed at column lobbyOffsetX + (n mod 9) and row lobbyOffsetY + (n div 9), counting from 0.

Clicking a lobby joins it.

Placeholder in lobbyName and lobbyLoreValue
{index}Lobby number, from 1.
{players}, {max}Players in the lobby, and maxPartySize.
{player_names}Names of the members, wrapped in the ready or not-ready prefix and suffix. Lore only.
{ready_players}, {not_ready_players}Counts. Lore only.

readyPlayerPrefix, readyPlayerSuffix, notReadyPlayerPrefix and notReadyPlayerSuffix colour the names in {player_names}.

buttonTypeBehaviour
DUNGEON_LOBBY_SLOTMarks where a lobby appears.
DUNGEON_READYToggles ready. If the player lacks the entry cost, nobody is marked ready and the lobby gets the missingItemsMessage of the dungeon.
DUNGEON_LEAVELeaves the lobby and returns to the global menu the player came from.
DUNGEON_AUTO_FILLJoins the first non-empty lobby with a free place.

When the run starts:

  1. Everyone in the lobby must be ready and the lobby must hold at least minPartySize players.
  2. A countdown of startCooldownSeconds runs. It stops if anyone un-readies. With 0, the run starts at once.
  3. The criteria are checked for every player, then the entry costs. With entryCostMode LEADER, the first player of the lobby pays. With GROUP, everyone pays. Items are taken only if nobody is missing anything.
  4. The run is created and the players are teleported to the spawn point.

A lobby that is waiting without a countdown for lobbyIdleKickSeconds (120 seconds by default) is emptied. An admin can start a lobby by hand with /typewriter dungeon force-start <instance>, which waives the minimum group size and the criteria.

While players wait, the party menu can show a waiting scoreboard (enableWaitingScoreboard, scoreboardTitle, scoreboardWaiting with {missing}, scoreboardCountdown with {time}).

Parties of other plugins. If MMOCore (using its own party module), Parties or the Typewriter party extension is installed, Dungeon reads its parties and never creates, merges or changes them. When a player joins a lobby, the whole party of that player joins with them if the lobby has room for all of it. MMOCore is used alone when it is present.

Commands used by the buttons​

The buttons do not use a server command: they call an internal handler of the menu system, so players need no permission and there is nothing to type by hand.

Configuration​

The extension has no config file. Most settings live on entries. The messages of the action entries (Enter, Leave, Close, Complete) and of the dungeon instance (missingItemsMessage) are fields. The idle delay of a lobby is the lobbyIdleKickSeconds field of the dungeon instance (default 120, 2 minutes).

Every other text a player reads is a Typewriter snippet, so nothing is fixed in the code: change or translate them in the web panel (snippets). Values are MiniMessage, and {...} placeholders are replaced as listed. Keep the defaults and nothing changes.

FamilyKeys (after the prefix)
content.dungeon_menu.invalid_action, action_failed, in_instance, party_in_instance, global_in_instance, locked, lobby_unavailable, left_lobby, not_in_lobby, no_lobby_available, left_party, no_party_found, no_party_menu ({dungeon}), no_category, party_needs_dungeon
content.dungeon_lobby.idle_kick ({seconds}, {minutes}), party_sync, missing_items_fallback ({PlayerName}, {MissingQuantity}, {ItemName}; used when missingItemsMessage is empty), scoreboard_syncing
content.dungeon_run.sidebar.time_left ({seconds}), quest ({number}). A sidebar line is plain text: MiniMessage tags are removed.
content.dungeon_chest.default_title (title of a chest whose containerTitle is empty), trigger_chest_missing, trigger_not_manual
content.dungeon_launch.prefix (put before every text of the family), no_online_member, already_in_run ({player}), no_room_configuration, group_size ({size}, {min}, {max}), criteria_not_met ({player}), missing_cost and missing_cost_leader ({player}, {amount}, {item}), max_runs_reached, isolation_unavailable, generation_failed ({text}), failed
content.dungeon_stats.How the statistic placeholders read: duration_format (tokens {h}, {m}, {mm}, {ss}, {SSS}; default {mm}:{ss}) and missing_value (what is written for a value that does not exist yet; default -).
content.dungeon_command.The replies of the /typewriter dungeon ... commands: only_players.close, only_players.enter, only_players.leave, only_players.menu, only_players.force_start, only_players.edit_room (sent to the console), not_in_run, close.done, close.already_closing, enter.done ({dungeon}), leave.done ({dungeon}), instance_menu.join_failed, instance_menu.joined ({dungeon}), global_menu.not_configured ({category}), force_start.not_in_lobby, force_start.done ({dungeon}), room.invalid_index ({index})
content.dungeon_room., content.dungeon_room_template., content.dungeon_generated.Room editors and generated-dungeon refusals.

The replies of the /typewriter dungeon ... commands are snippets too, even though the commands are for staff only. The replies of the room editor (addnode, removenode, save...) are in content.dungeon_room., and the text of a refused enter is a content.dungeon_launch. snippet.

The artifacts store data under plugins/Typewriter/:

ArtifactContent
Dungeon ArtifactPer-dungeon and per-player statistics (artifactId default dungeon_data).
Active Dungeon Instance ArtifactState of the runs in progress, so that a reload does not lose them.
Dungeon Room TemplateThe saved structure of one room of a generated dungeon.
Dungeon Party Lobby ArtifactInert. Kept so that old pages still load.

Commands​

All Dungeon commands live under /typewriter dungeon (/tw dungeon). Each one requires the permission typewriter.dungeon.admin and must be run by a player.

CommandDescription
/typewriter dungeon enter <instance>Create a run for you alone and teleport to it. The group size, criteria, entry cost and run limit still apply.
/typewriter dungeon leave <instance>Remove yourself from your run of that dungeon and go back to where you came from.
/typewriter dungeon close <instance>End your own run of that dungeon (admin close).
/typewriter dungeon global-menu <category>Open the global menu configured for the category.
/typewriter dungeon instance-menu <instance>Join the first lobby with room for your group and open the party menu.
/typewriter dungeon force-start <instance>Start the lobby you are in without waiting for ready, the countdown, the minimum group size or the criteria.
/typewriter dungeon room <room> editOpen the in-game room editor for a Dungeon Room.
/typewriter dungeon room <room> addnodeAdd a node at your feet.
/typewriter dungeon room <room> removenodeRemove the last node.
/typewriter dungeon room <room> removenodeat <index>Remove a node by its number, from 1.
/typewriter dungeon room <room> saveSave the room.
/typewriter dungeon room <room> cancelDiscard the edit.

leave and close need you to be in a run of the dungeon you name, otherwise they answer "You are not in a run of this dungeon" (the content.dungeon_command.not_in_run snippet). The old start sub-command no longer exists: use enter.

Room templates of generated dungeons are edited from the web panel (the content editor of the artifactId field), not with a command. See Generated dungeons.

Room editor (fixed dungeons)​

edit opens an editor with a toolbar in your hotbar: the blaze rod in slot 1 adds a node (at the block you look at, or at your feet when sneaking), the redstone in slot 2 removes the last node, and the lime dye in slot 8 saves and exits. Double-tap sneak exits without saving. Nodes are shown as blocks with a particle outline; sneak and click a node to delete it. One node makes a point room (radius 0.5 block), two make a line, three or more a polygon. The vertical extent comes from the lowest and highest node, plus verticalMargin.

Permissions​

PermissionGrants
typewriter.dungeon.adminEvery /typewriter dungeon command, including the room editor.

Players need no permission to use the menus.

Statistics​

Dungeon counts what each player does during a run and keeps it, for each Dungeon Artifact, as 22 statistics. The counts of a run are held while it lasts and each member is paid once, when they leave the run or when it ends; nothing is written to disk hit by hit, and a typewriter reload keeps the counts of the runs in progress. A dungeon that shares its artifact with another adds to the same statistics.

KeyUnitWhat it holds
runs_startedcountRuns begun, counted at the start even if the run is lost.
runs_completedcountRuns finished with the player still in.
best_timedurationShortest time of a completed run (a record: no value before the first completion).
runs_timed_outcountRuns whose time limit ran out with the player still in.
runs_leftcountRuns the player left on their own, or whose reconnection delay ran out. A death that takes the player out of the run is not counted here (it stays in deaths).
mob_killscountMobs killed.
damage_dealthealthDamage dealt to mobs, as it really took health: a hit of 100 on a target that had 2 health counts 2.
damage_takenhealthDamage taken, with the same limit (the health and absorption the player had).
deathscountDeaths.
time_playeddurationTime spent in runs.
completion_raterateruns_completed over runs_started, computed when read and written as a percentage.
current_healthhealthHealth of the player now. Only has a value during a run: it is never stored.
best_run_killscountMost mobs killed in a single run (a record).
best_run_damagehealthMost damage dealt in a single run (a record).
flawless_completionscountCompleted runs without a death.
solo_completionscountCompleted runs that began with one member.
best_time_solodurationShortest time of a completed solo run.
health_regainedhealthHealth really regained, never more than what was missing.
rooms_enteredcountRooms entered; a room entered twice in a run counts once.
rooms_clearedcountRooms cleared with Dungeon Clear Room, for the members standing in the room.
chests_openedcountLoot chests opened, once per chest for the player who made its loot.
waves_clearedcountWaves cleared. Only real waves count: the groups of a Dungeon Mob Spawn that define waves.

Units: a health is in health points (a heart is two), a duration is written as mm:ss unless the snippets say otherwise, and a rate is written as a percentage.

What counts:

  • Only the members of an active run, inside the world of their run, in SURVIVAL or ADVENTURE. A player in CREATIVE or SPECTATOR counts for nothing, so an admin watching a run cannot top a board.
  • The mobs that count are set by statsMobScope on the Dungeon Instance. MARKED_ONLY (default): only the mobs made by the run (marked dungeon_mob_run); the pieces of a split slime never count as kills. ANY_MOB_IN_RUN_WORLD: also the other mobs of the world of the run, such as a boss placed by another plugin. It is refused with SHARED_WORLD_SLOTS, whose world holds other runs: MARKED_ONLY is used there and a warning is logged at load.
  • Statistics are counted for each artifact. Over several artifacts, the totals add the counters and keep the best record; two artifacts with the same artifactId are one file and count once.

Read them with the placeholders, with the Player Dungeon Statistic fact, or rank them in a GUI leaderboard with a Dungeon Leaderboard Source (GUI 0.20 or later).

Placeholders​

PlaceholderAPI placeholders use the %typewriter_dungeon_…% prefix. Placeholders about the current run return 0 or an empty value when the player is not in a run. Exception: %typewriter_dungeon_stat_KEY% and its _raw form only resolve during a run; outside a run they stay displayed as written. Only dungeon_total_KEY and dungeon_inst_ID_KEY work outside a run.

PlaceholderReturns
%typewriter_dungeon_remaining%Seconds left in the player's run.
%typewriter_dungeon_remaining_formatted%Time left as mm:ss.
%typewriter_dungeon_players%Players in the player's run.
%typewriter_dungeon_max%maxPartySize of the player's dungeon.
%typewriter_dungeon_list%Names of the players in the run, separated by commas.
%typewriter_dungeon_player_N_name%Name of the Nth player of the run (from 1).
%typewriter_dungeon_player_N_health%, …_maxhealth%, …_healthpercent%Health, maximum health and percentage of the Nth player.
%typewriter_dungeon_player_health_N%Name: health/max of the Nth player.
%typewriter_dungeon_lobby_time%Seconds left on the countdown of the player's lobby. Add _formatted for mm:ss.
%typewriter_dungeon_attempts%, %typewriter_dungeon_completions%, %typewriter_dungeon_best%Runs, completions and best time of the player for the dungeon they are in.
%typewriter_dungeon_total_attempts%, …_total_completions%, …_total_ratio%Totals across all dungeons, and the completion percentage.
%typewriter_dungeon_inst_ID_attempts%, …_completions%, …_best%The same statistics for the dungeon whose entry id is ID. The id must not contain an underscore.
%typewriter_dungeon_stat_KEY%, …_stat_KEY_raw%Any statistic of the player, in the artifact of the dungeon they are in. KEY is the key of the table, for example %typewriter_dungeon_stat_mob_kills%. _raw gives the bare number of the unit (milliseconds, health points, parts per thousand), 0 when there is no value.
%typewriter_dungeon_total_KEY%, …_total_KEY_raw%The same statistic over all the dungeons.
%typewriter_dungeon_inst_ID_KEY%, …_inst_ID_KEY_raw%The same statistic for the dungeon whose entry id is ID.

current_health only has a value in dungeon_stat_current_health, during a run. A duration is written with the snippet content.dungeon_stats.duration_format and a missing value with content.dungeon_stats.missing_value.

The statistics come from the Dungeon Artifact linked in the artifact field of the dungeon. Dungeon writes them itself (attempts when a run starts, completions and best time when a run completes). A player's best time is kept once per artifact, over every dungeon that shares it: give each dungeon its own artifact when each needs its own best time. Statistics are kept per MMOProfiles profile when that plugin is installed, and per player otherwise. There is nothing to configure.

Entries​

39 entries, generated from the extension source.

Actions9
Events6
Facts4
Audiences1
Entities1
Groups1
Artifacts4
Manifests13

Troubleshooting​

The menu does not open. The GUI extension is missing, or mainLayoutId does not match the id of a layout in layoutPool. Install GUI, then check the id.

Dungeons do not appear in the global menu. The layout has no item with buttonType set to DUNGEON_INSTANCE_SLOT, or the markers are in a layout type other than simple, paginated or scrollable.

A button does nothing or does not look like a button. buttonType is case-sensitive and must be one of DUNGEON_FIND_PARTY, DUNGEON_INFO, DUNGEON_INSTANCE_SLOT, DUNGEON_LOBBY_SLOT, DUNGEON_READY, DUNGEON_LEAVE or DUNGEON_AUTO_FILL. A global button in the party menu, or the reverse, is ignored.

A dungeon is shown as Locked. The criteria of its slot in the category do not match this player. Check them with the player's facts, or empty the list.

Clicking a dungeon prints nothing and no menu opens. No party menu serves the dungeon. Check the server log for No dungeon_party_menu serves, then create one with an empty dungeonInstance or one naming the dungeon.

"The dungeon cannot be started on this server." The isolation mode of the dungeon cannot run here (for example SLIME_CLONE without Advanced Slime Paper), or it cannot hold a generated dungeon. There is no fallback to another mode. See Runs and world isolation.

"The group has N player(s): this dungeon needs X to Y." The lobby or the enter command was used with a group outside minPartySize to maxPartySize. An admin can use force-start from a lobby.

"All the runs of this dungeon are taken." maxSimultaneousInstances runs are already active.

Players arrive in an empty new world. templateWorld does not match a world folder in the server root. The log says Cannot teleport player … world '…' not found when the world cannot be loaded at all.

Players keep being thrown out of the run. Leaving the world of the run, even through a command, removes the player from it. The last player leaving ends the run.

A loot chest triggered by Loot Chest Trigger never comes back. The default triggerMode ONCE is once per run. Use REPEATABLE to trigger it several times in the same run. The next run starts clean.

An NPC never shows. In a generated dungeon the NPC appears only through an NPC marker of a room of the run. In a fixed dungeon check allowedDungeonIds and spawnLocation. See Entities in dungeons.

A room is empty of mobs even though no mob is alive. The cap maxAliveMobs may have held some back, and a reload makes the extension count again. Do not use Dungeon Mobs Alive to decide that a room is cleared: use the mob death event.