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

  • Автор темы Автор темы iD3LSY
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

iD3LSY

Активный участник
Пользователь
Баллы
76
Привет все 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, ибо удобно там всё реализовано. Если найду, тему закрою.
 
сначала split по пробелу, потом if String.startswith(name) отсекай. кароч в гугли методы работы со строками в яве
 
String result = s.replace("name:", "").replace("lore:", "");
String[] spl = result.split(" ");
String id = spl[0];
String name = spl[1];
String lore = spl[2];
 
советую что-то типа id:data k:v k:v k:v
потом просто сплит по пробелу. первый аргумент у нас всегда тип предмета а остальное - любой ключ:значение, которые тоже легко распарсить сплитом двоеточия
 
String result = s.replace("name:", "").replace("lore:", "");
String[] spl = result.split(" ");
String id = spl[0];
String name = spl[1];
String lore = spl[2];
Нет. Это не то. Нужна запилить тему, чтобы при отсутствие 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
 
в общем у меня получилось.

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

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

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

Вывод - учите принципы программирования
 
в общем у меня получилось.

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

Вот что я получил:

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

Вывод - учите принципы программирования
Эм.. Я чёт не понимаю. Что тут изменено? Больше вопрос заключается в том, что будет-ли это работать, если убрать lore из data? А 2ой, мой, который стоял перед твоим постом.
Да и в общем, эту тему я просто дописал использую копи паст с форума изучения String и его основных методов. Поэтому как оттуда вытащить что-то - я хз xd

И да, я неправильно выразился. Я понял, что ты добавил перенос. Но тут более важно, чтобы была возможность как я уже написал выше, чтобы при отсутствие lore просто не крашилось.
 
Эм.. Я чёт не понимаю. Что тут изменено? Больше вопрос заключается в том, что будет-ли это работать, если убрать lore из data? А 2ой, мой, который стоял перед твоим постом.
эта штука работает:
  • при варианте айтема 1:2 (создаст камень с датой два)
  • если кривой материал (буит бедрок)
  • если нет даты или она кривая - будет заюзана дата 0
  • если нет лора\нейма
  • если нет количества (будет заюзано кол-во 1)
ок заменил
Подкомментировал некоторые места
Сливаю код

Java:
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);
}
 
эта штука работает:
  • при варианте айтема 1:2 (создаст камень с датой два)
  • если кривой материал (буит бедрок)
  • если нет даты или она кривая - будет заюзана дата 0
  • если нет лора\нейма
  • если нет количества (будет заюзано кол-во 1)

ок заменил
Подкомментировал некоторые места
Сливаю код

Java:
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);
}
Слушай, раз уж тут решена уже проблема, то хочу задать тебе еще один вопрос, который связан тоже с этой темой. Если в инвентаре будет >54 предметов, то просто другие уже не взелут, и будет краш. Как реализовать создание кнопки открытия новой страницы инвентаря если предметы не влезают на 1 страницу? А если и на 2 страницы, то вообще 3 инвентаря.
 
Слушай, раз уж тут решена уже проблема, то хочу задать тебе еще один вопрос, который связан тоже с этой темой. Если в инвентаре будет >54 предметов, то просто другие уже не взелут, и будет краш. Как реализовать создание кнопки открытия новой страницы инвентаря если предметы не влезают на 1 страницу? А если и на 2 страницы, то вообще 3 инвентаря.
общий массив для всех айтемов + номер страницы который задается при вызове метода + форка с началом отсчета не с нуля а с формулы (а-ля в зависимости от номера страницы начинаем 55-й айтемы, либо с 109-й ну и тд. она очень простая, если сам не поймешь - то иди учись делать вообще программы)
 
Вот собственно формула разделения. Дальше думаю разберешься.

Java:
    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;
    }
 
Вот собственно формула разделения. Дальше думаю разберешься.

Java:
    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;
    }
не парился с такой штукой.

просто форка i=0+(pagenomer-1)*slots
и все
 
Ну мне этот проще и саблист сизе показывает сколько страниц.
форка по формуле вернет то же самое List<List<T>>, так что size тоже вполне можно вытащить

мне кажется мы спорим(это даже спором не назвать) на пустом месте.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх