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

Помогите Метод с Lore

Тема в разделе "Разработка плагинов для новичков", создана пользователем baksovic111, 5 сен 2015.

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

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

    Баллы:
    88
    Skype:
    Baksovic2
    Имя в Minecraft:
    Baksovic
    Всем привет! Помогите допилить метод.
    Никак не могу сообразить как сделать то что я хочу.. Мозги дымят..
    Вообщем мне нужно сделать метод который будет проверять лор 2х предметов.
    1. Если лор есть на втором предмете, а на первом его нет. То просто перекинуть его со второго предмета на первый.
    2. А если лор есть на первом предмете и на втором то заменить лор на первом предмете лором со второго.
    Вот мой метод но он работает не правильно..
    upload_2015-9-5_14-55-10.png
    http://pastebin.com/5mxTJ7x7
     
  2. Хостинг MineCraft
    <
  3. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Во-первых нет проверки на наличие итемметы у итема stone.
    Во-вторых у тебя алгоритм делает не то, что ты описал. Твой алгоритм очень странный, он сначала берет лор первого предмета, каждую строку проверяет на наличие ":", потом берет часть строки до ":" и сравнивает с каждой строкой до ":" из каждой строки лора второго предмета и если такое совпадение есть, то добавляет строку в новый лор.
    Объясни по-лучше что именно тебе нужно?
     
  4. Автор темы
    baksovic111

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

    Баллы:
    88
    Skype:
    Baksovic2
    Имя в Minecraft:
    Baksovic
    upload_2015-9-5_15-15-11.png
    Проверки нет т.к она не нужна. Второй предмет передается обязательно с ItemMeta.
    А зачем такая странная проверка?
    Потому что Lore у меня не простой а такого формата
    upload_2015-9-5_15-16-0.png

    Собственно вот что нужно сделать.
    Есть предмет с таким Лором.
    upload_2015-9-5_15-17-45.png

    И есть второй предмет
    upload_2015-9-5_15-18-6.png

    Что нужно сделать:
    Во втором предмете есть лор - Sta
    Его в первом предмете нет. Его нужно перенести на первый предмет.
    А так же на втором предмете есть лор Dex который так же есть в первом предмете. Но он не много другой.
    По этому его нужно заменить в первом предмете[DOUBLEPOST=1441455634,1441455575][/DOUBLEPOST]А в коде у меня и правда безобразие.
    Я как бы не дурак но я тупо не могу свою идею преобразовать в код хоть опыта уже и не так мало..
     
  5. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Тогда проще сделать локальную мапу в которой хранить ключи и значения, потом пройтись по первому лору и пропарсить ключ-значение, а потом пройтись по второму и парсить и также добавлять в мапу, получается лор с одинаковым ключем перезапишется. Ну и потом просто по мапе пройтись и сериализировать в лор.
     
  6. Автор темы
    baksovic111

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

    Баллы:
    88
    Skype:
    Baksovic2
    Имя в Minecraft:
    Baksovic
    Большое спасибо за идею. Действительно хороший выход из моего положения)
    Второй раз уже выручаешь меня. Благодарю за помощь!
     
  7. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Мне бы твое упорство, а то я много чего умею(как оказывается), но кодить страшно лень.[DOUBLEPOST=1441459278,1441459153][/DOUBLEPOST]Кстати, при записи какого-то значения в мапу можно еще проверять, в мапе значение больше, чем то которое хочешь записать или нет. Если больше то не записывать, если меньше, то перезаписать новое. А то может быть такое, что оружие имеет параметр больше, чем у апгрейда и апгрейд "даунгрейдид" оружку.
     
  8. Автор темы
    baksovic111

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

    Баллы:
    88
    Skype:
    Baksovic2
    Имя в Minecraft:
    Baksovic
    Что-то типо того думал)
    Спасибо так и сделаю)
     
  9. Rider3217

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

    Баллы:
    98
    Имя в Minecraft:
    Planet0111
    Умеешь? Может быть, но это только 5%, мы(люди) могли бы уметь намного больше, если бы умели правильно использовать свой мозг и если бы умели читать, правильно читать, не только воспринимать символы, тот кто читал что то о развитии способностей мозга, поймёт.
     
  10. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Код:
        public ItemStack upgradeItem(ItemStack from, ItemStack stone) {
            HashMap<String, Integer> in = this.getStats(from);
            HashMap<String, Integer> upgrader = this.getStats(stone);
            ArrayList<String> lore = new ArrayList<>();
            for (Map.Entry<String, Integer> e : upgrader.entrySet()) {
                if (in.containsKey(e.getKey())) {
                    in.put(e.getKey(), in.get(e.getKey()) + e.getValue());
                } else {
                    in.put(e.getKey(), e.getValue());
                }
            }
          
            for (Map.Entry<String, Integer> e : in.entrySet()) {
                lore.add(e.getKey() + ": +" + e.getValue());
            }
          
            ItemMeta im = from.getItemMeta();
            im.setLore(lore);
            from.setItemMeta(im);
            return from;
        }
      
        public HashMap<String, Integer> getStats(ItemStack item) {
            HashMap<String, Integer> stats = new HashMap<>();
            List<String> lore = item.getItemMeta().getLore();
            for (String line : lore) {
                if (!line.contains(": ")) {
                    continue;
                }
                String[] data = line.split(":");
                stats.put(data[0], Integer.parseInt(data[1]));
            }
            return stats;
        }

    Вот что то вроде такого. Не тестил, возможно кое что надо поправлять.
    UPD: нашёл ошибку. Старые свойства предмета стираются, если их не было в камне.
    UPD1: Исправил.
    З.Ы.: Было бы лучше реализовывать это через enum.
     
    Последнее редактирование: 6 сен 2015
  11. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Кстати да, можно было через enum реализовать, но тут это не принципиально.
     
  12. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Ну почему же.
    То, что я предоставил, рассчитано только на данные. А на скриншотах видны цветовые коды. Угадай что будет, если сравнивать строки из недр плагина и лора.

    А вообще, у меня давно в голове крутится мысль про data на цветовых кодах. Они не рендрятся, но существуют. Можно неплохо это использовать в быту.
     
  13. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Кто-то уже юзает, вроде бы @saharNooby в сундучках удачи.
     

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