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

Статус
Закрыто для дальнейших ответов.

В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);
    }
собсна, хочу узнать, как сделать, чтобы при указании игрока в плейсхолдере показывало, например, наигранное кол-во времени именно указанного игрока, а не того, кто вызвал этот плейсхолдер.
 
Ну для начала разделяешь identifier на параметр и на ник, как ты указал.
Примерно так можно:
Код:
int lastIndex = identifier.lastIndexOf("_");
String playerName = identifier.substring(lastIndex + 1);
String parameter = identifier.substring(0, lastIndex);
Далее получаешь игрока или оффлайн игрока по нику и как там switch идет по identifier, теперь будет по parameter.
 
Ну для начала разделяешь identifier на параметр и на ник, как ты указал.
Примерно так можно:
Код:
int lastIndex = identifier.lastIndexOf("_");
String playerName = identifier.substring(lastIndex + 1);
String parameter = identifier.substring(0, lastIndex);
Далее получаешь игрока или оффлайн игрока по нику и как там switch идет по identifier, теперь будет по parameter.
мне нужно это только добавить или сделать изменения в существующем коде?
 
Ну для начала разделяешь identifier на параметр и на ник, как ты указал.
Примерно так можно:
Код:
int lastIndex = identifier.lastIndexOf("_");
String playerName = identifier.substring(lastIndex + 1);
String parameter = identifier.substring(0, lastIndex);
Далее получаешь игрока или оффлайн игрока по нику и как там switch идет по identifier, теперь будет по parameter.
Может я чего-то не понимаю, но мне кажется
Код:
string.split("_");
будет лучше.
 
Может я чего-то не понимаю, но мне кажется
Код:
string.split("_");
будет лучше.
Нет, нам нужно разделить только в конце, а не везде. Через string.split("_") придется обратно склеивать N-1 строчек в массиве.
 
Нет, нам нужно разделить только в конце, а не везде. Через string.split("_") придется обратно склеивать N-1 строчек в массиве.
я вообще по нулям в java, но логигу я понимаю, мне лишь образец, как нужно правильно поместить код и далее я уже соображу
 
Нет, нам нужно разделить только в конце, а не везде. Через string.split("_") придется обратно склеивать N-1 строчек в массиве.
Ну так всёравно надо только ник. То есть string.split("_")[n-1];
 
Все, решил таким путем, взяв пример с 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);
              }
        }
    }
Всем спасибо.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх