以下是一个使用 Java 编写的 Bukkit 插件,基于 PlayerPoints 的玩家排行榜:

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.player.Stat;
import com.gmail.nossr50.util.player.UserManager;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class PlayerPointsLeaderboard extends JavaPlugin {

    private HashMap<String, Integer> leaderboard;

    @Override
    public void onEnable() {
        leaderboard = new HashMap<>();

        // 在启用插件时加载排行榜
        loadLeaderboard();

        // 注册一个命令来查看排行榜
        getCommand("leaderboard").setExecutor((sender, command, label, args) -> {
            if (args.length == 0) {
                // 没有指定页数,默认显示第一页
                displayLeaderboard(sender, 1);
            } else {
                try {
                    int page = Integer.parseInt(args[0]);
                    displayLeaderboard(sender, page);
                } catch (NumberFormatException e) {
                    sender.sendMessage("Invalid page number!");
                }
            }
            return true;
        });
    }

    @Override
    public void onDisable() {
        // 在禁用插件时保存排行榜
        saveLeaderboard();
    }

    private void loadLeaderboard() {
        // 加载所有玩家的 PlayerPoints
        UserManager userManager = UserManager.getInstance();
        for (PlayerProfile playerProfile : userManager.getAllProfiles()) {
            int points = playerProfile.getStat(Stat.POINTS);
            leaderboard.put(playerProfile.getName(), points);
        }
    }

    private void saveLeaderboard() {
        // 保存排行榜内容
        // 这里可以将 leaderboard 保存到文件或者数据库中
    }

    private void displayLeaderboard(Player player, int page) {
        int pageSize = 10; // 每页显示 10 个玩家

        // 将 leaderboard 按照分数从高到低排序
        LinkedHashMap<String, Integer> sortedLeaderboard = leaderboard.entrySet().stream()
                .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                        (oldValue, newValue) -> oldValue, LinkedHashMap::new));

        int totalPages = (int) Math.ceil(sortedLeaderboard.size() / (double) pageSize);

        if (page < 1 || page > totalPages) {
            player.sendMessage("Invalid page number!");
            return;
        }

        player.sendMessage("PlayerPoints Leaderboard - Page " + page + "\/" + totalPages);

        int startIndex = (page - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, sortedLeaderboard.size());

        int rank = startIndex + 1;
        for (Map.Entry<String, Integer> entry : sortedLeaderboard.entrySet()) {
            if (rank > endIndex) {
                break;
            }
            player.sendMessage(rank + ". " + entry.getKey() + " - " + entry.getValue() + " points");
            rank++;
        }
    }
}

此插件将在启用时加载所有玩家的 PlayerPoints,并在禁用时保存排行榜。它还注册了一个名为 "/leaderboard" 的命令,用于查看排行榜。您可以根据需要进行修改和扩展。请确保将此插件与 PlayerPoints 插件一起使用,并将 PlayerPoints 插件添加到您的项目依赖中。

Bukkit PlayerPoints 排行榜插件 (Java)

原文地址: https://www.cveoy.top/t/topic/ppVz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录