Skip to content
Merged
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
1 change: 1 addition & 0 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ dependencies {
modImplementation(ctnh.botarium)
modImplementation(ctnh.createnewage)
modImplementation(ctnh.creatediesel)
modImplementation(ctnh.createmetallurgy)
modImplementation(ctnh.createvintage)

modCompileOnly(variantOf(ctnh.curios) { classifier("api") })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.material.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;

import com.google.gson.JsonArray;
Expand All @@ -24,17 +26,33 @@
public class CompactingRecipeBuilder {

private final ResourceLocation id;
private final boolean exactId;
private final List<Ingredient> ingredients = new ArrayList<>();
private final List<JsonObject> fluidIngredients = new ArrayList<>();
private final List<ItemStack> results = new ArrayList<>();
private final List<JsonObject> fluidResults = new ArrayList<>();

public CompactingRecipeBuilder(String name) {
this.id = CTPP.id(name);
this(CTPP.id(name), false);
}

public CompactingRecipeBuilder(ResourceLocation id) {
this(id, true);
}

private CompactingRecipeBuilder(ResourceLocation id, boolean exactId) {
this.id = id;
this.exactId = exactId;
}

public static CompactingRecipeBuilder builder(String name) {
return new CompactingRecipeBuilder(name);
}

public static CompactingRecipeBuilder builder(ResourceLocation id) {
return new CompactingRecipeBuilder(id);
}

public CompactingRecipeBuilder input(ItemStack stack) {
return input(Ingredient.of(stack));
}
Expand All @@ -52,28 +70,60 @@ public CompactingRecipeBuilder input(Ingredient ingredient) {
return this;
}

public CompactingRecipeBuilder inputFluid(Fluid fluid, int amount) {
this.fluidIngredients.add(serializeFluidStack(new FluidStack(fluid, amount)));
return this;
}

public CompactingRecipeBuilder inputFluid(FluidStack fluidStack) {
this.fluidIngredients.add(serializeFluidStack(fluidStack));
return this;
}

public CompactingRecipeBuilder inputFluid(String fluidId, int amount) {
ResourceLocation fluid = ResourceLocation.parse(fluidId);
return inputFluid(Objects.requireNonNull(ForgeRegistries.FLUIDS.getValue(fluid), fluidId), amount);
}

public CompactingRecipeBuilder result(ItemStack stack) {
this.results.add(stack.copy());
return this;
}

public CompactingRecipeBuilder resultFluid(Fluid fluid, int amount) {
this.fluidResults.add(serializeFluidStack(new FluidStack(fluid, amount)));
return this;
}

public CompactingRecipeBuilder resultFluid(FluidStack fluidStack) {
this.fluidResults.add(serializeFluidStack(fluidStack));
return this;
}

public CompactingRecipeBuilder resultFluid(String fluidId, int amount) {
ResourceLocation fluid = ResourceLocation.parse(fluidId);
return resultFluid(Objects.requireNonNull(ForgeRegistries.FLUIDS.getValue(fluid), fluidId), amount);
}

public CompactingRecipeBuilder output(ItemStack stack) {
return result(stack);
}

public void toJson(JsonObject json) {
if (ingredients.isEmpty() || results.isEmpty()) {
if ((ingredients.isEmpty() && fluidIngredients.isEmpty()) || (results.isEmpty() && fluidResults.isEmpty())) {
throw new IllegalStateException("Compacting recipe missing required fields");
}

json.addProperty("type", "create:compacting");

JsonArray ingredientsJson = new JsonArray();
ingredients.forEach(ing -> ingredientsJson.add(ing.toJson()));
fluidIngredients.forEach(ingredientsJson::add);
json.add("ingredients", ingredientsJson);

JsonArray resultsJson = new JsonArray();
results.forEach(stack -> resultsJson.add(serializeItemStack(stack)));
fluidResults.forEach(resultsJson::add);
json.add("results", resultsJson);
}

Expand All @@ -88,7 +138,7 @@ public void serializeRecipeData(@Nonnull JsonObject pJson) {
@Nonnull
@Override
public ResourceLocation getId() {
return ResourceLocation.fromNamespaceAndPath(id.getNamespace(), "compacting/" + id.getPath());
return exactId ? id : ResourceLocation.fromNamespaceAndPath(id.getNamespace(), "compacting/" + id.getPath());
}

@Nonnull
Expand Down Expand Up @@ -123,4 +173,11 @@ private static JsonObject serializeItemStack(ItemStack stack) {
if (stack.hasTag()) json.addProperty("nbt", String.valueOf(stack.getTag()));
return json;
}

private static JsonObject serializeFluidStack(FluidStack stack) {
JsonObject json = new JsonObject();
json.addProperty("fluid", Objects.requireNonNull(ForgeRegistries.FLUIDS.getKey(stack.getFluid())).toString());
json.addProperty("amount", stack.getAmount());
return json;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,34 @@
public class MechanicalCraftingRecipeBuilder {

private final ResourceLocation id;
private final boolean exactId;
private final List<Ingredient> ingredients = new ArrayList<>();
private final List<ItemStack> results = new ArrayList<>();
// optional pattern support (Create's mechanical_crafting supports a pattern + key mapping)
private final List<String> pattern = new ArrayList<>();
private final Map<Character, Ingredient> key = new HashMap<>();

public MechanicalCraftingRecipeBuilder(String name) {
this.id = CTPP.id(name);
this(CTPP.id(name), false);
}

public MechanicalCraftingRecipeBuilder(ResourceLocation id) {
this(id, true);
}

private MechanicalCraftingRecipeBuilder(ResourceLocation id, boolean exactId) {
this.id = id;
this.exactId = exactId;
}

public static MechanicalCraftingRecipeBuilder builder(String name) {
return new MechanicalCraftingRecipeBuilder(name);
}

public static MechanicalCraftingRecipeBuilder builder(ResourceLocation id) {
return new MechanicalCraftingRecipeBuilder(id);
}

public MechanicalCraftingRecipeBuilder input(ItemStack stack) {
return input(Ingredient.of(stack));
}
Expand Down Expand Up @@ -187,14 +201,15 @@ public void serializeRecipeData(@Nonnull JsonObject pJson) {
@Nonnull
@Override
public ResourceLocation getId() {
if (exactId) return id;
return ResourceLocation.fromNamespaceAndPath(id.getNamespace(), "mechanical_crafting/" + id.getPath());
}

@Nonnull
@Override
public RecipeSerializer<?> getType() {
return Objects.requireNonNull(ForgeRegistries.RECIPE_SERIALIZERS.getValue(
ResourceLocation.tryParse("create:mechanical_crafting")),
ResourceLocation.tryParse("create:mechanical_crafting")),
"Create mechanical_crafting serializer not found");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.mo_guang.ctpp.CTPP;
import com.simibubi.create.content.processing.recipe.HeatCondition;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
Expand All @@ -26,21 +27,36 @@
public class MixingRecipeBuilder {

private final ResourceLocation id;
private final boolean exactId;
private final List<Ingredient> ingredients = new ArrayList<>();
private final List<ItemStack> results = new ArrayList<>();
private final List<JsonObject> resultObjects = new ArrayList<>();
// optional fluid result support
private JsonObject fluidResult = null;
private final List<JsonObject> fluidIngredients = new ArrayList<>();
private HeatCondition heatRequirement = HeatCondition.NONE;

public MixingRecipeBuilder(String name) {
this.id = CTPP.id(name);
this(CTPP.id(name), false);
}

public MixingRecipeBuilder(ResourceLocation id) {
this(id, true);
}

private MixingRecipeBuilder(ResourceLocation id, boolean exactId) {
this.id = id;
this.exactId = exactId;
}

public static MixingRecipeBuilder builder(String name) {
return new MixingRecipeBuilder(name);
}

public static MixingRecipeBuilder builder(ResourceLocation id) {
return new MixingRecipeBuilder(id);
}

public MixingRecipeBuilder input(ItemStack stack) {
return input(Ingredient.of(stack));
}
Expand Down Expand Up @@ -116,6 +132,15 @@ public MixingRecipeBuilder output(ItemStack stack) {
return result(stack);
}

public MixingRecipeBuilder heatRequirement(HeatCondition heatCondition) {
this.heatRequirement = heatCondition;
return this;
}

public MixingRecipeBuilder heatRequirement(String heatRequirement) {
return heatRequirement(HeatCondition.deserialize(heatRequirement));
}

public void toJson(JsonObject json) {
if (ingredients.isEmpty() || (results.isEmpty() && fluidResult == null)) {
throw new IllegalStateException("Mixing recipe missing required fields");
Expand All @@ -134,6 +159,7 @@ public void toJson(JsonObject json) {
resultObjects.forEach(resultsJson::add);
if (fluidResult != null) resultsJson.add(fluidResult);
json.add("results", resultsJson);
if (heatRequirement != HeatCondition.NONE) json.addProperty("heatRequirement", heatRequirement.serialize());
}

public FinishedRecipe build() {
Expand All @@ -147,7 +173,8 @@ public void serializeRecipeData(@Nonnull JsonObject pJson) {
@Nonnull
@Override
public ResourceLocation getId() {
return ResourceLocation.fromNamespaceAndPath(id.getNamespace(), "mixing/" + id.getPath());
return exactId ? id :
ResourceLocation.fromNamespaceAndPath(id.getNamespace(), "mixing/" + id.getPath());
}

@Nonnull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,30 @@ public class SequencedAssemblyRecipeBuilder {
private final List<ItemStack> results = new ArrayList<>();
private final List<JsonObject> sequence = new ArrayList<>();
private final ResourceLocation id;
private final boolean exactId;
private int loops = 1;

public SequencedAssemblyRecipeBuilder(String name) {
this.id = CTPP.id(name);
this(CTPP.id(name), false);
}

public SequencedAssemblyRecipeBuilder(ResourceLocation id) {
this(id, true);
}

private SequencedAssemblyRecipeBuilder(ResourceLocation id, boolean exactId) {
this.id = id;
this.exactId = exactId;
}

public static SequencedAssemblyRecipeBuilder builder(String name) {
return new SequencedAssemblyRecipeBuilder(name);
}

public static SequencedAssemblyRecipeBuilder builder(ResourceLocation id) {
return new SequencedAssemblyRecipeBuilder(id);
}

public SequencedAssemblyRecipeBuilder input(ItemStack itemStack) {
return ingredient(Ingredient.of(itemStack));
}
Expand Down Expand Up @@ -175,6 +189,14 @@ public SequencedAssemblyRecipeBuilder cutting() {
});
}

public SequencedAssemblyRecipeBuilder vintageCurving(ItemStack head) {
return step("vintageimprovements:curving", json -> {
json.add("ingredients", ingredients(itemIngredient(transitionalItem)));
json.add("results", ingredients(itemIngredient(transitionalItem)));
json.addProperty("head", Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(head.getItem())).toString());
});
}

public SequencedAssemblyRecipeBuilder step(ResourceLocation type, java.util.function.Consumer<JsonObject> config) {
JsonObject json = new JsonObject();
json.addProperty("type", type.toString());
Expand Down Expand Up @@ -224,6 +246,7 @@ public void serializeRecipeData(@Nonnull JsonObject pJson) {
@Nonnull
@Override
public ResourceLocation getId() {
if (exactId) return id;
return ResourceLocation.fromNamespaceAndPath(id.getNamespace(), "sequenced_assembly/" + id.getPath());
}

Expand Down
Loading
Loading