Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ final Map<String, List<String>> 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],
Expand Down
56 changes: 56 additions & 0 deletions examples/postInit/generated/lightningcraft_generated.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@

// Auto generated groovyscript example file
// MODS_LOADED: lightningcraft

log '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()
.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()
.center(item('minecraft:clay'))
.input(item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping']))
.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()
1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ debug_inspirations = false
debug_integrated_dynamics = false

debug_lazy_ae2 = false
debug_lightningcraft = false

debug_magneticraft = false
debug_mekanism = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 "";

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -142,10 +143,11 @@ public class ModSupport {
public static final GroovyContainer<Inspirations> INSPIRATIONS = new InternalModContainer<>("inspirations", "Inspirations", Inspirations::new);
public static final GroovyContainer<IntegratedDynamics> INTEGRATED_DYNAMICS = new InternalModContainer<>("integrateddynamics", "Integrated Dynamics", IntegratedDynamics::new, "id");
public static final GroovyContainer<JustEnoughItems> JEI = new InternalModContainer<>("jei", "Just Enough Items", JustEnoughItems::new, "hei");
public static final GroovyContainer<LazyAE2> LAZYAE2 = new InternalModContainer<>("threng", "LazyAE2", LazyAE2::new, "lazyae2");
public static final GroovyContainer<LightningCraft> LIGHTNING_CRAFT = new InternalModContainer<>("lightningcraft", "LightningCraft", LightningCraft::new);
public static final GroovyContainer<Magneticraft> MAGNETICRAFT = new InternalModContainer<>("magneticraft", "Magneticraft", Magneticraft::new);
public static final GroovyContainer<Mekanism> MEKANISM = new InternalModContainer<>("mekanism", "Mekanism", Mekanism::new);
public static final GroovyContainer<MysticalAgriculture> MYSTICAL_AGRICULTURE = new InternalModContainer<>("mysticalagriculture", "Mystical Agriculture", MysticalAgriculture::new);
public static final GroovyContainer<LazyAE2> LAZYAE2 = new InternalModContainer<>("threng", "LazyAE2", LazyAE2::new, "lazyae2");
public static final GroovyContainer<NaturesAura> NATURES_AURA = new InternalModContainer<>("naturesaura", "Nature's Aura", NaturesAura::new);
public static final GroovyContainer<PneumaticCraft> PNEUMATIC_CRAFT = new InternalModContainer<>("pneumaticcraft", "PneumaticCraft: Repressurized", PneumaticCraft::new);
public static final GroovyContainer<PrimalTech> PRIMAL_TECH = new InternalModContainer<>("primal_tech", "Primal Tech", PrimalTech::new, "primaltech");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
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<LightningCrusherRecipe> {

@Override
public Collection<LightningCrusherRecipe> getRecipes() {
return LightningCrusherRecipes.instance().getRecipeList();
}

@MethodDescription(example = @Example("item('minecraft:saddle')"))
public boolean removeByInput(IIngredient input) {
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 -> output.test(r.getOutput()) && doAddBackup(r));
}

@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<LightningCrusherRecipe> {

@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<ItemStack> inputs = Arrays.asList(input.get(0).getMatchingStacks());
LightningCrusherRecipe recipe = new LightningCrusherRecipe(output.get(0), inputs);
ModSupport.LIGHTNING_CRAFT.get().crusher.add(recipe);
return recipe;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
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<LightningInfusionRecipe> {

@Override
public Collection<LightningInfusionRecipe> 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<LightningInfusionRecipe> {

@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;

@GroovyBlacklist
private static boolean hasAnyNbt(ItemStack centerStack, List<ItemStack> 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;
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");
}

@Override
@RecipeBuilderRegistrationMethod
public @Nullable LightningInfusionRecipe register() {
if (!validate()) return null;

LightningInfusionRecipe recipe = null;
for (var centerStack : center.getMatchingStacks()) {
for (List<ItemStack> cartesianProductItemStack : IngredientHelper.cartesianProductItemStacks(input)) {
recipe = new LightningInfusionRecipe(output.get(0), le, centerStack, cartesianProductItemStack.toArray());
// 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);
}
}
return recipe;
}
}
}
Original file line number Diff line number Diff line change
@@ -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 Crusher crusher = new Crusher();
public final Infusion infusion = new Infusion();
public final Transformation transformation = new Transformation();
}
Loading