1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Помощь", создана пользователем GigiGgJBIRE, 14 апр 2022.

Метки:
Статус темы:
Закрыта.
  1. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    Здравствуйте, пишу плагин на выдачу очков в ScoreBoard за голосование.
    Нужно, чтобы первого числа:
    1. Топ-3 игрокам давалась валюта
    2. Топ-3 игроки записывались в конфиг
    Выдачу я умею делать, запись в конфиг тоже я не могу получить топ-3.
    Банально не могу понять как взять из списка топ-3 игроков и выписать их.
    Если кто разбирается, помогите.
     
  2. SashaBrine

    SashaBrine Активный участник Пользователь

    Баллы:
    76
    Вроде так
    Код:
    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);
     
  3. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    Это классно, а "YOUR TOP" откуда брать, разрешите спросить?
     
  4. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    так как Scoreboard не возвращает Map<Player, Integer>
     
  5. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    ок, разобрался в mapе, вроде как
     
  6. NuaN

    NuaN Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    NuaN
    Возможно, я не прав, но есть подозрения, что не будет работать.

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

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

    SashaBrine Активный участник Пользователь

    Баллы:
    76
    Не знал спасибо за подсказку
     
  8. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    А можете мне теперь помочь))
    Что-то я вообще не вдупляю, видимо рано в это полез, но есть идеи, что делать?
    А точнее, как код должен выглядеть?
    Мои кривые ручки написали вот это

    Код:
    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);
     
  9. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    Новая версия:
    Код:
    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);
     
  10. SashaBrine

    SashaBrine Активный участник Пользователь

    Баллы:
    76
    ну тут не так надо
    Код:
    Map<Player, Integer> map = new HashMap<>();
     
  11. SashaBrine

    SashaBrine Активный участник Пользователь

    Баллы:
    76
    Ты просто пробуешь превратить мапу - Map<Object, Object> в Map<Player, Integer> поэтому оно и не работает

    это убери
     
  12. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    Код:
    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);
     
  13. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    Ему не откуда брать Player и поэтому топ-1 не существует
     
  14. SashaBrine

    SashaBrine Активный участник Пользователь

    Баллы:
    76
    Да потому что мапа пустая и тебе её нужно собрать
    map.put();
     
  15. SashaBrine

    SashaBrine Активный участник Пользователь

    Баллы:
    76
    вот например как здесь но не в не цикла
    Код:
    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);
     
  16. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    Можем мы связаться в дискорд?
    Хотябы переписка moda84#6997
     
  17. SashaBrine

    SashaBrine Активный участник Пользователь

    Баллы:
    76
    Хорошо
     
  18. Автор темы
    GigiGgJBIRE

    GigiGgJBIRE Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Moda84
    Для тех кто будет искать подобную тему, вот код:
    Проблема была в том, что вызывался 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);
                    }
     
Статус темы:
Закрыта.

Поделиться этой страницей