Creating gates
Where the config lives, how to write a gate, and what ALL and ANY mean.
Configuration location
The common/server config is generated at:
config/advancement_portals-common.tomlThe complete default structure is:
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/enchant_item, minecraft:story/mine_diamond",
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris"
]
[dimensionGating]
enabled = true
creativePlayersBypassGates = true
spectatorPlayersBypassGates = true
operatorsBypassGates = true
operatorBypassPermissionLevel = 2
warningCooldownSeconds = 2
blockedPortalRetryDelayTicks = 20
showAdvancementDescriptions = true
showDimensionUnlockMessages = true
[ftbTeams]
shareAdvancementsWithTeam = true
shareOnlyPortalAdvancements = false
shareRecipeAdvancements = false
syncTeamAdvancementsOnLogin = true
notifySharedAdvancements = trueApplying config changes
The gate parser detects changes to the dimensionRequirements list when the config value is read again. However, startup validation runs when the server starts.
For the most reliable result after editing the common config:
- Stop the server.
- Edit the config.
- Start the server.
- Review the validation messages in the server log.
Creating dimension gates
The recommended syntax is:
dimension | ALL/ANY | advancement, advancementA TOML entry must be inside quotation marks:
"namespace:dimension_path | ALL | namespace:advancement_path"One advancement
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/mine_diamond"
]Multiple advancements
dimensionRequirements = [
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris, minecraft:nether/summon_wither"
]Multiple dimensions
dimensionRequirements = [
"minecraft:the_nether | ALL | minecraft:story/mine_diamond",
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris",
"twilightforest:twilight_forest | ANY | mypack:quests/twilight_key, mypack:bosses/defeat_lich"
]Spacing
Spaces around | and commas are recommended for readability, but IDs are trimmed by the parser.
This is readable:
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris"This can also parse:
"minecraft:the_end|ALL|minecraft:nether/obtain_ancient_debris"Duplicate advancement IDs
Repeated advancement IDs inside one gate are automatically reduced to one requirement.
Example:
"minecraft:the_end | ALL | minecraft:story/mine_diamond, minecraft:story/mine_diamond"This behaves as though the advancement were listed once.
Duplicate destination IDs
Only one gate is stored per destination.
If the config contains:
dimensionRequirements = [
"minecraft:the_end | ALL | minecraft:story/mine_diamond",
"minecraft:the_end | ALL | minecraft:nether/obtain_ancient_debris"
]The final valid minecraft:the_end entry replaces the earlier entry. A warning is written to the log.
Combine the requirements into a single entry instead:
dimensionRequirements = [
"minecraft:the_end | ALL | minecraft:story/mine_diamond, minecraft:nether/obtain_ancient_debris"
]ALL and ANY modes
ALL
ALL requires every listed advancement.
"minecraft:the_end | ALL | mypack:chapter_two, mypack:defeat_wither"The player must complete both mypack:chapter_two and mypack:defeat_wither.
A locked-travel message lists the requirements that remain incomplete.
The unlock message appears when the final requirement is completed.
ANY
ANY requires at least one listed advancement.
"minecraft:the_end | ANY | minecraft:nether/summon_wither, mypack:quests/end_pass"The player can unlock the End by either:
- Summoning the Wither, or
- Completing the custom End Pass advancement.
While the gate remains locked, all configured options are incomplete, so the warning lists each available route.
The unlock message appears when the first qualifying advancement is completed.
What is not currently supported
Version 3.1 uses one flat mode per destination. It does not currently support grouped expressions such as:
(A AND B) OR CA dedicated advancement can represent more complex logic. Create a datapack advancement whose criteria and requirements match the progression expression, then use that advancement as the portal requirement.
