Skip to content

Commit 00f518a

Browse files
add LightningCraft compat (#365)
* feat: added lightningcraft compat New WR adding a gs compat * oops * pr adjustments * pr adjustments (2) * lightningcraft: suggested PR fixes * lightningcraft: fixes (3) * update * lightning transformation * fix Property annotation javadocs * rework nbt check --------- Co-authored-by: Wizzerinus <[email protected]>
1 parent c501f15 commit 00f518a

File tree

10 files changed

+389
-3
lines changed

10 files changed

+389
-3
lines changed

dependencies.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ final Map<String, List<String>> mod_dependencies = [
8888
'lemonlib-306926:2639879' : [debug_arcane_world, debug_arcane_world_rotn],
8989
'libnine-322344:3509087' : [debug_lazy_ae2],
9090
'libvulpes-236541:3801015' : [debug_advanced_rocketry],
91+
'lightningcraft-237422:2872478' : [debug_lightningcraft],
9192
'llibrary-243298:2504999' : [debug_ice_and_fire_old, debug_ice_and_fire_rotn],
9293
'magneticraft-224808:3791484' : [debug_magneticraft],
9394
'mantle-74924:2713386' : [debug_inspirations, debug_tinkers_construct],
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
2+
// Auto generated groovyscript example file
3+
// MODS_LOADED: lightningcraft
4+
5+
log 'mod \'lightningcraft\' detected, running script'
6+
7+
// Lightning Crusher:
8+
// Consumes LE to convert 1 input itemstack into an output itemstack.
9+
10+
mods.lightningcraft.crusher.removeByInput(item('minecraft:saddle'))
11+
mods.lightningcraft.crusher.removeByOutput(item('minecraft:redstone'))
12+
// mods.lightningcraft.crusher.removeAll()
13+
14+
mods.lightningcraft.crusher.recipeBuilder()
15+
.input(item('minecraft:diamond_block'))
16+
.output(item('minecraft:nether_star'))
17+
.register()
18+
19+
20+
// Lightning Infusion Table:
21+
// Consumes LE to convert up to 5 input itemstacks into an output itemstack.
22+
23+
mods.lightningcraft.infusion.removeByOutput(item('minecraft:diamond'))
24+
// mods.lightningcraft.infusion.removeAll()
25+
26+
mods.lightningcraft.infusion.recipeBuilder()
27+
.center(item('minecraft:clay'))
28+
.input(item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:iron_ingot'), item('minecraft:iron_ingot'))
29+
.output(item('minecraft:nether_star'))
30+
.le(500)
31+
.register()
32+
33+
mods.lightningcraft.infusion.recipeBuilder()
34+
.center(item('minecraft:clay'))
35+
.input(item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping']))
36+
.output(item('minecraft:diamond_block'))
37+
.le(200)
38+
.register()
39+
40+
41+
// Lightning Transformation:
42+
// Converts any number of itemstacks on the ground into the output itemstack when the area is struck by lightning.
43+
44+
mods.lightningcraft.transformation.removeByInput(item('minecraft:iron_ingot'))
45+
mods.lightningcraft.transformation.removeByOutput(item('lightningcraft:material', 11))
46+
// mods.lightningcraft.transformation.removeAll()
47+
48+
mods.lightningcraft.transformation.recipeBuilder()
49+
.input(item('minecraft:clay'))
50+
.output(item('minecraft:diamond'))
51+
.register()
52+
53+
mods.lightningcraft.transformation.recipeBuilder()
54+
.input(item('minecraft:gold_ingot') * 3, item('minecraft:diamond_block'))
55+
.output(item('minecraft:clay') * 16)
56+
.register()

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ debug_inspirations = false
8383
debug_integrated_dynamics = false
8484

8585
debug_lazy_ae2 = false
86+
debug_lightningcraft = false
8687

8788
debug_magneticraft = false
8889
debug_mekanism = false

src/main/java/com/cleanroommc/groovyscript/api/documentation/annotations/Property.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,8 @@
7373
* For instance, "0" is the default value for {@code int}s, and so does not have to be declared.
7474
*
7575
* @return what the default value is, defaults to {@code false}, {@code 0}, {@code 0.0f}, {@code "null"}, etc depending on the property class.
76-
* @see com.cleanroommc.groovyscript.documentation.Builder#defaultValueConverter
76+
* @see com.cleanroommc.groovyscript.documentation.helper.descriptor.DescriptorHelper#defaultValueConverter
7777
*/
78-
@SuppressWarnings("JavadocReference")
7978
String defaultValue() default "";
8079

8180
/**

src/main/java/com/cleanroommc/groovyscript/compat/mods/ModSupport.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import com.cleanroommc.groovyscript.compat.mods.integrateddynamics.IntegratedDynamics;
5353
import com.cleanroommc.groovyscript.compat.mods.jei.JustEnoughItems;
5454
import com.cleanroommc.groovyscript.compat.mods.lazyae2.LazyAE2;
55+
import com.cleanroommc.groovyscript.compat.mods.lightningcraft.LightningCraft;
5556
import com.cleanroommc.groovyscript.compat.mods.magneticraft.Magneticraft;
5657
import com.cleanroommc.groovyscript.compat.mods.mekanism.Mekanism;
5758
import com.cleanroommc.groovyscript.compat.mods.mysticalagriculture.MysticalAgriculture;
@@ -144,10 +145,11 @@ public class ModSupport {
144145
public static final GroovyContainer<Inspirations> INSPIRATIONS = new InternalModContainer<>("inspirations", "Inspirations", Inspirations::new);
145146
public static final GroovyContainer<IntegratedDynamics> INTEGRATED_DYNAMICS = new InternalModContainer<>("integrateddynamics", "Integrated Dynamics", IntegratedDynamics::new, "id");
146147
public static final GroovyContainer<JustEnoughItems> JEI = new InternalModContainer<>("jei", "Just Enough Items", JustEnoughItems::new, "hei");
148+
public static final GroovyContainer<LazyAE2> LAZYAE2 = new InternalModContainer<>("threng", "LazyAE2", LazyAE2::new, "lazyae2");
149+
public static final GroovyContainer<LightningCraft> LIGHTNING_CRAFT = new InternalModContainer<>("lightningcraft", "LightningCraft", LightningCraft::new);
147150
public static final GroovyContainer<Magneticraft> MAGNETICRAFT = new InternalModContainer<>("magneticraft", "Magneticraft", Magneticraft::new);
148151
public static final GroovyContainer<Mekanism> MEKANISM = new InternalModContainer<>("mekanism", "Mekanism", Mekanism::new);
149152
public static final GroovyContainer<MysticalAgriculture> MYSTICAL_AGRICULTURE = new InternalModContainer<>("mysticalagriculture", "Mystical Agriculture", MysticalAgriculture::new);
150-
public static final GroovyContainer<LazyAE2> LAZYAE2 = new InternalModContainer<>("threng", "LazyAE2", LazyAE2::new, "lazyae2");
151153
public static final GroovyContainer<NaturesAura> NATURES_AURA = new InternalModContainer<>("naturesaura", "Nature's Aura", NaturesAura::new);
152154
public static final GroovyContainer<PneumaticCraft> PNEUMATIC_CRAFT = new InternalModContainer<>("pneumaticcraft", "PneumaticCraft: Repressurized", PneumaticCraft::new);
153155
public static final GroovyContainer<PrimalTech> PRIMAL_TECH = new InternalModContainer<>("primal_tech", "Primal Tech", PrimalTech::new, "primaltech");
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.cleanroommc.groovyscript.compat.mods.lightningcraft;
2+
3+
import com.cleanroommc.groovyscript.api.GroovyLog;
4+
import com.cleanroommc.groovyscript.api.IIngredient;
5+
import com.cleanroommc.groovyscript.api.documentation.annotations.*;
6+
import com.cleanroommc.groovyscript.compat.mods.ModSupport;
7+
import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder;
8+
import com.cleanroommc.groovyscript.registry.StandardListRegistry;
9+
import net.minecraft.item.ItemStack;
10+
import org.jetbrains.annotations.Nullable;
11+
import sblectric.lightningcraft.api.recipes.LightningCrusherRecipe;
12+
import sblectric.lightningcraft.recipes.LightningCrusherRecipes;
13+
14+
import java.util.Arrays;
15+
import java.util.Collection;
16+
import java.util.List;
17+
18+
@RegistryDescription
19+
public class Crusher extends StandardListRegistry<LightningCrusherRecipe> {
20+
21+
@Override
22+
public Collection<LightningCrusherRecipe> getRecipes() {
23+
return LightningCrusherRecipes.instance().getRecipeList();
24+
}
25+
26+
@MethodDescription(example = @Example("item('minecraft:saddle')"))
27+
public boolean removeByInput(IIngredient input) {
28+
return getRecipes().removeIf(r -> r.getInput().stream().anyMatch(input) && doAddBackup(r));
29+
}
30+
31+
@MethodDescription(example = @Example("item('minecraft:redstone')"))
32+
public boolean removeByOutput(IIngredient output) {
33+
return getRecipes().removeIf(r -> output.test(r.getOutput()) && doAddBackup(r));
34+
}
35+
36+
@RecipeBuilderDescription(example = @Example(".input(item('minecraft:diamond_block')).output(item('minecraft:nether_star'))"))
37+
public RecipeBuilder recipeBuilder() {
38+
return new RecipeBuilder();
39+
}
40+
41+
@Property(property = "input", comp = @Comp(eq = 1))
42+
@Property(property = "output", comp = @Comp(eq = 1))
43+
public static class RecipeBuilder extends AbstractRecipeBuilder<LightningCrusherRecipe> {
44+
45+
@Override
46+
public String getErrorMsg() {
47+
return "Error adding LightningCraft Crusher recipe";
48+
}
49+
50+
@Override
51+
public void validate(GroovyLog.Msg msg) {
52+
validateItems(msg, 1, 1, 1, 1);
53+
}
54+
55+
@Override
56+
protected int getMaxItemInput() {
57+
return 1;
58+
}
59+
60+
@Override
61+
@RecipeBuilderRegistrationMethod
62+
public @Nullable LightningCrusherRecipe register() {
63+
if (!validate()) return null;
64+
List<ItemStack> inputs = Arrays.asList(input.get(0).getMatchingStacks());
65+
LightningCrusherRecipe recipe = new LightningCrusherRecipe(output.get(0), inputs);
66+
ModSupport.LIGHTNING_CRAFT.get().crusher.add(recipe);
67+
return recipe;
68+
}
69+
}
70+
}
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package com.cleanroommc.groovyscript.compat.mods.lightningcraft;
2+
3+
import com.cleanroommc.groovyscript.api.GroovyBlacklist;
4+
import com.cleanroommc.groovyscript.api.GroovyLog;
5+
import com.cleanroommc.groovyscript.api.IIngredient;
6+
import com.cleanroommc.groovyscript.api.documentation.annotations.*;
7+
import com.cleanroommc.groovyscript.compat.mods.ModSupport;
8+
import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper;
9+
import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder;
10+
import com.cleanroommc.groovyscript.registry.StandardListRegistry;
11+
import net.minecraft.item.ItemStack;
12+
import org.jetbrains.annotations.Nullable;
13+
import sblectric.lightningcraft.api.recipes.LightningInfusionRecipe;
14+
import sblectric.lightningcraft.recipes.LightningInfusionRecipes;
15+
16+
import java.util.Collection;
17+
import java.util.List;
18+
19+
@RegistryDescription
20+
public class Infusion extends StandardListRegistry<LightningInfusionRecipe> {
21+
22+
@Override
23+
public Collection<LightningInfusionRecipe> getRecipes() {
24+
return LightningInfusionRecipes.instance().getRecipeList();
25+
}
26+
27+
@MethodDescription(example = @Example("item('minecraft:diamond')"))
28+
public boolean removeByOutput(IIngredient output) {
29+
return getRecipes().removeIf(r -> output.test(r.getOutput()) && doAddBackup(r));
30+
}
31+
32+
@RecipeBuilderDescription(example = {
33+
@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)"),
34+
@Example(".center(item('minecraft:clay')).input(item('minecraft:gold_ingot'), item('minecraft:potion').withNbt(['Potion': 'minecraft:leaping'])).output(item('minecraft:diamond_block')).le(200)"),
35+
})
36+
public RecipeBuilder recipeBuilder() {
37+
return new RecipeBuilder();
38+
}
39+
40+
@Property(property = "input", comp = @Comp(gte = 0, lte = 4))
41+
@Property(property = "output", comp = @Comp(eq = 1))
42+
public static class RecipeBuilder extends AbstractRecipeBuilder<LightningInfusionRecipe> {
43+
44+
@Property(comp = @Comp(not = "empty"))
45+
private IIngredient center;
46+
@Property(comp = @Comp(gte = 0))
47+
private int le;
48+
@Property(defaultValue = "true if any input item has nbt data")
49+
private boolean nbtSensitive = false;
50+
51+
private boolean nbtSensitiveChanged = false;
52+
53+
@GroovyBlacklist
54+
private static boolean hasAnyNbt(ItemStack centerStack, List<ItemStack> input) {
55+
if (centerStack.hasTagCompound()) {
56+
return true;
57+
}
58+
for (var stack : input) {
59+
if (stack.hasTagCompound()) {
60+
return true;
61+
}
62+
}
63+
return false;
64+
}
65+
66+
@RecipeBuilderMethodDescription
67+
public RecipeBuilder le(int le) {
68+
this.le = le;
69+
return this;
70+
}
71+
72+
@RecipeBuilderMethodDescription(field = "le")
73+
public RecipeBuilder cost(int le) {
74+
this.le = le;
75+
return this;
76+
}
77+
78+
@RecipeBuilderMethodDescription
79+
public RecipeBuilder nbtSensitive(boolean nbtSensitive) {
80+
this.nbtSensitive = nbtSensitive;
81+
nbtSensitiveChanged = true;
82+
return this;
83+
}
84+
85+
@RecipeBuilderMethodDescription
86+
public RecipeBuilder center(IIngredient center) {
87+
this.center = center;
88+
return this;
89+
}
90+
91+
@Override
92+
public String getErrorMsg() {
93+
return "Error adding LightningCraft Infusion Table recipe";
94+
}
95+
96+
@Override
97+
protected int getMaxItemInput() {
98+
// recipes with more than 1 item in some slot don't get recognized
99+
return 1;
100+
}
101+
102+
@Override
103+
public void validate(GroovyLog.Msg msg) {
104+
validateItems(msg, 0, 4, 1, 1);
105+
validateFluids(msg);
106+
msg.add(IngredientHelper.isEmpty(center), "Center item must not be empty");
107+
msg.add(le < 0, "LE cost must be positive");
108+
for (IIngredient it : this.input) {
109+
msg.add(IngredientHelper.isEmpty(it), "All inputs must not be empty");
110+
}
111+
msg.add(IngredientHelper.overMaxSize(center, 1), "centerItem must have a stack size of 1");
112+
}
113+
114+
@Override
115+
@RecipeBuilderRegistrationMethod
116+
public @Nullable LightningInfusionRecipe register() {
117+
if (!validate()) return null;
118+
119+
LightningInfusionRecipe recipe = null;
120+
for (var centerStack : center.getMatchingStacks()) {
121+
for (List<ItemStack> cartesianProductItemStack : IngredientHelper.cartesianProductItemStacks(input)) {
122+
recipe = new LightningInfusionRecipe(output.get(0), le, centerStack, cartesianProductItemStack.toArray());
123+
// check if any input items have NBT if NBT sensitive mode isn't manually set
124+
if (nbtSensitiveChanged ? nbtSensitive : hasAnyNbt(centerStack, cartesianProductItemStack)) recipe.setNBTSensitive();
125+
ModSupport.LIGHTNING_CRAFT.get().infusion.add(recipe);
126+
}
127+
}
128+
return recipe;
129+
}
130+
}
131+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.cleanroommc.groovyscript.compat.mods.lightningcraft;
2+
3+
import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer;
4+
5+
public class LightningCraft extends GroovyPropertyContainer {
6+
7+
public final Crusher crusher = new Crusher();
8+
public final Infusion infusion = new Infusion();
9+
public final Transformation transformation = new Transformation();
10+
}

0 commit comments

Comments
 (0)