1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Неподтвержденные плагины", создана пользователем DonDays, 19 ноя 2016.

  1. Автор темы
    DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    Сегодня все сделаю
     
  2. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    ну так что там?
     
  3. Автор темы
    DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    Сегодня надо сделать, пока времени нет
     
  4. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    выложи исходники плиз, а то декомпилять очень лень
     
  5. Автор темы
    DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    Выше есть исходники прошлой версии, сегодня выложу последней, быть может, даже чуть перепишу
    Дошли руки, сейчас починю гитхаб на компе, и, соотвественно, залью исходники. В ближайшее время полностью перепишу плагин, убрав весь говнокод
    Updated. @InterVi,
     
  6. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    Код просто отвратительный и он не работает. Ошибки в условиях, кривые алгоритмы. Вот зачем циклом гонять список материй, когда есть contains? Зачем при каждой итерации инициализировать новый список? Зачем чёрти как грузить список из конфига, когда можно взять строки и циклом их прогнать в материю? Много, много всего. Ещё бы сплитеры вырезать, но руки не дошли. А ещё ты забыл впилить новые опции, которые есть в конфиге.
    Моя версия: https://bitbucket.org/InterVi/itemstatsfork
     
  7. Автор темы
    DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    собственно, я его даже и не переписывал, не было времени, может, в будущем исправлю это говно
    тут не соглашусь, через StreamAPI это делать гораздо удобнее, чем через циклы
     
  8. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    Разберу понятно.
    Код:
    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)
    Ну, ссылку я дал. Смотри там код. Развивать плагин вряд ли буду, если надо - форкай оттуда. Возможно обработку второй руки добавлю для новых версий. А ещё надо сделать счётчик для удочки.
    1. java >= 8
    2. потеря производительности
    3. менее понятно, чем циклы
     
  9. Автор темы
    DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    до этого только на один предмет вешалась мета, честно говоря, этот код, сделанный на скорую руку, не тестировал
    тут-то оно понятно
    на седьмой и ниже и так не работает, если я правильно понял, то, что стрим 8+ я знаю
    вообще, я хотел спать, когда это писал, но и сейчас не понимаю: вроде бы все правильно, если у игрока креатив, а статистика в креативе отключена, функционал отрезает, или я опять что-то неправильно понял?
    Честно говоря, когда я это писал, не сейчас, а тогда, я долго думал над тем, как это реализовать, уставши, и наконец придумав, кое-как набросал статистику при ломании блока, а потом копировал код в остальные евенты, порой, забывая про элементарные вещи

    из-за того, что в этом коде слишком много говна и мусора, я и не стал переписывать его с нуля,а если честно, он настолько страшный, что я даже не мог понять, что к чему, сейчас исправлю эти недочеты, может, в ближайшее пару дней перепишу с нуля
    поковырялся, чуть убрал говна, проверил, вроде работает, на днях возможно займусь написанием с нуля
     
  10. InterVi

    InterVi Старожил Пользователь

    Баллы:
    173
    исправленный работает, под 7 компилил
    Всё правильно. Это у меня невнимательность, значит там где-то в другом месте баг был. Только blockBreak срабатывал, остальное нет.
     
    Последнее редактирование: 14 май 2017
  11. Dereku

    Dereku Старожил Пользователь

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    if true then return.
     
  12. Автор темы
    DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    Значит, уже поправил, позже подумаю над более разумной реализацией
     

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