mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-03-04 06:44:40 +01:00
Carbon copy
- Written Filters, Clipboards and Schedules can now be copied onto unwritten ones in the crafting table
This commit is contained in:
parent
688a07b314
commit
8003bfac36
8 changed files with 120 additions and 5 deletions
|
@ -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
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "create:item_copying",
|
||||||
|
"category": "misc"
|
||||||
|
}
|
|
@ -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()
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue