Simple - Create advancements for your server with ease
Async - Every operation is packet based. This means no lag for the server!
Advancement Visibility - Easy visibility system to customize advancement visibilities
Advancements for teams - The player progression is synchronized between members of the same team
Offline Player Support - Extensive and complete API to modify offline players progressions
Toasts - Send custom toast notifications
Database system - Fast and reliable savings wherever you want (SQLite, MySQL, In-Memory)
Disable vanilla advancements - Completely disable vanilla advancements without touching the server jar
This is a plugin for developers. If a plugin you use needs it, just download the correct version for you server and drop it into your plugins folder.
Add the dependency with maven to your project and start coding.
Check out the wiki to learn how to use the API.
Maven
<repositories>
<repository>
<id>fren_gor</id>
<url>https://nexus.frengor.com/repository/public/</url>
</repository>
</repositories>
<dependency>
<groupId>com.frengor</groupId>
<artifactId>ultimateadvancementapi</artifactId>
<version>2.4.2</version>
<scope>provided</scope>
</dependency>
There is also a shadeable version, see the related wiki page to know more about it.
Fully customizable - Make your own advancements
Easy to use - Complete and well-documented API
Support teams of players - Let more players collaborate together thanks to native support for teams
Maven and shadeable version - API is distributed with maven and it can be shaded into your plugins
Great support - Ask your questions on our Discord server
Online generator - The API comes with UltimateAdvancementGenerator, the official tool that helps you designing your advancements graphically
The official online tool to design your advancement graphically. The Java classes for your plugin are then generated by the tool automatically.
Try it now
UltimateAdvancementGenerator
Video tutorial
❗WARNING❗: The tool is still in BETA, please report bugs on GitHub.
Commands and Permissions
/ultimateadvancementapi <progression|grant|revoke> ...
Permission: ultimateadvancementapi.command
/ultimateadvancementapi grant <all|tab|one> ...
Permission: ultimateadvancementapi.grant
/ultimateadvancementapi grant all <player> [giveRewards]
Permission: ultimateadvancementapi.grant.all
/ultimateadvancementapi grant tab <advancementTab> [player] [giveRewards]
Permission: ultimateadvancementapi.grant.tab
/ultimateadvancementapi grant one <advancement> [player] [giveRewards]
Permission: ultimateadvancementapi.grant.one
/ultimateadvancementapi revoke <all|tab|one> ...
Permission: ultimateadvancementapi.revoke
/ultimateadvancementapi revoke all <player> [hideTab]
Permission: ultimateadvancementapi.revoke.all
/ultimateadvancementapi revoke tab <advancementTab> [player] [hideTab]
Permission: ultimateadvancementapi.revoke.tab
/ultimateadvancementapi revoke one <advancement> [player]
Permission: ultimateadvancementapi.revoke.one
/ultimateadvancementapi progression <get|set> ...
Permission: ultimateadvancementapi.progression
/ultimateadvancementapi progression get <advancement> [player]
Permission: ultimateadvancementapi.progression.get
/ultimateadvancementapi progression set <advancement> <progression> [player] [giveRewards]
Permission: ultimateadvancementapi.progression.set
// Creates an advancement called "Example" with the description:
// - "A random"
// - "description."
public class MainClass extends JavaPlugin implements Listener {
private AdvancementTab advancementTab;
private UltimateAdvancementAPI api;
@Override
public void onEnable() {
api = UltimateAdvancementAPI.getInstance(this);
advancementTab = api.createAdvancementTab("your_tab_name");
AdvancementDisplay rootDisplay = new AdvancementDisplay(Material.GRASS_BLOCK, "Example", AdvancementFrameType.TASK, true, true, 0, 0, "A random", "description.");
RootAdvancement root = new RootAdvancement(advancementTab, "root", rootDisplay, "textures/block/stone.png");
advancementTab.registerAdvancements(root);
Bukkit.getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onJoin(PlayerLoadingCompletedEvent e) {
// Called after a player has successfully been loaded by the API
Player p = e.getPlayer();
// Here you can show tabs to players
advancementTab.showTab(p);
}
}
Result:
90% of ad revenue goes to creators
Support creators and Modrinth ad-free with Modrinth+