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

Помогите Разделение текста

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

Статус темы:
Закрыта.
  1. Автор темы
    iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Привет все c:

    Вопрос относится не к Bukkit, а больше к Java, но в прочем достигаю я решение этой проблемы только из-за Bukkit, поэтому написал именно сюда, а не пошёл гуглить)

    Недавно опять начались 2 темы на счёт добавления айтемов и их нбт в кастомный инвентарь. Я подумал, что всё-же юзать метод создания тех самых айтемов в одну строку намного удобнее. И тут можно понять, что всё писать через какой-либо 1 делящий знак не очень удобно, т.к. тогда нужно будет обязательно заполнить всё по форме. К тому-же если не будет того-же самого lore, то команда просто не откроет инвентарь(краш), а одна пустая доп.строка(лор) - мусор.

    Сначала я просто подумал(сейчас я сожалею, и понимаю насколько я был глуп(я сейчас такой же тупой xdd)) создать несколько делящих знаков, но потом понял, что если этот делящий знак не будет стоять в конце того же самого name, то весь текст и после "name:" будет скопирован. То есть если я сделаю что-то на подобие
    Код:
    - 1:6 2 name:name lore:lore
    То как результат я получу:
    Материал: "1:6"
    Дата: "6 2 name"
    Имя предмета: "name lore:lore"
    Лор предмета: "lore"

    В общем задумка - сделать как в Essentials. Сейчас пойду смотреть сурцы Essentials, ибо удобно там всё реализовано. Если найду, тему закрою.
     
  2. Хостинг MineCraft
    <
  3. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    сначала split по пробелу, потом if String.startswith(name) отсекай. кароч в гугли методы работы со строками в яве
     
  4. Автор темы
    iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Сейчас попробую что-нибудь сделать с startsWith
     
  5. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    String result = s.replace("name:", "").replace("lore:", "");
    String[] spl = result.split(" ");
    String id = spl[0];
    String name = spl[1];
    String lore = spl[2];
     
  6. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    советую что-то типа id:data k:v k:v k:v
    потом просто сплит по пробелу. первый аргумент у нас всегда тип предмета а остальное - любой ключ:значение, которые тоже легко распарсить сплитом двоеточия
     
  7. Автор темы
    iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Нет. Это не то. Нужна запилить тему, чтобы при отсутствие name например, lore всё-равно существовал. Но тут, если name отсутствует, этим name станосится lore. В и заключается проблема того, чтобы просто удалить сам "name:", "lore:"

    Код:
    String data = "STONE 6 2 name:&cТы_пидр lore:&6А_может_быть_и_нет_:)";
    String[] lines = data.split(" ");
    for(String line : lines) {
        player.sendMessage(line.substring(line.lastIndexOf(":") + 1, line.length()).replace("name:", "").replace("lore:", "").replace('_', ' ').replace('&', '§'));
    }
    Но тут вроде такая же будет ошибка, как и у тебя :)

    Да и в общем, эту тему я просто дописал использую копи паст с форума изучения String и его основных методов. Поэтому как оттуда вытащить что-то - я хз xd
     
  8. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    в общем у меня получилось.

    вот что я ввел:String data = "STONE:6 2 name:&cТы_пидр lore:&6А_может_быть_и_нет/n:)";
    да, я добавил /n перед смайлом (в эссеншалс это вроде как перенос строки)

    Вот что я получил:
    upload_2017-1-16_20-22-17.png

    Про сплинт я загуглил два часа назад.

    Вывод - учите принципы программирования
     
  9. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    \n*
     
  10. Автор темы
    iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Эм.. Я чёт не понимаю. Что тут изменено? Больше вопрос заключается в том, что будет-ли это работать, если убрать lore из data? А 2ой, мой, который стоял перед твоим постом.
    [DOUBLEPOST=1484580746,1484580669][/DOUBLEPOST]И да, я неправильно выразился. Я понял, что ты добавил перенос. Но тут более важно, чтобы была возможность как я уже написал выше, чтобы при отсутствие lore просто не крашилось.
     
  11. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    эта штука работает:
    • при варианте айтема 1:2 (создаст камень с датой два)
    • если кривой материал (буит бедрок)
    • если нет даты или она кривая - будет заюзана дата 0
    • если нет лора\нейма
    • если нет количества (будет заюзано кол-во 1)
    ок заменил[DOUBLEPOST=1484581457,1484581228][/DOUBLEPOST]Подкомментировал некоторые места
    Сливаю код

    Код:
    public void onPlayerJoin(PlayerJoinEvent e){
        Player p = e.getPlayer();
        String data = "Stne:6 name:&cТы_пидр lore:&6А_может_быть_и_нет\n:)";
        String[] spl = data.split(" ");
        String itemtype = spl[0].split(":")[0];
        int itemdata=0;
        Material material = Material.BEDROCK;
        Material temp=null; //по другому не пашет. МАГИЯ!
        try {
            itemdata = Integer.parseInt(spl[0].split(":")[1]);
        }catch (Exception exc){
            p.sendMessage("§cWrong data! Using default data (0)");
        }
        try {
            material = Material.getMaterial(Integer.parseInt(itemtype));
        }catch (Exception exc){
            try{
                temp = Material.getMaterial(itemtype.toUpperCase()); //если использоват тут переменную material , то если матерьял кривой, то она станет null. Фжух и нуллпоинтер!! 
            }catch(Exception exc2){
                p.sendMessage("§сItem is uncorrect");
            }
        }
        if (temp!=null){
            material = temp;
        }
        int ammount = 1;
        try {
            ammount = Integer.parseInt(spl[1]);
        } catch (Exception exc2) {}
        ItemStack item = new ItemStack(material, ammount, (short)itemdata);
        boolean named=false; //защита круче чем от презика
        boolean lored=false;
        String name = "";
        List<String> lore = new ArrayList<>();
        for (String str: spl){
            if (str.startsWith("name:")){
                name = str.replace("name:", "").replace("_", " ").replace("&", "§");
                named=true;
            }
            if (str.startsWith("lore:")){
                String allLore = str.replace("lore:", "").replace("_", " ");
                for (String sl:allLore.split("\n")){ //теперь "\n"  строке будет обозначать переход на новую строку
                    lore.add(sl.replace("&", "§"));
                }
                lored=true;
            }
        }
        ItemMeta meta = item.getItemMeta();
        if (named){meta.setDisplayName(name);}
        if (lored){meta.setLore(lore);}
        item.setItemMeta(meta);
        p.getInventory().addItem(item);
    }
     
  12. Автор темы
    iD3LSY

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

    Баллы:
    46
    Имя в Minecraft:
    opy
    Слушай, раз уж тут решена уже проблема, то хочу задать тебе еще один вопрос, который связан тоже с этой темой. Если в инвентаре будет >54 предметов, то просто другие уже не взелут, и будет краш. Как реализовать создание кнопки открытия новой страницы инвентаря если предметы не влезают на 1 страницу? А если и на 2 страницы, то вообще 3 инвентаря.
     
  13. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    общий массив для всех айтемов + номер страницы который задается при вызове метода + форка с началом отсчета не с нуля а с формулы (а-ля в зависимости от номера страницы начинаем 55-й айтемы, либо с 109-й ну и тд. она очень простая, если сам не поймешь - то иди учись делать вообще программы)
     
  14. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Вот собственно формула разделения. Дальше думаю разберешься.

    Код:
        public static <T extends Object> List<List<T>> split(List<T> list, int targetSize) {
            List<List<T>> lists = new ArrayList<List<T>>();
            for (int i = 0; i < list.size(); i += targetSize) {
                lists.add(list.subList(i, Math.min(i + targetSize, list.size())));
            }
            return lists;
        }
     
  15. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    не парился с такой штукой.

    просто форка i=0+(pagenomer-1)*slots
    и все
     
  16. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Ну а что, такая форка на листы не разобъет?(мне тоже просто удобнее таким алгоритмом. он проще для меня)
     
  17. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    форка по формуле вернет то же самое List<List<T>>, так что size тоже вполне можно вытащить

    мне кажется мы спорим(это даже спором не назвать) на пустом месте.
     
Статус темы:
Закрыта.

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