Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<SandingFanProcessingType.ParticleData> {
private final RecipeWrapper reusableWrapper = new RecipeWrapper(new net.minecraftforge.items.ItemStackHandler(1));
Expand Down Expand Up @@ -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);
}

Expand All @@ -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<List<ItemStack>> dndResult = processByCompatRecipe(createDNDRecipe, stack, level);
return dndResult.orElse(null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import plus.dragons.createdragonsplus.mixin.minecraft.RecipeManagerAccessor;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
Expand Down Expand Up @@ -66,6 +67,22 @@ public UpdateRecipesEvent(RecipeManager recipeManager,
this.byName = byName;
}

/**
* Returns all recipes of the given type from the current recipe set.
* <p>
* This includes any recipes added by earlier handlers of this event.
*
* @param type the recipe type to query
* @param <C> the recipe type
* @return an unmodifiable list of recipes of the given type
*/
@SuppressWarnings("unchecked")
public <C extends Recipe<?>> List<C> getRecipesForType(RecipeType<C> type) {
Map<ResourceLocation, Recipe<?>> typeMap = byType.get(type);
if (typeMap == null) return List.of();
return (List<C>) List.copyOf(typeMap.values());
}

/**
* @return the {@link RecipeManager recipe manager}.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -86,6 +90,11 @@ private static void buildPolishedBlockRecipes(Consumer<FinishedRecipe> output) {
.require(baseItem)
.output(polishedItem)
.build(output);
var sandingId = CDPCommon.asResource(baseId.toString().replace(':', '/') + "_sanding");
CreateRecipeBuilders.sanding(sandingId)
.require(baseItem)
.output(polishedItem)
.build(output);
});
}

Expand All @@ -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) {
Expand All @@ -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);
});
}

Expand All @@ -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);
});
}

Expand Down Expand Up @@ -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.<RecipeType<SandPaperPolishingRecipe>>getType())
.stream()
.filter(AllRecipeTypes.CAN_BE_AUTOMATED)
.map(SandingRecipe::convertSandPaperPolishing)
.forEach(recipe -> event.addRecipe(recipe.getId(), recipe));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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<CrushingRecipe> crushing(ResourceLocation id) {
return new ProcessingRecipeBuilder<>(CrushingRecipe::new, id);
Expand Down Expand Up @@ -67,6 +69,10 @@ public static ProcessingRecipeBuilder<SandPaperPolishingRecipe> polishing(Resour
return new ProcessingRecipeBuilder<>(SandPaperPolishingRecipe::new, id);
}

public static ProcessingRecipeBuilder<SandingRecipe> sanding(ResourceLocation id) {
return new ProcessingRecipeBuilder<>(SandingRecipe::new, id);
}

public static ProcessingRecipeBuilder<SplashingRecipe> splashing(ResourceLocation id) {
return new ProcessingRecipeBuilder<>(SplashingRecipe::new, id);
}
Expand Down