3535import net .minecraft .block .Block ;
3636import net .minecraft .item .Item ;
3737import net .minecraft .item .ItemStack ;
38+ import net .minecraft .util .ResourceLocation ;
3839import net .minecraftforge .fluids .Fluid ;
3940import net .minecraftforge .fluids .FluidStack ;
4041import net .minecraftforge .fml .common .Optional ;
4445import com .cleanroommc .groovyscript .helper .ingredient .OreDictIngredient ;
4546import crafttweaker .CraftTweakerAPI ;
4647import it .unimi .dsi .fastutil .ints .IntList ;
48+ import it .unimi .dsi .fastutil .objects .Object2ObjectOpenHashMap ;
4749import org .apache .commons .lang3 .builder .ToStringBuilder ;
4850import org .jetbrains .annotations .ApiStatus ;
4951import org .jetbrains .annotations .MustBeInvokedByOverriders ;
5355import java .util .ArrayList ;
5456import java .util .Arrays ;
5557import java .util .Collection ;
58+ import java .util .Collections ;
5659import java .util .List ;
5760import 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}
0 commit comments