diff --git a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 index 5f2baf8e49..450f76f1a1 100644 --- a/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 +++ b/src/generated/resources/.cache/82992cbf8f2794d83ac94034835eac0acd7915b9 @@ -1,4 +1,4 @@ -// 1.20.1 2025-02-07T11:08:37.2861078 Create's Standard Recipes +// 1.20.1 2025-02-07T11:36:36.6037564 Create's Standard Recipes a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json 2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.json 81dcf0cb1aa99e39bc7d1a386e07cad4cee7d8b9 data/create/advancements/recipes/combat/crafting/appliances/netherite_diving_boots.json @@ -336,6 +336,7 @@ bbf63119e3ee54afd49fe2ccfe2c06baaa9f6f41 data/create/recipes/crafting/appliances d0bad974476c54315e4b656c67dbf6165d183bbc data/create/recipes/crafting/appliances/tree_fertilizer.json 5b499ce4eee741d17813f96274333abfa2de99a9 data/create/recipes/crafting/curiosities/brown_toolbox.json 05eb422734dcdd4c499437ae564e73af5c2e4673 data/create/recipes/crafting/curiosities/cake.json +b961ce60986ebfed1b0cc0f7053d6e558de13e86 data/create/recipes/crafting/curiosities/item_copying.json c3444000827e1f9553818dedec6d3dba4af9dfcd data/create/recipes/crafting/curiosities/minecart_coupling.json 1323b7c6d30d4e343e010902b7ebbfa2590a4cf5 data/create/recipes/crafting/curiosities/peculiar_bell.json e54646485af774e490409e9912a3799f7ac44e01 data/create/recipes/crafting/curiosities/toolbox_dyeing.json diff --git a/src/generated/resources/data/create/recipes/crafting/curiosities/item_copying.json b/src/generated/resources/data/create/recipes/crafting/curiosities/item_copying.json new file mode 100644 index 0000000000..81fc0b7fd6 --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/curiosities/item_copying.json @@ -0,0 +1,4 @@ +{ + "type": "create:item_copying", + "category": "misc" +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllRecipeTypes.java b/src/main/java/com/simibubi/create/AllRecipeTypes.java index 3962526ffe..e8540ed470 100644 --- a/src/main/java/com/simibubi/create/AllRecipeTypes.java +++ b/src/main/java/com/simibubi/create/AllRecipeTypes.java @@ -27,6 +27,7 @@ import com.simibubi.create.content.processing.recipe.ProcessingRecipeBuilder.Pro import com.simibubi.create.content.processing.recipe.ProcessingRecipeSerializer; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipeSerializer; import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; +import com.simibubi.create.foundation.recipe.ItemCopyingRecipe; import net.createmod.catnip.lang.Lang; import net.minecraft.core.registries.Registries; @@ -64,7 +65,8 @@ public enum AllRecipeTypes implements IRecipeTypeInfo { MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new), SEQUENCED_ASSEMBLY(SequencedAssemblyRecipeSerializer::new), - TOOLBOX_DYEING(() -> new SimpleCraftingRecipeSerializer<>(ToolboxDyeingRecipe::new), () -> RecipeType.CRAFTING, false); + TOOLBOX_DYEING(() -> new SimpleCraftingRecipeSerializer<>(ToolboxDyeingRecipe::new), () -> RecipeType.CRAFTING, false), + ITEM_COPYING(() -> new SimpleCraftingRecipeSerializer<>(ItemCopyingRecipe::new), () -> RecipeType.CRAFTING, false); public static final Predicate> CAN_BE_AUTOMATED = r -> !r.getId() .getPath() diff --git a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java index 9f3314a2a6..9aae35a44c 100644 --- a/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java +++ b/src/main/java/com/simibubi/create/content/equipment/clipboard/ClipboardBlockItem.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.equipment.clipboard; import javax.annotation.Nonnull; +import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying; + import net.createmod.catnip.gui.ScreenOpener; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -21,7 +23,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.ItemHandlerHelper; -public class ClipboardBlockItem extends BlockItem { +public class ClipboardBlockItem extends BlockItem implements SupportsItemCopying { public ClipboardBlockItem(Block pBlock, Properties pProperties) { super(pBlock, pProperties); diff --git a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java index 4eaf0b9b70..eefe7dd387 100644 --- a/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/filter/FilterItem.java @@ -15,6 +15,7 @@ import com.simibubi.create.content.logistics.box.PackageItem; import com.simibubi.create.content.logistics.filter.AttributeFilterMenu.WhitelistMode; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.foundation.item.ItemHelper; +import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying; import com.simibubi.create.foundation.utility.CreateLang; import net.minecraft.ChatFormatting; @@ -43,7 +44,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.network.NetworkHooks; -public class FilterItem extends Item implements MenuProvider { +public class FilterItem extends Item implements MenuProvider, SupportsItemCopying { private FilterType type; diff --git a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java index 4c7281342f..6eb4740bc3 100644 --- a/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java +++ b/src/main/java/com/simibubi/create/content/trains/schedule/ScheduleItem.java @@ -10,6 +10,7 @@ import com.simibubi.create.content.trains.entity.CarriageContraptionEntity; import com.simibubi.create.content.trains.entity.Train; import com.simibubi.create.content.trains.schedule.destination.DestinationInstruction; import com.simibubi.create.foundation.advancement.AllAdvancements; +import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying; import com.simibubi.create.foundation.utility.CreateLang; import net.createmod.catnip.data.Couple; @@ -36,7 +37,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.network.NetworkHooks; -public class ScheduleItem extends Item implements MenuProvider { +public class ScheduleItem extends Item implements MenuProvider, SupportsItemCopying { public ScheduleItem(Properties pProperties) { super(pProperties); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index b5186abb56..cae3b12513 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -202,6 +202,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .pattern(" L ")), TOOLBOX_DYEING = createSpecial(AllRecipeTypes.TOOLBOX_DYEING::getSerializer, "crafting", "toolbox_dyeing"), + ITEM_COPYING = createSpecial(AllRecipeTypes.ITEM_COPYING::getSerializer, "crafting", "item_copying"), MINECART_COUPLING = create(AllItems.MINECART_COUPLING).unlockedBy(I::andesiteAlloy) .viaShaped(b -> b.define('E', I.andesiteAlloy()) diff --git a/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java b/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java new file mode 100644 index 0000000000..8779ee0170 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/recipe/ItemCopyingRecipe.java @@ -0,0 +1,103 @@ +package com.simibubi.create.foundation.recipe; + +import javax.annotation.Nullable; + +import com.simibubi.create.AllRecipeTypes; + +import net.createmod.catnip.data.IntAttached; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingBookCategory; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.Level; + +public class ItemCopyingRecipe extends CustomRecipe { + + public static interface SupportsItemCopying { + + public default ItemStack createCopy(ItemStack original, int count) { + ItemStack copyWithCount = original.copyWithCount(count); + copyWithCount.removeTagKey("Enchantments"); + return copyWithCount; + } + + public default boolean canCopyFromItem(ItemStack item) { + return item.hasTag(); + } + + public default boolean canCopyToItem(ItemStack item) { + return !item.hasTag(); + } + + } + + public ItemCopyingRecipe(ResourceLocation id, CraftingBookCategory category) { + super(id, category); + } + + @Override + public boolean matches(CraftingContainer inv, Level level) { + return copyCheck(inv) != null; + } + + @Override + public ItemStack assemble(CraftingContainer container, RegistryAccess registryAccess) { + IntAttached copyCheck = copyCheck(container); + if (copyCheck == null) + return ItemStack.EMPTY; + + ItemStack itemToCopy = copyCheck.getValue(); + if (!(itemToCopy.getItem() instanceof SupportsItemCopying sic)) + return ItemStack.EMPTY; + + return sic.createCopy(itemToCopy, copyCheck.getFirst() + 1); + } + + @Nullable + private IntAttached copyCheck(CraftingContainer inv) { + ItemStack itemToCopy = ItemStack.EMPTY; + int copyTargets = 0; + + for (int j = 0; j < inv.getContainerSize(); ++j) { + ItemStack itemInSlot = inv.getItem(j); + if (itemInSlot.isEmpty()) + continue; + if (!itemToCopy.isEmpty() && itemToCopy.getItem() != itemInSlot.getItem()) + return null; + if (!(itemInSlot.getItem() instanceof SupportsItemCopying sic)) + continue; + + if (sic.canCopyFromItem(itemInSlot)) { + if (!itemToCopy.isEmpty()) + return null; + itemToCopy = itemInSlot; + continue; + } + + if (sic.canCopyToItem(itemInSlot)) + copyTargets++; + } + + if (itemToCopy.isEmpty() || copyTargets == 0) + return null; + + return IntAttached.with(copyTargets, itemToCopy); + } + + public NonNullList getRemainingItems(CraftingContainer inv) { + NonNullList nonnulllist = NonNullList.withSize(inv.getContainerSize(), ItemStack.EMPTY); + return nonnulllist; + } + + public RecipeSerializer getSerializer() { + return AllRecipeTypes.ITEM_COPYING.getSerializer(); + } + + public boolean canCraftInDimensions(int width, int height) { + return width >= 2 && height >= 2; + } +}