简体   繁体   中英

Bukkit Player check achievements

I don't know what I should put into player.getAdvancementProgress(Here).

if (player.getAdvancementProgress().isDone()) {

}

Maybe someone knows something?

You should use an Advancement object, specially the advancement that you are looking for informations.

You can get it with Bukkit.getAdvancement(NamespacedKey.fromString("advancement/name")) where advancement/name can be nether/all_potions for example. You can get all here (column: "Resource location). If you are getting it from command, I suggest you to add tab complete.

Example of TAB that show only not-done success:

@Override
public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] arg) {
    List<String> list = new ArrayList<>();
    if(!(sender instanceof Player))
        return list;
    Player p = (Player) sender;
    String prefix = arg[arg.length - 1].toLowerCase(Locale.ROOT); // the begin of the searched advancement
    Bukkit.advancementIterator().forEachRemaining((a) -> {
        AdvancementProgress ap = p.getAdvancementProgress(a);
        if((prefix.isEmpty() || a.getKey().getKey().toLowerCase().startsWith(prefix)) && !ap.isDone() && !a.getKey().getKey().startsWith("recipes"))
            list.add(a.getKey().getKey());
    });
    return list;
}

Then, in the command you can do like that:

@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] arg) {
    if(!(sender instanceof Player)) // not allowed for no-player
        return false;
    Player p = (Player) sender;
    // firstly: try to get advancement
    Advancement a = Bukkit.getAdvancement(NamespacedKey.fromString(arg[0]));
    if(a == null)
        a = Bukkit.getAdvancement(NamespacedKey.minecraft(arg[0]));
    if(a == null) // can't find it
        p.sendMessage(ChatColor.RED + "Failed to find success " + arg[0]);
    else { // founded :
        AdvancementProgress ap = p.getAdvancementProgress(a);
        p.sendMessage(ChatColor.GREEN + "Achivement " + a.getKey().getKey() + " stay: " + ChatColor.YELLOW + String.join(", ", ap.getRemainingCriteria().stream().map(this::getCleaned).collect(Collectors.toList())));
    }
    return false;
}
    
private String getCleaned(String s) { // this method is only to make content easier to read
    String[] args = s.split("/");
    return args[args.length - 1].replace(".png", "").replace(".jpg", "").replace("minecraft:", "").replace("_", " ");
}

Else, if you want to get all advancements, you should use Bukkit.advancementIterator() .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM