From 854a37743de18087610dceb3f223ac6be6efbb4c Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 22 Dec 2024 18:29:02 +0300 Subject: [PATCH 01/10] feat: added lightningcraft compat New WR adding a gs compat --- dependencies.gradle | 1 + examples/postInit/lightningcraft.groovy | 39 +++++++ gradle.properties | 1 + .../groovyscript/compat/mods/ModSupport.java | 2 + .../compat/mods/lightningcraft/Crusher.java | 85 ++++++++++++++ .../compat/mods/lightningcraft/Infusion.java | 106 ++++++++++++++++++ .../mods/lightningcraft/Lightningcraft.java | 10 ++ .../assets/groovyscript/lang/en_us.lang | 9 ++ 8 files changed, 253 insertions(+) create mode 100644 examples/postInit/lightningcraft.groovy create mode 100644 src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java create mode 100644 src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java create mode 100644 src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Lightningcraft.java diff --git a/dependencies.gradle b/dependencies.gradle index 73bb9dd77..ebffba5f4 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -88,6 +88,7 @@ final Map> mod_dependencies = [ 'lemonlib-306926:2639879' : [debug_arcane_world, debug_arcane_world_rotn], 'libnine-322344:3509087' : [debug_lazy_ae2], 'libvulpes-236541:3801015' : [debug_advanced_rocketry], + 'lightningcraft-237422:2872478' : [debug_lightningcraft], 'llibrary-243298:2504999' : [debug_ice_and_fire_old, debug_ice_and_fire_rotn], 'magneticraft-224808:3791484' : [debug_magneticraft], 'mantle-74924:2713386' : [debug_inspirations, debug_tinkers_construct], diff --git a/examples/postInit/lightningcraft.groovy b/examples/postInit/lightningcraft.groovy new file mode 100644 index 000000000..1ce2dbfa1 --- /dev/null +++ b/examples/postInit/lightningcraft.groovy @@ -0,0 +1,39 @@ + +// Auto generated groovyscript example file +// MODS_LOADED: lightningcraft + +log.info 'mod \'lightningcraft\' detected, running script' + +// Lightning Crusher: +// Consumes LE to convert 1 input itemstack into an output itemstack. + +mods.lightningcraft.crusher.removeByInput(item('minecraft:saddle')) +mods.lightningcraft.crusher.removeByOutput(item('minecraft:redstone')) +// mods.lightningcraft.crusher.removeAll() + +mods.lightningcraft.crusher.recipeBuilder() + .input(item('minecraft:diamond_block')) + .output(item('minecraft:nether_star')) + .register() + + +// Lightning Infusion Table: +// Consumes LE to convert up to 5 input itemstacks into an output itemstack. + +mods.lightningcraft.infusion.removeByOutput(item('minecraft:diamond')) +// mods.lightningcraft.infusion.removeAll() + +mods.lightningcraft.infusion.recipeBuilder() + .input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')) + .output(item('minecraft:nether_star')) + .le(500) + .register() + +mods.lightningcraft.infusion.recipeBuilder() + .input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])) + .output(item('minecraft:diamond_block')) + .le(200) + .nbtSensitive() + .register() + + diff --git a/gradle.properties b/gradle.properties index b78dc633e..ee2fd17cf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -83,6 +83,7 @@ debug_inspirations = false debug_integrated_dynamics = false debug_lazy_ae2 = false +debug_lightningcraft = true debug_magneticraft = false debug_mekanism = false diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java index e2ac33af1..9e38999ec 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java @@ -51,6 +51,7 @@ import com.cleanroommc.groovyscript.compat.mods.integrateddynamics.IntegratedDynamics; import com.cleanroommc.groovyscript.compat.mods.jei.JustEnoughItems; import com.cleanroommc.groovyscript.compat.mods.lazyae2.LazyAE2; +import com.cleanroommc.groovyscript.compat.mods.lightningcraft.Lightningcraft; import com.cleanroommc.groovyscript.compat.mods.magneticraft.Magneticraft; import com.cleanroommc.groovyscript.compat.mods.mekanism.Mekanism; import com.cleanroommc.groovyscript.compat.mods.mysticalagriculture.MysticalAgriculture; @@ -146,6 +147,7 @@ public class ModSupport { public static final GroovyContainer MEKANISM = new InternalModContainer<>("mekanism", "Mekanism", Mekanism::new); public static final GroovyContainer MYSTICAL_AGRICULTURE = new InternalModContainer<>("mysticalagriculture", "Mystical Agriculture", MysticalAgriculture::new); public static final GroovyContainer LAZYAE2 = new InternalModContainer<>("threng", "LazyAE2", LazyAE2::new, "lazyae2"); + public static final GroovyContainer LIGHTNINGCRAFT = new InternalModContainer<>("lightningcraft", "Lightningcraft", Lightningcraft::new); public static final GroovyContainer NATURES_AURA = new InternalModContainer<>("naturesaura", "Nature's Aura", NaturesAura::new); public static final GroovyContainer PNEUMATIC_CRAFT = new InternalModContainer<>("pneumaticcraft", "PneumaticCraft: Repressurized", PneumaticCraft::new); public static final GroovyContainer PRIMAL_TECH = new InternalModContainer<>("primal_tech", "Primal Tech", PrimalTech::new, "primaltech"); diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java new file mode 100644 index 000000000..a17b3ee00 --- /dev/null +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java @@ -0,0 +1,85 @@ +package com.cleanroommc.groovyscript.compat.mods.lightningcraft; + +import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.api.IIngredient; +import com.cleanroommc.groovyscript.api.documentation.annotations.*; +import com.cleanroommc.groovyscript.compat.mods.ModSupport; +import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder; +import com.cleanroommc.groovyscript.registry.StandardListRegistry; +import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.Nullable; +import sblectric.lightningcraft.api.recipes.LightningCrusherRecipe; +import sblectric.lightningcraft.recipes.LightningCrusherRecipes; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +@RegistryDescription +public class Crusher extends StandardListRegistry { + + @Override + public Collection getRecipes() { + return LightningCrusherRecipes.instance().getRecipeList(); + } + + @MethodDescription(example = @Example("item('minecraft:saddle')")) + public boolean removeByInput(IIngredient input) { + return getRecipes().removeIf(r -> { + if (r.getInput().stream().anyMatch(input)) { + addBackup(r); + return true; + } + return false; + }); + } + + @MethodDescription(example = @Example("item('minecraft:redstone')")) + public boolean removeByOutput(IIngredient output) { + return getRecipes().removeIf(r -> { + if (output.test(r.getOutput())) { + addBackup(r); + return true; + } + return false; + }); + } + + @RecipeBuilderDescription(example = { + @Example(".input(item('minecraft:diamond_block')).output(item('minecraft:nether_star'))"), + }) + public RecipeBuilder recipeBuilder() { + return new RecipeBuilder(); + } + + @Property(property = "input", comp = @Comp(eq = 1)) + @Property(property = "output", comp = @Comp(eq = 1)) + public static class RecipeBuilder extends AbstractRecipeBuilder { + + @Override + public String getErrorMsg() { + return "Error adding Lightningcraft Crusher recipe"; + } + + @Override + public void validate(GroovyLog.Msg msg) { + validateItems(msg, 1, 1, 1, 1); + } + + @Override + protected int getMaxItemInput() { + return 1; + } + + @Override + @RecipeBuilderRegistrationMethod + public @Nullable LightningCrusherRecipe register() { + if (!validate()) return null; + List inputs = Arrays.asList(input.get(0).getMatchingStacks()); + LightningCrusherRecipe recipe = new LightningCrusherRecipe(output.get(0), inputs); + ModSupport.LIGHTNINGCRAFT.get().crusher.add(recipe); + return recipe; + } + } + +} diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java new file mode 100644 index 000000000..c938e8230 --- /dev/null +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java @@ -0,0 +1,106 @@ +package com.cleanroommc.groovyscript.compat.mods.lightningcraft; + +import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.api.IIngredient; +import com.cleanroommc.groovyscript.api.documentation.annotations.*; +import com.cleanroommc.groovyscript.compat.mods.ModSupport; +import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder; +import com.cleanroommc.groovyscript.registry.StandardListRegistry; +import org.jetbrains.annotations.Nullable; +import sblectric.lightningcraft.api.recipes.LightningInfusionRecipe; +import sblectric.lightningcraft.recipes.LightningInfusionRecipes; + +import java.util.Collection; + +@RegistryDescription +public class Infusion extends StandardListRegistry { + + @Override + public Collection getRecipes() { + return LightningInfusionRecipes.instance().getRecipeList(); + } + + @MethodDescription(example = @Example("item('minecraft:diamond')")) + public boolean removeByOutput(IIngredient output) { + return getRecipes().removeIf(r -> { + if (output.test(r.getOutput())) { + addBackup(r); + return true; + } + return false; + }); + } + + @RecipeBuilderDescription(example = { + @Example(".input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')).output(item('minecraft:nether_star')).le(500)"), + @Example(".input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])).output(item('minecraft:diamond_block')).le(200).nbtSensitive()"), + }) + public RecipeBuilder recipeBuilder() { + return new RecipeBuilder(); + } + + @Property(property = "input", comp = @Comp(gte = 1, lte = 5)) + @Property(property = "output", comp = @Comp(eq = 1)) + public static class RecipeBuilder extends AbstractRecipeBuilder { + + @Property(comp = @Comp(gte = 0)) + private int le = -1; + + @Property + private boolean nbtSensitive = false; + + public RecipeBuilder le(int le) { + this.le = le; + return this; + } + + public RecipeBuilder cost(int le) { + this.le = le; + return this; + } + + public RecipeBuilder nbtSensitive(boolean nbtSensitive) { + this.nbtSensitive = nbtSensitive; + return this; + } + + public RecipeBuilder nbtSensitive() { + this.nbtSensitive = true; + return this; + } + + @Override + public String getErrorMsg() { + return "Error adding Lightningcraft Infusion Table recipe"; + } + + @Override + protected int getMaxItemInput() { + // recipes with more than 1 item in some slot don't get recognized + return 1; + } + + @Override + public void validate(GroovyLog.Msg msg) { + validateItems(msg, 1, 5, 1, 1); + validateFluids(msg); + msg.add(le < 0, "LE cost must be positive"); + for (IIngredient it : this.input) { + msg.add(it == null || it.getMatchingStacks().length == 0, "all inputs must have a matching item"); + } + } + + @Override + @RecipeBuilderRegistrationMethod + public @Nullable LightningInfusionRecipe register() { + if (!validate()) return null; + Object centerItem = input.get(0).getMatchingStacks()[0]; + Object[] inputs = input.stream().skip(1).map(i -> i.getMatchingStacks()[0]).toArray(); + LightningInfusionRecipe recipe = new LightningInfusionRecipe(output.get(0), le, centerItem, inputs); + if (nbtSensitive) recipe.setNBTSensitive(); + ModSupport.LIGHTNINGCRAFT.get().infusion.add(recipe); + return recipe; + } + } + +} diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Lightningcraft.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Lightningcraft.java new file mode 100644 index 000000000..b81f35350 --- /dev/null +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Lightningcraft.java @@ -0,0 +1,10 @@ +package com.cleanroommc.groovyscript.compat.mods.lightningcraft; + +import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer; + +public class Lightningcraft extends GroovyPropertyContainer { + + public final Infusion infusion = new Infusion(); + public final Crusher crusher = new Crusher(); + +} diff --git a/src/main/resources/assets/groovyscript/lang/en_us.lang b/src/main/resources/assets/groovyscript/lang/en_us.lang index b35ddcc8d..a3d9ad63e 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -2108,6 +2108,15 @@ groovyscript.wiki.threng.etcher.top.value=Sets the top slot of the recipe groovyscript.wiki.threng.etcher.bottom.value=Sets the bottom slot of the recipe +# Lightningcraft +groovyscript.wiki.lightningcraft.crusher.title=Lightning Crusher +groovyscript.wiki.lightningcraft.crusher.description=Consumes LE to convert 1 input itemstack into an output itemstack + +groovyscript.wiki.lightningcraft.infusion.title=Lightning Infusion Table +groovyscript.wiki.lightningcraft.infusion.description=Consumes LE to convert up to 5 input itemstacks into an output itemstack +groovyscript.wiki.lightningcraft.infusion.le.value=Sets the LE cost for the recipe +groovyscript.wiki.lightningcraft.infusion.nbtSensitive.value=Sets whether the recipe inputs require a specific NBT tag + # Magneticraft groovyscript.wiki.magneticraft.crushing_table.title=Crushing Table groovyscript.wiki.magneticraft.crushing_table.description=Converts an input itemstack into an output itemstack when placed on top of the Crushing Table and interacted with by a Hammer which has From 98ea29870672000f82ce566756e1f3488b846170 Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 22 Dec 2024 18:32:05 +0300 Subject: [PATCH 02/10] oops --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ee2fd17cf..5bd1de0d4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -83,7 +83,7 @@ debug_inspirations = false debug_integrated_dynamics = false debug_lazy_ae2 = false -debug_lightningcraft = true +debug_lightningcraft = false debug_magneticraft = false debug_mekanism = false From b70b2decf791f01a5bfb52bc441db103a2cd8d3d Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 22 Dec 2024 19:56:22 +0300 Subject: [PATCH 03/10] pr adjustments --- examples/postInit/lightningcraft.groovy | 1 - .../groovyscript/compat/mods/ModSupport.java | 4 +-- .../compat/mods/lightningcraft/Crusher.java | 2 +- .../compat/mods/lightningcraft/Infusion.java | 35 +++++++++++++------ ...ightningcraft.java => LightningCraft.java} | 20 +++++------ .../assets/groovyscript/lang/en_us.lang | 2 +- 6 files changed, 39 insertions(+), 25 deletions(-) rename src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/{Lightningcraft.java => LightningCraft.java} (77%) diff --git a/examples/postInit/lightningcraft.groovy b/examples/postInit/lightningcraft.groovy index 1ce2dbfa1..a16234611 100644 --- a/examples/postInit/lightningcraft.groovy +++ b/examples/postInit/lightningcraft.groovy @@ -33,7 +33,6 @@ mods.lightningcraft.infusion.recipeBuilder() .input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])) .output(item('minecraft:diamond_block')) .le(200) - .nbtSensitive() .register() diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java index 9e38999ec..01abcb960 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java @@ -51,7 +51,7 @@ import com.cleanroommc.groovyscript.compat.mods.integrateddynamics.IntegratedDynamics; import com.cleanroommc.groovyscript.compat.mods.jei.JustEnoughItems; import com.cleanroommc.groovyscript.compat.mods.lazyae2.LazyAE2; -import com.cleanroommc.groovyscript.compat.mods.lightningcraft.Lightningcraft; +import com.cleanroommc.groovyscript.compat.mods.lightningcraft.LightningCraft; import com.cleanroommc.groovyscript.compat.mods.magneticraft.Magneticraft; import com.cleanroommc.groovyscript.compat.mods.mekanism.Mekanism; import com.cleanroommc.groovyscript.compat.mods.mysticalagriculture.MysticalAgriculture; @@ -147,7 +147,7 @@ public class ModSupport { public static final GroovyContainer MEKANISM = new InternalModContainer<>("mekanism", "Mekanism", Mekanism::new); public static final GroovyContainer MYSTICAL_AGRICULTURE = new InternalModContainer<>("mysticalagriculture", "Mystical Agriculture", MysticalAgriculture::new); public static final GroovyContainer LAZYAE2 = new InternalModContainer<>("threng", "LazyAE2", LazyAE2::new, "lazyae2"); - public static final GroovyContainer LIGHTNINGCRAFT = new InternalModContainer<>("lightningcraft", "Lightningcraft", Lightningcraft::new); + public static final GroovyContainer LIGHTNINGCRAFT = new InternalModContainer<>("lightningcraft", "LightningCraft", LightningCraft::new); public static final GroovyContainer NATURES_AURA = new InternalModContainer<>("naturesaura", "Nature's Aura", NaturesAura::new); public static final GroovyContainer PNEUMATIC_CRAFT = new InternalModContainer<>("pneumaticcraft", "PneumaticCraft: Repressurized", PneumaticCraft::new); public static final GroovyContainer PRIMAL_TECH = new InternalModContainer<>("primal_tech", "Primal Tech", PrimalTech::new, "primaltech"); diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java index a17b3ee00..d94e6cb17 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java @@ -58,7 +58,7 @@ public static class RecipeBuilder extends AbstractRecipeBuilder i.getMatchingStacks()[0]).toArray(); - LightningInfusionRecipe recipe = new LightningInfusionRecipe(output.get(0), le, centerItem, inputs); + ItemStack[] inputs = input.stream().skip(1).map(i -> i.getMatchingStacks()[0]).toArray(ItemStack[]::new); + + // check if any input items have NBT to enable NBT sensitive mode automatically + if (!nbtSensitiveChanged) { + for (ItemStack i : inputs) { + if (i.hasTagCompound()) { + nbtSensitive = true; + break; + } + } + } + + LightningInfusionRecipe recipe = new LightningInfusionRecipe(output.get(0), le, centerItem, (Object[]) inputs); if (nbtSensitive) recipe.setNBTSensitive(); ModSupport.LIGHTNINGCRAFT.get().infusion.add(recipe); return recipe; diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Lightningcraft.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java similarity index 77% rename from src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Lightningcraft.java rename to src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java index b81f35350..ccf08c4fa 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Lightningcraft.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java @@ -1,10 +1,10 @@ -package com.cleanroommc.groovyscript.compat.mods.lightningcraft; - -import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer; - -public class Lightningcraft extends GroovyPropertyContainer { - - public final Infusion infusion = new Infusion(); - public final Crusher crusher = new Crusher(); - -} +package com.cleanroommc.groovyscript.compat.mods.lightningcraft; + +import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer; + +public class LightningCraft extends GroovyPropertyContainer { + + public final Infusion infusion = new Infusion(); + public final Crusher crusher = new Crusher(); + +} diff --git a/src/main/resources/assets/groovyscript/lang/en_us.lang b/src/main/resources/assets/groovyscript/lang/en_us.lang index a3d9ad63e..3764abaf6 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -2108,7 +2108,7 @@ groovyscript.wiki.threng.etcher.top.value=Sets the top slot of the recipe groovyscript.wiki.threng.etcher.bottom.value=Sets the bottom slot of the recipe -# Lightningcraft +# LightningCraft groovyscript.wiki.lightningcraft.crusher.title=Lightning Crusher groovyscript.wiki.lightningcraft.crusher.description=Consumes LE to convert 1 input itemstack into an output itemstack From 62c5e48988ae5c97cea0b099b8e04bb71af23319 Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 22 Dec 2024 20:09:40 +0300 Subject: [PATCH 04/10] pr adjustments (2) --- .../compat/mods/lightningcraft/Crusher.java | 20 +++---------------- .../compat/mods/lightningcraft/Infusion.java | 10 ++-------- .../assets/groovyscript/lang/en_us.lang | 1 + 3 files changed, 6 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java index d94e6cb17..1817daf92 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java @@ -25,29 +25,15 @@ public Collection getRecipes() { @MethodDescription(example = @Example("item('minecraft:saddle')")) public boolean removeByInput(IIngredient input) { - return getRecipes().removeIf(r -> { - if (r.getInput().stream().anyMatch(input)) { - addBackup(r); - return true; - } - return false; - }); + return getRecipes().removeIf(r -> r.getInput().stream().anyMatch(input) && doAddBackup(r)); } @MethodDescription(example = @Example("item('minecraft:redstone')")) public boolean removeByOutput(IIngredient output) { - return getRecipes().removeIf(r -> { - if (output.test(r.getOutput())) { - addBackup(r); - return true; - } - return false; - }); + return getRecipes().removeIf(r -> output.test(r.getOutput()) && doAddBackup(r)); } - @RecipeBuilderDescription(example = { - @Example(".input(item('minecraft:diamond_block')).output(item('minecraft:nether_star'))"), - }) + @RecipeBuilderDescription(example = @Example(".input(item('minecraft:diamond_block')).output(item('minecraft:nether_star'))")) public RecipeBuilder recipeBuilder() { return new RecipeBuilder(); } diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java index 6b6c94f13..2c9e62ebd 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java @@ -23,13 +23,7 @@ public Collection getRecipes() { @MethodDescription(example = @Example("item('minecraft:diamond')")) public boolean removeByOutput(IIngredient output) { - return getRecipes().removeIf(r -> { - if (output.test(r.getOutput())) { - addBackup(r); - return true; - } - return false; - }); + return getRecipes().removeIf(r -> output.test(r.getOutput()) && doAddBackup(r)); } @RecipeBuilderDescription(example = { @@ -44,7 +38,7 @@ public RecipeBuilder recipeBuilder() { @Property(property = "output", comp = @Comp(eq = 1)) public static class RecipeBuilder extends AbstractRecipeBuilder { - @Property(comp = @Comp(gte = 0)) + @Property(comp = @Comp(gte = 0), defaultValue = "-1") private int le = -1; @Property(defaultValue = "determined automatically based on the input items") diff --git a/src/main/resources/assets/groovyscript/lang/en_us.lang b/src/main/resources/assets/groovyscript/lang/en_us.lang index 3764abaf6..dae060522 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -2117,6 +2117,7 @@ groovyscript.wiki.lightningcraft.infusion.description=Consumes LE to convert up groovyscript.wiki.lightningcraft.infusion.le.value=Sets the LE cost for the recipe groovyscript.wiki.lightningcraft.infusion.nbtSensitive.value=Sets whether the recipe inputs require a specific NBT tag + # Magneticraft groovyscript.wiki.magneticraft.crushing_table.title=Crushing Table groovyscript.wiki.magneticraft.crushing_table.description=Converts an input itemstack into an output itemstack when placed on top of the Crushing Table and interacted with by a Hammer which has From 49b6d859b1864af8dc2fd8346d95c338d6f3c90c Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sat, 1 Feb 2025 15:35:59 +0300 Subject: [PATCH 05/10] lightningcraft: suggested PR fixes --- examples/postInit/lightningcraft.groovy | 6 ++- .../compat/mods/lightningcraft/Infusion.java | 42 +++++++++++++------ .../assets/groovyscript/lang/en_us.lang | 1 + 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/examples/postInit/lightningcraft.groovy b/examples/postInit/lightningcraft.groovy index a16234611..30b30e0d6 100644 --- a/examples/postInit/lightningcraft.groovy +++ b/examples/postInit/lightningcraft.groovy @@ -24,13 +24,15 @@ mods.lightningcraft.infusion.removeByOutput(item('minecraft:diamond')) // mods.lightningcraft.infusion.removeAll() mods.lightningcraft.infusion.recipeBuilder() - .input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')) + .centerItem(item('minecraft:clay')) + .input(item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')) .output(item('minecraft:nether_star')) .le(500) .register() mods.lightningcraft.infusion.recipeBuilder() - .input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])) + .centerItem(item('minecraft:clay')) + .input(item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])) .output(item('minecraft:diamond_block')) .le(200) .register() diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java index 2c9e62ebd..54c3f2f00 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java @@ -1,5 +1,6 @@ package com.cleanroommc.groovyscript.compat.mods.lightningcraft; +import com.cleanroommc.groovyscript.GroovyScriptConfig; import com.cleanroommc.groovyscript.api.GroovyLog; import com.cleanroommc.groovyscript.api.IIngredient; import com.cleanroommc.groovyscript.api.documentation.annotations.*; @@ -27,17 +28,20 @@ public boolean removeByOutput(IIngredient output) { } @RecipeBuilderDescription(example = { - @Example(".input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')).output(item('minecraft:nether_star')).le(500)"), - @Example(".input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])).output(item('minecraft:diamond_block')).le(200)"), + @Example(".centerItem(item('minecraft:clay')).input(item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')).output(item('minecraft:nether_star')).le(500)"), + @Example(".centerItem(item('minecraft:clay')).input(item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])).output(item('minecraft:diamond_block')).le(200)"), }) public RecipeBuilder recipeBuilder() { return new RecipeBuilder(); } - @Property(property = "input", comp = @Comp(gte = 1, lte = 5)) + @Property(property = "input", comp = @Comp(gte = 0, lte = 4)) @Property(property = "output", comp = @Comp(eq = 1)) public static class RecipeBuilder extends AbstractRecipeBuilder { + @Property() + private IIngredient centerItem = null; + @Property(comp = @Comp(gte = 0), defaultValue = "-1") private int le = -1; @@ -65,6 +69,12 @@ public RecipeBuilder nbtSensitive(boolean nbtSensitive) { return this; } + @RecipeBuilderMethodDescription + public RecipeBuilder centerItem(IIngredient centerItem) { + this.centerItem = centerItem; + return this; + } + @Override public String getErrorMsg() { return "Error adding LightningCraft Infusion Table recipe"; @@ -78,11 +88,16 @@ protected int getMaxItemInput() { @Override public void validate(GroovyLog.Msg msg) { - validateItems(msg, 1, 5, 1, 1); + validateItems(msg, 0, 4, 1, 1); validateFluids(msg); + msg.add(centerItem == null, "Center item must not be null"); + msg.add(centerItem != null && centerItem.getMatchingStacks().length == 0, "Center item must not have a matching item"); msg.add(le < 0, "LE cost must be positive"); for (IIngredient it : this.input) { - msg.add(it == null || it.getMatchingStacks().length == 0, "all inputs must have a matching item"); + msg.add(it == null || it.getMatchingStacks().length == 0, "All inputs must have a matching item"); + } + if (GroovyScriptConfig.compat.checkInputStackCounts && centerItem != null) { + msg.add(centerItem.getAmount() > 1, "Expected stack size of 1 for {}, got {}", centerItem, centerItem.getAmount()); } } @@ -91,16 +106,19 @@ public void validate(GroovyLog.Msg msg) { public @Nullable LightningInfusionRecipe register() { if (!validate()) return null; - - Object centerItem = input.get(0).getMatchingStacks()[0]; - ItemStack[] inputs = input.stream().skip(1).map(i -> i.getMatchingStacks()[0]).toArray(ItemStack[]::new); + ItemStack centerItem = this.centerItem.getMatchingStacks()[0]; + ItemStack[] inputs = input.stream().map(i -> i.getMatchingStacks()[0]).toArray(ItemStack[]::new); // check if any input items have NBT to enable NBT sensitive mode automatically if (!nbtSensitiveChanged) { - for (ItemStack i : inputs) { - if (i.hasTagCompound()) { - nbtSensitive = true; - break; + if (centerItem.hasTagCompound()) { + nbtSensitive = true; + } else { + for (ItemStack i : inputs) { + if (i.hasTagCompound()) { + nbtSensitive = true; + break; + } } } } diff --git a/src/main/resources/assets/groovyscript/lang/en_us.lang b/src/main/resources/assets/groovyscript/lang/en_us.lang index dae060522..e258a6b64 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -2114,6 +2114,7 @@ groovyscript.wiki.lightningcraft.crusher.description=Consumes LE to convert 1 in groovyscript.wiki.lightningcraft.infusion.title=Lightning Infusion Table groovyscript.wiki.lightningcraft.infusion.description=Consumes LE to convert up to 5 input itemstacks into an output itemstack +groovyscript.wiki.lightningcraft.infusion.centerItem.value=Sets the center slot of the recipe groovyscript.wiki.lightningcraft.infusion.le.value=Sets the LE cost for the recipe groovyscript.wiki.lightningcraft.infusion.nbtSensitive.value=Sets whether the recipe inputs require a specific NBT tag From ab0a5fa0c8e50e350a4a6ff0f3e4d6b01caa5d46 Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 2 Feb 2025 01:12:14 +0300 Subject: [PATCH 06/10] lightningcraft: fixes (3) --- .../groovyscript/compat/mods/lightningcraft/Infusion.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java index 54c3f2f00..8c4d13134 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java @@ -1,10 +1,10 @@ package com.cleanroommc.groovyscript.compat.mods.lightningcraft; -import com.cleanroommc.groovyscript.GroovyScriptConfig; import com.cleanroommc.groovyscript.api.GroovyLog; import com.cleanroommc.groovyscript.api.IIngredient; import com.cleanroommc.groovyscript.api.documentation.annotations.*; import com.cleanroommc.groovyscript.compat.mods.ModSupport; +import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper; import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder; import com.cleanroommc.groovyscript.registry.StandardListRegistry; import net.minecraft.item.ItemStack; @@ -39,7 +39,7 @@ public RecipeBuilder recipeBuilder() { @Property(property = "output", comp = @Comp(eq = 1)) public static class RecipeBuilder extends AbstractRecipeBuilder { - @Property() + @Property private IIngredient centerItem = null; @Property(comp = @Comp(gte = 0), defaultValue = "-1") @@ -96,9 +96,7 @@ public void validate(GroovyLog.Msg msg) { for (IIngredient it : this.input) { msg.add(it == null || it.getMatchingStacks().length == 0, "All inputs must have a matching item"); } - if (GroovyScriptConfig.compat.checkInputStackCounts && centerItem != null) { - msg.add(centerItem.getAmount() > 1, "Expected stack size of 1 for {}, got {}", centerItem, centerItem.getAmount()); - } + msg.add(IngredientHelper.overMaxSize(centerItem, 1), "centerItem must have a stack size of 1"); } @Override From 9ab77d777d3a84fc13535b5df294adaff8dc4c85 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Tue, 23 Dec 2025 23:52:30 -0800 Subject: [PATCH 07/10] update --- .../lightningcraft_generated.groovy} | 8 +- .../groovyscript/compat/mods/ModSupport.java | 4 +- .../compat/mods/lightningcraft/Crusher.java | 3 +- .../compat/mods/lightningcraft/Infusion.java | 269 +++++++++--------- .../mods/lightningcraft/LightningCraft.java | 3 +- .../assets/groovyscript/lang/en_us.lang | 2 +- 6 files changed, 146 insertions(+), 143 deletions(-) rename examples/postInit/{lightningcraft.groovy => generated/lightningcraft_generated.groovy} (89%) diff --git a/examples/postInit/lightningcraft.groovy b/examples/postInit/generated/lightningcraft_generated.groovy similarity index 89% rename from examples/postInit/lightningcraft.groovy rename to examples/postInit/generated/lightningcraft_generated.groovy index 30b30e0d6..661275268 100644 --- a/examples/postInit/lightningcraft.groovy +++ b/examples/postInit/generated/lightningcraft_generated.groovy @@ -2,7 +2,7 @@ // Auto generated groovyscript example file // MODS_LOADED: lightningcraft -log.info 'mod \'lightningcraft\' detected, running script' +log 'mod \'lightningcraft\' detected, running script' // Lightning Crusher: // Consumes LE to convert 1 input itemstack into an output itemstack. @@ -24,17 +24,15 @@ mods.lightningcraft.infusion.removeByOutput(item('minecraft:diamond')) // mods.lightningcraft.infusion.removeAll() mods.lightningcraft.infusion.recipeBuilder() - .centerItem(item('minecraft:clay')) + .center(item('minecraft:clay')) .input(item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')) .output(item('minecraft:nether_star')) .le(500) .register() mods.lightningcraft.infusion.recipeBuilder() - .centerItem(item('minecraft:clay')) + .center(item('minecraft:clay')) .input(item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])) .output(item('minecraft:diamond_block')) .le(200) .register() - - diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java index 01abcb960..3185fa53b 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java @@ -143,11 +143,11 @@ public class ModSupport { public static final GroovyContainer INSPIRATIONS = new InternalModContainer<>("inspirations", "Inspirations", Inspirations::new); public static final GroovyContainer INTEGRATED_DYNAMICS = new InternalModContainer<>("integrateddynamics", "Integrated Dynamics", IntegratedDynamics::new, "id"); public static final GroovyContainer JEI = new InternalModContainer<>("jei", "Just Enough Items", JustEnoughItems::new, "hei"); + public static final GroovyContainer LAZYAE2 = new InternalModContainer<>("threng", "LazyAE2", LazyAE2::new, "lazyae2"); + public static final GroovyContainer LIGHTNING_CRAFT = new InternalModContainer<>("lightningcraft", "LightningCraft", LightningCraft::new); public static final GroovyContainer MAGNETICRAFT = new InternalModContainer<>("magneticraft", "Magneticraft", Magneticraft::new); public static final GroovyContainer MEKANISM = new InternalModContainer<>("mekanism", "Mekanism", Mekanism::new); public static final GroovyContainer MYSTICAL_AGRICULTURE = new InternalModContainer<>("mysticalagriculture", "Mystical Agriculture", MysticalAgriculture::new); - public static final GroovyContainer LAZYAE2 = new InternalModContainer<>("threng", "LazyAE2", LazyAE2::new, "lazyae2"); - public static final GroovyContainer LIGHTNINGCRAFT = new InternalModContainer<>("lightningcraft", "LightningCraft", LightningCraft::new); public static final GroovyContainer NATURES_AURA = new InternalModContainer<>("naturesaura", "Nature's Aura", NaturesAura::new); public static final GroovyContainer PNEUMATIC_CRAFT = new InternalModContainer<>("pneumaticcraft", "PneumaticCraft: Repressurized", PneumaticCraft::new); public static final GroovyContainer PRIMAL_TECH = new InternalModContainer<>("primal_tech", "Primal Tech", PrimalTech::new, "primaltech"); diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java index 1817daf92..7500328e3 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Crusher.java @@ -63,9 +63,8 @@ protected int getMaxItemInput() { if (!validate()) return null; List inputs = Arrays.asList(input.get(0).getMatchingStacks()); LightningCrusherRecipe recipe = new LightningCrusherRecipe(output.get(0), inputs); - ModSupport.LIGHTNINGCRAFT.get().crusher.add(recipe); + ModSupport.LIGHTNING_CRAFT.get().crusher.add(recipe); return recipe; } } - } diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java index 8c4d13134..a343e9caa 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java @@ -1,131 +1,138 @@ -package com.cleanroommc.groovyscript.compat.mods.lightningcraft; - -import com.cleanroommc.groovyscript.api.GroovyLog; -import com.cleanroommc.groovyscript.api.IIngredient; -import com.cleanroommc.groovyscript.api.documentation.annotations.*; -import com.cleanroommc.groovyscript.compat.mods.ModSupport; -import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper; -import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder; -import com.cleanroommc.groovyscript.registry.StandardListRegistry; -import net.minecraft.item.ItemStack; -import org.jetbrains.annotations.Nullable; -import sblectric.lightningcraft.api.recipes.LightningInfusionRecipe; -import sblectric.lightningcraft.recipes.LightningInfusionRecipes; - -import java.util.Collection; - -@RegistryDescription -public class Infusion extends StandardListRegistry { - - @Override - public Collection getRecipes() { - return LightningInfusionRecipes.instance().getRecipeList(); - } - - @MethodDescription(example = @Example("item('minecraft:diamond')")) - public boolean removeByOutput(IIngredient output) { - return getRecipes().removeIf(r -> output.test(r.getOutput()) && doAddBackup(r)); - } - - @RecipeBuilderDescription(example = { - @Example(".centerItem(item('minecraft:clay')).input(item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')).output(item('minecraft:nether_star')).le(500)"), - @Example(".centerItem(item('minecraft:clay')).input(item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])).output(item('minecraft:diamond_block')).le(200)"), - }) - public RecipeBuilder recipeBuilder() { - return new RecipeBuilder(); - } - - @Property(property = "input", comp = @Comp(gte = 0, lte = 4)) - @Property(property = "output", comp = @Comp(eq = 1)) - public static class RecipeBuilder extends AbstractRecipeBuilder { - - @Property - private IIngredient centerItem = null; - - @Property(comp = @Comp(gte = 0), defaultValue = "-1") - private int le = -1; - - @Property(defaultValue = "determined automatically based on the input items") - private boolean nbtSensitive = false; - - private boolean nbtSensitiveChanged = false; - - @RecipeBuilderMethodDescription - public RecipeBuilder le(int le) { - this.le = le; - return this; - } - - @RecipeBuilderMethodDescription(field = "le") - public RecipeBuilder cost(int le) { - this.le = le; - return this; - } - - @RecipeBuilderMethodDescription - public RecipeBuilder nbtSensitive(boolean nbtSensitive) { - this.nbtSensitive = nbtSensitive; - nbtSensitiveChanged = true; - return this; - } - - @RecipeBuilderMethodDescription - public RecipeBuilder centerItem(IIngredient centerItem) { - this.centerItem = centerItem; - return this; - } - - @Override - public String getErrorMsg() { - return "Error adding LightningCraft Infusion Table recipe"; - } - - @Override - protected int getMaxItemInput() { - // recipes with more than 1 item in some slot don't get recognized - return 1; - } - - @Override - public void validate(GroovyLog.Msg msg) { - validateItems(msg, 0, 4, 1, 1); - validateFluids(msg); - msg.add(centerItem == null, "Center item must not be null"); - msg.add(centerItem != null && centerItem.getMatchingStacks().length == 0, "Center item must not have a matching item"); - msg.add(le < 0, "LE cost must be positive"); - for (IIngredient it : this.input) { - msg.add(it == null || it.getMatchingStacks().length == 0, "All inputs must have a matching item"); - } - msg.add(IngredientHelper.overMaxSize(centerItem, 1), "centerItem must have a stack size of 1"); - } - - @Override - @RecipeBuilderRegistrationMethod - public @Nullable LightningInfusionRecipe register() { - if (!validate()) return null; - - ItemStack centerItem = this.centerItem.getMatchingStacks()[0]; - ItemStack[] inputs = input.stream().map(i -> i.getMatchingStacks()[0]).toArray(ItemStack[]::new); - - // check if any input items have NBT to enable NBT sensitive mode automatically - if (!nbtSensitiveChanged) { - if (centerItem.hasTagCompound()) { - nbtSensitive = true; - } else { - for (ItemStack i : inputs) { - if (i.hasTagCompound()) { - nbtSensitive = true; - break; - } - } - } - } - - LightningInfusionRecipe recipe = new LightningInfusionRecipe(output.get(0), le, centerItem, (Object[]) inputs); - if (nbtSensitive) recipe.setNBTSensitive(); - ModSupport.LIGHTNINGCRAFT.get().infusion.add(recipe); - return recipe; - } - } - -} +package com.cleanroommc.groovyscript.compat.mods.lightningcraft; + +import com.cleanroommc.groovyscript.api.GroovyBlacklist; +import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.api.IIngredient; +import com.cleanroommc.groovyscript.api.documentation.annotations.*; +import com.cleanroommc.groovyscript.compat.mods.ModSupport; +import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper; +import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder; +import com.cleanroommc.groovyscript.registry.StandardListRegistry; +import net.minecraft.item.ItemStack; +import org.jetbrains.annotations.Nullable; +import sblectric.lightningcraft.api.recipes.LightningInfusionRecipe; +import sblectric.lightningcraft.recipes.LightningInfusionRecipes; + +import java.util.Collection; +import java.util.List; + +@RegistryDescription +public class Infusion extends StandardListRegistry { + + @Override + public Collection getRecipes() { + return LightningInfusionRecipes.instance().getRecipeList(); + } + + @MethodDescription(example = @Example("item('minecraft:diamond')")) + public boolean removeByOutput(IIngredient output) { + return getRecipes().removeIf(r -> output.test(r.getOutput()) && doAddBackup(r)); + } + + @RecipeBuilderDescription(example = { + @Example(".center(item('minecraft:clay')).input(item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot')).output(item('minecraft:nether_star')).le(500)"), + @Example(".center(item('minecraft:clay')).input(item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])).output(item('minecraft:diamond_block')).le(200)"), + }) + public RecipeBuilder recipeBuilder() { + return new RecipeBuilder(); + } + + @Property(property = "input", comp = @Comp(gte = 0, lte = 4)) + @Property(property = "output", comp = @Comp(eq = 1)) + public static class RecipeBuilder extends AbstractRecipeBuilder { + + @Property(comp = @Comp(not = "empty")) + private IIngredient center; + @Property(comp = @Comp(gte = 0)) + private int le; + @Property(defaultValue = "true if any input item has nbt data") + private boolean nbtSensitive = false; + + private boolean nbtSensitiveChanged = false; + + @RecipeBuilderMethodDescription + public RecipeBuilder le(int le) { + this.le = le; + return this; + } + + @RecipeBuilderMethodDescription(field = "le") + public RecipeBuilder cost(int le) { + this.le = le; + return this; + } + + @RecipeBuilderMethodDescription + public RecipeBuilder nbtSensitive(boolean nbtSensitive) { + this.nbtSensitive = nbtSensitive; + nbtSensitiveChanged = true; + return this; + } + + @RecipeBuilderMethodDescription + public RecipeBuilder center(IIngredient center) { + this.center = center; + return this; + } + + @Override + public String getErrorMsg() { + return "Error adding LightningCraft Infusion Table recipe"; + } + + @Override + protected int getMaxItemInput() { + // recipes with more than 1 item in some slot don't get recognized + return 1; + } + + @Override + public void validate(GroovyLog.Msg msg) { + validateItems(msg, 0, 4, 1, 1); + validateFluids(msg); + msg.add(IngredientHelper.isEmpty(center), "Center item must not be empty"); + msg.add(le < 0, "LE cost must be positive"); + for (IIngredient it : this.input) { + msg.add(IngredientHelper.isEmpty(it), "All inputs must not be empty"); + } + msg.add(IngredientHelper.overMaxSize(center, 1), "centerItem must have a stack size of 1"); + // check if any input items have NBT to enable NBT sensitive mode automatically + if (!nbtSensitiveChanged) { + nbtSensitive = hasAnyNbt(); + } + } + + @GroovyBlacklist + private boolean hasAnyNbt() { + for (var stack : center.getMatchingStacks()) { + if (stack.hasTagCompound()) { + return true; + } + } + for (var i : input) { + for (var stack : i.getMatchingStacks()) { + if (stack.hasTagCompound()) { + return true; + } + } + } + return false; + } + + @Override + @RecipeBuilderRegistrationMethod + public @Nullable LightningInfusionRecipe register() { + if (!validate()) return null; + + LightningInfusionRecipe recipe = null; + for (var centerStack : center.getMatchingStacks()) { + for (List cartesianProductItemStack : IngredientHelper.cartesianProductItemStacks(input)) { + recipe = new LightningInfusionRecipe(output.get(0), le, centerStack, cartesianProductItemStack.toArray()); + if (nbtSensitive) recipe.setNBTSensitive(); + ModSupport.LIGHTNING_CRAFT.get().infusion.add(recipe); + } + } + return recipe; + } + } +} diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java index ccf08c4fa..cfb7f7b69 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java @@ -4,7 +4,6 @@ public class LightningCraft extends GroovyPropertyContainer { - public final Infusion infusion = new Infusion(); public final Crusher crusher = new Crusher(); - + public final Infusion infusion = new Infusion(); } diff --git a/src/main/resources/assets/groovyscript/lang/en_us.lang b/src/main/resources/assets/groovyscript/lang/en_us.lang index e258a6b64..50c8e7ec0 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -2114,7 +2114,7 @@ groovyscript.wiki.lightningcraft.crusher.description=Consumes LE to convert 1 in groovyscript.wiki.lightningcraft.infusion.title=Lightning Infusion Table groovyscript.wiki.lightningcraft.infusion.description=Consumes LE to convert up to 5 input itemstacks into an output itemstack -groovyscript.wiki.lightningcraft.infusion.centerItem.value=Sets the center slot of the recipe +groovyscript.wiki.lightningcraft.infusion.center.value=Sets the center slot of the recipe groovyscript.wiki.lightningcraft.infusion.le.value=Sets the LE cost for the recipe groovyscript.wiki.lightningcraft.infusion.nbtSensitive.value=Sets whether the recipe inputs require a specific NBT tag From cf1b74983c0544b64cb5b49a7c309717191859ac Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Wed, 24 Dec 2025 00:22:43 -0800 Subject: [PATCH 08/10] lightning transformation --- .../generated/lightningcraft_generated.groovy | 18 ++++ .../mods/lightningcraft/LightningCraft.java | 1 + .../mods/lightningcraft/Transformation.java | 101 ++++++++++++++++++ .../assets/groovyscript/lang/en_us.lang | 4 + 4 files changed, 124 insertions(+) create mode 100644 src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Transformation.java diff --git a/examples/postInit/generated/lightningcraft_generated.groovy b/examples/postInit/generated/lightningcraft_generated.groovy index 661275268..505ca90fb 100644 --- a/examples/postInit/generated/lightningcraft_generated.groovy +++ b/examples/postInit/generated/lightningcraft_generated.groovy @@ -36,3 +36,21 @@ mods.lightningcraft.infusion.recipeBuilder() .output(item('minecraft:diamond_block')) .le(200) .register() + + +// Lightning Transformation: +// Converts any number of itemstacks on the ground into the output itemstack when the area is struck by lightning. + +mods.lightningcraft.transformation.removeByInput(item('minecraft:iron_ingot')) +mods.lightningcraft.transformation.removeByOutput(item('lightningcraft:material', 11)) +// mods.lightningcraft.transformation.removeAll() + +mods.lightningcraft.transformation.recipeBuilder() + .input(item('minecraft:clay')) + .output(item('minecraft:diamond')) + .register() + +mods.lightningcraft.transformation.recipeBuilder() + .input(item('minecraft:gold_ingot') * 3, item('minecraft:diamond_block')) + .output(item('minecraft:clay') * 16) + .register() diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java index cfb7f7b69..51dcc8333 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/LightningCraft.java @@ -6,4 +6,5 @@ public class LightningCraft extends GroovyPropertyContainer { public final Crusher crusher = new Crusher(); public final Infusion infusion = new Infusion(); + public final Transformation transformation = new Transformation(); } diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Transformation.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Transformation.java new file mode 100644 index 000000000..24d28e945 --- /dev/null +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Transformation.java @@ -0,0 +1,101 @@ +package com.cleanroommc.groovyscript.compat.mods.lightningcraft; + +import com.cleanroommc.groovyscript.api.GroovyLog; +import com.cleanroommc.groovyscript.api.IIngredient; +import com.cleanroommc.groovyscript.api.documentation.annotations.*; +import com.cleanroommc.groovyscript.compat.mods.ModSupport; +import com.cleanroommc.groovyscript.helper.SimpleObjectStream; +import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper; +import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder; +import com.cleanroommc.groovyscript.registry.VirtualizedRegistry; +import net.minecraft.item.ItemStack; +import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.Nullable; +import sblectric.lightningcraft.recipes.LightningTransformRecipes; + +import java.util.List; +import java.util.Map; + +@RegistryDescription(admonition = @Admonition(value = "groovyscript.wiki.lightningcraft.transformation.note", type = Admonition.Type.WARNING)) +public class Transformation extends VirtualizedRegistry, ItemStack>> { + + public Map, ItemStack> getEntries() { + return LightningTransformRecipes.instance().getRecipeList(); + } + + @Override + public void onReload() { + var instance = getEntries(); + var entries = instance.entrySet(); + removeScripted().forEach(entry -> entries.removeIf(entry.getKey()::equals)); + restoreFromBackup().forEach(x -> instance.put(x.getKey(), x.getValue())); + } + + public boolean add(Map.Entry, ItemStack> recipe) { + if (recipe == null) return false; + LightningTransformRecipes.instance().addRecipe(recipe.getValue(), recipe.getKey()); + doAddScripted(recipe); + return true; + } + + public boolean remove(Map.Entry, ItemStack> recipe) { + return recipe != null && getEntries().entrySet().removeIf(r -> r == recipe) && doAddBackup(recipe); + } + + @RecipeBuilderDescription(example = { + @Example(".input(item('minecraft:clay')).output(item('minecraft:diamond'))"), + @Example(".input(item('minecraft:gold_ingot') * 3, item('minecraft:diamond_block')).output(item('minecraft:clay') * 16)") + }) + public RecipeBuilder recipeBuilder() { + return new RecipeBuilder(); + } + + @MethodDescription(example = @Example("item('minecraft:iron_ingot')")) + public boolean removeByInput(IIngredient input) { + return getEntries().entrySet().removeIf(r -> r.getKey().stream().anyMatch(input) && doAddBackup(r)); + } + + @MethodDescription(example = @Example("item('lightningcraft:material', 11)")) + public boolean removeByOutput(IIngredient output) { + return getEntries().entrySet().removeIf(r -> output.test(r.getValue()) && doAddBackup(r)); + } + + @MethodDescription(priority = 2000, example = @Example(commented = true)) + public void removeAll() { + getEntries().entrySet().forEach(this::doAddBackup); + getEntries().clear(); + } + + @MethodDescription(type = MethodDescription.Type.QUERY) + public SimpleObjectStream, ItemStack>> streamRecipes() { + return new SimpleObjectStream<>(getEntries().entrySet()).setRemover(this::remove); + } + + @Property(property = "input", comp = @Comp(gte = 1)) + @Property(property = "output", comp = @Comp(eq = 1)) + public static class RecipeBuilder extends AbstractRecipeBuilder, ItemStack>> { + + @Override + public String getErrorMsg() { + return "Error adding LightningCraft Transformation recipe"; + } + + @Override + public void validate(GroovyLog.Msg msg) { + validateItems(msg, 1, Integer.MAX_VALUE, 1, 1); + } + + @Override + @RecipeBuilderRegistrationMethod + public @Nullable Map.Entry, ItemStack> register() { + if (!validate()) return null; + var inputs = IngredientHelper.cartesianProductItemStacks(input); + Map.Entry, ItemStack> recipe = null; + for (List itemStacks : inputs) { + recipe = Pair.of(itemStacks, output.get(0)); + ModSupport.LIGHTNING_CRAFT.get().transformation.add(recipe); + } + return recipe; + } + } +} diff --git a/src/main/resources/assets/groovyscript/lang/en_us.lang b/src/main/resources/assets/groovyscript/lang/en_us.lang index 50c8e7ec0..f35f02a82 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -2118,6 +2118,10 @@ groovyscript.wiki.lightningcraft.infusion.center.value=Sets the center slot of t groovyscript.wiki.lightningcraft.infusion.le.value=Sets the LE cost for the recipe groovyscript.wiki.lightningcraft.infusion.nbtSensitive.value=Sets whether the recipe inputs require a specific NBT tag +groovyscript.wiki.lightningcraft.transformation.title=Lightning Transformation +groovyscript.wiki.lightningcraft.transformation.description=Converts any number of itemstacks on the ground into the output itemstack when the area is struck by lightning. +groovyscript.wiki.lightningcraft.transformation.note=THe items on the ground must match the stack size of the recipe exactly. + # Magneticraft groovyscript.wiki.magneticraft.crushing_table.title=Crushing Table From f2676dd64ce298acd9795a05ce1d1ed4451dd253 Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Wed, 24 Dec 2025 00:22:54 -0800 Subject: [PATCH 09/10] fix Property annotation javadocs --- .../groovyscript/api/documentation/annotations/Property.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/cleanroommc/groovyscript/api/documentation/annotations/Property.java b/src/main/java/com/cleanroommc/groovyscript/api/documentation/annotations/Property.java index d8b5720f6..29841cc3c 100644 --- a/src/main/java/com/cleanroommc/groovyscript/api/documentation/annotations/Property.java +++ b/src/main/java/com/cleanroommc/groovyscript/api/documentation/annotations/Property.java @@ -73,9 +73,8 @@ * For instance, "0" is the default value for {@code int}s, and so does not have to be declared. * * @return what the default value is, defaults to {@code false}, {@code 0}, {@code 0.0f}, {@code "null"}, etc depending on the property class. - * @see com.cleanroommc.groovyscript.documentation.Builder#defaultValueConverter + * @see com.cleanroommc.groovyscript.documentation.helper.descriptor.DescriptorHelper#defaultValueConverter */ - @SuppressWarnings("JavadocReference") String defaultValue() default ""; /** From 7bb186bd050c958edd370eb171ca8dcc17a3c7ba Mon Sep 17 00:00:00 2001 From: Waiting Idly <25394029+WaitingIdly@users.noreply.github.com> Date: Wed, 24 Dec 2025 00:29:06 -0800 Subject: [PATCH 10/10] rework nbt check --- .../compat/mods/lightningcraft/Infusion.java | 37 ++++++++----------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java index a343e9caa..595a36e1e 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/lightningcraft/Infusion.java @@ -50,6 +50,19 @@ public static class RecipeBuilder extends AbstractRecipeBuilder input) { + if (centerStack.hasTagCompound()) { + return true; + } + for (var stack : input) { + if (stack.hasTagCompound()) { + return true; + } + } + return false; + } + @RecipeBuilderMethodDescription public RecipeBuilder le(int le) { this.le = le; @@ -96,27 +109,6 @@ public void validate(GroovyLog.Msg msg) { msg.add(IngredientHelper.isEmpty(it), "All inputs must not be empty"); } msg.add(IngredientHelper.overMaxSize(center, 1), "centerItem must have a stack size of 1"); - // check if any input items have NBT to enable NBT sensitive mode automatically - if (!nbtSensitiveChanged) { - nbtSensitive = hasAnyNbt(); - } - } - - @GroovyBlacklist - private boolean hasAnyNbt() { - for (var stack : center.getMatchingStacks()) { - if (stack.hasTagCompound()) { - return true; - } - } - for (var i : input) { - for (var stack : i.getMatchingStacks()) { - if (stack.hasTagCompound()) { - return true; - } - } - } - return false; } @Override @@ -128,7 +120,8 @@ private boolean hasAnyNbt() { for (var centerStack : center.getMatchingStacks()) { for (List cartesianProductItemStack : IngredientHelper.cartesianProductItemStacks(input)) { recipe = new LightningInfusionRecipe(output.get(0), le, centerStack, cartesianProductItemStack.toArray()); - if (nbtSensitive) recipe.setNBTSensitive(); + // check if any input items have NBT if NBT sensitive mode isn't manually set + if (nbtSensitiveChanged ? nbtSensitive : hasAnyNbt(centerStack, cartesianProductItemStack)) recipe.setNBTSensitive(); ModSupport.LIGHTNING_CRAFT.get().infusion.add(recipe); } }