From 5489e20312b9fae43788a02d5caee3a423282452 Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 22 Dec 2024 18:29:02 +0300 Subject: [PATCH 1/6] 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 3032a3425..70343f855 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -84,6 +84,7 @@ final def mod_dependencies = [ 'integrated-dynamics-236307:3159505' : [project.debug_integrated_dynamics], 'lazy-ae2-322347:3254160' : [project.debug_lazy_ae2], 'libnine-322344:3509087' : [project.debug_lazy_ae2], + 'lightningcraft-237422:2872478' : [project.debug_lightningcraft], 'magneticraft-224808:3791484' : [project.debug_magneticraft], 'modelloader-277663:2744735' : [project.debug_magneticraft], 'mekanism-268560:2835175' : [project.debug_mekanism], 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 b73a02b66..c6d0513c5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -62,6 +62,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 650a3798d..3f52c7292 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java @@ -42,6 +42,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; @@ -124,6 +125,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 6105c243e..5545bb079 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -1481,6 +1481,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 fed014991c9700f947017a943ca6877834484f62 Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 22 Dec 2024 18:32:05 +0300 Subject: [PATCH 2/6] oops --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index c6d0513c5..f297ca61f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -62,7 +62,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 6cecfcb2862a7db9aaa2a28eada68483b3846f32 Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 22 Dec 2024 19:56:22 +0300 Subject: [PATCH 3/6] 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 3f52c7292..a05ea09d9 100644 --- a/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java +++ b/src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java @@ -42,7 +42,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; @@ -125,7 +125,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 5545bb079..f6ac25d70 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -1481,7 +1481,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 71331e2c8ada46dbb9f68a23b5477e56542aef9e Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 22 Dec 2024 20:09:40 +0300 Subject: [PATCH 4/6] 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 f6ac25d70..042adc8d3 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -1490,6 +1490,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 3641ccd3f2a71fb62f54608910d85aad25d91f92 Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sat, 1 Feb 2025 15:35:59 +0300 Subject: [PATCH 5/6] 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 042adc8d3..1335069df 100644 --- a/src/main/resources/assets/groovyscript/lang/en_us.lang +++ b/src/main/resources/assets/groovyscript/lang/en_us.lang @@ -1487,6 +1487,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 c5a023b713381a9eb0dced1baebb4c1210a8d313 Mon Sep 17 00:00:00 2001 From: Wizzerinus Date: Sun, 2 Feb 2025 01:12:14 +0300 Subject: [PATCH 6/6] 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