use of slimeknights.tconstruct.library.json.TagIntersectionPresentCondition in project TinkersConstruct by SlimeKnights.
the class ISmelteryRecipeHelper method oreMelting.
/**
* Base logic for {@link #metalMelting(Consumer, Fluid, String, boolean, String, boolean, IByproduct...)}
* @param consumer Recipe consumer
* @param fluid Fluid to melt into
* @param amount Amount to melt into
* @param tagName Input tag
* @param factor Melting factor
* @param recipePath Recipe output name
* @param oreRate Ore rate for boosting
* @param isOptional If true, recipe is optional
* @param byproducts List of byproduct options for this metal, first one that is present will be used
*/
default void oreMelting(Consumer<FinishedRecipe> consumer, Fluid fluid, int amount, String tagName, @Nullable Tag.Named<Item> size, float factor, String recipePath, boolean isOptional, OreRateType oreRate, float byproductScale, IByproduct... byproducts) {
Consumer<FinishedRecipe> wrapped;
Ingredient baseIngredient = Ingredient.of(getTag("forge", tagName));
Ingredient ingredient;
// not everyone sets size, so treat singular as the fallback, means we want anything in the tag that is not sparse or dense
if (size == Tags.Items.ORE_RATES_SINGULAR) {
ingredient = IngredientDifference.difference(baseIngredient, CompoundIngredient.from(Ingredient.of(Tags.Items.ORE_RATES_SPARSE), Ingredient.of(Tags.Items.ORE_RATES_DENSE)));
wrapped = withCondition(consumer, new TagDifferencePresentCondition(new ResourceLocation("forge", tagName), Tags.Items.ORE_RATES_SPARSE.getName(), Tags.Items.ORE_RATES_DENSE.getName()));
// size tag means we want an intersection between the tag and that size
} else if (size != null) {
ingredient = IngredientIntersection.intersection(baseIngredient, Ingredient.of(size));
wrapped = withCondition(consumer, new TagIntersectionPresentCondition(new ResourceLocation("forge", tagName), size.getName()));
// default only need it to be in the tag
} else {
ingredient = baseIngredient;
wrapped = isOptional ? withCondition(consumer, tagCondition(tagName)) : consumer;
}
Supplier<MeltingRecipeBuilder> supplier = () -> MeltingRecipeBuilder.melting(ingredient, fluid, amount, factor).setOre(oreRate);
ResourceLocation location = modResource(recipePath);
// if no byproducts, just build directly
if (byproducts.length == 0) {
supplier.get().save(wrapped, location);
// if first option is always present, only need that one
} else if (byproducts[0].isAlwaysPresent()) {
supplier.get().addByproduct(new FluidStack(byproducts[0].getFluid(), (int) (byproducts[0].getAmount() * byproductScale))).save(wrapped, location);
} else {
// multiple options, will need a conditonal recipe
ConditionalRecipe.Builder builder = ConditionalRecipe.builder();
boolean alwaysPresent = false;
for (IByproduct byproduct : byproducts) {
// found an always present byproduct? no need to tag and we are done
alwaysPresent = byproduct.isAlwaysPresent();
if (alwaysPresent) {
builder.addCondition(TrueCondition.INSTANCE);
} else {
builder.addCondition(tagCondition("ingots/" + byproduct.getName()));
}
builder.addRecipe(supplier.get().addByproduct(new FluidStack(byproduct.getFluid(), (int) (byproduct.getAmount() * byproductScale)))::save);
if (alwaysPresent) {
break;
}
}
// not always present? add a recipe with no byproducts as a final fallback
if (!alwaysPresent) {
builder.addCondition(TrueCondition.INSTANCE);
builder.addRecipe(supplier.get()::save);
}
builder.build(wrapped, location);
}
}
Aggregations