Bukkit PlayerPoints 排行榜插件 (Java)
以下是一个使用 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 插件添加到您的项目依赖中。
原文地址: https://www.cveoy.top/t/topic/ppVz 著作权归作者所有。请勿转载和采集!