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

Помогите как продолжить StringList

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

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

    KoltR Активный участник

    Баллы:
    61
    Имя в Minecraft:
    KoltR
    Привет!
    Я не знаю какой есть метод(или что-то другое) который бы продолжал команду.
    Подробнее:
    Код:

    List<String> list = plugin.getConfig().getStringList("ID");
    for (String s : list) {
    Material limited = Material.getMaterial(s);


    У меня в конфиге стоит самым первым GOLD_BLOCK
    Если это GOLD_BLOCK то он пишет команду
    И получается что он пишет
    • GOLD_BLOCK
    • IRON_BLOCK
    Но вторым стоит IRON_BLOCK
    Если это IRON_BLOCK то
    получается что он пишет
    • GOLD_BLOCK
    Потому-что GOLD_BLOCK не обнаружен и не продолжается StringList
    Как это исправить?
     
  2. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Если честно - я мало что понял, можешь немного детальнее описать проблему?
     
  3. Автор темы
    KoltR

    KoltR Активный участник

    Баллы:
    61
    Имя в Minecraft:
    KoltR
    Проблема в том,что StringList при не выполнении команды не продолжается

    Ща по лучше скажу
    Config.yml

    id:
    - GOLD_BLOCK // материал
    - IRON_BLOCK // материал

    я вписываю материал блоков в конфиг, а из конфига берется данные.
    Если я ставлю материал в первую строку то всё работает.Но если второй материал добавить то нет.Потому-что
    StringList продолжает читать в конфиге если действие выполнилось. Как это исправить.

    Ещё подробней.

    Ставлю блок GOLD_BLOCK
    пишет в чат

    GOLD_BLOCK
    IRON_BLOCK

    Ставлю блок IRON_BLOCK
    пишет в чат

    GOLD_BLOCK

    потому-что GOLD_BLOCK не обнаружен.
     
  4. NyanGuyMF

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

    Баллы:
    76
    Как я понял, нужно прекратить проход по циклу, верно?
    Команда
    PHP:
    break;
    Может принудительно выходить из цикла, соответственно код
    PHP:
    for (String materialName materialList) {
        if (
    условие) {
            
    // code...
            
    break;
        }
    }
    выйдет из цикла, если условие выполняется
     
  5. CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Вообще я написал почти одно и тоже что NyanGuyMF, но более подробнее


    PHP:
            for(String materialName materialList) {
                if(
    Material.getMaterial(materialName) != null) {
                    
    Material mat Material.getMaterial(materialName);
                    
    //Допустим что переменная blockPlace это поставленный тобою блок
                    
    if(blockPlace.getType() != mat) {
                        break;
                    }
                    
    //Ну и дальше свой код
                
    }
            }
     
  6. alexandrage

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

    Баллы:
    173
    Я один сломал мозг пытаясь понять, что хочет ТС?
     
  7. CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Если честно, я прочитал раз 6 что бы понять
     
  8. Автор темы
    KoltR

    KoltR Активный участник

    Баллы:
    61
    Имя в Minecraft:
    KoltR
    @EventHandler
    public void onSetBlock(BlockPlaceEvent event){
    Player p = event.getPlayer();
    List<String> list = plugin.getConfig().getStringList("id");
    for(String s : list) {
    if(Material.getMaterial(s) != null) {
    Material limited = Material.getMaterial(s);
    p.sendMessage(s);
    String t = plugin.getConfig().getString("warning");
    t = t.replace("&", "\u00a7");
    Block set = event.getBlockPlaced();
    if(set.getType() != limited) { return; }
    int maxnumber = 1;
    int number = 0;
    Chunk checkchunk = set.getLocation().getChunk();
    for ( x = 0; x < 16; ){
    for ( y = 0; y < 128; ){
    for (z = 0; z < 16; ){
    Material check = checkchunk.getBlock(x, y, z).getType();
    if(check.equals(limited)){number++;}
    z++;
    }
    y++;
    }
    x++;
    }
    if(number > maxnumber){event.setCancelled(true);p.sendMessage(t);}
    }
    }
    }
    }

    Куда в этом коде написать
    break;
    ???
    P.S Я тупой
     
    Последнее редактирование: 18 дек 2018
  9. NyanGuyMF

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

    Баллы:
    76
    Тут вообще в логике проблема: код не успевает пройтись по всему массиву и уже выходит из цикла, я бы на Вашем месте перебирал материалы из конфига и выполнял действие только если поставленный блок равен блоку из конфига.

    И return, и break навсегда выйдут из цикла, вернуться можно будет только с goto или continue, но их лучше вообще не использовать и забыть про их существование :D
     
  10. _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Насколько я знаю, goto в java нет.
     
  11. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    goto запрещен
    continue норм тема, в чем трабл?
     
  12. NyanGuyMF

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

    Баллы:
    76
    Усложняет структуру кода и в большинстве случаев можно избежать использование continue. Прочитай «Совершенный код», в главе 31 листинг 31-34 хорошо объясняются проблемы использования оператора goto, который схож сontinue :KappaPride:
     
  13. NyanGuyMF

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

    Баллы:
    76
    Не использую => не знаю о существовании :D
     
  14. LuckyZeeRo

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

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    В отличии от goto, который может скакать куда угодно, не вижу никаких усложнений при чтении кода с continue. Наоборот он зачастую позволяет уменьшить количество вложенных блоков if'ов например.
    Самый простой пример:
    Код:
    for (int number : numbers) {
        if (number < 0) continue;
        // Выполнение кода
    }
    Код:
    for (int number : numbers) {
        if (number >= 0) {
            // Выполнение кода
        }
    }
    Первый вариант будет намного легче читать например, если будет множество проверок с промежуточными расчетами (какие нибудь фильтры). Во втором варианте придется сделать кучу блоков if.

    Та же самая штука про break с меткой во вложенных циклах. Понятное дело мы можем обойтись, но добавим кучу лишнего кода, который скорее будет запутаннее.

    Вот кстати нашел в книге которую ты написал:
    [​IMG]

    UPD: Понятное дело, что его тоже нужно использовать с умом, но я только хочу сказать, что нельзя равнять к goto.
     
    Последнее редактирование: 20 дек 2018
  15. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    А может кто-то всё-таки перефразировать, чего хочется достичь? Я тоже 6 раз прочитал, но не понял.
     
  16. _MCMaster_

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

    Баллы:
    76
    Имя в Minecraft:
    DragOn4ik
    Да я сам не с первого раза понял... Понял только из его примера, или как это назвать...
     

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