5.0.0
CommandsAPI v5.0.0
π¨ Breaking Changes
- Repository Migration: JitPack β
repo.groupez.dev - GroupId Change:
com.github.Traqueur-dev.CommandsAPIβfr.traqueur.commands - Java 21 Required
- Removed deprecated
getAsInt(),getAsDouble()methods β Useargs.<T>get()orargs.<T>getOptional()
β¨ New Features
Annotations Addon
New optional module for declarative command definition using annotations.
@CommandContainer public class MyCommands {@Command(name = "heal", permission = "admin.heal") @Alias({"h", "health"}) public void heal(Player sender, @Arg("target") Optional<Player> target) { Player toHeal = target.orElse(sender); toHeal.setHealth(20); } @Command(name = "admin.reload") // Hierarchical via dot notation public void reload(CommandSender sender) { } @TabComplete(command = "heal", arg = "target") public List<String> completeTarget(Player sender, String current) { return Bukkit.getOnlinePlayers().stream() .map(Player::getName) .filter(n -> n.startsWith(current)) .toList(); }
}
Annotations: @CommandContainer, @Command, @Arg, @Infinite, @Alias, @TabComplete
CommandBuilder - Fluent API
Create commands without subclassing:
manager.command("hello")
.description("Say hello")
.permission("myplugin.hello")
.arg("player", Player.class)
.optionalArg("message", String.class)
.executor((sender, args) -> {
Player target = args.get("player");
sender.sendMessage("Hello " + target.getName());
})
.register();
SenderResolver
Automatic sender type resolution for annotations. Each platform provides its own resolver:
- Bukkit:
CommandSender,Player,ConsoleCommandSender - Velocity:
CommandSource,Player,ConsoleCommandSource - JDA:
SlashCommandInteractionEvent,User,Member
ArgumentParser System
New extensible parsing system with typed error handling:
ParseResultwith success/error statesParseErrorwith types:MISSING_REQUIRED,TYPE_NOT_FOUND,CONVERSION_FAILED
β‘ Performance Improvements
- Player/OfflinePlayer argument caching - Tab completion cached with 1s/5s TTL
- CommandTree optimizations - Precompiled patterns, HashMap lookups
- Async version checker - Non-blocking update check with 5s timeout
π§ Improvements
- Sealed
ArgumentTypeinterface (Simple|Infinite) - Better label validation (max 64 chars/segment, max 10 depth)
- Improved Javadoc across all modules
- Code cleanup and formatting
π¦ Installation
<repository> <id>groupez-releases</id> <url>https://repo.groupez.dev/releases</url> </repository><dependency>
<groupId>fr.traqueur.commands</groupId>
<artifactId>platform-spigot</artifactId> <!-- or platform-velocity, platform-jda -->
<version>5.0.0</version>
</dependency>
<!-- Optional: Annotations Addon -->
<dependency>
<groupId>fr.traqueur.commands</groupId>
<artifactId>annotations-addon</artifactId>
<version>5.0.0</version>
</dependency>
repositories {
maven { url 'https://repo.groupez.dev/releases' }
}
dependencies {
implementation 'fr.traqueur.commands:platform-spigot:5.0.0'
implementation 'fr.traqueur.commands:annotations-addon:5.0.0' // Optional
}
π― 3 Ways to Create Commands
| Method | Style | Best For |
|---|---|---|
| Inheritance | extends Command<T,S> | Complex commands, full control |
| Builder | manager.command() | Quick inline commands |
| Annotations | @ Command | Clean, declarative style |
Full Changelog: See MIGRATION_v4_to_v5.md for detailed migration guide.
Full Changelog: 4.3.1...5.0.0