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

Версия 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,509
Это способ на новых версиях создавать рецепты кодом. На версиях 1.12 и ниже это называлось IRecipe.
Пример(4 ссылка в гугле по запросу IRecipeSerializer): SilentChaos512/Tutorial-1.14.x

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

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

Мне говорили, что можно реализовав этот метод сделать так, чтобы он брал крафт с json файла.
У метода IRecipeSerializer#read есть параметр JsonObject, соответственно, можно через json делать какую-то конфигурацию своего рецепта. В примере выше этот параметр не используется
 
Чисто теоретически можно. Получить текущий контейнер игрока из события, проверить, что это верстак и положить в слот миску
Но на сколько я понимаю, то человек не сможет за раз скрафтить стак предметов, ибо мыска, которая нужна для крафта пропадает и потом появляется.

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

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

Поковыряй SpecialRecipe
Вспомни, может, в ваниле есть такие рецепты
Может, в модах есть такие рецепты, можно будет там посмотреть
 
Вспомни, может, в ваниле есть такие рецепты
Нету, я искал))


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


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

Поковыряй 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,509
Потестируй.
Попробуй:
  • скрафтить один предмет(чтобыц в сетке хватало только на 1 крафт)
  • сразу стак
  • 63 штуки
  • миску можно стакать до 4, попробуй скрафтить из стака мисок
  • проверь как работает крафт на кастомных верстаках из модов
Проверь все кейсы, какие только сможешь придумать

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

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