Хостинг серверов Minecraft playvds.com
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите PlaceholderAPI: допиливание expansion "Statistic"

Тема в разделе "Разработка плагинов для новичков", создана пользователем ВukkitPrоfi, 3 ноя 2018.

Статус темы:
Закрыта.
  1. Автор темы
    ВukkitPrоfi

    ВukkitPrоfi Активный участник Только чтение Пользователь

    Баллы:
    76
    В expansion Statistic мне нужно добавить возможность отображать информацию об указанном игроке, типа: %statistic_seconds_played_<ник_игрока>%.

    Вот кусок кода:
    Код:
      @Override
      public String onPlaceholderRequest(Player p, String identifier) {
        if (p == null) {
          return "";
        }
        switch (identifier.toLowerCase()) {
          case "mine_block":
            long mine = 0;
            if (mine_block.isEmpty()) {
              return "0";
            }
            for (Material m : mine_block) {
              mine += p.getStatistic(Statistic.MINE_BLOCK, m);
            }
            return String.valueOf(mine);
    
          case "use_item":
            long use = 0;
            if (use_item.isEmpty()) {
              return "0";
            }
            for (Material m : use_item) {
              use += p.getStatistic(Statistic.USE_ITEM, m);
            }
            return String.valueOf(use);
    
          case "break_item":
            long br = 0;
            if (break_item.isEmpty()) {
              return "0";
            }
            for (Material m : break_item) {
              br += p.getStatistic(Statistic.BREAK_ITEM, m);
            }
            return String.valueOf(br);
    
          case "craft_item":
            long cr = 0;
            if (craft_item.isEmpty()) {
              return "0";
            }
            for (Material m : craft_item) {
              cr += p.getStatistic(Statistic.CRAFT_ITEM, m);
            }
            return String.valueOf(cr);
          case "seconds_played":
            try {
              return String.valueOf(p.getStatistic(Statistic.PLAY_ONE_MINUTE) / 20);
            } catch (NoSuchFieldError error) {
              return String.valueOf(p.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20);
            }
          case "minutes_played":
            try {
              return String.valueOf((p.getStatistic(Statistic.PLAY_ONE_MINUTE) / 20) / 60);
            } catch (NoSuchFieldError error) {
              return String.valueOf((p.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20) / 60);
            }
    
          case "hours_played":
            try {
              return String.valueOf(((p.getStatistic(Statistic.PLAY_ONE_MINUTE) / 20) / 60) / 60);
            } catch (NoSuchFieldError error) {
              return String.valueOf(((p.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20) / 60) / 60);
            }
    
          case "days_played":
            try {
              return String.valueOf((((p.getStatistic(Statistic.PLAY_ONE_MINUTE) / 20) / 60) / 60) / 24);
            } catch (NoSuchFieldError error) {
              return String.valueOf((((p.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20) / 60) / 60) / 24);
            }
    
          case "time_played":
            try {
              return TimeUtil.getTime((p.getStatistic(Statistic.PLAY_ONE_MINUTE) / 20));
            } catch (NoSuchFieldError error) {
              return TimeUtil.getTime((p.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20));
            }
          case "time_since_death":
            return TimeUtil.getTime(p.getStatistic(Statistic.TIME_SINCE_DEATH) / 20);
          case "seconds_since_death":
            return String.valueOf(p.getStatistic(Statistic.TIME_SINCE_DEATH) / 20L);
          case "minutes_since_death":
            return String.valueOf((p.getStatistic(Statistic.TIME_SINCE_DEATH) / 20L) / 60L);
          case "hours_since_death":
            return String.valueOf(((p.getStatistic(Statistic.TIME_SINCE_DEATH) / 20L) / 60L) / 60L);
          case "days_since_death":
            return String.valueOf((((p.getStatistic(Statistic.TIME_SINCE_DEATH) / 20L) / 60L) / 60L) / 24L);
        }
    
    собсна, хочу узнать, как сделать, чтобы при указании игрока в плейсхолдере показывало, например, наигранное кол-во времени именно указанного игрока, а не того, кто вызвал этот плейсхолдер.
     
  2. Mr Hosting
  3. LuckyZeeRo

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

    Баллы:
    76
    Имя в Minecraft:
    i0xHeX
    Ну для начала разделяешь identifier на параметр и на ник, как ты указал.
    Примерно так можно:
    Код:
    int lastIndex = identifier.lastIndexOf("_");
    String playerName = identifier.substring(lastIndex + 1);
    String parameter = identifier.substring(0, lastIndex);
    Далее получаешь игрока или оффлайн игрока по нику и как там switch идет по identifier, теперь будет по parameter.
     
  4. Автор темы
    ВukkitPrоfi

    ВukkitPrоfi Активный участник Только чтение Пользователь

    Баллы:
    76
    мне нужно это только добавить или сделать изменения в существующем коде?
     
  5. LuckyZeeRo

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

    Баллы:
    76
    Имя в Minecraft:
    i0xHeX
    Ну наверное для начала лучше подучить Java :)
    А дальше ты поймешь что нужно сделать.
     
  6. Andoroid

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

    Баллы:
    76
    Может я чего-то не понимаю, но мне кажется
    Код:
    string.split("_");
    будет лучше.
     
  7. LuckyZeeRo

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

    Баллы:
    76
    Имя в Minecraft:
    i0xHeX
    Нет, нам нужно разделить только в конце, а не везде. Через string.split("_") придется обратно склеивать N-1 строчек в массиве.
     
  8. Автор темы
    ВukkitPrоfi

    ВukkitPrоfi Активный участник Только чтение Пользователь

    Баллы:
    76
    я вообще по нулям в java, но логигу я понимаю, мне лишь образец, как нужно правильно поместить код и далее я уже соображу
     
  9. Andoroid

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

    Баллы:
    76
    Ну так всёравно надо только ник. То есть string.split("_")[n-1];
     
  10. LuckyZeeRo

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

    Баллы:
    76
    Имя в Minecraft:
    i0xHeX
    Не только, первую часть тоже. Ему не для 1 плейсхолдера такую возможность нужно, а для всех.
     
  11. Автор темы
    ВukkitPrоfi

    ВukkitPrоfi Активный участник Только чтение Пользователь

    Баллы:
    76
    Все, решил таким путем, взяв пример с expansion OtherPlayer:
    Код:
      @Override
      public String onPlaceholderRequest(Player p, String identifier) {
        if (p == null) {
          return "";
        }
        if(identifier.startsWith("seconds_played_"))
        {
            String plrStr = identifier.split("seconds_played_")[1];
            Player player = getPlayer(plrStr, false);
            if(player == null)
            {
                return "PNF";
            } else
            {
                try {
    
                    return String.valueOf(player.getStatistic(Statistic.PLAY_ONE_TICK) / 20);
                  } catch (NoSuchFieldError error) {
                    return String.valueOf(player.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20);
                  }
            }
        }
        if(identifier.startsWith("minutes_played_"))
        {
            String plrStr = identifier.split("minutes_played_")[1];
            Player player = getPlayer(plrStr, false);
            if(player == null)
            {
                return "PNF";
            } else
            {
                try {
                    return String.valueOf((player.getStatistic(Statistic.PLAY_ONE_TICK) / 20) / 60);
                  } catch (NoSuchFieldError error) {
                    return String.valueOf((player.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20) / 60);
                  }
            }
        }
        if(identifier.startsWith("hours_played_"))
        {
            String plrStr = identifier.split("hours_played_")[1];
            Player player = getPlayer(plrStr, false);
            if(player == null)
            {
                return "PNF";
            } else
            {
                try {
                    return String.valueOf(((player.getStatistic(Statistic.PLAY_ONE_TICK) / 20) / 60) / 60);
                  } catch (NoSuchFieldError error) {
                    return String.valueOf(((player.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20) / 60) / 60);
                  }
            }
        }
        if(identifier.startsWith("days_played_"))
        {
            String plrStr = identifier.split("days_played_")[1];
            Player player = getPlayer(plrStr, false);
            if(player == null)
            {
                return "PNF";
            } else
            {
                try {
                    return String.valueOf((((player.getStatistic(Statistic.PLAY_ONE_TICK) / 20) / 60) / 60) / 24);
                  } catch (NoSuchFieldError error) {
                    return String.valueOf((((player.getStatistic(Statistic.valueOf("PLAY_ONE_TICK")) / 20) / 60) / 60) / 24);
                  }
            }
        }
    
    Всем спасибо.
     
Статус темы:
Закрыта.

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