Skip to content

Commit 992b946

Browse files
committed
Add registeredCondition to ProcessConditionHelper
1 parent 7048dbc commit 992b946

File tree

2 files changed

+59
-6
lines changed

2 files changed

+59
-6
lines changed

docs/ADDING_RECIPES.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,24 @@ ServerEvents.recipes(event => {
9090
});
9191
```
9292

93+
## Registered process conditions
94+
If a process condition doesn't have direct KubeJS support (like from an addon mod), you can manually write its parameters using `registeredCondition(JsonObject)`:
95+
96+
```js
97+
// Manually adding a dimension condition - of course, this is just an example and you don't have a reason to actually do it this way.
98+
ServerEvents.recipes(event => {
99+
event.recipes.modern_industrialization.compressor(2, 200)
100+
.itemIn("dirt")
101+
.itemOut("diamond")
102+
// Use custom condition defined above
103+
.registeredCondition({
104+
"modern_industrialization:dimension": {
105+
"dimension": "minecraft:the_nether"
106+
}
107+
})
108+
});
109+
```
110+
93111
## Adding multiblock slots
94112
Multiblock machines always have an unlimited number of input and output slots
95113
(provided the recipe type allows the relevant input/output types).

src/main/java/aztech/modern_industrialization/compat/kubejs/recipe/ProcessConditionHelper.java

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,22 @@
2323
*/
2424
package aztech.modern_industrialization.compat.kubejs.recipe;
2525

26-
import aztech.modern_industrialization.machines.recipe.condition.AdjacentBlockProcessCondition;
27-
import aztech.modern_industrialization.machines.recipe.condition.BiomeProcessCondition;
28-
import aztech.modern_industrialization.machines.recipe.condition.CustomProcessCondition;
29-
import aztech.modern_industrialization.machines.recipe.condition.DimensionProcessCondition;
30-
import aztech.modern_industrialization.machines.recipe.condition.MachineProcessCondition;
26+
import aztech.modern_industrialization.machines.recipe.condition.*;
27+
import com.google.gson.JsonElement;
28+
import com.google.gson.JsonObject;
3129
import com.mojang.datafixers.util.Either;
30+
import com.mojang.datafixers.util.Pair;
31+
import com.mojang.serialization.DataResult;
32+
import com.mojang.serialization.JsonOps;
33+
import com.mojang.serialization.MapCodec;
3234
import net.minecraft.core.registries.Registries;
3335
import net.minecraft.resources.ResourceKey;
3436
import net.minecraft.resources.ResourceLocation;
3537
import net.minecraft.tags.TagKey;
3638
import net.minecraft.world.level.block.Block;
3739

40+
import java.util.Map;
41+
3842
public interface ProcessConditionHelper {
3943
ProcessConditionHelper processCondition(MachineProcessCondition condition);
4044

@@ -57,4 +61,35 @@ default ProcessConditionHelper biomeTag(ResourceLocation tag) {
5761
default ProcessConditionHelper customCondition(String id) {
5862
return processCondition(new CustomProcessCondition(id));
5963
}
60-
}
64+
65+
default ProcessConditionHelper registeredCondition(JsonElement condition) {
66+
if (!condition.isJsonObject()) {
67+
throw new IllegalArgumentException("Parameter must be a JsonObject");
68+
}
69+
70+
JsonObject obj = condition.getAsJsonObject();
71+
if (obj.size() != 1) {
72+
throw new IllegalArgumentException("Expected only condition ID");
73+
}
74+
75+
Map.Entry<String, JsonElement> entry = obj.entrySet().iterator().next();
76+
String idString = entry.getKey();
77+
78+
ResourceLocation id = ResourceLocation.tryParse(idString);
79+
if (id == null) {
80+
throw new IllegalArgumentException(String.format("'%s' is not registered at MachineProcessConditions. Perhaps you meant to use a customCondition?", idString));
81+
}
82+
83+
MapCodec<? extends MachineProcessCondition> codec = MachineProcessConditions.getCodec(id);
84+
if (codec == null) {
85+
throw new IllegalArgumentException("'%s' doesn't have a registered codec!".formatted(idString));
86+
}
87+
88+
DataResult<MachineProcessCondition> result = codec.codec().decode(JsonOps.INSTANCE, entry.getValue())
89+
.map(Pair::getFirst);
90+
91+
return processCondition(result.getOrThrow(p -> {
92+
throw new IllegalArgumentException("Couldn't parse '%s': %s".formatted(idString, p));
93+
}));
94+
}
95+
}

0 commit comments

Comments
 (0)