HomeJavaModsGardin's Advancement
Gardin's Advancement
ModsJava

Gardin's Advancement

Placeholder-Driven Native Advancement System

⬇ Download on Spigot
This is my first time uploading something here; honestly, I'm a bit nervous.
Gardin's Advancement
[​IMG]
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"
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.
Code (YAML):
progress:
  placeholder
: ' %player_level%'
  max
: 10
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
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 下"
 
> 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:

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"
Then, you can mount this branch under any advancement node in a tab:

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"

The mounted branch will be generated under branch_anchor as its parent node in the current tab.

Notes
Performance
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
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:
Changes to advancement structures require a server restart.

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 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.

Explore more