Крафт с ванильным предметом

Версия Minecraft
1.16.4
API
Forge
Ребят, я добавил в игру три предмета:
1. Кусок руды
2. Измельченная руда
3. Пестик

Так же добавил рецепт(безформеный):
1. Кусок руды
2. Пестик
3. Миска
Крафт:
1. измельченная руда.

Я реализовал так, чтобы пестик при крафте ломался на 1 прочность.
Теперь я хочу сделать так, чтобы миска при крафте не тратилась. Поскольку это ванильный предмет там нужно, как мне посоветовали англичане "IRecipeSerializer".
Из-за того что я только начинаю разбираться в моддинге, то я не знаю как использовать этот метод/функции(?). Я уже дня три гуглю, спрашую у англичан, а они просто посылают меня((

Я просто не знаю как правильно построить вот этот IRecipeSerializer.

Может его даже использовать не надо, может есть другие варианты реализации задумки.

1609880480413.png
1609880491758.png

Вот, на скринах видно, что миска пропала, а мне нужно, чтобы она осталась.
Ребят, прошу помочь не только посылание на какие-то методы, а и кодом, потому что, если я не знаю как правильно реализовать этот метод, то и не смогу его использовать, но если будет код, который показывает реализацию метода, то я в нем смогу разобраться и научится😇
 
Последнее редактирование:
Решение
Это способ на новых версиях создавать рецепты кодом. На версиях 1.12 и ниже это называлось IRecipe.
Пример(4 ссылка в гугле по запросу IRecipeSerializer): SilentChaos512/Tutorial-1.14.x

Однако это тебе скорее всего не понадобится, ибо есть событие PlayerEvent.ItemCraftedEvent, по которому можно просто закидывать в инвентарь игрока новую миску
~~~
Тутор про события:
7,099
324
1,510
Это способ на новых версиях создавать рецепты кодом. На версиях 1.12 и ниже это называлось IRecipe.
Пример(4 ссылка в гугле по запросу IRecipeSerializer): SilentChaos512/Tutorial-1.14.x

Однако это тебе скорее всего не понадобится, ибо есть событие PlayerEvent.ItemCraftedEvent, по которому можно просто закидывать в инвентарь игрока новую миску
~~~
Тутор про события:
 
7,099
324
1,510
А есть возможность оставить ее в верстаке? Ну или положить туда новую, в ту же ячейку?
Чисто теоретически можно. Получить текущий контейнер игрока из события, проверить, что это верстак и положить в слот миску

Мне говорили, что можно реализовав этот метод сделать так, чтобы он брал крафт с json файла.
У метода IRecipeSerializer#read есть параметр JsonObject, соответственно, можно через json делать какую-то конфигурацию своего рецепта. В примере выше этот параметр не используется
 
7,099
324
1,510
Я почитал то, что ты скинул, но так и не понял как там предмет не пропадает(если он там пропадает).
Там пример рецепта кодом: покраска предмета любой краской без необходимости перечислять кучу рецептов в куче json.
Как сделать ,чтобы какой-то предмет не тратился и оставлся в сетке - готовог орешения у меня нет.

Поковыряй SpecialRecipe
Вспомни, может, в ваниле есть такие рецепты
Может, в модах есть такие рецепты, можно будет там посмотреть
 
Это способ на новых версиях создавать рецепты кодом. На версиях 1.12 и ниже это называлось IRecipe.
Пример(4 ссылка в гугле по запросу IRecipeSerializer): SilentChaos512/Tutorial-1.14.x
Мне говорили, что можно реализовав этот метод сделать так, чтобы он брал крафт с json файла.
Но я так понял это не единственный вариант.

в инвентарь игрока новую миску
А есть возможность оставить ее в верстаке? Ну или положить туда новую, в ту же ячейку?
Просто человек явно захочет за раз переделать более чем 1 руду(с помощью шифта), а постоянно перетягивать с инвентаря или кликать на слот крафта не очень круто)
 
Чисто теоретически можно. Получить текущий контейнер игрока из события, проверить, что это верстак и положить в слот миску
Но на сколько я понимаю, то человек не сможет за раз скрафтить стак предметов, ибо мыска, которая нужна для крафта пропадает и потом появляется.

IRecipeSerializer#read есть параметр JsonObject
Если с помощью IRecipeSerializer можно будет сделать все красиво, без вот этих проверок на верстак(учитывая то, что крафт можно делать в инвентаре), то очень классно будет.

Я почитал то, что ты скинул, но так и не понял как там предмет не пропадает(если он там пропадает). Было бы классно если бы можно было использовать json крафт, но при этом, сделать так, чтобы миска не пропадала
 
Вспомни, может, в ваниле есть такие рецепты
Нету, я искал))


Может, в модах есть такие рецепты, можно будет там посмотреть
Есть, в таумкрафте, но я не нашел там рецепт)


чтобы какой-то предмет не тратился и оставлся в сетке - готовог орешения у меня нет.
Ну а хотя бы может знаешь каким образом предмет может остаться? Вот есть у меня пример, тот что ты скинул, теперь я хоть немного понял как реализовывать крафт. Это шаг к решению проблемы, но не решение)

Поковыряй SpecialRecipe
Окей, тада я полез снова читать море кода)
 
В общем реализовал я, через то что ты подсказал
PlayerEvent.ItemCraftedEvent


Разобрался с примером
SilentChaos512/Tutorial-1.14.x

Применил полученные знания и сделал вот это:

Java:
@SubscribeEvent
    public static void onCraft(ItemCraftedEvent event){
        CraftingInventory inv = (CraftingInventory) event.getInventory();
        for (int i = 0; i < inv.getSizeInventory(); ++i) {
            ItemStack stack = inv.getStackInSlot(i);
            if (!stack.isEmpty()) {
                if(stack.getItem() == Items.BOWL) {
                    int count = stack.getCount();
                    event.getInventory().setInventorySlotContents(i, new ItemStack(Items.BOWL, count+1));
                }
            }
        }
    }

Но поскольку я новичок еще в этом деле, то мне кажется что это не идеальный вариант, хоть и миска остаться там где надо, и крафтить можно через шифт большие объёмы. Не исключаю, что возможен дюп предмета.

Взгляните своим профессиональным взглядом и подскажите, может добавить какие-то if'ы еще, доп проверки и т.п?)

Я знаю что так, миска не будет тратиться при любом крафте, я уже реализовую проверку ингредиентов. Может есть более оптимальный варианты, кроме как просто проверять ингредиенты?
 
Я немного доделал проверку. Проверяю если все предметы с моего рецепта находятся в верстаке и нет лишних, то делаем грязь)

Java:
@SubscribeEvent
    public static void onCraft(ItemCraftedEvent event){
        CraftingInventory inv = (CraftingInventory) event.getInventory();
        boolean p = false, b = false, s=false, l = false;
        for (int i = 0; i < inv.getSizeInventory(); ++i) {
            ItemStack stack = inv.getStackInSlot(i);
            if (!stack.isEmpty()) {
                if (stack.getItem() == Items.BOWL) {
                    b = true;
                }else if(stack.getItem() == ItemInit.white_shard.get()) {
                    s = true;
                }else if(stack.getItem() == ItemInit.pounder.get()) {
                    p = true;
                }else{
                    l = true;
                }
            }
        }
        if(p && b && s && !l) {
            for (int i = 0; i < inv.getSizeInventory(); ++i) {
                ItemStack stack = inv.getStackInSlot(i);
                if (!stack.isEmpty()) {
                    if(stack.getItem() == Items.BOWL) {
                        int count = stack.getCount();
                        event.getInventory().setInventorySlotContents(i, new ItemStack(Items.BOWL, count+1));
                    }
                }
            }
        }
    }

Но вопрос на счет дюпа и оптимизации открытый
 
7,099
324
1,510
Потестируй.
Попробуй:
  • скрафтить один предмет(чтобыц в сетке хватало только на 1 крафт)
  • сразу стак
  • 63 штуки
  • миску можно стакать до 4, попробуй скрафтить из стака мисок
  • проверь как работает крафт на кастомных верстаках из модов
Проверь все кейсы, какие только сможешь придумать

Могут существовать два рецепта с одинаковой сеткой, но разным результатом. Мод NoRecipeConflict позволяет выбирать результат крафта. У тебя сейчас нет проверки результата, поэтому миска не будет тратиться для всех похожих рецептов, а не только для твоего
 
Попробуй:
  • скрафтить один предмет(чтобыц в сетке хватало только на 1 крафт)
  • сразу стак
  • 63 штуки
  • миску можно стакать до 4, попробуй скрафтить из стака мисок
  • проверь как работает крафт на кастомных верстаках из модов
Это пробовал, кроме верстаков с модов.

Так-то вроде все хорошо.
Ладно, думаю тему можно считать закрытой)
 
Сверху