Carbon copy

- Written Filters, Clipboards and Schedules can now be copied onto unwritten ones in the crafting table
This commit is contained in:
simibubi 2025-02-07 11:50:20 +01:00
parent 688a07b314
commit 8003bfac36
8 changed files with 120 additions and 5 deletions

View file

@ -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 a8cc4af26f6c7c45a9eef12e92af1452fe042454 data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank.json
2c2639c7b307ee7c7a4e97e5efebf496788998ad data/create/advancements/recipes/combat/crafting/appliances/netherite_backtank_from_netherite.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 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 d0bad974476c54315e4b656c67dbf6165d183bbc data/create/recipes/crafting/appliances/tree_fertilizer.json
5b499ce4eee741d17813f96274333abfa2de99a9 data/create/recipes/crafting/curiosities/brown_toolbox.json 5b499ce4eee741d17813f96274333abfa2de99a9 data/create/recipes/crafting/curiosities/brown_toolbox.json
05eb422734dcdd4c499437ae564e73af5c2e4673 data/create/recipes/crafting/curiosities/cake.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 c3444000827e1f9553818dedec6d3dba4af9dfcd data/create/recipes/crafting/curiosities/minecart_coupling.json
1323b7c6d30d4e343e010902b7ebbfa2590a4cf5 data/create/recipes/crafting/curiosities/peculiar_bell.json 1323b7c6d30d4e343e010902b7ebbfa2590a4cf5 data/create/recipes/crafting/curiosities/peculiar_bell.json
e54646485af774e490409e9912a3799f7ac44e01 data/create/recipes/crafting/curiosities/toolbox_dyeing.json e54646485af774e490409e9912a3799f7ac44e01 data/create/recipes/crafting/curiosities/toolbox_dyeing.json

View file

@ -0,0 +1,4 @@
{
"type": "create:item_copying",
"category": "misc"
}

View file

@ -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.recipe.ProcessingRecipeSerializer;
import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipeSerializer; import com.simibubi.create.content.processing.sequenced.SequencedAssemblyRecipeSerializer;
import com.simibubi.create.foundation.recipe.IRecipeTypeInfo; import com.simibubi.create.foundation.recipe.IRecipeTypeInfo;
import com.simibubi.create.foundation.recipe.ItemCopyingRecipe;
import net.createmod.catnip.lang.Lang; import net.createmod.catnip.lang.Lang;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
@ -64,7 +65,8 @@ public enum AllRecipeTypes implements IRecipeTypeInfo {
MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new), MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new),
SEQUENCED_ASSEMBLY(SequencedAssemblyRecipeSerializer::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<? super Recipe<?>> CAN_BE_AUTOMATED = r -> !r.getId() public static final Predicate<? super Recipe<?>> CAN_BE_AUTOMATED = r -> !r.getId()
.getPath() .getPath()

View file

@ -2,6 +2,8 @@ package com.simibubi.create.content.equipment.clipboard;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying;
import net.createmod.catnip.gui.ScreenOpener; import net.createmod.catnip.gui.ScreenOpener;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@ -21,7 +23,7 @@ import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
public class ClipboardBlockItem extends BlockItem { public class ClipboardBlockItem extends BlockItem implements SupportsItemCopying {
public ClipboardBlockItem(Block pBlock, Properties pProperties) { public ClipboardBlockItem(Block pBlock, Properties pProperties) {
super(pBlock, pProperties); super(pBlock, pProperties);

View file

@ -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.filter.AttributeFilterMenu.WhitelistMode;
import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute; import com.simibubi.create.content.logistics.item.filter.attribute.ItemAttribute;
import com.simibubi.create.foundation.item.ItemHelper; import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying;
import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.CreateLang;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
@ -43,7 +44,7 @@ import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.NetworkHooks;
public class FilterItem extends Item implements MenuProvider { public class FilterItem extends Item implements MenuProvider, SupportsItemCopying {
private FilterType type; private FilterType type;

View file

@ -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.entity.Train;
import com.simibubi.create.content.trains.schedule.destination.DestinationInstruction; import com.simibubi.create.content.trains.schedule.destination.DestinationInstruction;
import com.simibubi.create.foundation.advancement.AllAdvancements; import com.simibubi.create.foundation.advancement.AllAdvancements;
import com.simibubi.create.foundation.recipe.ItemCopyingRecipe.SupportsItemCopying;
import com.simibubi.create.foundation.utility.CreateLang; import com.simibubi.create.foundation.utility.CreateLang;
import net.createmod.catnip.data.Couple; 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.api.distmarker.OnlyIn;
import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.NetworkHooks;
public class ScheduleItem extends Item implements MenuProvider { public class ScheduleItem extends Item implements MenuProvider, SupportsItemCopying {
public ScheduleItem(Properties pProperties) { public ScheduleItem(Properties pProperties) {
super(pProperties); super(pProperties);

View file

@ -202,6 +202,7 @@ public class StandardRecipeGen extends CreateRecipeProvider {
.pattern(" L ")), .pattern(" L ")),
TOOLBOX_DYEING = createSpecial(AllRecipeTypes.TOOLBOX_DYEING::getSerializer, "crafting", "toolbox_dyeing"), 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) MINECART_COUPLING = create(AllItems.MINECART_COUPLING).unlockedBy(I::andesiteAlloy)
.viaShaped(b -> b.define('E', I.andesiteAlloy()) .viaShaped(b -> b.define('E', I.andesiteAlloy())

View file

@ -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<ItemStack> 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<ItemStack> 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<ItemStack> getRemainingItems(CraftingContainer inv) {
NonNullList<ItemStack> 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;
}
}