[Tutorial/LIB] Создаем Scoreboard'ы

JustBlender

Старожил
Девелопер
Пользователь
Баллы
123
Имя в Minecraft
JustBlender
Всем привет! Сегодня я покажу вам, как создать Scoreboard! Это просто, давайте приступим:
PS. Это "библиотека" очень действительно удобна и проста, главное чтобы руки не росли из точки G :D
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

1. Что нам нужно это создать класс: рекомендую ISCOREAPI (Будет проще для нубиков-кубиков)
Код:
public class ISCOREAPI
{
/* ISCOREAPI by Firebreath15 v1.5
*
* Written for private use. Do not duplicate or republish.
*/
  Scoreboard board;
  Objective obj;

  public ISCOREAPI()
  {
    this.board = Bukkit.getScoreboardManager().getNewScoreboard();
  }

  public void setScoreboard(Player p) {
    this.board = p.getScoreboard();
    this.obj = this.board.getObjective(DisplaySlot.SIDEBAR);
  }

  public void createObjective(String name, String desc) {
    if (this.board.getObjective(name) == null) {
      this.obj = this.board.registerNewObjective(name, desc);
      this.obj.setDisplayName(name);
      this.obj.setDisplaySlot(DisplaySlot.SIDEBAR); // Вы можете сделать не только "таблицы", можно и сделать подсчет над головой, главное в DisplaySlot выберите другой вариант. Их существует несколько. Посмотрите на вики
    }
  }

  public void removeObjective(String obj) {
          if(board.getObjective(obj)!=null){
                  this.board.getObjective(obj).unregister();
          }
  }

  public void createTeam(String name) {
    if (this.board.getTeam(name) == null) {
      Team team = this.board.registerNewTeam(name);
      team.setDisplayName(name);
    }
  }

  public void removeTeam(String team) {
    this.board.getTeam(team).unregister();
  }

  public void addPlayerToTeam(String team, Player p) {
    this.board.getTeam(team).addPlayer(p);
  }

  public int getScores(OfflinePlayer p) {
    Score score = this.obj.getScore(p);
    return score.getScore();
  }

  public void setScore(OfflinePlayer p, int sc) {
    Score score = this.obj.getScore(p);
    score.setScore(sc);
  }

  public void removePlayerFromTeam(String team, Player p) {
          if(this.board.getTeam(team)!=null){
                  if(this.board.getTeam(team).hasPlayer(p)){
                          this.board.getTeam(team).removePlayer(p);
                  }
          }
  }

  public void refreshPlayerScoreboard(Player p) {
    p.setScoreboard(this.board);
  }

  public Scoreboard getPlayerScoreboard(Player p) {
    return p.getScoreboard();
  }

  public void removePlayerScoreboard(Player p) {
      board.getObjective(DisplaySlot.SIDEBAR).unregister();
  }

Вставляем это. Проблем быть не должно!

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
2. Регистрируем это в главном классе.

Код:
public class {MainClassName} extends JavaPlugin{

        public ISCOREAPI sapi;
А это в onEnable:
Код:
        public void onEnable(){
                sapi=new ISCOREAPI();
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
3. We're done!

Чтобы создать уже сам Scoreboard (Вот чего мы ждали)
Делаем так:
Код:
    ISCOREAPI api = new ISCOREAPI();
    api.createObjective(ChatColor.DARK_AQUA+"Тест", "Тест"); //Ваш заголовок
    api.createTeam("Player");
    api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED + "Красный"), 0);
    api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "Синий"),
    api.addPlayerToTeam("Player", p);
    api.refreshPlayerScoreboard(p);
Чтобы добавить "очко" "игроку":
(Не спрашивайте зачем нужны getOnlinePlayers())
Код:
        Player[] online = Bukkit.getServer().getOnlinePlayers();
        for (int i = 0; i < online.length; i++) {
                Player o = online[i];
                plugin.sapi.setScoreboard(o);
                int sc = plugin.sapi.getScores(Bukkit.getOfflinePlayer(ChatColor.RED+ "Красный"));
                plugin.sapi.setScore(Bukkit.getOfflinePlayer(ChatColor.RED+ "Красный"), sc + 1); //Присуждаем игроку 1 балл
Чтобы удалить таблицу совсем:
Код:
        ISCOREAPI api = new ISCOREAPI();
        api.setScoreboard(p);
        api.removePlayerFromTeam("Player", p);
            api.removeTeam("Player");
            api.removeObjective(ChatColor.DARK_AQUA+ "Тест");

Надеюсь вам понравился туториал! Если это так, то покажите свою любовь лайками :p

Посмотреть на само чудо самим, можно тут: Click ME
 
Последнее редактирование:
Для первого туториала - хорошо
Но вот только реализовано не совсем верно.
Для ISCOREAPI лучше использовать паттерн Singlet-on, так как создавать его нам надо только 1 раз
 
Чувствую взял отсюда. Но хорошо, что потрудился над переводом и показал как с этим работать.
 
Наличие гайдов по девингу на этом форуме и желание людей их писать - уже отлично.
Я сам думаю заняться гайдингом для RB
Возможно даже в видео-формате, опыт все таки есть)

Но надо бы сначала на YT вернуться :D
 
Был бы раздел такой, с удовольствием сделал бы туториалов побольше. Admin, ну, ты понял
 
Последнее редактирование модератором:
Последнее редактирование модератором:
Блин, я тут заметил..
Он же попросил..
/* ISCOREAPI by Firebreath15 v1.5
*
* Written for private use. Do not duplicate or republish.
*/

Хоть ссылочку оставь на источник
 
А можно какой-нибудь пример, что это и как это используется?)
 
А можно какой-нибудь пример, что это и как это используется?)
А что именно нужно? Например, для создания таблиц подсчета убийств.

670_Minecraft-13w36a--13w36b--Minecraft-17_pvpstats1.png
 
А что именно нужно? Например, для создания таблиц подсчета убийств.
Но ведь она будет сброшена при рестарте сервера, или что-то не понимаю? И такой странный вопрос, а как ее отобразить(см. ваш скрин)?
 
Но ведь она будет сброшена при рестарте сервера, или что-то не понимаю? И такой странный вопрос, а как ее отобразить(см. ваш скрин)?
  1. ISCOREAPI api = new ISCOREAPI();
  2. api.createObjective(ChatColor.DARK_AQUA+"Тест", "Тест"); //Ваш заголовок
  3. api.createTeam("Player");
  4. api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED + "Красный"), 0);
  5. api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "Синий"),
  6. api.addPlayerToTeam("Player", p);
  7. api.refreshPlayerScoreboard(p);
Он будет отображаться всегда, даже при рестарте, должно. Если хочешь чтобы сразу это было видно, можно сунуть это в PlayerJoinEvent
 
  1. ISCOREAPI api = new ISCOREAPI();
  2. api.createObjective(ChatColor.DARK_AQUA+"Тест", "Тест"); //Ваш заголовок
  3. api.createTeam("Player");
  4. api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED + "Красный"), 0);
  5. api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "Синий"),
  6. api.addPlayerToTeam("Player", p);
  7. api.refreshPlayerScoreboard(p);
Он будет отображаться всегда, даже при рестарте, должно. Если хочешь чтобы сразу это было видно, можно сунуть это в PlayerJoinEvent
Да? Спасибо, прошу прощения за глупый вопрос.
 
Вопросик:
Код:
              ISCOREAPI api = new ISCOREAPI();
                api.createObjective(ChatColor.DARK_AQUA+"Teams", "Teams");
                api.createTeam("Player");
                api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED + "RED"), 0);
                api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "BLUE"),
                api.addPlayerToTeam("Player", p));
                api.refreshPlayerScoreboard(p);
Почему у меня "p" выдают ошибку? Типа, эй чувак, мы не можем resolved as variable, а ты отстой D:
Помоги, а?
 
Вопросик:
Код:
              ISCOREAPI api = new ISCOREAPI();
                api.createObjective(ChatColor.DARK_AQUA+"Teams", "Teams");
                api.createTeam("Player");
                api.setScore(Bukkit.getOfflinePlayer(ChatColor.RED + "RED"), 0);
                api.setScore(Bukkit.getOfflinePlayer(ChatColor.BLUE + "BLUE"),
                api.addPlayerToTeam("Player", p));
                api.refreshPlayerScoreboard(p);
Почему у меня "p" выдают ошибку? Типа, эй чувак, мы не можем resolved as variable, а ты отстой D:
Помоги, а?
Стринг для эвента: Player p = e.getPlayer();
String для команды: Player p = (Player) sender;
 
Последнее редактирование:
Не\
Стринг для эвента: Player p = e.getPlayer();
String для команды: Player p = (Player) sender;
Нет, ГетПлеер не работает, или я тупой... И вообще, почему Скоробороды стало так сложно создавать? Раньше все было на раз, два,три...
 
Назад
Верх