Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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 таким: Доступен: нет, в ином случае выводим Доступен: да. Подскажите, пожалуйста, что я неправильно делаю? И как правильно обновлять скорборд?
 
Всем привет! Есть код, где проверяется переменная 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 таким: Доступен: нет, в ином случае выводим Доступен: да. Подскажите, пожалуйста, что я неправильно делаю? И как правильно обновлять скорборд?
https://www.spigotmc.org/wiki/making-scoreboard-with-teams-no-flicker/
 
Ты создаешь 2 разных переменные. По логике у тебя должно быть две строчки:
Доступен: да 3
Доступен: нет 3
 
Ты создаешь 2 разных переменные. По логике у тебя должно быть две строчки:
Доступен: да 3
Доступен: нет 3
В каком смысле 2 разные переменные? Мне нужно, чтобы строка (скор 3) менялся в игре, если isReady равна значению true.
 
1) Почему ты при входе конкретного игрока запускается таймер, обновляющий скорборд всем игрокам?
У тебя 10 игроков вошло - 10 таймеров запустилось, так быть не должно.

2) Для чего тебе проверка "if (!Main.getInstance().isReady)", если тебе нужно обновлять скорборд независимо от состояния этой переменной?
 
1) Почему ты при входе конкретного игрока запускается таймер, обновляющий скорборд всем игрокам?
У тебя 10 игроков вошло - 10 таймеров запустилось, так быть не должно.

2) Для чего тебе проверка "if (!Main.getInstance().isReady)", если тебе нужно обновлять скорборд независимо от состояния этой переменной?
1) По поводу этого, то это я делал, надеясь на то, что скорборд будет обновляться :lol:
2) Проверка на "if (!Main.getInstance().isReady)" нужна, чтобы понять менять ли нам сообщение: с "Доступен: да" на "Доступен: нет". То есть если значение переменное false, то соответственно и в скорборде мы будем выводить нет, а если значение true, то выводить будем да.
 
1) По поводу этого, то это я делал, надеясь на то, что скорборд будет обновляться :lol:
2) Проверка на "if (!Main.getInstance().isReady)" нужна, чтобы понять менять ли нам сообщение: с "Доступен: да" на "Доступен: нет". То есть если значение переменное false, то соответственно и в скорборде мы будем выводить нет, а если значение true, то выводить будем да.
То есть, тебе нужно, чтобы когда значение переменной было true выводить строку да, когда значение будет false, то выводить строку нет? Я правильно понимаю?
 
String yourString = Main.getInstance().isReady() ? "Да" : "Нет"
Можно упростить, если проверка нужна только для изменения строки
 
String yourString = Main.getInstance().isReady() ? "Да" : "Нет"
Можно упростить, если проверка нужна только для изменения строки
Да, проверка нужна только для изменения строк. За код выше спасибо, попробую, отпишусь.
 
Да, проверка нужна только для изменения строк. За код выше спасибо, попробую, отпишусь.
Подскажите, пожалуйста, как мне обновлять сам скорборд, например каждую секунду?
Код:
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);
        }
    }
}
 
Последнее редактирование:
Код:
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);
    }
}
Сделал так, но скорборд не обновляется.
 
Код:
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);
    }
}
Сделал так, но скорборд не обновляется.
Потому что ты каждую секунду устанавливаешь один и тот же скорборд
 
Потому что ты каждую секунду устанавливаешь один и тот же скорборд
Сделал так, но ситуация та же.
Код:
        Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.getInstance(), () -> {
            for (Player player1 : Bukkit.getOnlinePlayers()) {
                board.resetScores(player1);
            }
        }, 0L, 20L);
    }
}
 
Код:
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);
    }
}
Сделал так, но скорборд не обновляется.
И запускай шедулер не при входе игрока, а при запуске плагина
 

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

Назад
Верх