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
17 changes: 17 additions & 0 deletions docs/ADDING_RECIPES.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,23 @@ ServerEvents.recipes(event => {
});
```

## Registered process conditions
If a process condition doesn't have direct KubeJS support (like from an addon mod), you can manually write its parameters using `registeredCondition(JsonObject)`:

```js
// 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.
ServerEvents.recipes(event => {
event.recipes.modern_industrialization.compressor(2, 200)
.itemIn("dirt")
.itemOut("diamond")
.registeredCondition({
"modern_industrialization:dimension": {
"dimension": "minecraft:the_nether"
}
})
});
```

## Adding multiblock slots
Multiblock machines always have an unlimited number of input and output slots
(provided the recipe type allows the relevant input/output types).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,15 @@
*/
package aztech.modern_industrialization.compat.kubejs.recipe;

import aztech.modern_industrialization.machines.recipe.condition.AdjacentBlockProcessCondition;
import aztech.modern_industrialization.machines.recipe.condition.BiomeProcessCondition;
import aztech.modern_industrialization.machines.recipe.condition.CustomProcessCondition;
import aztech.modern_industrialization.machines.recipe.condition.DimensionProcessCondition;
import aztech.modern_industrialization.machines.recipe.condition.MachineProcessCondition;
import aztech.modern_industrialization.machines.recipe.condition.*;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.mojang.datafixers.util.Either;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.JsonOps;
import com.mojang.serialization.MapCodec;
import java.util.Map;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
Expand Down Expand Up @@ -57,4 +60,36 @@ default ProcessConditionHelper biomeTag(ResourceLocation tag) {
default ProcessConditionHelper customCondition(String id) {
return processCondition(new CustomProcessCondition(id));
}

default ProcessConditionHelper registeredCondition(JsonElement condition) {
if (!condition.isJsonObject()) {
throw new IllegalArgumentException("Parameter must be a JsonObject");
}

JsonObject obj = condition.getAsJsonObject();
if (obj.size() != 1) {
throw new IllegalArgumentException("Expected only condition ID");
}

Map.Entry<String, JsonElement> entry = obj.entrySet().iterator().next();
String idString = entry.getKey();

ResourceLocation id = ResourceLocation.tryParse(idString);
if (id == null) {
throw new IllegalArgumentException(
String.format("'%s' is not registered at MachineProcessConditions. Perhaps you meant to use a customCondition?", idString));
}

MapCodec<? extends MachineProcessCondition> codec = MachineProcessConditions.getCodec(id);
if (codec == null) {
throw new IllegalArgumentException("'%s' doesn't have a registered codec!".formatted(idString));
}

DataResult<MachineProcessCondition> result = codec.codec().decode(JsonOps.INSTANCE, entry.getValue())
.map(Pair::getFirst);

return processCondition(result.getOrThrow(p -> {
throw new IllegalArgumentException("Couldn't parse '%s': %s".formatted(idString, p));
}));
}
}
Loading