execute as @e[type=item,nbt={Item:{id:"minecraft:paper",Count:3b}}] at @s if entity @e[type=item,nbt={Item:{id:"minecraft:leather",Count:2b}},limit=1,distance=..0.3] run tag @s add DoCombine execute at @e[type=item,tag=DoCombine] run kill @e[type=item,nbt={Item:{id:"minecraft:leather",Count:2b}},limit=1,distance=..0.3] execute at @e[type=item,tag=DoCombine] run summon item ~ ~ ~ {Item:{id:"minecraft:book",Count:1b},Motion:[0.0,0.2,0.0]} kill @e[type=item,tag=DoCombine]
{id:"minecraft:paper",Count:3b} - Первый предмет {id:"minecraft:leather",Count:2b} - Второй предмет {id:"minecraft:book",Count:1b} - Предмет который получится
-{id:"<айди предмета>",Count:<необходимое количество>b} ..0.3 - Расстояние на котором предметы будут объеденяются DoCombine - Временный тег (если вы собираетесь добавлять ещё таких крафтов, лучше ставить для каждого крафта свой уникальный тег)
#Если в датапаке
#- main (основной цикл датапака)
execute as @e[type=item,nbt={Item:{id:"minecraft:paper",Count:3b}}] at @s if entity @e[type=item,nbt={Item:{id:"minecraft:leather",Count:2b}},limit=1,distance=..0.3] run function datapack:DoCombine
#- DoCombine
kill @e[type=item,nbt={Item:{id:"minecraft:leather",Count:2b}},limit=1,distance=..0.3] summon item ~ ~ ~ {Item:{id:"minecraft:book",Count:1b},Motion:[0.0,0.2,0.0]} kill @s
datapack - имя датапака DoCombine - имя функции крафта (для каждого крафта нужна своя функция)