|
1 | 1 | package dev.latvian.mods.kubejs.create; |
2 | 2 |
|
| 3 | +import com.google.gson.JsonObject; |
3 | 4 | import com.simibubi.create.Create; |
4 | 5 | import com.simibubi.create.content.processing.recipe.ProcessingOutput; |
5 | 6 | import com.simibubi.create.foundation.fluid.FluidIngredient; |
|
16 | 17 | import dev.latvian.mods.kubejs.event.EventGroupRegistry; |
17 | 18 | import dev.latvian.mods.kubejs.plugin.KubeJSPlugin; |
18 | 19 | import dev.latvian.mods.kubejs.plugin.builtin.wrapper.ItemWrapper; |
| 20 | +import dev.latvian.mods.kubejs.plugin.builtin.wrapper.StringUtilsWrapper; |
19 | 21 | import dev.latvian.mods.kubejs.recipe.component.RecipeComponentTypeRegistry; |
20 | 22 | import dev.latvian.mods.kubejs.recipe.schema.RecipeSchemaRegistry; |
21 | 23 | import dev.latvian.mods.kubejs.registry.BuilderTypeRegistry; |
|
24 | 26 | import dev.latvian.mods.kubejs.script.TypeWrapperRegistry; |
25 | 27 | import dev.latvian.mods.rhino.Context; |
26 | 28 | import net.minecraft.core.registries.Registries; |
| 29 | +import net.minecraft.util.Mth; |
| 30 | +import net.minecraft.world.item.ItemStack; |
| 31 | +import net.minecraft.world.item.Items; |
| 32 | +import net.minecraft.world.level.ItemLike; |
27 | 33 | import org.jetbrains.annotations.Nullable; |
28 | 34 |
|
| 35 | +import java.util.Map; |
| 36 | +import java.util.function.Function; |
| 37 | + |
29 | 38 | public class KubeJSCreatePlugin implements KubeJSPlugin { |
30 | 39 | @Override |
31 | 40 | public void afterInit() { |
@@ -58,13 +67,28 @@ public void registerTypeWrappers(TypeWrapperRegistry registry) { |
58 | 67 | registry.register(ProcessingOutput.class, KubeJSCreatePlugin::wrapProcessingOutput); |
59 | 68 | } |
60 | 69 |
|
61 | | - private static ProcessingOutput wrapProcessingOutput(Context cx, @Nullable Object from) { |
62 | | - if (from instanceof ProcessingOutput p) { |
63 | | - return p; |
| 70 | + private static ProcessingOutput fromMapLike(Context cx, Object from, Function<String, Object> getter, boolean nested) { |
| 71 | + var chance = (float) Mth.clamp(StringUtilsWrapper.parseDouble(getter.apply("chance"), 1.0), 0.0, 1.0); |
| 72 | + if (nested) { |
| 73 | + var output = ItemWrapper.wrap(cx, getter.apply("output")); |
| 74 | + return new ProcessingOutput(output, chance); |
| 75 | + } else { |
| 76 | + return new ProcessingOutput(ItemWrapper.wrap(cx, from), chance); |
64 | 77 | } |
| 78 | + } |
65 | 79 |
|
66 | | - var stack = ItemWrapper.wrap(cx, from); |
67 | | - return stack.isEmpty() ? ProcessingOutput.EMPTY : new ProcessingOutput(stack, 1F); |
| 80 | + private static ProcessingOutput wrapProcessingOutput(Context cx, @Nullable Object from) { |
| 81 | + return switch (from) { |
| 82 | + case null -> ProcessingOutput.EMPTY; |
| 83 | + case ProcessingOutput id -> id; |
| 84 | + case ItemStack s -> s.isEmpty() ? ProcessingOutput.EMPTY : new ProcessingOutput(s, 1F); |
| 85 | + case ItemLike i when i.asItem() == Items.AIR -> ProcessingOutput.EMPTY; |
| 86 | + case ItemLike i -> new ProcessingOutput(i.asItem(), 1, 1F); |
| 87 | + case JsonObject json when json.has("chance") -> fromMapLike(cx, json, json::get, json.has("output")); |
| 88 | + case Map<?, ?> map when map.containsKey("chance") -> fromMapLike(cx, map, map::get, map.containsKey("output")); |
| 89 | + // TODO: maybe a custom string-like type wrapper ("2x apple @ 20%" or something like that???) |
| 90 | + default -> new ProcessingOutput(ItemWrapper.wrap(cx, from), 1F); |
| 91 | + }; |
68 | 92 | } |
69 | 93 |
|
70 | 94 | @Override |
|
0 commit comments