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

Помогите Крафт из кастомных предметов и их переплавка

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

  1. alexandrage

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

    Баллы:
    173
    Да работает, я тоже делал через PrepareItemCraftEvent
     
  2. Автор темы
    fx8320e

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

    Баллы:
    66
    Но что делать с багом? Оставлять такое точно нельзя.
     
  3. alexandrage

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

    Баллы:
    173
    Так переделай без бага, проблем? Не я же кодил за тебя.
     
  4. Автор темы
    fx8320e

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

    Баллы:
    66
    К сожалению, я не знаю его причину. Если бы понимал, в чем там проблема, за помощью бы не обращался. Притом, проблема такая не только у меня. А вот решения я не нашел.
     
  5. alexandrage

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

    Баллы:
    173
    Значит рано тебе плагины писать, если ты даже не понимаешь как написанный тобою код работает.
     
  6. Автор темы
    fx8320e

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

    Баллы:
    66
    Как работает код-то я понимаю, и в теории он работает правильно, оттуда и проблема, что ничего, что могло бы спровоцировать проблему я не добавлял. Никаких операций с ингредиентами, кроме сравнения meta, я не проводил. И, повторюсь, не только я с этим сталкивался, http://rubukkit.org/threads/nekorrektnaja-rabota-preparecraftitemevent-resheno.162371/ . Даже вы этот тред комментировали. Но, по итогу, решение так и не было представлено. Я, безусловно, много чего еще не понимаю, но, все же с чего-то начинали. Что же, в любом случае, спасибо за советы, буду пытаться это как-то решать.
     
  7. alexandrage

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

    Баллы:
    173
    Проблема точно в тебе, мой же плагин работает исправно, кидал выше.
     
  8. Автор темы
    fx8320e

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

    Баллы:
    66
    Я не отрицаю, что во мне, лишь указываю на некую распространенность проблемы. И, раз даже более опытные люди с этим столкнулись, думаю, новичку это простительно, и плагины мне писать все же можно. Проблему, так или иначе, я устранил банальным локом количества предметов в ячейке на 1. Можно ли лучше? Да, наверняка, но как, мне пока неизвестно. Ваш код, в отличие от своего, я понимаю не до конца, потому и не прибегаю к нему. В любом случае, благодарю за помощь!
     
  9. alexandrage

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

    Баллы:
    173
    Не понимаю о чем ты, я вообще не трогаю предметы в сетке крафта, только отменяю результат выставив воздух, если на предметах нету нужной метдаты. В этом нет никакой логики, зачем их вообще нужно подменять? Их же сам игрок кладет.
     
  10. Автор темы
    fx8320e

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

    Баллы:
    66
    Мой алгоритм таков: я проверяю: 1) если материал в ячейка[n] == тому, чему мне надо, 2) этот материал имеет meta, 3) этот материал имеет определенную meta (кастомного предмета). При таком подходе, если предметов больше 1, возникал вышеописанный баг. Теперь же я добавил условие: 4) количество в ячейка[n] ! == 1. Опять же, это жуткие костыли, но хотя бы работает.
    PHP:
            if(craft.getType() == InventoryType.WORKBENCH
                    
    && matrix[0] == null
                    
    && matrix[1] == null 
                    
    && matrix[2] == null 
                    
    && matrix[3] == null 
                    
    && matrix[4] != null && matrix[4].getType() == Material.NAUTILUS_SHELL && matrix[4].hasItemMeta() && matrix[4].getItemMeta().equals(meta) && matrix[4].getAmount() == 1
                    
    && matrix[5] == null 
                    
    && matrix[6] == null
                    
    && matrix[7] != null && matrix[7].getType() == Material.STICK && matrix[7].getAmount() == 1
                    
    && matrix[8] == null) {
               

                        
    event.getInventory().setResult(woodendagge);
            }   
        }
     
  11. alexandrage

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

    Баллы:
    173
    В этом реально смысла нет, число предметов не имеет значение, от слова совсем. Нет смысла его считать и сравнивать. if(stack1.isSimilar(stack2)) {todo}
     
  12. Автор темы
    fx8320e

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

    Баллы:
    66
    Не соглашусь, что не имеет смысла. Если в ячейку положить более одного предмета, то после крафта он останется, верно? Так вот, здесь этот самый остаток рассчитывается по некоторой формуле. Остаток = (n-1)*2, где n - исходное число предметов. То есть, как на скриншоте ниже, если я крафчу кинжал из одного материала, загружая в ячейку стак, то на выходе получу (64-1)*2 = 126 материала. При ограничении в один, остаток будет равен нулю ((1-1)*2), как и должен при нормальном крафте. Не знаю, как формула получилась, ведь я ничего подобного и близко не добавлял.
     

    Вложения:

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