This is my first time uploading something here; honestly, I'm a bit nervous.
Gardin's Advancement
Dependencies:
PlaceholderAPI
https://www.spigotmc.org/resources/placeholderapi.6245/
UltimateAdvancementAPI
https://www.spigotmc.org/resources/ultimateadvancementapi-1-15-26-1-2.95585/
You don't want to write your own data packs because they are too complicated.
You want a plugin that allows you to add custom vanilla-style advancements to your server through a much more user-friendly YAML configuration.
However, traditional advancement systems have always relied on event listeners implemented by plugin developers.
This creates limitations for server owners:
Traditional achievement plugins usually detect player actions through event listeners.
The problem is that when another plugin introduces new items, skills, or gameplay systems, the achievement system cannot recognize these new features unless a specific compatibility integration has been developed.
Nowadays, PlaceholderAPI has become widely adopted across the Minecraft plugin ecosystem. More and more plugins use placeholders as a way to expose their internal data and states.
Therefore, using placeholders as advancement conditions is a natural solution.
It keeps the advancement system lightweight while providing compatibility with any plugin that exposes PlaceholderAPI values.
Gardin's Advancement is designed around this concept.
Gardin's Advancement uses PlaceholderAPI as a unified data interface.
Instead of depending on a large number of event listeners, the plugin uses Placeholder expressions as its universal condition system.
As long as a plugin provides PlaceholderAPI support, it can directly participate in advancement checks without requiring additional compatibility modules.
Example:
This configuration means:
- The player's level is 15 or higher.
- The player is currently jailed in Towny.
Only when both conditions are satisfied will the player receive the corresponding advancement.
With this design, theoretically any plugin supporting PlaceholderAPI can directly become a source of advancement conditions.
We also support progress bars.
Currently, only one variable is supported.
This will display an advancement progress bar.
When the player's level reaches 10, the advancement will be completed automatically.
Please note:
Due to the limitation of the vanilla system, only integer values are supported.
If your Placeholder returns a non-numeric value, it will always be treated as 0.
If your Placeholder returns a floating-point number, it will be rounded down automatically.
The condition system and progress bar system can be used together or independently.
For more complex logic, you can combine PlaceholderAPI's JavaScript expansion or other scripting plugins to create custom conditions.
Supported Expressions
Gardin's Advancement supports the following expressions:
Example Configuration
tabs:
novice_path:
display-mode: direct
background: "minecraft:textures/block/stone.png"
advancements:
novice_root:
type: root
conditions:
- "placeholder: %player_level% >= 0"
commands:
- "say %player_name% 已解锁根成就 novice_root"
- "tell %player_name% &a欢迎来到新手之路"
data: #minecraft每个标签页下仅支持一个根进度,并且以根进度作为页面标题,以根进度icon作为标签页icon
title: "初入世界"
icon: minecraft:acacia_door
frame: task
show_toast: true
announce_chat: true
x: 10
y: 20
description:
- "这是新手线路的根节点"
novice_step_one:
type: common
parent: novice_root
conditions:
- "placeholder: %player_level% >= 5"
data:
title: "迈出第一步"
icon: CE:customfishing:sturgeon_fish_golden_star
frame: goal
show_toast: true
announce_chat: true
x: 12
y: 20
description:
- "&a这个普通节点绑定在 novice_root 下"
> Note: Minecraft only supports one root advancement per advancement tab.
> The root advancement acts as the title of the tab, and its icon is used as the tab icon.
Branch System
Advancement trees inevitably become harder to read and maintain as they grow. To solve this problem, Gardin's Advancement introduces the branch system, allowing you to encapsulate parts of your advancement tree into independent branches. You only need to define a branch structure like this:
Then, you can mount this branch under any advancement node in a tab:
The mounted branch will be generated under branch_anchor as its parent node in the current tab.
Notes
This plugin pre-compiles condition expressions on startup and generates a variable index that maps placeholders to related advancements. This avoids repeatedly reading the same placeholders.
During placeholder checks, conditions are only evaluated when the placeholder value changes compared to the cached value.
When an advancement is completed, the plugin automatically checks placeholder usage. If a placeholder is no longer required, it will be removed from the tracking system.
Therefore, using the same placeholder multiple times will not cause significant performance issues. Progressive advancement chains such as:
can be freely used without worrying about additional performance costs.
Due to this caching mechanism, advancement trees cannot be hot-reloaded.
The `/reload` command only updates:
Important Notice
If you need an advancement system based on instant event triggers
(for example: triggering immediately when a player breaks a block or kills an entity), this plugin may not be suitable for your needs.
Gardin's Advancement is not designed to replace event-based achievement systems.
Instead, it provides a lightweight and universal condition checking framework based on PlaceholderAPI.
Icon Support
Gardin's Advancement
Dependencies:
PlaceholderAPI
https://www.spigotmc.org/resources/placeholderapi.6245/
UltimateAdvancementAPI
https://www.spigotmc.org/resources/ultimateadvancementapi-1-15-26-1-2.95585/
You don't want to write your own data packs because they are too complicated.
You want a plugin that allows you to add custom vanilla-style advancements to your server through a much more user-friendly YAML configuration.
However, traditional advancement systems have always relied on event listeners implemented by plugin developers.
This creates limitations for server owners:
Traditional achievement plugins usually detect player actions through event listeners.
The problem is that when another plugin introduces new items, skills, or gameplay systems, the achievement system cannot recognize these new features unless a specific compatibility integration has been developed.
Nowadays, PlaceholderAPI has become widely adopted across the Minecraft plugin ecosystem. More and more plugins use placeholders as a way to expose their internal data and states.
Therefore, using placeholders as advancement conditions is a natural solution.
It keeps the advancement system lightweight while providing compatibility with any plugin that exposes PlaceholderAPI values.
Gardin's Advancement is designed around this concept.
Gardin's Advancement uses PlaceholderAPI as a unified data interface.
Instead of depending on a large number of event listeners, the plugin uses Placeholder expressions as its universal condition system.
As long as a plugin provides PlaceholderAPI support, it can directly participate in advancement checks without requiring additional compatibility modules.
Example:
Code (Text):
- "placeholder: %player_level% >= 15 && %townyadvanced_player_jailed% == true"
- The player's level is 15 or higher.
- The player is currently jailed in Towny.
Only when both conditions are satisfied will the player receive the corresponding advancement.
With this design, theoretically any plugin supporting PlaceholderAPI can directly become a source of advancement conditions.
We also support progress bars.
Currently, only one variable is supported.
Code (YAML):
progress:
placeholder : ' %player_level%'
max : 10
placeholder : ' %player_level%'
max : 10
When the player's level reaches 10, the advancement will be completed automatically.
Please note:
Due to the limitation of the vanilla system, only integer values are supported.
If your Placeholder returns a non-numeric value, it will always be treated as 0.
If your Placeholder returns a floating-point number, it will be rounded down automatically.
The condition system and progress bar system can be used together or independently.
For more complex logic, you can combine PlaceholderAPI's JavaScript expansion or other scripting plugins to create custom conditions.
Supported Expressions
Gardin's Advancement supports the following expressions:
- !
- <
- >
- ==
- !=
- >=
- <=
- &&
- ||
- ()
Example Configuration
Code (Text):
tabs:
novice_path:
display-mode: direct
background: "minecraft:textures/block/stone.png"
advancements:
novice_root:
type: root
conditions:
- "placeholder: %player_level% >= 0"
commands:
- "say %player_name% 已解锁根成就 novice_root"
- "tell %player_name% &a欢迎来到新手之路"
data: #minecraft每个标签页下仅支持一个根进度,并且以根进度作为页面标题,以根进度icon作为标签页icon
title: "初入世界"
icon: minecraft:acacia_door
frame: task
show_toast: true
announce_chat: true
x: 10
y: 20
description:
- "这是新手线路的根节点"
novice_step_one:
type: common
parent: novice_root
conditions:
- "placeholder: %player_level% >= 5"
data:
title: "迈出第一步"
icon: CE:customfishing:sturgeon_fish_golden_star
frame: goal
show_toast: true
announce_chat: true
x: 12
y: 20
description:
- "&a这个普通节点绑定在 novice_root 下"
> The root advancement acts as the title of the tab, and its icon is used as the tab icon.
Branch System
Advancement trees inevitably become harder to read and maintain as they grow. To solve this problem, Gardin's Advancement introduces the branch system, allowing you to encapsulate parts of your advancement tree into independent branches. You only need to define a branch structure like this:
Code (YAML):
branchs:
mining_line:
advancements:
mining_branch_root:
type : root
conditions:
- "placeholder : %player_level% >= 4"
data:
title : "&7Mining Branch Start"
icon : minecraft:stone_pickaxe
frame : task
show_toast : true
announce_chat : false
x : 3
y : 3
description :
- "&7This root will automatically become a normal node"
- "&7when mounted, and its parent will be bound"
- "&7to the advancement that references this branch"
mining_branch_iron:
type : common
parent : mining_branch_root
conditions:
- "placeholder : %player_level% >= 8"
branch :
- mining_deep_line # other branch
data:
title : "&fSmelt Iron Ingots"
icon : minecraft:iron_ingot
frame : goal
show_toast : true
announce_chat : true
x : 5
y : 3
description :
- "&7Nodes inside a branch can also"
- "&7mount additional branches"
mining_line:
advancements:
mining_branch_root:
type : root
conditions:
- "placeholder : %player_level% >= 4"
data:
title : "&7Mining Branch Start"
icon : minecraft:stone_pickaxe
frame : task
show_toast : true
announce_chat : false
x : 3
y : 3
description :
- "&7This root will automatically become a normal node"
- "&7when mounted, and its parent will be bound"
- "&7to the advancement that references this branch"
mining_branch_iron:
type : common
parent : mining_branch_root
conditions:
- "placeholder : %player_level% >= 8"
branch :
- mining_deep_line # other branch
data:
title : "&fSmelt Iron Ingots"
icon : minecraft:iron_ingot
frame : goal
show_toast : true
announce_chat : true
x : 5
y : 3
description :
- "&7Nodes inside a branch can also"
- "&7mount additional branches"
Code (YAML):
branch_anchor:
type : common
conditions:
- "placeholder : %player_level% >= 0"
parent : branch_demo_root
branch :
- mining_line
data:
title : "&eBranch Mount Point"
icon : minecraft:cartography_table
frame : task
show_toast : true
announce_chat : false
x : 2
y : 2
description :
- "&7Mount mining_line under this node"
- "&7The same branch cannot be referenced elsewhere"
type : common
conditions:
- "placeholder : %player_level% >= 0"
parent : branch_demo_root
branch :
- mining_line
data:
title : "&eBranch Mount Point"
icon : minecraft:cartography_table
frame : task
show_toast : true
announce_chat : false
x : 2
y : 2
description :
- "&7Mount mining_line under this node"
- "&7The same branch cannot be referenced elsewhere"
The mounted branch will be generated under branch_anchor as its parent node in the current tab.
Notes
- Branches cannot be reused. Each branch can only be mounted once.
- Nodes inside a branch share the same ID namespace as the parent tab after mounting.
- Avoid using duplicate advancement IDs within the same tab to prevent conflicts.
This plugin pre-compiles condition expressions on startup and generates a variable index that maps placeholders to related advancements. This avoids repeatedly reading the same placeholders.
During placeholder checks, conditions are only evaluated when the placeholder value changes compared to the cached value.
When an advancement is completed, the plugin automatically checks placeholder usage. If a placeholder is no longer required, it will be removed from the tracking system.
Therefore, using the same placeholder multiple times will not cause significant performance issues. Progressive advancement chains such as:
Code (Text):
Level 5 → Level 10 → Level 15
Due to this caching mechanism, advancement trees cannot be hot-reloaded.
The `/reload` command only updates:
- check-interval-ticks
- Debug settings
Important Notice
If you need an advancement system based on instant event triggers
(for example: triggering immediately when a player breaks a block or kills an entity), this plugin may not be suitable for your needs.
Gardin's Advancement is not designed to replace event-based achievement systems.
Instead, it provides a lightweight and universal condition checking framework based on PlaceholderAPI.
Icon Support
- craftengine
Gardin's Advancement is a free Minecraft Java mod. Compatible with Minecraft 1.21, 26.1, 26.2. Downloaded 41 times (via Spigot). Download it and open it directly in the game.