diff --git a/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java b/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java index ae6ba2d49..41cdf8ada 100644 --- a/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java +++ b/projects/common/src/main/java/dan200/computercraft/data/RecipeProvider.java @@ -65,6 +65,7 @@ class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { addSpecial(add, ModRegistry.RecipeSerializers.PRINTOUT.get()); addSpecial(add, ModRegistry.RecipeSerializers.DISK.get()); addSpecial(add, ModRegistry.RecipeSerializers.DYEABLE_ITEM.get()); + addSpecial(add, ModRegistry.RecipeSerializers.DYEABLE_ITEM_CLEAR.get()); addSpecial(add, ModRegistry.RecipeSerializers.TURTLE_UPGRADE.get()); addSpecial(add, ModRegistry.RecipeSerializers.POCKET_COMPUTER_UPGRADE.get()); } diff --git a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java index cbf0d8c28..364e8b8d7 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/ModRegistry.java @@ -19,6 +19,7 @@ import dan200.computercraft.shared.command.arguments.ComputerArgumentType; import dan200.computercraft.shared.command.arguments.ComputersArgumentType; import dan200.computercraft.shared.command.arguments.RepeatArgumentType; import dan200.computercraft.shared.command.arguments.TrackingFieldArgumentType; +import dan200.computercraft.shared.common.ClearColourRecipe; import dan200.computercraft.shared.common.ColourableRecipe; import dan200.computercraft.shared.common.DefaultBundledRedstoneProvider; import dan200.computercraft.shared.common.HeldItemMenu; @@ -351,6 +352,7 @@ public final class ModRegistry { } public static final RegistryEntry> DYEABLE_ITEM = simple("colour", ColourableRecipe::new); + public static final RegistryEntry> DYEABLE_ITEM_CLEAR = simple("clear_colour", ClearColourRecipe::new); public static final RegistryEntry TURTLE = REGISTRY.register("turtle", TurtleRecipe.Serializer::new); public static final RegistryEntry> TURTLE_UPGRADE = simple("turtle_upgrade", TurtleUpgradeRecipe::new); public static final RegistryEntry> POCKET_COMPUTER_UPGRADE = simple("pocket_computer_upgrade", PocketComputerUpgradeRecipe::new); diff --git a/projects/common/src/main/java/dan200/computercraft/shared/common/ClearColourRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/common/ClearColourRecipe.java new file mode 100644 index 000000000..f297db3d8 --- /dev/null +++ b/projects/common/src/main/java/dan200/computercraft/shared/common/ClearColourRecipe.java @@ -0,0 +1,84 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2022. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ +package dan200.computercraft.shared.common; + +import dan200.computercraft.shared.ModRegistry; +import net.minecraft.core.NonNullList; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +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; + +/** + * Craft a wet sponge with a {@linkplain IColouredItem dyable item} to remove its dye. + */ +public final class ClearColourRecipe extends CustomRecipe { + public ClearColourRecipe(ResourceLocation id, CraftingBookCategory category) { + super(id, category); + } + + @Override + public boolean matches(CraftingContainer inv, Level world) { + var hasColourable = false; + var hasSponge = false; + for (var i = 0; i < inv.getContainerSize(); i++) { + var stack = inv.getItem(i); + if (stack.isEmpty()) continue; + + if (stack.getItem() instanceof IColouredItem colourable) { + if (hasColourable) return false; + if (colourable.getColour(stack) == -1) return false; + hasColourable = true; + } else if (stack.getItem() == Items.WET_SPONGE) { + if (hasSponge) return false; + hasSponge = true; + } else { + return false; + } + } + + return hasColourable && hasSponge; + } + + @Override + public ItemStack assemble(CraftingContainer inv) { + var colourable = ItemStack.EMPTY; + + for (var i = 0; i < inv.getContainerSize(); i++) { + var stack = inv.getItem(i); + if (stack.getItem() instanceof IColouredItem) colourable = stack; + } + + if (colourable.isEmpty()) return ItemStack.EMPTY; + + var stack = ((IColouredItem) colourable.getItem()).withColour(colourable, -1); + stack.setCount(1); + return stack; + } + + @Override + public NonNullList getRemainingItems(CraftingContainer container) { + var remaining = NonNullList.withSize(container.getContainerSize(), ItemStack.EMPTY); + for (var i = 0; i < remaining.size(); i++) { + if (container.getItem(i).getItem() == Items.WET_SPONGE) remaining.set(i, new ItemStack(Items.WET_SPONGE)); + } + return remaining; + } + + @Override + public boolean canCraftInDimensions(int x, int y) { + return x * y >= 2; + } + + @Override + public RecipeSerializer getSerializer() { + return ModRegistry.RecipeSerializers.DYEABLE_ITEM_CLEAR.get(); + } +} diff --git a/projects/common/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java b/projects/common/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java index c4a8b36d8..3c1943078 100644 --- a/projects/common/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java +++ b/projects/common/src/main/java/dan200/computercraft/shared/common/ColourableRecipe.java @@ -74,7 +74,7 @@ public final class ColourableRecipe extends CustomRecipe { } @Override - public RecipeSerializer getSerializer() { + public RecipeSerializer getSerializer() { return ModRegistry.RecipeSerializers.DYEABLE_ITEM.get(); } } diff --git a/projects/fabric/src/generated/resources/data/computercraft/recipes/clear_colour.json b/projects/fabric/src/generated/resources/data/computercraft/recipes/clear_colour.json new file mode 100644 index 000000000..c19fd9b0d --- /dev/null +++ b/projects/fabric/src/generated/resources/data/computercraft/recipes/clear_colour.json @@ -0,0 +1 @@ +{"type": "computercraft:clear_colour", "category": "misc"} diff --git a/projects/forge/src/generated/resources/data/computercraft/recipes/clear_colour.json b/projects/forge/src/generated/resources/data/computercraft/recipes/clear_colour.json new file mode 100644 index 000000000..c19fd9b0d --- /dev/null +++ b/projects/forge/src/generated/resources/data/computercraft/recipes/clear_colour.json @@ -0,0 +1 @@ +{"type": "computercraft:clear_colour", "category": "misc"}