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

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

baksovic111

Активный участник
Пользователь
Баллы
88
Имя в Minecraft
Baksovic
Всем привет! Помогите допилить метод.
Никак не могу сообразить как сделать то что я хочу.. Мозги дымят..
Вообщем мне нужно сделать метод который будет проверять лор 2х предметов.
1. Если лор есть на втором предмете, а на первом его нет. То просто перекинуть его со второго предмета на первый.
2. А если лор есть на первом предмете и на втором то заменить лор на первом предмете лором со второго.
Вот мой метод но он работает не правильно..
upload_2015-9-5_14-55-10.png
http://pastebin.com/5mxTJ7x7
 
Во-первых нет проверки на наличие итемметы у итема stone.
Во-вторых у тебя алгоритм делает не то, что ты описал. Твой алгоритм очень странный, он сначала берет лор первого предмета, каждую строку проверяет на наличие ":", потом берет часть строки до ":" и сравнивает с каждой строкой до ":" из каждой строки лора второго предмета и если такое совпадение есть, то добавляет строку в новый лор.
Объясни по-лучше что именно тебе нужно?
 
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 который так же есть в первом предмете. Но он не много другой.
По этому его нужно заменить в первом предмете
А в коде у меня и правда безобразие.
Я как бы не дурак но я тупо не могу свою идею преобразовать в код хоть опыта уже и не так мало..
 
Посмотреть вложение 35965
Проверки нет т.к она не нужна. Второй предмет передается обязательно с ItemMeta.
А зачем такая странная проверка?
Потому что Lore у меня не простой а такого формата
Посмотреть вложение 35966

Собственно вот что нужно сделать.
Есть предмет с таким Лором.
Посмотреть вложение 35967

И есть второй предмет
Посмотреть вложение 35968

Что нужно сделать:
Во втором предмете есть лор - Sta
Его в первом предмете нет. Его нужно перенести на первый предмет.
А так же на втором предмете есть лор Dex который так же есть в первом предмете. Но он не много другой.
По этому его нужно заменить в первом предмете
А в коде у меня и правда безобразие.
Я как бы не дурак но я тупо не могу свою идею преобразовать в код хоть опыта уже и не так мало..
Тогда проще сделать локальную мапу в которой хранить ключи и значения, потом пройтись по первому лору и пропарсить ключ-значение, а потом пройтись по второму и парсить и также добавлять в мапу, получается лор с одинаковым ключем перезапишется. Ну и потом просто по мапе пройтись и сериализировать в лор.
 
Тогда проще сделать локальную мапу в которой хранить ключи и значения, потом пройтись по первому лору и пропарсить ключ-значение, а потом пройтись по второму и парсить и также добавлять в мапу, получается лор с одинаковым ключем перезапишется. Ну и потом просто по мапе пройтись и сериализировать в лор.
Большое спасибо за идею. Действительно хороший выход из моего положения)
Второй раз уже выручаешь меня. Благодарю за помощь!
 
Большое спасибо за идею. Действительно хороший выход из моего положения)
Второй раз уже выручаешь меня. Благодарю за помощь!
Мне бы твое упорство, а то я много чего умею(как оказывается), но кодить страшно лень.
Кстати, при записи какого-то значения в мапу можно еще проверять, в мапе значение больше, чем то которое хочешь записать или нет. Если больше то не записывать, если меньше, то перезаписать новое. А то может быть такое, что оружие имеет параметр больше, чем у апгрейда и апгрейд "даунгрейдид" оружку.
 
Мне бы твое упорство, а то я много чего умею(как оказывается), но кодить страшно лень.
Кстати, при записи какого-то значения в мапу можно еще проверять, в мапе значение больше, чем то которое хочешь записать или нет. Если больше то не записывать, если меньше, то перезаписать новое. А то может быть такое, что оружие имеет параметр больше, чем у апгрейда и апгрейд "даунгрейдид" оружку.
Что-то типо того думал)
Спасибо так и сделаю)
 
Мне бы твое упорство, а то я много чего умею(как оказывается), но кодить страшно лень.
Кстати, при записи какого-то значения в мапу можно еще проверять, в мапе значение больше, чем то которое хочешь записать или нет. Если больше то не записывать, если меньше, то перезаписать новое. А то может быть такое, что оружие имеет параметр больше, чем у апгрейда и апгрейд "даунгрейдид" оружку.
Умеешь? Может быть, но это только 5%, мы(люди) могли бы уметь намного больше, если бы умели правильно использовать свой мозг и если бы умели читать, правильно читать, не только воспринимать символы, тот кто читал что то о развитии способностей мозга, поймёт.
 
Java:
    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.
 
Последнее редактирование:
Java:
    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.
Кстати да, можно было через enum реализовать, но тут это не принципиально.
 
Кстати да, можно было через enum реализовать, но тут это не принципиально.
Ну почему же.
То, что я предоставил, рассчитано только на данные. А на скриншотах видны цветовые коды. Угадай что будет, если сравнивать строки из недр плагина и лора.

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

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

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

Назад
Верх