Skip to content

Commit c0c5b60

Browse files
authored
Let recipe builders skip map build actions (#2650)
1 parent d747c98 commit c0c5b60

File tree

2 files changed

+68
-4
lines changed

2 files changed

+68
-4
lines changed

src/main/java/gregtech/api/recipes/RecipeBuilder.java

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import net.minecraft.block.Block;
3636
import net.minecraft.item.Item;
3737
import net.minecraft.item.ItemStack;
38+
import net.minecraft.util.ResourceLocation;
3839
import net.minecraftforge.fluids.Fluid;
3940
import net.minecraftforge.fluids.FluidStack;
4041
import net.minecraftforge.fml.common.Optional;
@@ -44,6 +45,7 @@
4445
import com.cleanroommc.groovyscript.helper.ingredient.OreDictIngredient;
4546
import crafttweaker.CraftTweakerAPI;
4647
import it.unimi.dsi.fastutil.ints.IntList;
48+
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
4749
import org.apache.commons.lang3.builder.ToStringBuilder;
4850
import org.jetbrains.annotations.ApiStatus;
4951
import org.jetbrains.annotations.MustBeInvokedByOverriders;
@@ -53,6 +55,7 @@
5355
import java.util.ArrayList;
5456
import java.util.Arrays;
5557
import java.util.Collection;
58+
import java.util.Collections;
5659
import java.util.List;
5760
import java.util.Map;
5861

@@ -86,6 +89,9 @@ public class RecipeBuilder<R extends RecipeBuilder<R>> {
8689
protected RecipePropertyStorage recipePropertyStorage = RecipePropertyStorage.EMPTY;
8790
protected boolean recipePropertyStorageErrored = false;
8891

92+
protected boolean ignoreAllBuildActions = false;
93+
protected Map<ResourceLocation, RecipeBuildAction<R>> ignoredBuildActions;
94+
8995
protected RecipeBuilder() {
9096
this.inputs = new ArrayList<>();
9197
this.outputs = new ArrayList<>();
@@ -126,6 +132,10 @@ protected RecipeBuilder(RecipeBuilder<R> recipeBuilder) {
126132
this.hidden = recipeBuilder.hidden;
127133
this.category = recipeBuilder.category;
128134
this.recipePropertyStorage = recipeBuilder.recipePropertyStorage.copy();
135+
this.ignoreAllBuildActions = recipeBuilder.ignoreAllBuildActions;
136+
if (recipeBuilder.ignoredBuildActions != null) {
137+
this.ignoredBuildActions = new Object2ObjectOpenHashMap<>(recipeBuilder.ignoredBuildActions);
138+
}
129139
}
130140

131141
public R cleanroom(@Nullable CleanroomType cleanroom) {
@@ -887,6 +897,31 @@ public R copy() {
887897
return (R) new RecipeBuilder<>(this);
888898
}
889899

900+
/**
901+
* Only use if you absolutely don't want the recipe to be run through any build actions.
902+
* Instead, you should blacklist specific actions with {@link #ignoreBuildAction(ResourceLocation)}
903+
*/
904+
public R ignoreAllBuildActions() {
905+
this.ignoreAllBuildActions = true;
906+
return (R) this;
907+
}
908+
909+
public R ignoreBuildAction(ResourceLocation buildActionName) {
910+
if (ignoredBuildActions == null) {
911+
ignoredBuildActions = new Object2ObjectOpenHashMap<>();
912+
} else if (!recipeMap.getBuildActions().containsKey(buildActionName)) {
913+
GTLog.logger.error("Recipe map {} does not contain build action {}!", recipeMap, buildActionName,
914+
new Throwable());
915+
return (R) this;
916+
} else if (ignoredBuildActions.containsKey(buildActionName)) {
917+
return (R) this;
918+
}
919+
920+
ignoredBuildActions.put(buildActionName, recipeMap.getBuildActions().get(buildActionName));
921+
922+
return (R) this;
923+
}
924+
890925
public ValidationResult<Recipe> build() {
891926
EnumValidationResult result = recipePropertyStorageErrored ? EnumValidationResult.INVALID : validate();
892927
return ValidationResult.newResult(result, new Recipe(inputs, outputs,
@@ -985,8 +1020,14 @@ protected R invalidateOnBuildAction() {
9851020
*/
9861021
@MustBeInvokedByOverriders
9871022
public void buildAndRegister() {
988-
for (RecipeBuildAction<R> action : recipeMap.getBuildActions()) {
989-
action.accept((R) this);
1023+
if (!ignoreAllBuildActions) {
1024+
for (Map.Entry<ResourceLocation, RecipeBuildAction<R>> buildAction : recipeMap.getBuildActions()
1025+
.entrySet()) {
1026+
if (ignoredBuildActions != null && ignoredBuildActions.containsKey(buildAction.getKey())) {
1027+
continue;
1028+
}
1029+
buildAction.getValue().accept((R) this);
1030+
}
9901031
}
9911032
ValidationResult<Recipe> validationResult = build();
9921033
recipeMap.addRecipe(validationResult);
@@ -1047,6 +1088,27 @@ public int getDuration() {
10471088
return this.recipePropertyStorage.get(CleanroomProperty.getInstance(), null);
10481089
}
10491090

1091+
public boolean ignoresAllBuildActions() {
1092+
return ignoreAllBuildActions;
1093+
}
1094+
1095+
/**
1096+
* Get all ignored build actions for the recipe map.
1097+
*
1098+
* @return A map of ignored build actions.
1099+
*/
1100+
public @NotNull Map<ResourceLocation, RecipeBuildAction<R>> getIgnoredBuildActions() {
1101+
if (ignoreAllBuildActions) {
1102+
return recipeMap.getBuildActions();
1103+
}
1104+
1105+
if (ignoredBuildActions == null) {
1106+
return Collections.emptyMap();
1107+
}
1108+
1109+
return ignoredBuildActions;
1110+
}
1111+
10501112
@Override
10511113
public String toString() {
10521114
return new ToStringBuilder(this)
@@ -1064,6 +1126,8 @@ public String toString() {
10641126
.append("dimensions", getDimensionIDs().toString())
10651127
.append("dimensions_blocked", getBlockedDimensionIDs().toString())
10661128
.append("recipeStatus", recipeStatus)
1129+
.append("ignoresBuildActions", ignoresAllBuildActions())
1130+
.append("ignoredBuildActions", getIgnoredBuildActions())
10671131
.toString();
10681132
}
10691133
}

src/main/java/gregtech/api/recipes/RecipeMap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,8 +347,8 @@ protected void onRecipeBuild(@NotNull Map<ResourceLocation, RecipeBuildAction<R>
347347
* @return the build actions for this RecipeMap's default RecipeBuilder
348348
*/
349349
@ApiStatus.Internal
350-
protected @UnmodifiableView @NotNull Collection<@NotNull RecipeBuildAction<R>> getBuildActions() {
351-
return this.recipeBuildActions.values();
350+
protected @UnmodifiableView @NotNull Map<ResourceLocation, RecipeBuildAction<R>> getBuildActions() {
351+
return this.recipeBuildActions;
352352
}
353353

354354
public RecipeMap<R> allowEmptyOutput() {

0 commit comments

Comments
 (0)