Помогите Выявление и запись топ-3 игроков из Scoreboard

Статус
Закрыто для дальнейших ответов.

GigiGgJBIRE

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Moda84
Здравствуйте, пишу плагин на выдачу очков в ScoreBoard за голосование.
Нужно, чтобы первого числа:
1. Топ-3 игрокам давалась валюта
2. Топ-3 игроки записывались в конфиг
Выдачу я умею делать, запись в конфиг тоже я не могу получить топ-3.
Банально не могу понять как взять из списка топ-3 игроков и выписать их.
Если кто разбирается, помогите.
 
Вроде так
Код:
Map<Player, Integer> map = /* YOUR TOP */;
Set<Player> playersSet = map.keySet();
List<Player> players = new ArrayList<Player>();
for (Player player : playersSet) players.add(player);

players.sort(new Comparator<Player>() {

    @Override
    public int compare(Player o1, Player o2) {
        return map.get(o1)-map.get(o2);
    }
});
Player top1 = players.get(0);
Player top2 = players.get(1);
Player top3 = players.get(2);
 
Вроде так
Код:
Map<Player, Integer> map = /* YOUR TOP */;
Set<Player> playersSet = map.keySet();
List<Player> players = new ArrayList<Player>();
for (Player player : playersSet) players.add(player);

players.sort(new Comparator<Player>() {

    @Override
    public int compare(Player o1, Player o2) {
        return map.get(o1)-map.get(o2);
    }
});
Player top1 = players.get(0);
Player top2 = players.get(1);
Player top3 = players.get(2);
Это классно, а "YOUR TOP" откуда брать, разрешите спросить?
 
так как Scoreboard не возвращает Map<Player, Integer>
 
ок, разобрался в mapе, вроде как
 
Вроде так
Код:
Map<Player, Integer> map = /* YOUR TOP */;
Set<Player> playersSet = map.keySet();
List<Player> players = new ArrayList<Player>();
for (Player player : playersSet) players.add(player);

players.sort(new Comparator<Player>() {

    @Override
    public int compare(Player o1, Player o2) {
        return map.get(o1)-map.get(o2);
    }
});
Player top1 = players.get(0);
Player top2 = players.get(1);
Player top3 = players.get(2);
Возможно, я не прав, но есть подозрения, что не будет работать.

1. Map не гарантирует хранение данных в каком-то порядке. Поэтому для начала нужно из него взять топ 3 значения. А чтобы это сделать - нужно его отсортировать. А отсортировать можно с помощью TreeMap, в который нужно передать компаратор.

2. Цикл, который ты предложил можно заменить на более красивый код))
Код:
List<String> players = new ArrayList<>(playersSet);
 
Возможно, я не прав, но есть подозрения, что не будет работать.

1. Map не гарантирует хранение данных в каком-то порядке. Поэтому для начала нужно из него взять топ 3 значения. А чтобы это сделать - нужно его отсортировать. А отсортировать можно с помощью TreeMap, в который нужно передать компаратор.

2. Цикл, который ты предложил можно заменить на более красивый код))
Код:
List<String> players = new ArrayList<>(playersSet);
Не знал спасибо за подсказку
 
Не знал спасибо за подсказку
А можете мне теперь помочь))
Что-то я вообще не вдупляю, видимо рано в это полез, но есть идеи, что делать?
А точнее, как код должен выглядеть?
Мои кривые ручки написали вот это

Код:
List<Player> players = null;
            for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
                Map mapA = new HashMap();
                mapA.put(op.getPlayer(), sb.getScores(op));
                Map<Player, Integer> map = mapA;
                Set<Player> playersSet = map.keySet();
                players = new ArrayList<Player>();
                for (Player player : playersSet) {
                players.add(player);
                }
                players.sort(new Comparator<Player>() {
                    @Override
                    public int compare(Player o1, Player o2) {
                        return map.get(o1)-map.get(o2);
                    }
                });
            }
            if (players != null) {
                Player top1 = players.get(0);
                Player top2 = players.get(1);
                Player top3 = players.get(2);
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"say ВСЁ РАБОТАЕТ, АНДРЮХА " + top1.getName() + top2.getName() + top3.getName());
                tops.set(date.getMonth()+": TOP 1:", top1.getName());
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top1.getName()+" 10");
                tops.set(date.getMonth()+": TOP 2:", top2.getName());
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top2.getName()+" 7");
                tops.set(date.getMonth()+": TOP 3:", top3.getName());
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top3.getName()+" 5");
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"say ВСЁ РАБОТАЕТ, АНДРЮХА");
                try {
                    tops.save(top);
                } catch (IOException ex) {
                    Logger.getLogger(mwscoreboard.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
                sb.resetScores(op);
            }
Но консоль выдаёт ошибку ссылаясь на Player top2 = players.get(1);
 
Новая версия:
Код:
List<Player> players = null;
            for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
                Map mapA = new HashMap();
                mapA.put(op.getPlayer(), sb.getScores(op));
                Map<Player, Integer> map = mapA;
                Set<Player> playersSet = map.keySet();
                players = new ArrayList<>(playersSet);
                for (Player player : playersSet) {
                players.add(player);
                }
                players.sort(new Comparator<Player>() {
                    @Override
                    public int compare(Player o1, Player o2) {
                        return map.get(o1)-map.get(o2);
                    }
                });
            }
            if (players != null) {
                Player top1 = players.get(0);
                Player top2 = players.get(1);
                Player top3 = players.get(2);
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"say ВСЁ РАБОТАЕТ, АНДРЮХА " + top1.getName() + top2.getName() + top3.getName());
                tops.set(date.getMonth()+": TOP 1:", top1.getName());
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top1.getName()+" 10");
                tops.set(date.getMonth()+": TOP 2:", top2.getName());
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top2.getName()+" 7");
                tops.set(date.getMonth()+": TOP 3:", top3.getName());
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top3.getName()+" 5");
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"say ВСЁ РАБОТАЕТ, АНДРЮХА");
                try {
                    tops.save(top);
                } catch (IOException ex) {
                    Logger.getLogger(mwscoreboard.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
                sb.resetScores(op);
            }
Код:
[11:50:39 ERROR]: Error occurred while enabling MWTop v0.1.13 (Is it up to date?)
java.lang.ClassCastException: class com.google.common.collect.SingletonImmutableSet cannot be cast to class java.lang.Integer (com.google.common.collect.SingletonImmutableSet is in unnamed module of loader java.net.URLClassLoader @759ebb3d; java.lang.Integer is in module java.base of loader 'bootstrap')
        at moda84.mwscoreboard$1.compare(mwscoreboard.java:108) ~[MWScoreboard.jar:?]
        at moda84.mwscoreboard$1.compare(mwscoreboard.java:105) ~[MWScoreboard.jar:?]
        at java.util.TimSort.countRunAndMakeAscending(TimSort.java:355) ~[?:?]
        at java.util.TimSort.sort(TimSort.java:220) ~[?:?]
        at java.util.Arrays.sort(Arrays.java:1307) ~[?:?]
        at java.util.ArrayList.sort(ArrayList.java:1721) ~[?:?]
        at moda84.mwscoreboard.onEnable(mwscoreboard.java:105) ~[MWScoreboard.jar:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:501) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.enablePlugin(CraftServer.java:559) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.enablePlugins(CraftServer.java:473) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.reload(CraftServer.java:1018) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at org.bukkit.Bukkit.reload(Bukkit.java:897) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:54) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:172) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.dispatchCommand(CraftServer.java:905) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.dispatchServerCommand(CraftServer.java:868) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.dedicated.DedicatedServer.handleConsoleInputs(DedicatedServer.java:549) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:523) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1485) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1248) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:322) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
[11:50:39 INFO]: [MWTop] Disabling MWTop v0.1.13
105 строка: players.sort(new Comparator<Player>() {
108 строка: return map.get(o1)-map.get(o2);
 
Ты просто пробуешь превратить мапу - Map<Object, Object> в Map<Player, Integer> поэтому оно и не работает


это убери
Код:
List<Player> players = null;
            
                Map<Player, Integer> map = new HashMap<>();
                Set<Player> playersSet = map.keySet();
                players = new ArrayList<>(playersSet);
                
                players.sort(new Comparator<Player>() {
                    @Override
                    public int compare(Player o1, Player o2) {
                        return map.get(o1)-map.get(o2);
                    }
                });
                Player top1 = players.get(0);
                Player top2 = players.get(1);
                Player top3 = players.get(2);
                log1.info("say ВСЁ РАБОТАЕТ, АНДРЮХА " + top1 + top2 + top3);
                tops.set(date.getMonth()+": TOP 1:", top1);
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top1.getName()+" 10");
                tops.set(date.getMonth()+": TOP 2:", top2);
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top2.getName()+" 7");
                tops.set(date.getMonth()+": TOP 3:", top3);
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top3.getName()+" 5");
                log1.info("say ВСЁ РАБОТАЕТ, АНДРЮХА");
                try {
                    tops.save(top);
                } catch (IOException ex) {
                    Logger.getLogger(mwscoreboard.class.getName()).log(Level.SEVERE, null, ex);
                }
            for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
                sb.resetScores(op);
            }

Код:
[12:24:18 ERROR]: Error occurred while enabling MWTop v0.1.17 (Is it up to date?)
java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
        at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) ~[?:?]
        at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) ~[?:?]
        at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) ~[?:?]
        at java.util.Objects.checkIndex(Objects.java:359) ~[?:?]
        at java.util.ArrayList.get(ArrayList.java:427) ~[?:?]
        at moda84.mwscoreboard.onEnable(mwscoreboard.java:116) ~[MWScoreboard.jar:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:501) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.enablePlugin(CraftServer.java:559) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.enablePlugins(CraftServer.java:473) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.reload(CraftServer.java:1018) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at org.bukkit.Bukkit.reload(Bukkit.java:897) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:54) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:172) ~[purpur-api-1.18.2-R0.1-SNAPSHOT.jar:?]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.dispatchCommand(CraftServer.java:905) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at org.bukkit.craftbukkit.v1_18_R2.CraftServer.dispatchServerCommand(CraftServer.java:868) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.dedicated.DedicatedServer.handleConsoleInputs(DedicatedServer.java:549) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.dedicated.DedicatedServer.tickChildren(DedicatedServer.java:523) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1485) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1248) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at net.minecraft.server.MinecraftServer.lambda$spin$1(MinecraftServer.java:322) ~[purpur-1.18.2.jar:git-Purpur-1579]
        at java.lang.Thread.run(Thread.java:833) ~[?:?]
[12:24:18 INFO]: [MWTop] Disabling MWTop v0.1.17

116 строка: Player top1 = players.get(0);
 
Ему не откуда брать Player и поэтому топ-1 не существует
 
for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){ Map mapA = new HashMap(); mapA.put(op.getPlayer(), sb.getScores(op));
вот например как здесь но не в не цикла
Код:
Map<Player, Integer> map = new HashMap<>();
for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
    map.put(op.getPlayer(), sb.getScores(op));
}
Set<Player> playersSet = map.keySet();
List<Player> players = new ArrayList<>(playersSet);
             
players.sort(new Comparator<Player>() {
    @Override
    public int compare(Player o1, Player o2) {
        return map.get(o1)-map.get(o2);
    }
);
Player top1 = players.get(0);
Player top2 = players.get(1);
Player top3 = players.get(2);
 
вот например как здесь но не в не цикла
Код:
Map<Player, Integer> map = new HashMap<>();
for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
    map.put(op.getPlayer(), sb.getScores(op));
}
Set<Player> playersSet = map.keySet();
List<Player> players = new ArrayList<>(playersSet);
            
players.sort(new Comparator<Player>() {
    @Override
    public int compare(Player o1, Player o2) {
        return map.get(o1)-map.get(o2);
    }
);
Player top1 = players.get(0);
Player top2 = players.get(1);
Player top3 = players.get(2);
Можем мы связаться в дискорд?
Хотябы переписка moda84#6997
 
Для тех кто будет искать подобную тему, вот код:
Проблема была в том, что вызывался Player, а не OfflinePlayer
Objective obj = sb.getObjective(DisplaySlot.SIDEBAR);
int year = (date.getYear()-100)+2000;

Код:
                Map<OfflinePlayer, Integer> map = new HashMap();
                for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
                    map.put(op, obj.getScore(op).getScore());
                }
                Set<OfflinePlayer> playersSet = map.keySet();
                List<OfflinePlayer> players = new ArrayList<>(playersSet);
                players.sort(new Comparator<OfflinePlayer>() {
                    @Override
                    public int compare(OfflinePlayer o1, OfflinePlayer o2) {
                        return map.get(o2)-map.get(o1);
                    }
                });
                String top1 = players.get(0).getName();
                String top2 = players.get(1).getName();
                String top3 = players.get(2).getName();
                int month = date.getMonth()+1;
                tops.set(month+"."+year+" TOP 1:", top1);
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top1+" 10");
                tops.set(month+"."+year+" TOP 2:", top2);
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top2+" 7");
                tops.set(month+"."+year+" TOP 3:", top3);
                Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),"mwc add "+top3+" 5");
                try {
                    tops.save(top);
                } catch (IOException ex) {
                    Logger.getLogger(mwscoreboard.class.getName()).log(Level.SEVERE, null, ex);
                }
                for (OfflinePlayer op : getServer().getScoreboardManager().getMainScoreboard().getPlayers()){
                    sb.resetScores(op);
                }
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх