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

Помогите Как менять скор в скорборде?

Тема в разделе "Разработка плагинов для новичков", создана пользователем GoodPlayer, 30 май 2024.

  1. Автор темы
    GoodPlayer

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

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Всем привет! Есть код, где проверяется переменная boolean isReady на true и false. Не понимаю, почему скорборд не хочет обновляться. Код ниже не работает.
    Код:
    package ru.test.plugin.Boards;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Score;
    import org.bukkit.scoreboard.Scoreboard;
    import ru.test.plugin.Main;
    
    public class waiting implements Listener {
        private Scoreboard scoreboard;
        private Objective objective;
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            if (!Main.getInstance().isReady) {
                scoreboard = Bukkit.getScoreboardManager().getNewScoreboard();
                objective = scoreboard.registerNewObjective(ChatColor.AQUA + "Scoreboard", "dummy");
                objective.setDisplaySlot(DisplaySlot.SIDEBAR);
                Score score3 = objective.getScore(ChatColor.WHITE + "Доступен: " + ChatColor.RED+ "нет");
                score3.setScore(3);
                Bukkit.getScheduler().runTaskTimer(War.getInstance(), scoreboardUpdater, 0, 20);
                for (Player player : Bukkit.getOnlinePlayers()) {
                    player.setScoreboard(scoreboard);
                }
            }
        }
    
        private void updateScoreboard() {
            Score score3 = objective.getScore(ChatColor.WHITE + "Доступен: " + ChatColor.GREEN + "да");
            score3.setScore(3);
        }
        Runnable scoreboardUpdater = () -> {
            updateScoreboard();
        };
    }
    
    То есть, если переменная isReady равна false (!Main.getInstance().isReady), то тогда мы выводим score3 таким: Доступен: нет, в ином случае выводим Доступен: да. Подскажите, пожалуйста, что я неправильно делаю? И как правильно обновлять скорборд?
     
  2. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    https://www.spigotmc.org/wiki/making-scoreboard-with-teams-no-flicker/
     
  3. koten0k

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

    Баллы:
    46
    Ты создаешь 2 разных переменные. По логике у тебя должно быть две строчки:
    Доступен: да 3
    Доступен: нет 3
     
  4. Автор темы
    GoodPlayer

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

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    В каком смысле 2 разные переменные? Мне нужно, чтобы строка (скор 3) менялся в игре, если isReady равна значению true.
     
  5. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    1) Почему ты при входе конкретного игрока запускается таймер, обновляющий скорборд всем игрокам?
    У тебя 10 игроков вошло - 10 таймеров запустилось, так быть не должно.

    2) Для чего тебе проверка "if (!Main.getInstance().isReady)", если тебе нужно обновлять скорборд независимо от состояния этой переменной?
     
  6. Автор темы
    GoodPlayer

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

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    1) По поводу этого, то это я делал, надеясь на то, что скорборд будет обновляться :lol:
    2) Проверка на "if (!Main.getInstance().isReady)" нужна, чтобы понять менять ли нам сообщение: с "Доступен: да" на "Доступен: нет". То есть если значение переменное false, то соответственно и в скорборде мы будем выводить нет, а если значение true, то выводить будем да.
     
  7. BetterLex

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

    Баллы:
    76
    То есть, тебе нужно, чтобы когда значение переменной было true выводить строку да, когда значение будет false, то выводить строку нет? Я правильно понимаю?
     
  8. Автор темы
    GoodPlayer

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

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Да.
     
  9. Level132331

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

    Баллы:
    66
    String yourString = Main.getInstance().isReady() ? "Да" : "Нет"
    Можно упростить, если проверка нужна только для изменения строки
     
  10. Автор темы
    GoodPlayer

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

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Да, проверка нужна только для изменения строк. За код выше спасибо, попробую, отпишусь.
     
  11. Автор темы
    GoodPlayer

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

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Подскажите, пожалуйста, как мне обновлять сам скорборд, например каждую секунду?
    Код:
    public class board implements Listener {
        private Scoreboard board;
        private Objective objective;
        public String STATUS = War.getInstance().isReady ? "Да" : "Нет";
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            board = Bukkit.getScoreboardManager().getNewScoreboard();
            objective = board.registerNewObjective("Scoreboard", "dummy");
            objective.setDisplaySlot(DisplaySlot.SIDEBAR);
            Score score1 = objective.getScore(STATUS);
            score1.setScore(1);
            for (Player player : Bukkit.getOnlinePlayers()) {
                player.setScoreboard(board);
            }
        }
    }
     
    Последнее редактирование: 1 июн 2024
  12. Level132331

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

    Баллы:
    66
    Шедулеры
     
  13. Автор темы
    GoodPlayer

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

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Код:
    public class board implements Listener {
        private Scoreboard board;
        private Objective objective;
        public String STATUS = Main.getInstance().isReady ? "Да" : "Нет";
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            board = Bukkit.getScoreboardManager().getNewScoreboard();
            objective = board.registerNewObjective("Scoreboard", "dummy");
            objective.setDisplaySlot(DisplaySlot.SIDEBAR);
            Score score1 = objective.getScore(STATUS);
            score1.setScore(1);
            Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () -> {
                for (Player player : Bukkit.getOnlinePlayers()) {
                    player.setScoreboard(board);
                }
            }, 0L, 20L);
        }
    }
    Сделал так, но скорборд не обновляется.
     
  14. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
    Потому что ты каждую секунду устанавливаешь один и тот же скорборд
     
  15. Автор темы
    GoodPlayer

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

    Баллы:
    66
    Имя в Minecraft:
    GoodPlayer
    Сделал так, но ситуация та же.
    Код:
            Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () -> {
                for (Player player1 : Bukkit.getOnlinePlayers()) {
                    board.resetScores(player1);
                }
            }, 0L, 20L);
        }
    }
     
  16. mirrerror

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

    Баллы:
    76
    Имя в Minecraft:
    mirrerror
  17. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    И запускай шедулер не при входе игрока, а при запуске плагина
     

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