RecipeType отличается от самого рецепта. Давайте посмотрим пример рецепта, чтобы лучше понять его:
{ "type": "minecraft:smelting", "ingredient": { "tag": "minecraft:logs_that_burn" }, "result": "minecraft:charcoal", "experience": 0.15, "cookingtime": 200 }
Сам файл определяет рецепт получения древесного угля, тип этого рецепта - плавка. RecipeType может быть определен как группа рецептов. Этот RecipeType используется блоком печи, но вы можете создать другую печь, которая также использует этот тип рецепта, но с другой статистикой.
Для работы RecipeType необходимы две вещи: класс Recipe и класс RecipeSerializer.
Класс Recipe определяет входные данные, выходные данные, способы их обработки и другие вещи. При создании рецепта, подобного примеру с древесным углем, создается экземпляр вашего класса Recipe, который используется для регистрации в RecipeType.
RecipeSerializer используется для сериализации объекта (здесь это экземпляр вашего класса Recipe, который определяет рецепт) в пакет и для десериализации из пакета или объекта json в экземпляр вашего класса Recipe. RecipeSerializer помогает нам быстрее создавать рецепты без необходимости создавать собственный класс Recipe для каждого нужного нам рецепта.
Чтобы проверить, работают ли разные предметы в инвентаре как входные данные рецепта, и получить ожидаемый результат, мы используем класс RecipeManager. У него есть некоторый полезный метод, такой как getAllOfType, возвращающий карту всех рецептов определенного типа с их идентификатором, или getAllMatches, возвращающий список рецептов, которые можно использовать с помощью инвентаря обработчика экрана.
Самый простой способ добавить тип рецепта - это использовать некоторые классы ванилы, чтобы сэкономить много кода. Примером этого могут служить все абстрактные классы, связанные с приготовлением пищи. Эти классы используются для печи, коптильни, доменной печи и даже костра. Если ваш RecipeType ведет себя так же, как и ванильный RecipeType, вам следует сначала попытаться расширить используемые классы, если они существуют (иногда в RecipeType для блока нет классов, которые вы можете использовать, и проще создать свой RecipeType с нуля).