
3.0.0 Beta
3.0.0 Beta is available on the
main-3.0.0branch. Download it if you want to try it out.
The Javadoc for the beta is published here.

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.8.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 (NEW)
UltimateAdvancementGenerator (OLD)
Video tutorial (Old Generator)
Video tutorial (New Generator)
WIP
❗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
Permission: ultimateadvancementapi.grant.all
/ultimateadvancementapi grant tab
Permission: ultimateadvancementapi.grant.tab
/ultimateadvancementapi grant one
Permission: ultimateadvancementapi.grant.one
/ultimateadvancementapi revoke <all|tab|one> ...
Permission: ultimateadvancementapi.revoke
/ultimateadvancementapi revoke all
Permission: ultimateadvancementapi.revoke.all
/ultimateadvancementapi revoke tab
Permission: ultimateadvancementapi.revoke.tab
/ultimateadvancementapi revoke one
Permission: ultimateadvancementapi.revoke.one
/ultimateadvancementapi progression <get|set> ...
Permission: ultimateadvancementapi.progression
/ultimateadvancementapi progression get
Permission: ultimateadvancementapi.progression.get
/ultimateadvancementapi progression set
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:

bStats
All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 | ||||
| 9h ago | 1 |
- Added support for Minecraft 26.3
- Updated CommandAPI to 12.1.0
- Improved the plugin update checker
- Added support for Minecraft 26.3
- Updated CommandAPI to 12.1.0
- Added support for Minecraft 26.2 (by [@Ariouz](https://github.com/Ariouz))
- Updated CommandAPI to 12.0.0
- Updated Libby to 1.3.2
- SQLite database is now [vacuumed](https://sqlite.org/lang_vacuum.html) at startup, optimizing the database file and reducing its disk space
- Unused imports are now checked at compile time
- The project now uses .editorconfig
- Added project icon for IntelliJ
### UltimateAdvancementGenerator
Released the new version of [UltimateAdvancementGenerator](https://generator.devheim.space/), the official generator for UltimateAdvancementAPI:
- New UI and improved user experience
- Supports both 2.X.X and 3.0.0-beta versions
- To migrate, download the JSON data from the [old generator](https://escanortargaryen.dev/UltimateAdvancementGenerator/), log in on the [new one](https://generator.devheim.space/) and import it into a new project
- You can now manage multiple projects using your Google account
- Export your projects as JSON to easily share them with your collaborators
- Easily insert color codes with the new widget in titles and descriptions
- Other fixes and improvements
- The tool is still in **BETA**, please report bugs and wanted features on [GitHub](https://github.com/frengor/UltimateAdvancementAPI/issues)
- Added support for Minecraft 26.2 (by [@Ariouz](https://github.com/Ariouz))
- Updated CommandAPI to 12.0.0
- Updated Libby to 1.3.2
- SQLite database is now [vacuumed](https://sqlite.org/lang_vacuum.html) at startup, optimizing the database file and reducing its disk space
- Unused imports are now checked at compile time
- The project now uses .editorconfig
- Added project icon for IntelliJ
### UltimateAdvancementGenerator
Released the new version of [UltimateAdvancementGenerator](https://generator.devheim.space/), the official generator for UltimateAdvancementAPI:
- New UI and improved user experience
- Supports both 2.X.X and 3.0.0-beta versions
- To migrate, download the JSON data from the [old generator](https://escanortargaryen.dev/UltimateAdvancementGenerator/), log in on the [new one](https://generator.devheim.space/) and import it into a new project
- You can now manage multiple projects using your Google account
- Export your projects as JSON to easily share them with your collaborators
- Easily insert color codes with the new widget in titles and descriptions
- Other fixes and improvements
- The tool is still in **BETA**, please report bugs and wanted features on [GitHub](https://github.com/frengor/UltimateAdvancementAPI/issues)
- Added support for Minecraft 26.1.2
- Updated CommandAPI to 11.2.0
- Renamed the
mojang-mappedclassifier tomojang-mapped-legacy. Starting from 26.1, both Spigot and Paper are Mojang mapped, so we now consider these versions as legacy, since they are only useful on (Mojang mapped) Paper 1.18-1.21.11 servers. - Minor improvements
- Added support for Minecraft 26.1.2
- Updated CommandAPI to 11.2.0
- Renamed the
mojang-mappedclassifier tomojang-mapped-legacy. Starting from 26.1, both Spigot and Paper are Mojang mapped, so we now consider these versions as legacy, since they are only useful on (Mojang mapped) Paper 1.18-1.21.11 servers. - Minor improvements
- Updated Java version to 17
- Advancement displays overhaul to allow, for example, multi-language or the usage of placeholders in displays:
- Advancement displays are now abstract classes and use
BaseComponents by default - Now there are three kinds of displays:
- Immutable (
AbstractImmutableAdvancementDisplay), which always returns the same values from the same methods (i.e., display properties never change) - Per-player (
AbstractPerTeamAdvancementDisplay), which provides customized values for each player - Per-team (
AbstractPerTeamAdvancementDisplay), which provides customized values for each team - Advancement constructors now accept an
AbstractAdvancementDisplayinstead ofAdvancementDisplay - The
AdvancementDisplayclass is now an immutable display and can be constructed exclusively using the builder - Announcement messages now employ a system similar to advancement visibilities. For more information, see
IAnnouncementMessage - Announcement messages are now customizable per-player
- Tab icon, background and title are now customizable (even per-player and per-team) and independent from the root advancement
- On advancement grant, toasts are now shown to every online team member by default. Use
AdvancementTab.setShowToastToTeamto send toasts only to the player who completed the advancement - On advancement grant, announcement messages can be shown only to team members by using
AdvancementTab.setSendAnnouncementMessageOnlyToTeam. By default, announcement messages are sent to every online player - Renamed
UltimateAdvancementAPI.updatePlayertoupdateAdvancementsToTeam - Removed deprecated methods
- Added more team management methods in
UltimateAdvancementAPIclass: createNewTeamWithOneLoadingRequestloadAndAddLoadingRequestaddLoadingRequestremoveLoadingRequestsetTeamPermanentisTeamPermanentgetPermanentTeams- Renamed
UltimateAdvancementAPI.loadOfflinePlayertoloadAndAddLoadingRequest - Renamed
UltimateAdvancementAPI.unloadOfflinePlayertoremoveLoadingRequest - Removed
CacheFreeingOption,ObjectResultandResultclasses - Reworked
MultiTasksAdvancementandTaskAdvancement - Make advancement constructors more coherent
- Added
AdvancementGrantedEvent - Fixed
AdvancementTab.showtabsometimes being ignored - Refactored the advancement granting procedure
- Reserved a prefix for namespaces and keys for internal use. For more information, see
AdvancementKey.RESERVED_NAMESPACE_PREFIXandAdvancementKey.RESERVED_KEY_PREFIX - Replace callbacks in
UltimateAdvancementAPIclass withCompletableFutures
- Massively improved the
DatabaseManager - Use MockBukkit for tests
- Added more tests
For more details, refer to the [Javadoc](https://frengor.com/javadocs/UltimateAdvancementAPI/3.0.0-beta-1/) or contact us on Discord. The Wiki will be updated with the 3.0.0 official release.
- Updated to Minecraft 1.21.11
- Updated CommandAPI to 11.1.0
- Commands do not fail anymore if an advancement method throws
UnsupportedOperationException.UnsupportedOperationExceptionis thrown when granting or revoking some advancements (likeFakeAdvancements), usually when they are not saved in the database. Now, when anUnsupportedOperationExceptionis thrown, the advancement is simply ignored instead of failing the command execution
- Refactored commands implementation
- Replaced usages of (the deprecated)
PlayerLoginEventon Paper 1.21.7+ - Fixed SQLite not working on 1.15-1.17.1
- Minor fixes and improvements
- Added support for Minecraft 1.21.9 and 1.21.10
- Updated CommandAPI to 11.0.0
- Updated ConfigUpdater to 2.2
TeamLoadEventmay now provide an invalidTeamProgression, fixing a rareIllegalArgumentException.TeamLoadEventhas been deprecated for removal since 2.2.0, it is recommended to useAsyncTeamLoadEventinstead
- Added support for Minecraft 1.21.8 (by [@NickCloudAT](https://github.com/NickCloudAT))
- Updated CommandAPI to 10.1.2 (by [@NickCloudAT](https://github.com/NickCloudAT))
- Vanilla recipe advancements are now disabled separately from vanilla advancements (by [@Hydrolien](https://github.com/HydrolienF)). Vanilla recipe advancements can be disabled using the new
disable-vanilla-recipe-advancementsconfig option or using theUltimateAdvancementAPI#disableVanillaRecipeAdvancements()method.
- Added config updater
- Added disabled vanilla recipe advancements to bStats
- Added support for Minecraft 1.21.6 and 1.21.7
- Updated CommandAPI to 10.1.1
- Fixed a rare stack overflow error when enabling commands
- Updated CommandAPI to 10.0.1
- Added support for Minecraft 1.21.5
- Updated CommandAPI to 10.0.0
- Updated bStats to 3.1.0
- Added support for custom database implementations in the shaded version (by [CrazyDev05](https://github.com/CrazyDev05)). See [
AdvancementMain#enable(...)](https://frengor.com/javadocs/UltimateAdvancementAPI/2.5.0/com/fren_gor/ultimateAdvancementAPI/AdvancementMain.html#enable(java.util.concurrent.Callable)) javadoc for more information - Improved config comments
- Reworked database initialization
- Added support for Minecraft 1.21.4
- Updated CommandAPI to 9.7.0
- Fixed hex color codes not working in 1.20.3-1.20.6
- Added constructors taking a
BaseComponenttoAdvancementDisplayWrapper(by [CrazyDev05](https://github.com/CrazyDev05))
- Added support for Minecraft 1.21.3
- Updated CommandAPI to 9.6.1
- Updated HikariCP to 5.1.0
- Minor fixes and improvements
- Added support for Minecraft 1.21.1
- Updated CommandAPI to 9.5.3
- Added support for Minecraft 1.21
- Updated CommandAPI to 9.5.1
- Added support for hex color codes in titles and descriptions (for example using BungeeCord's
ChatColor.of(new Color(0, 0, 0))) - Commands now use the
ultimateadvancementapinamespace (only for 1.17+)
- Fixed a SQLite related bug
- Added support for Minecraft 1.20.6
- Added support for Mojang mapped servers: if you're running a Mojang mapped server you should download the
Mojang-Mappedjar instead of the normal one. If you're shading, just add<classifier>mojang-mapped</classifier>to the UltimateAdvancementAPI dependency. For more information, see the [wiki](https://github.com/frengor/UltimateAdvancementAPI/wiki/Shadeable-Version) - Refactored the Maven structure of the project to support Mojang mapped jars
- Added
load: STARTUPto theplugin.ymlof the plugin version - Updated CommandAPI to 9.5.0-SNAPSHOT
- Updated Libby to 1.3.0
- Minor improvements and fixes
- Added support for 1.20.3 and 1.20.4
- Updated CommandAPI to 9.3.0
- Fix
NullPointerExceptionon player join on 1.20.2 - Now
PlayerLoadingCompletedEventandPlayerLoadingFailedEventare always called afterPlayerJoinEvent
- Added support for 1.20.2
- Updated CommandAPI to 9.2.0
- Fixed a bug where, when loading on an unsupported server version, an error was printed to the console instead of the nicer message that was supposed to be printed
- Added support for 1.20.1
- Updated CommandAPI to 9.0.3 (by [dandan2611](https://github.com/dandan2611))
- The plugin version of the API now doesn't crash anymore when it fails to load or enable commands
- Added support for 1.20
- Updated CommandAPI to 9.0.2
- Fix
SQLException: Generated keys not requestedwhen usingmovePlayerInNewTeam(...)on MySQL
- Added support for 1.19.4
- Updated CommandAPI to 8.8.0
- Added support for 1.19.3
- Updated CommandAPI to 8.7.1
- Fixed AdvancementKey#VALID_ADVANCEMENT_KEY and AdvancementKey#VALID_KEY patterns. Now they recognize keys correctly
- Added support for 1.19.2
- Updated CommandAPI to 8.5.1
- Added support for 1.19
- Advancements updates are now sent maximum one time per tick to avoid sending useless packets
- The method AdvancementTab#updateEveryAdvancement has been deprecated, use AdvancementTab#updateAdvancementsToTeam instead
- The following utility methods has been added to the AdvancementTab class:
- automaticallyShowToPlayers, which automatically shows this tab to every player just after they have been loaded
- automaticallyGrantRootAdvancement, which automatically grants the root advancement of the tab to every player after they have been loaded
- registerEvent, which registers an event into the EventManager of the tab
- Added the following events:
- AsyncTeamLoadEvent
- AsyncTeamUnloadEvent
- AsyncTeamUpdateEvent
- AsyncPlayerUnregisteredEvent
- Deprecated for removal (in the next versions) the following events:
- TeamLoadEvent (use AsyncTeamLoadEvent instead)
- TeamUnloadEvent (use AsyncTeamUnloadEvent instead)
- TeamUpdateEvent (use AsyncTeamUpdateEvent instead)
- Updated CommandAPI to 8.3.1
- The CHANGELOG file has been added on GitHub
- Jenkins workspace is now cleaned after every successful build
- The NOTICE file has been updated since UltimateAdvancementAPI is licensed under LGPL but it was containing GPL instead
- Fixed IllegalArgumentException thrown when AdvancementTab#hideTab(Player) is called with a player who hasn't the tab shown
