Skip to main content

Dungeon Packager

webapp_banner.jpg

What are dungeons?

You can find info about dungeons, including info about premade dungeons here.


What is the dungeon packager?

The dungeon packager allows admins to not only create and package dungeons but also package any kind of EliteMobs content. This includes things such as event packs, model packs, arenas, npc packs, item packs and so on.

Why use dungeon packages?
  • Instanced dungeons! Instanced dungeons can only be created through the dungeon package system.
  • Safe backups of Minidungeons! If you make a Dungeon Package, you'll be able to deploy and redeploy it in any server you want at any time and for any reason.
  • Easy to turn off and on! You can always do /em setup and temporarily or permanently turn Dungeon Packages off and on.
  • Easy to share! If you wish to share your creations, Dungeon Packages can just be zipped up and sent to other people. There is a Discord room dedicated to community creations if you are interested!
  • Teleports! Dungeon packages automatically create teleport locations which can be accessed in the Teleports page of the /em menu, which might be very useful in a lot of setups.

Creating Dungeons

The following settings are used to create a configuration file which should go into the content_packages folder. These settings are used to create dungeons specifically, and are not required if you just want to use the dungeon packager to distribute non-dungeon content such as a pack of items or events.

Required plugins

None. Dungeon protection is handled by EliteMobs itself: setting protect: true applies EliteMobs' own per-world protection suite to the package's world, with no region plugin involved.

WorldGuard is still an optional soft dependency. When it is installed, its EliteMobs-specific region flags become available, but it is not needed for a dungeon package to be protected.

Creating a dungeon, step-by-step

EliteMobs used to have two major kinds of dungeons: world-based and schematic-based.

Schematic-based dungeons, were associated with a schematic build. They are now phased out and not supported anymore.

All EliteMobs dungeons are now world based.

Required pack.meta file

Your dungeon package should include a pack.meta file, which is simply a renamed .txt file with a .meta extension. This file should contain just one word, indicating which plugin the package is for (e.g., "elitemobs," written in lowercase). The pack.meta file must be located in the root directory of your package, alongside all the other folders.


Global values

The following values apply to all dungeons

isEnabled

Sets if the dungeon package is enabled.

KeyValuesDefaultMandatory
isEnabledBooleanfalse
Example
isEnabled: true

name

Sets the name of the content. Supports Color Codes.

KeyValuesDefaultMandatory
nameStringnone
Example
name: '&c[lvl 999] &aThe Green Dungeon'

create_packager_name.jpg


contentType

Sets the type of dungeon.

KeyValuesDefaultMandatory
contentTypeOPEN_DUNGEON / INSTANCED_DUNGEON / DYNAMIC_DUNGEON / HUB / META_PACKAGE / ITEMS_PACKAGE / EVENTS_PACKAGE / MODELS_PACKAGEnone
Example
contentType: INSTANCED_DUNGEON
SCHEMATIC_DUNGEON is dead

SCHEMATIC_DUNGEON is still accepted by the parser but schematic dungeons were removed in EliteMobs 9.0 and replaced by world dungeons. A package using it loads nothing and prints a console warning telling you to delete the entry. If you want the schematic experience, use BetterStructures with the elite shrines packages instead.


customInfo

Sets the additional info that will appear in the /em setup screen. Only for information purposes. Supports Color Codes.

KeyValuesDefaultMandatory
customInfoString Listnone
Example
customInfo:
- '&aThe best dungeon.'
- '&aMade by: CoolPlayer'

create_packager_custominfo.jpg


setupMenuDescription

Sets the description that will appear in the /em setup menu for this dungeon package. Supports Color Codes.

KeyValuesDefaultMandatory
setupMenuDescriptionString Listnone
Example
setupMenuDescription:
- '&2A cool dungeon for levels 10-20!'
- '&2Features 3 bosses and custom loot!'

Sets the download link shown to players in the /em setup menu when the content is not downloaded yet.

KeyValuesDefaultMandatory
downloadLinkStringempty string
Example
downloadLink: http://www.example.org

create_packager_downloadlink.jpg


dungeonSizeCategory

Sets the size category of the dungeon package. Only for information purposes.

KeyValuesDefaultMandatory
dungeonSizeCategorySpecial [1]none
Example
dungeonSizeCategory: MINIDUNGEON

create_packager_size.jpg

Special [1]

Expand Table
KeyDescription
LAIRLairs are a type of small dungeon which focuses on one big boss fight.
SANCTUMSanctums are the equivalent of instanced Lairs. This means that they focus around one huge boss fight.
MINIDUNGEONMinidungeons are a type of medium sized dungeon which usually contains 3-15 minibosses and a big boss, as well as a lot of "trash" mobs which are meant to be "farmed" for coins and gear by players.
DUNGEONDungeons are the equivalent of instanced Minidungeons. This is the most traditional MMORPG type of dungeon, where players party up and go through a gauntlet of trash mobs and minibosses to fight a final boss.
RAIDComing soon!
ADVENTUREAdventures are full adventure maps. They include quests lines, npcs, large amounts of minibosses and bosses and can even contain their own arenas or dungeons inside of them.
ARENAArenas are wave-based survival areas in which players get rewarded for defeating waves.
OTHERAnything else that does not already fall in the previous categories.
REALMRealms are large, persistent worlds with extensive content and progression systems.

For more detailed descriptions see Dungeons


protect

Sets if the dungeon package's world should be protected. This does not use WorldGuard - EliteMobs registers the world with its own protection suite, which blocks block breaking and placing, block burning/fading/igniting, leaf decay, bonemeal, liquid buckets, sign edits, container access (except treasure chests), door/trapdoor/fence-gate opening, dragon-egg and flowerpot interaction, item-frame and armour-stand tampering, and vanilla mob spawning. Several of those are further tuned by allowExplosionBlockDamage, allowLiquidFlow and allowElytra.

When protect is false, none of that applies and the world behaves like any normal world.

KeyValuesDefaultMandatory
protectBooleantrue
Example
protect: true

dungeonVersion

Sets the version of the dungeon package.

KeyValuesDefaultMandatory
dungeonVersionIntegernone
Example
dungeonVersion: 1

playerInfo

Sets the info which appears in the menu. Supports Color Codes.

Works only when the /em is set to book mode using /em alt.

KeyValuesDefaultMandatory
playerInfoStringnone
Example
playerInfo: 'Difficulty: &a1-man easy content!'

create_packager_playerinfo.jpg


regionEnterMessage

Sets the message that appears when a player enters the dungeon zone. Supports Color Codes.

KeyValuesDefaultMandatory
regionEnterMessageStringnone
Example
regionEnterMessage: '&aYou have entered the dungeon!'

create_packager_enter.jpg


regionLeaveMessage

Sets the message that appears when a player leaves the dungeon zone. Supports Color Codes.

KeyValuesDefaultMandatory
regionLeaveMessageStringnone
Example
regionLeaveMessage: '&aYou have left the dungeon!'

create_packager_leave.jpg


hasCustomModels

Flags that the dungeon package ships custom models (for ModelEngine or FreeMinecraftModels). The key is read and written, but nothing in EliteMobs currently acts on it - models are installed purely on the strength of the models folder being present in the package. Treat it as a documentation marker.

KeyValuesDefaultMandatory
hasCustomModelsBooleanfalse
Example
hasCustomModels: false

dungeonConfigFolderName

Sets the name of the folders used for files associated to this dungeon.

Mandatory for instanced dungeons!

KeyValuesDefaultMandatory
dungeonConfigFolderNameStringnone
Example
dungeonConfigFolderName: my_dungeon_folder

anchorPoint

Sets the reference point that /em relativecoords <package> measures from. With an anchor point set, an admin standing anywhere inside the installed package can run that command and get back the coordinates of where they are standing relative to the anchor, which is the format used by things like reinforcement offsets and script locations.

If calculatedRotation is non-zero, the returned vector is rotated around the anchor on the Y axis before being shown, so the numbers stay correct for rotated placements.

Without an anchor point the command tells the admin the anchor point is invalid and does nothing else.

KeyValuesDefaultMandatory
anchorPointLocationnone
calculatedRotationInteger (degrees)0
Example
anchorPoint: my_dungeon_world,100,64,100,0,0
calculatedRotation: 0

contentLevel

Sets the content level the dungeon should display in the EM menu.

KeyValuesDefaultMandatory
contentLevelIntegernone
Example
contentLevel: 20

enchantmentChallenge

Sets if the dungeon should be an Enchantment Challenge dungeon.

KeyValuesDefaultMandatory
enchantmentChallengeBooleanfalse
Example
enchantmentChallenge: false

song

Sets if the dungeon should have a soundtrack.

KeyValuesDefaultMandatory
songStringnone

name= This where you define which file from the resource pack should be played.
length= The length of the soundtrack in milliseconds. EliteMobs converts this to ticks internally, so it must be the real duration of the sound or the track will restart early or late.

The two parts are separated by a space. Two tracks can be chained with ->, in which case the second entry uses the same name=/length= syntax.

Example
song: name=elitemobs:dark_cathedral.ambient length=93830

Two-track form:

song: name=elitemobs:intro length=12000->name=elitemobs:dark_cathedral.ambient length=93830

dungeonLockoutMinutes

Sets a dungeon lockout timer after the boss of the dungeon has been slain. Specified value is in minutes. The default is 4320 (72 hours) since EliteMobs 10.3.1 and applies to every premade content package — set this to 0 in your YAML to disable the lockout for a specific package, or to a different positive number to override it. Locked-out players also do not earn skill XP from the boss they are on cooldown for.

KeyValuesDefaultMandatory
dungeonLockoutMinutesInteger4320
Example
dungeonLockoutMinutes: 1440

containedPackages

Sets the list of dungeon packages contained within a meta package. This is used when the contentType is set to META_PACKAGE to list all sub-packages that belong to the larger dungeon.

KeyValuesDefaultMandatory
containedPackagesString Listnone
Example
containedPackages:
- my_dungeon_adventure.yml
- my_dungeon_sanctum.yml
- my_dungeon_boss_fight.yml

customItemFilenames

Sets the list of custom item files for an item package. Setting this value will automatically set the contentType to ITEMS_PACKAGE.

KeyValuesDefaultMandatory
customItemFilenamesString Listnone
Example
customItemFilenames:
- my_custom_sword.yml
- my_custom_armor.yml

customEventFilenames

Sets the list of custom event files for an event package. Setting this value will automatically set the contentType to EVENTS_PACKAGE.

KeyValuesDefaultMandatory
customEventFilenamesString Listnone
Example
customEventFilenames:
- my_custom_event.yml

modelNames

Sets the list of model names for a model package. Setting this value will automatically set the contentType to MODELS_PACKAGE.

KeyValuesDefaultMandatory
modelNamesString Listnone
Example
modelNames:
- my_custom_model

Translatable keys

Six of the values above are registered with the translation system when the package loads: name, customInfo, playerInfo, regionEnterMessage, regionLeaveMessage and the name of each entry in difficulties. On a server running a non-English language these are looked up in that language's CSV, and the text you write in the YAML is what the English column is reconciled against. Write them in English if you want your package to be translatable.


World-based dungeon packages

The following values only apply to world-based dungeons.


worldName

Sets the name of the world that should be packaged.

KeyValuesDefaultMandatory
worldNameStringnone
Example
worldName: my_minecraft_world

wormholeWorldName

This function sets the name of the wormhole world, which serves as a secondary world linked to the main world. It is utilized for features like teleport hubs or unique boss chambers.

KeyValuesDefaultMandatory
wormholeWorldNameStringnone
Example
wormholeWorldName: my_minecraft_world_wormhole

environment

Sets the world's environment.

KeyValuesDefaultMandatory
environmentEnvironmentnone
Example
environment: NORMAL

teleportLocation

Sets the teleport location of the dungeon package. This is where the players will be teleported to when entering the dungeon.

KeyValuesDefaultMandatory
teleportLocationStringnone
Example
teleportLocation: my_minecraft_world,-1.5,68,0.5,0.0,0.0

allowExplosionBlockDamage

Either allows or prevents explosions to damage blocks in a dungeon. The explosions are considered elite explosions so any damage to blocks will be regenerated within 2 minutes.

KeyValuesDefaultMandatory
allowExplosionBlockDamageBooleanfalse
Example
allowExplosionBlockDamage: true

allowLiquidFlow

Sets whether liquid (water, lava) is allowed to flow in the dungeon.

KeyValuesDefaultMandatory
allowLiquidFlowBooleantrue
Example
allowLiquidFlow: false

allowElytra

Sets whether players are allowed to glide with an elytra inside this content package's world. When false (the default), EliteMobs cancels glide attempts in the package's world and re-asserts non-gliding state every tick — useful for stopping players from skipping designed dungeon traversal.

KeyValuesDefaultMandatory
allowElytraBooleanfalse
Example
allowElytra: true

listedInTeleports

Sets whether the dungeon package appears in the teleports menu. When set to false, players will not be able to teleport to the dungeon via the /em teleport menu.

KeyValuesDefaultMandatory
listedInTeleportsBooleantrue
Example
listedInTeleports: false

teleportLocationOffset

Sets an offset for the teleport location of the dungeon package.

This key is parsed but currently unused - nothing in EliteMobs reads the resulting offset, so setting it has no effect on where players land. Adjust teleportLocation itself instead.

KeyValuesDefaultMandatory
teleportLocationOffsetStringnone
Example
teleportLocationOffset: my_minecraft_world,0.5,2,0.5,0.0,0.0

Instanced dungeons

Instanced dungeons create a new world for every time a group of players wants to complete a dungeon, and deletes it when it's done. For this to work correctly, you must put a folder following the dungeonConfigFolderName in the world_blueprints configuration folder of EliteMobs.

You then place the world you'll be using inside of the folder you created, making sure that the session.lock file of the world is deleted.

The following values only apply to instanced dungeons. Note that all instanced dungeons are world dungeons, so they also use the values from world dungeons.


startLocation

Sets the teleport location of the instanced dungeon starting point. This is where the players will be teleported to when starting the instanced dungeon with /em start.

KeyValuesDefaultMandatory
startLocationStringnone
Example
startLocation: my_minecraft_world,10.5,70,10.5,0.0,0.0

permission

Sets the permission required in order to enter the dungeon instance.

KeyValuesDefaultMandatory
permissionStringnone
Example
permission: elitedungeon.mypermission

minPlayerCount

Sets the minimum player count required to start a dungeon.

KeyValuesDefaultMandatory
minPlayerCountInteger1
Example
minPlayerCount: 1

maxPlayerCount

Sets the maximum player count allowed in a dungeon.

KeyValuesDefaultMandatory
maxPlayerCountInteger5
Example
maxPlayerCount: 5

dungeonObjectives

Sets list of dungeon objectives required for the dungeon to be considered completed.

KeyValuesDefaultMandatory
dungeonObjectivesString Listnone
Examples

There are currently two dungeon objective types:

  • Kill target: filename=boss.yml:amount=X
  • Kill percentage of dungeon: clearpercentage=X.Y
dungeonObjectives:
- filename=dungeon_final_boss.yml
- filename=dungeon_miniboss_one.yml
- filename=dungeon_miniboss_two.yml
dungeonObjectives: 
- clearpercentage=0.8

A bare boss.yml with no filename= prefix is still accepted and silently treated as filename=boss.yml, so older packages keep working. New packages should use the explicit form.


difficulties

Sets list of difficulties in the instanced dungeon.

Mandatory for instanced dungeons!

KeyValuesDefaultMandatory
difficultiesSpecial [1]none
Examples
difficulties:
- levelSync: 25
id: 0
name: normal
- levelSync: 20
id: 1
name: hard
- levelSync: 15
id: 2
name: mythic

create_packager_difficulty.jpg

Special [1]

Expand Table

Setting instanced dungeon difficulties will automatically create different difficulty options when entering the dungeon.

The difficulty names set here will be the ones used in the custom bosses folder, where you are able to set which powers bosses have based on the difficulty.

Difficulties are in a list format which have the following fields:

KeyDescriptionValuesMandatory
nameName of the difficulty for players.String
idID of the difficulty, used in custom bosses and custom items for the difficulty-based feature.String
levelSyncSets the level of the level sync, if any. Level sync makes all player gear max out at the set value, making it impossible for players to get over leveled for a dungeon and keeping it relevant for later runs. Based on the Final Fantasy 14 level sync system.Absolute level (25) or a value relative to contentLevel (+5, -3)

Relative level sync: a levelSync that starts with + or - is applied on top of the package's contentLevel and clamped to a minimum of 1. For example, contentLevel: 40 with levelSync: -5 syncs players to level 35. On a dynamic dungeon, whose content level is only decided when the instance is created, the relative value resolves at that point instead. An unparseable value disables level sync (0) and logs a warning.

Dynamic dungeons

Dynamic dungeons are an extension of instanced dungeons, but with one key difference: they allow the dungeon’s content to scale to the difficulty level chosen by the player. The level options available to the player are determined by the player’s unlocked Guild level.

When designing bosses and mobs for a dynamic dungeon, use the setting level: dynamic. Any loot in dynamic dungeons should be set with scalability: scalable.

The following values are needed for dynamic dungeons.
Since all dynamic dungeons are also instanced dungeons, they additionally use all values and settings from instanced dungeons.


contentType

Sets the type of dungeon. This must be set to DYNAMIC_DUNGEON.

KeyValuesDefaultMandatory
contentTypeOPEN_DUNGEON / INSTANCED_DUNGEON / DYNAMIC_DUNGEON / HUB / META_PACKAGE / ITEMS_PACKAGE / EVENTS_PACKAGE / MODELS_PACKAGEnone
Example
contentType: DYNAMIC_DUNGEON

contentLevel

Sets the content level the dungeon should display in the EM menu. This needs to be set to the value of -1 for the dungeon to be shown as a dynamic dungeon.

KeyValuesDefaultMandatory
contentLevelIntegernone
Example
contentLevel: -1

difficulties

Sets the available list of difficulties and level sync in the dynamic dungeon.

Mandatory for instanced dungeons!

KeyValuesDefaultMandatory
difficultiesSpecial [1]none
Examples
difficulties:
- levelSync: '+5'
name: normal
id: 0
- levelSync: '+0'
name: hard
id: 1
- levelSync: '-5'
name: mythic
id: 2

create_packager_difficulty.jpg

Special [1]

Expand Table

Setting instanced dungeon difficulties will automatically create different difficulty options when entering the dungeon.

The difficulty names set here will be the ones used in the custom bosses folder, where you are able to set which powers bosses have based on the difficulty.

Setting levelSync values to positive or negative numbers in quotation marks controls how the player’s equipment is synced inside the dungeon. These values do not affect the dungeon’s own level—dungeon content always syncs directly to the player’s level choice upon entry.

For example, if levelSync is set to "+0", the player’s equipment will be synced to match the dungeon’s content level exactly.
If set to "+5", the player’s equipment will be synced 5 levels above the dungeon’s content.
If set to "-5", their equipment will be synced 5 levels below the dungeon’s content.

Difficulties are in a list format which have the following fields:

KeyDescriptionValuesMandatory
nameName of the difficulty for players.String
idID of the difficulty, used in custom bosses and custom items for the difficulty-based feature.String
levelSyncSets the level for player gear scaling. This determines how a player’s equipment level is adjusted relative to the dungeon content, allowing gear to be up to a few levels above or below the chosen dungeon difficulty. Based on the Final Fantasy 14 level sync system.Integer

Using the meta_pack.yml dungeon package file for large dungeons.

Sometimes, you may be working on a large dungeon that includes other, smaller dungeons within itself, allowing players to travel between them through the main dungeon world. A great example of this is the EliteMobs Adventure Dungeon Primis.

Primis features a vast world where players can explore and complete quests, but it also includes two instanced dungeons within its world—one of which serves as the final boss fight. In cases like this, there will be multiple dungeon package files, even though they all belong to the same overarching dungeon.

To manage this, we use a meta dungeon package file. This file acts as a central directory, specifying the primary dungeon and listing all additional dungeon content associated with it.

Let’s take a closer look at how the Primis meta dungeon package is structured:

isEnabled: true
name: '&2[000-020] The Primis Adventure!'
customInfo:
- The tutorial adventure for players
- new to EliteMobs!
downloadLink: https://discord.gg/9f5QSka
dungeonSizeCategory: LAIR
environment: NORMAL
protect: true
contentType: META_PACKAGE
containedPackages:
- primis_adventure.yml
- primis_blood_temple_sanctum.yml
- primis_gladius_invasion_dungeon.yml
setupMenuDescription:
- '&2A soft tutorial adventure for players between levels 0-20!'
- '&2Adventures are massive maps with quests,'
- '&2many bosses and npcs, among other things!'
- '&2Also has custom models!'
dungeonVersion: 21 #added dungeon meta package file

As you can see, the meta dungeon package file is very similar to a regular dungeon package, with a few key differences. The contentType: is set to META_PACKAGE, and there is an additional setting called containedPackages:. This setting lists all the other dungeon packages that are part of the larger dungeon.

When creating your meta package, be sure to include the containedPackages: setting and list every dungeon package that is part of your larger dungeon. This ensures that everything is properly linked and organized within the overarching structure.

When versioning your dungeon, all versioning should be managed through the meta package. This is because the meta package serves as the primary package that determines the version of the entire dungeon and is also the package used to display information in the /em setup menu.

Keep in mind that individual dungeons listed in the meta package might still appear in the /em setup teleport menu. To prevent this, you’ll need to manually disable teleport options for each of those dungeons in their respective configuration files.

For example, in the case of the Primis dungeon:

Disable teleport entries in the menu for primis_blood_temple_sanctum.yml and primis_gladius_invasion_dungeon.yml. Leave teleport options enabled for primis_adventure.yml, as this serves as the main hub where players begin their journey and access the other dungeons. This setup ensures a smooth experience for players while maintaining proper structure and functionality for the dungeon system.

When naming the file we recommend the following naming convention:

your_dungeon_name_meta_pack.yml


Recommended Boss Values

Creating an average dungeon mob

We recommend leaving the setting normalizedCombat set to true. This setting normalizes all mobs to scale equally with health and damage, regardless of their entity type.

Note that for dungeon content this is usually decided for you: while normalizeRegionalBosses is true in MobCombatSettings.yml (the default), every regional boss and every instanced-dungeon boss is forced to normalized combat regardless of what the boss file says. The multipliers below are therefore the values that actually matter.

normalizedCombat: true
healthMultiplier: 1.0 #~3 sword hits to slay
damageMultiplier: 1.0 #1.5 hearts of dmg

Note: Given that 1.0 is the default value for health and damage, you can simply omit defining healthMultiplier or damageMultiplier and set normalizedCombat to true.

Creating trash packs

Trash packs are numerous but not very dangerous:

normalizedCombat: true
healthMultiplier: 0.7 #~2 sword hits to slay
damageMultiplier: 0.5 #0.5 hearts of dmg

Creating reinforcements

Reinforcements should die very easily, but pose a danger damage-wise (these values are recommended for 4+ melee entities, actual use may vary):

normalizedCombat: true
healthMultiplier: 0.25 #~1 sword hit to slay
damageMultiplier: 0.6 #1 heart of dmg

Creating minibosses

Minibosses should hold their ground, and pose a mechanic challenge to players. It should be a test of skill that lasts for a little while, but not something extremely deadly:

normalizedCombat: true
healthMultiplier: 3.0 #~10 sword hits to slay
damageMultiplier: 1.2 #2 hearts of dmg

Creating bosses

Bosses are a real challenge, the conclusion of a buildup in a dungeon and a real test of skill with everything on the line. Encounters should be long and death should be a present threat.

normalizedCombat: true
healthMultiplier: 7.0 #~23 sword hits to slay
damageMultiplier: 1.4 #2.5 hearts of dmg

These recommended values are merely rough estimates, and the final values should be adjusted according to the specific encounters.

This is particularly crucial for final dungeon bosses; you may want to significantly exceed the recommended 7.0 value for healthMultiplier to give the last fight that epic feeling.

Mind the health ceiling before pushing healthMultiplier up

Boss health is clamped to the server's settings.attribute.maxHealth.max (2048 on a default server) and boss damage is not clamped. Every multiplier therefore has a level past which the boss stops gaining health while its damage keeps scaling — 7.0 caps at level 36, 10.0 at level 33, 40.0 at level 23. Raising the multiplier above the point where it already clamps buys you nothing but a glassier boss. See healthMultiplier for the full table and how to raise the ceiling.


Packaging EliteMobs content for distribution

Finally, you will probably want to package your dungeon either for storage or for distribution.

EliteMobs has an import system which allows admins to quickly import, install and uninstall content. You can see how it works here.

Distributing Dungeon Resource Packs

As of EliteMobs 9.6.0, dungeons can be packaged and distributed with their own resource packs! This allows you to do cool things like using custom textures or models for loot dropped in the dungeon, or adding custom sounds—like we did in our dungeon The Hallowed Haunt.

To distribute a resource pack with your dungeon, create it like any standard resource pack. If you want a template, you can reference the EliteMobs default resource pack, which EliteMobs exports on boot to plugins/EliteMobs/resource_pack/em_rsp_defaults/. The resource pack must be distributed unzipped, so create a folder named after your dungeon, for example: my_cool_dungeon_rsp. Place all the resource pack files that would normally go into the zip inside this folder. Then, place this folder inside a new folder called resource_pack—this is the same folder that EliteMobs uses to store its default resource pack.

Do not edit em_rsp_defaults itself: EliteMobs checksums the copy in its jar on every boot and wipes and re-exports the folder whenever the two differ, so your changes will be lost.

After organizing your files, the directory structure should look like this:

resource_pack
└── my_cool_dungeon_rsp
└── [resource pack files]

Once complete, your dungeon resource pack should import successfully when the dungeon is installed.

Trimming Worlds

Sometimes, you may need to reduce the size of your Minecraft world to make it lighter and, consequently, easier to distribute. This can be achieved through the use of the WorldBorder plugin. Despite the plugin being listed as only supporting MineCraft up to version 1.19, it functions seamlessly on the latest MineCraft version as of January 25, 2024.

Details

Tip If you are doing this for the first time it might be a good idea to create a backup of your world just in case something goes wrong.

Once the plugin is installed, navigate to the middle of the world or the specific area you wish to trim. Then, execute the command /wb set x, where x represents the approximate radius size you want for your area.

Details

Tip If /wb is not working for you, try /worldborder:wb.

After executing this command, fly to the edges of your world to verify that the world border has been properly set and covers the intended size. You will recognize reaching the world border edge when you are pushed back, accompanied by a message in the chat.

trim_pic_1.jpg

In the image above, we aim to trim the world around the purple blocks, leaving only a few chunks around them. To achieve this, we stand in the middle of the purple area on the red squares and execute /wb set 50, setting the world border just beyond the purple area.

Next, we use the /wb trim [freq] [pad] command, with the frequency set to 200 and the pad to 20. The pad determines how many chunks should be left around the world border (the purple area), and the frequency determines how many chunks should be processed per second. After running /wb trim 200 20, we will be prompted to confirm by executing /wb trim confirm. We confirm the action, and after some time, our world will be trimmed, reducing its size and making it more convenient for distribution.

You can now remove the world border using /wb clear all or just leave it if you wish.

Trimming the world folder

There are several files and folders located in your world folder that we can discard since the plugins do not use all of them. This will cut down the size of your world and make it easier to distribute.

For a NORMAL world Environment:

To prepare your world, keep the following files and folders:

  1. region folder
  2. raids.dat from within the data folder (ensure it's placed inside the data folder when copying)
  3. level.dat file

You can safely delete all other files and folders located in the world folder. This will set up your world correctly for the NORMAL environment.

For NETHER and THE_END world Environments:

To prepare your world, keep the following files and folders:

  1. region folder inside the DIM-1 folder (ensure it's placed inside the DIM-1 folder when copying)
  2. raids.dat from within the data folder (ensure it's placed inside the data folder when copying)
  3. level.dat file

You can safely delete all other files and folders located in the world folder. This will set up your world correctly for the NETHER and THE_END environments.

Running the package command

EliteMobs has the /em package <dungeonName> <version> command. This command looks for a subfolder named dungeonName inside each of the content folders below and copies whatever it finds into exports/<dungeonName>/, then zips that into exports/<dungeonName>_packaged.zip.

The folders it scans are, in order:

custombosses, customevents, npcs, customitems, customquests, customarenas, customspawns, customtreasurechests, wormholes, world_blueprints, powers

Anything it cannot find prints a "no subdirectory" notice and is skipped, which is normal for a package that does not use every content type.

For this reason, it is highly recommended you keep the content you want to package in folders with the same name as the name of your package. Otherwise, you will have to manually gather and package the files into the file structure for distribution.

Note that /em package does not collect content_packages, worldcontainer, models or resource_pack. Those four have to be added to the export folder by hand before you zip it.

Adding the dungeon package file

If you are creating a dungeon, you will need to manually add the dungeon package file into the freshly generated folder in the exports folder. Your dungeon package configuration file should follow the format described above and be placed in a folder called content_packages. See the File structure section below for more on that.

Make sure you zip your dungeon once done!

File structure

If you did everything correctly, the file structure should be similar to this example, where we called the dungeon my_cool_dungeon:

my_cool_dungeon File Structure Example
  • my_cool_dungeon.zip
    • content_packages
      • my_cool_dungeon.yml <- This is where your dungeon package configuration file goes
    • worldcontainer
      • [Your world folders go here]
    • wormholes
      • my_cool_dungeon
        • [Your wormholes go here]
    • npcs
      • my_cool_dungeon
        • [Your NPCs go here]
    • customtreasurechests
      • my_cool_dungeon
        • [Your treasure chests go here]
    • customquests
      • my_cool_dungeon
        • [Your quests go here]
    • customitems
      • my_cool_dungeon
        • [Your custom items go here]
    • custombosses
      • my_cool_dungeon
        • [Your custom bosses go here]
    • customarenas
      • my_cool_dungeon
        • [Your custom arenas go here]
    • powers
      • my_cool_dungeon
        • [Your custom powers go here]
    • world_blueprints
      • my_cool_dungeon
        • [Your world folder goes here, used for instanced dungeons]
    • customevents
      • my_cool_dungeon
        • [Your custom events go here]
    • customspawns
      • my_cool_dungeon
        • [Your custom spawns go here]
    • models
      • [Your bbmodel format models go here, accepts folders]
    • scripts
      • [Your FreeMinecraftModels Lua scripts go here]
    • resource_pack
      • my_cool_dungeon_rsp
        • [Your resource pack files go here]

This allows most users to drag and drop files directly on to their server and have it working immediately.

Recognized top-level folders

The importer only understands a fixed set of top-level names. For an EliteMobs package (pack.meta containing elitemobs) these are:

FolderWhere it is installed
content_packagesplugins/EliteMobs/content_packages
dungeonpackagesplugins/EliteMobs/content_packages (legacy alias)
custombossesplugins/EliteMobs/custombosses
customitemsplugins/EliteMobs/customitems
customtreasurechestsplugins/EliteMobs/customtreasurechests
customeventsplugins/EliteMobs/customevents
customspawnsplugins/EliteMobs/customspawns
customquestsplugins/EliteMobs/customquests
customarenasplugins/EliteMobs/customarenas
npcsplugins/EliteMobs/npcs
wormholesplugins/EliteMobs/wormholes
powersplugins/EliteMobs/powers
world_blueprintsplugins/EliteMobs/world_blueprints
resource_packplugins/EliteMobs/resource_pack
worldcontainerthe server's world container
models or modelengineFreeMinecraftModels' models folder if FreeMinecraftModels is installed, otherwise ModelEngine's blueprints folder
scriptsplugins/FreeMinecraftModels/scripts
pack.metanot installed anywhere - it is only read to identify the package

Anything else at the top level of the zip is not recognized and will not be installed, so keep stray readme files, screenshots and __MACOSX folders out of the archive root.

schematics is a special case: importing it into EliteMobs prints a warning telling you that schematic dungeons were removed in EliteMobs 9.0.

Important: when packaging for distribution, make sure you UNINSTALL THE MINIDUNGEON FIRST! You don't want to distribute installed minidungeons, you want admins to set them up on their servers!

Sharing Dungeon Packages you've created with the community

Discord contains a #community_dungeons section where people can share their Minidungeon creations. Feel free to contribute!