diff --git a/src/main/java/plus/dragons/createdragonsplus/common/kinetics/fan/sanding/SandingFanProcessingType.java b/src/main/java/plus/dragons/createdragonsplus/common/kinetics/fan/sanding/SandingFanProcessingType.java index da9d1b2..da5a707 100644 --- a/src/main/java/plus/dragons/createdragonsplus/common/kinetics/fan/sanding/SandingFanProcessingType.java +++ b/src/main/java/plus/dragons/createdragonsplus/common/kinetics/fan/sanding/SandingFanProcessingType.java @@ -5,7 +5,6 @@ */ package plus.dragons.createdragonsplus.common.kinetics.fan.sanding; -import com.simibubi.create.AllRecipeTypes; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.content.kinetics.fan.processing.FanProcessingType; import com.simibubi.create.foundation.recipe.RecipeApplier; @@ -38,7 +37,7 @@ /** * Sanding fan processing type. Implements {@link DynamicParticleFanProcessingType} directly, * matching the upstream NeoForge structure. Uses {@link DeferredHolder} for - * Create DnD compat lookups, and includes sandpaper polishing fallback. + * Create DnD compat lookups. */ public class SandingFanProcessingType implements DynamicParticleFanProcessingType { private final RecipeWrapper reusableWrapper = new RecipeWrapper(new net.minecraftforge.items.ItemStackHandler(1)); @@ -76,9 +75,6 @@ public boolean canProcess(ItemStack stack, Level level) { var recipe = level.getRecipeManager() .getRecipeFor(CDPRecipes.SANDING.getType(), reusableWrapper, level); if (recipe.isPresent()) return true; - if (AllRecipeTypes.SANDPAPER_POLISHING.find(reusableWrapper, level) - .filter(AllRecipeTypes.CAN_BE_AUTOMATED) - .isPresent()) return true; return canProcessByCompatRecipe(createDNDRecipe, stack, level); } @@ -91,11 +87,6 @@ public boolean canProcess(ItemStack stack, Level level) { if (recipe.isPresent()) { return RecipeApplier.applyRecipeOn(level, stack, recipe.get(), true); } - var polishingRecipe = AllRecipeTypes.SANDPAPER_POLISHING.find(reusableWrapper, level) - .filter(AllRecipeTypes.CAN_BE_AUTOMATED); - if (polishingRecipe.isPresent()) { - return RecipeApplier.applyRecipeOn(level, stack, polishingRecipe.get(), true); - } Optional> dndResult = processByCompatRecipe(createDNDRecipe, stack, level); return dndResult.orElse(null); } diff --git a/src/main/java/plus/dragons/createdragonsplus/common/recipe/UpdateRecipesEvent.java b/src/main/java/plus/dragons/createdragonsplus/common/recipe/UpdateRecipesEvent.java index 520afec..53957ac 100644 --- a/src/main/java/plus/dragons/createdragonsplus/common/recipe/UpdateRecipesEvent.java +++ b/src/main/java/plus/dragons/createdragonsplus/common/recipe/UpdateRecipesEvent.java @@ -33,6 +33,7 @@ import plus.dragons.createdragonsplus.mixin.minecraft.RecipeManagerAccessor; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -66,6 +67,22 @@ public UpdateRecipesEvent(RecipeManager recipeManager, this.byName = byName; } + /** + * Returns all recipes of the given type from the current recipe set. + *

+ * This includes any recipes added by earlier handlers of this event. + * + * @param type the recipe type to query + * @param the recipe type + * @return an unmodifiable list of recipes of the given type + */ + @SuppressWarnings("unchecked") + public > List getRecipesForType(RecipeType type) { + Map> typeMap = byType.get(type); + if (typeMap == null) return List.of(); + return (List) List.copyOf(typeMap.values()); + } + /** * @return the {@link RecipeManager recipe manager}. */ diff --git a/src/main/java/plus/dragons/createdragonsplus/data/internal/CDPRuntimeRecipeProvider.java b/src/main/java/plus/dragons/createdragonsplus/data/internal/CDPRuntimeRecipeProvider.java index fde9d86..2f74a4e 100644 --- a/src/main/java/plus/dragons/createdragonsplus/data/internal/CDPRuntimeRecipeProvider.java +++ b/src/main/java/plus/dragons/createdragonsplus/data/internal/CDPRuntimeRecipeProvider.java @@ -20,6 +20,8 @@ import java.util.List; import java.util.function.Consumer; +import com.simibubi.create.AllRecipeTypes; +import com.simibubi.create.content.equipment.sandPaper.SandPaperPolishingRecipe; import com.simibubi.create.content.fluids.potion.PotionMixingRecipes; import com.simibubi.create.content.kinetics.mixer.MixingRecipe; import com.simibubi.create.content.processing.recipe.HeatCondition; @@ -33,11 +35,13 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.WeatheringCopper; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.Mod; import plus.dragons.createdragonsplus.common.CDPCommon; +import plus.dragons.createdragonsplus.common.kinetics.fan.sanding.SandingRecipe; import plus.dragons.createdragonsplus.common.recipe.UpdateRecipesEvent; import plus.dragons.createdragonsplus.common.registry.CDPBlocks; import plus.dragons.createdragonsplus.common.registry.CDPDataMaps; @@ -86,6 +90,11 @@ private static void buildPolishedBlockRecipes(Consumer output) { .require(baseItem) .output(polishedItem) .build(output); + var sandingId = CDPCommon.asResource(baseId.toString().replace(':', '/') + "_sanding"); + CreateRecipeBuilders.sanding(sandingId) + .require(baseItem) + .output(polishedItem) + .build(output); }); } @@ -108,6 +117,7 @@ public static void buildRecipesForUpdate(final UpdateRecipesEvent event) { if (CDPConfig.COMMON.generateAutomaticBrewingRecipeForDragonBreathFluid.get()) { buildDragonBreathFluidRecipes(event); } + buildSandingFromPolishingRecipes(event); } private static void buildOxidizedBlockRecipes(UpdateRecipesEvent event) { @@ -124,6 +134,12 @@ private static void buildOxidizedBlockRecipes(UpdateRecipesEvent event) { .output(previousItem) .build(); event.addRecipe(recipeId, recipe); + var sandingId = CDPCommon.asResource(oxidizedId.toString().replace(':', '/') + "_sanding"); + Recipe sandingRecipe = CreateRecipeBuilders.sanding(sandingId) + .require(oxidizedItem) + .output(previousItem) + .build(); + event.addRecipe(sandingId, sandingRecipe); }); } @@ -141,6 +157,12 @@ private static void buildWaxedBlockRecipes(UpdateRecipesEvent event) { .output(unwaxedItem) .build(); event.addRecipe(recipeId, recipe); + var sandingId = CDPCommon.asResource(waxedId.toString().replace(':', '/') + "_sanding"); + Recipe sandingRecipe = CreateRecipeBuilders.sanding(sandingId) + .require(waxedItem) + .output(unwaxedItem) + .build(); + event.addRecipe(sandingId, sandingRecipe); }); } @@ -181,4 +203,20 @@ private static void buildDragonBreathFluidRecipes(UpdateRecipesEvent event) { } } + /** + * Converts all registered {@code SANDPAPER_POLISHING} recipes into corresponding + * {@code SANDING} recipes, so that the attribute filter and + * {@link plus.dragons.createdragonsplus.common.kinetics.fan.sanding.SandingFanProcessingType#canProcess} + * can detect "sanding-capable" items that only have sandpaper polishing recipes + * (e.g., Rose Quartz → Polished Rose Quartz). + */ + @SuppressWarnings("unchecked") + private static void buildSandingFromPolishingRecipes(UpdateRecipesEvent event) { + event.getRecipesForType(AllRecipeTypes.SANDPAPER_POLISHING.>getType()) + .stream() + .filter(AllRecipeTypes.CAN_BE_AUTOMATED) + .map(SandingRecipe::convertSandPaperPolishing) + .forEach(recipe -> event.addRecipe(recipe.getId(), recipe)); + } + } diff --git a/src/main/java/plus/dragons/createdragonsplus/data/recipe/CreateRecipeBuilders.java b/src/main/java/plus/dragons/createdragonsplus/data/recipe/CreateRecipeBuilders.java index f185c9e..42d8984 100644 --- a/src/main/java/plus/dragons/createdragonsplus/data/recipe/CreateRecipeBuilders.java +++ b/src/main/java/plus/dragons/createdragonsplus/data/recipe/CreateRecipeBuilders.java @@ -38,6 +38,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ItemLike; +import plus.dragons.createdragonsplus.common.kinetics.fan.sanding.SandingRecipe; + public class CreateRecipeBuilders { public static ProcessingRecipeBuilder crushing(ResourceLocation id) { return new ProcessingRecipeBuilder<>(CrushingRecipe::new, id); @@ -67,6 +69,10 @@ public static ProcessingRecipeBuilder polishing(Resour return new ProcessingRecipeBuilder<>(SandPaperPolishingRecipe::new, id); } + public static ProcessingRecipeBuilder sanding(ResourceLocation id) { + return new ProcessingRecipeBuilder<>(SandingRecipe::new, id); + } + public static ProcessingRecipeBuilder splashing(ResourceLocation id) { return new ProcessingRecipeBuilder<>(SplashingRecipe::new, id); }