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

Плагин [FUN] ItemStats v4.0 - статистика предмета [1.8.9+]

Ну вот я скрафтил на верстаке редстоуновый блок, жму шифтом по результату. У меня в инвентаре 63 обычных блока и 1 с подписью в лоре кто скрафтил.

Предлагаю сделать подпись о скрафтившем только в том случае, если предмет есть в logKills или logBreak. Ну или опционально: при true у всех, при false так.
Сегодня все сделаю
 
выложи исходники плиз, а то декомпилять очень лень
 
выложи исходники плиз, а то декомпилять очень лень
Выше есть исходники прошлой версии, сегодня выложу последней, быть может, даже чуть перепишу
Дошли руки, сейчас починю гитхаб на компе, и, соотвественно, залью исходники. В ближайшее время полностью перепишу плагин, убрав весь говнокод
Updated. @InterVi,
 
Код просто отвратительный и он не работает. Ошибки в условиях, кривые алгоритмы. Вот зачем циклом гонять список материй, когда есть contains? Зачем при каждой итерации инициализировать новый список? Зачем чёрти как грузить список из конфига, когда можно взять строки и циклом их прогнать в материю? Много, много всего. Ещё бы сплитеры вырезать, но руки не дошли. А ещё ты забыл впилить новые опции, которые есть в конфиге.
Моя версия: https://bitbucket.org/InterVi/itemstatsfork
 
Код просто отвратительный и он не работает. Ошибки в условиях, кривые алгоритмы. Вот зачем циклом гонять список материй, когда есть contains? Зачем при каждой итерации инициализировать новый список? Зачем чёрти как грузить список из конфига, когда можно взять строки и циклом их прогнать в материю? Много, много всего. Ещё бы сплитеры вырезать, но руки не дошли. А ещё ты забыл впилить новые опции, которые есть в конфиге.
Моя версия: https://bitbucket.org/InterVi/itemstatsfork
собственно, я его даже и не переписывал, не было времени, может, в будущем исправлю это говно
Зачем чёрти как грузить список из конфига, когда можно взять строки и циклом их прогнать в материю?
тут не соглашусь, через StreamAPI это делать гораздо удобнее, чем через циклы
 
Разберу понятно.
Код:
this.logKills.addAll(ItemStats.getInstance().getConfig().getStringList("logKills").stream().map(Material::valueOf).collect(Collectors.toList()));
this.logBreak.addAll(ItemStats.getInstance().getConfig().getStringList("logBreak").stream().map(Material::valueOf).collect(Collectors.toList()));
избыточно:
Код:
for (String s : ItemStats.getInstance().getConfig().getStringList("logKills")) logKills.add(Material.valueOf(s));
for (String s : ItemStats.getInstance().getConfig().getStringList("logBreak")) logBreak.add(Material.valueOf(s));
двойная кавычка - строка, одинарная - чар, где заменяется 1 символ надо использовать одинарную
Код:
craftFormat = ItemStats.getInstance().getConfig().getString("Strings.craft.format").replace('&', '§');
вот это убило половину функционала
Код:
 if(e.getWhoClicked().getGameMode() == GameMode.CREATIVE && !ItemStats.getInstance().getConfig().getBoolean("enableStatisticInCreative"))
  return;
а это что за говно?
Код:
        e.setCancelled(true);
        for(int i = 0; i < e.getCurrentItem().getAmount(); i++) {
            ItemStack item = e.getCurrentItem();
            item.setAmount(1);
            ItemMeta meta = item.getItemMeta();
            meta.setLore(Lists.newArrayList(this.craftFormat.replace("%name%", e.getWhoClicked().getName())));
            item.setItemMeta(meta);
            e.getWhoClicked().getInventory().addItem(item);
        }
вот так правильно
Код:
        ItemStack item = e.getCurrentItem();
        if (ItemStats.getInstance().getConfig().getBoolean("Strings.craft.inLists")) {
            Material type = item.getType();
            if (!logKills.contains(type) && !logBreak.contains(type)) return;
        }
        ItemMeta meta = item.getItemMeta();
        meta.setLore(Lists.newArrayList(craftFormat.replace("%name%", e.getWhoClicked().getName())));
        item.setItemMeta(meta);
это ж надо, из конфига сообразил как заумно грузить, а тут про contains забыл
Код:
        Player killer = e.getEntity().getKiller();
        ItemStack item = killer.getItemInHand(); //надо переписать под новые версии
        Material type = item.getType();
        for(Material c : this.logKills) { //бред
            if(type == Material.AIR || type != c) continue;
            List<String> lore = item.getItemMeta().getLore(); //почему не до цикла?
            List<String> newLore = Lists.newArrayList();
            int breaked = 0;
            if(lore != null) {
                for(String l : lore) {
                    if(!l.contains(this.mobKillsFormat.replace("%num%", ""))) { //и замена каждый раз заново
                        newLore.add(l);
                        continue;
                    }
                    breaked = Integer.valueOf(l.split(s2)[1]); //вот это надо вырезать, но мне лень
                }
            }
            breaked++;
            newLore.add(this.mobKillsFormat.replace("%num%", String.valueOf(breaked + 1)));
            ItemMeta meta = item.getItemMeta();
            meta.setLore(newLore);
            item.setItemMeta(meta);
      }
вынес в отдельный правильный метод
Код:
    private ItemMeta getKillsMeta(ItemStack item, boolean player) {
        if (logKills.contains(item.getType())) {
            ItemMeta meta = item.getItemMeta();
            List<String> lore = meta.getLore();
            List<String> newLore = Lists.newArrayList();
            if(lore != null) {
                String search = player ? playerKillsFormat.replace("%num%", "") : mobKillsFormat.replace("%num%", "");
                for(String l : lore) {
                    if(!l.contains(search)) {
                        newLore.add(l);
                        continue;
                    }
                    String breaked = String.valueOf(player ? Integer.valueOf(l.split(s3)[1])+1 : Integer.valueOf(l.split(s2)[1])+1);
                    newLore.add(player ? playerKillsFormat.replace("%num%", breaked) : mobKillsFormat.replace("%num%", breaked));
                }
            }
            meta.setLore(newLore);
            return meta;
        }
        return null;
    }
там везде по тому же шаблону, особенно не ясен смысл вот этого куска
Код:
        breaked++;
      newLore.add(this.bowFormat.replace("%num%", String.valueOf(breaked + 1)));
увеличиваем на 2, а не на 1? а вот кусок, который убивает перезагрузку конфига:
Код:
        if(!ItemStats.getInstance().getConfig().getBoolean("Strings.craft.enable")) {
            e.getHandlers().unregister(this);
            return;
        }
события регистрируй правильно, чтобы потом не вызывать isCancelled
Код:
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)

Ну, ссылку я дал. Смотри там код. Развивать плагин вряд ли буду, если надо - форкай оттуда. Возможно обработку второй руки добавлю для новых версий. А ещё надо сделать счётчик для удочки.
тут не соглашусь, через StreamAPI это делать гораздо удобнее, чем через циклы
  1. java >= 8
  2. потеря производительности
  3. менее понятно, чем циклы
 
а это что за говно?
до этого только на один предмет вешалась мета, честно говоря, этот код, сделанный на скорую руку, не тестировал
потеря производительности
тут-то оно понятно
на седьмой и ниже и так не работает, если я правильно понял, то, что стрим 8+ я знаю
вот это убило половину функционала
вообще, я хотел спать, когда это писал, но и сейчас не понимаю: вроде бы все правильно, если у игрока креатив, а статистика в креативе отключена, функционал отрезает, или я опять что-то неправильно понял?
там везде по тому же шаблону, особенно не ясен смысл вот этого куска
Честно говоря, когда я это писал, не сейчас, а тогда, я долго думал над тем, как это реализовать, уставши, и наконец придумав, кое-как набросал статистику при ломании блока, а потом копировал код в остальные евенты, порой, забывая про элементарные вещи

из-за того, что в этом коде слишком много говна и мусора, я и не стал переписывать его с нуля,а если честно, он настолько страшный, что я даже не мог понять, что к чему, сейчас исправлю эти недочеты, может, в ближайшее пару дней перепишу с нуля
поковырялся, чуть убрал говна, проверил, вроде работает, на днях возможно займусь написанием с нуля
 
на седьмой и ниже и так не работает
исправленный работает, под 7 компилил
если у игрока креатив, а статистика в креативе отключена, функционал отрезает, или я опять что-то неправильно понял?
Всё правильно. Это у меня невнимательность, значит там где-то в другом месте баг был. Только blockBreak срабатывал, остальное нет.
 
Последнее редактирование:
вынес в отдельный правильный метод
Код:
    private ItemMeta getKillsMeta(ItemStack item, boolean player) {
        if (logKills.contains(item.getType())) {
            ItemMeta meta = item.getItemMeta();
            List<String> lore = meta.getLore();
            List<String> newLore = Lists.newArrayList();
            if(lore != null) {
                String search = player ? playerKillsFormat.replace("%num%", "") : mobKillsFormat.replace("%num%", "");
                for(String l : lore) {
                    if(!l.contains(search)) {
                        newLore.add(l);
                        continue;
                    }
                    String breaked = String.valueOf(player ? Integer.valueOf(l.split(s3)[1])+1 : Integer.valueOf(l.split(s2)[1])+1);
                    newLore.add(player ? playerKillsFormat.replace("%num%", breaked) : mobKillsFormat.replace("%num%", breaked));
                }
            }
            meta.setLore(newLore);
            return meta;
        }
        return null;
    }
if true then return.
 
исправленный работает, под 7 компилил

Всё правильно. Это у меня невнимательность, значит там где-то в другом месте баг был. Только blockBreak срабатывал, остальное нет.
Значит, уже поправил, позже подумаю над более разумной реализацией
 

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

Назад
Верх