Skip to content

Commit 109b425

Browse files
authored
add Cyclic compat (#194)
1 parent 74a7797 commit 109b425

File tree

11 files changed

+729
-0
lines changed

11 files changed

+729
-0
lines changed

dependencies.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ final def mod_dependencies = [
5252
'chisel-235279:2915375' : [project.debug_chisel],
5353
'ctm-267602:2915363' : [project.debug_chisel],
5454
'compact-machines-224218:2707509' : [project.debug_compact_machines],
55+
'cyclic-239286:4075832' : [project.debug_cyclic],
5556
'brandons_core-231382:3408276' : [project.debug_draconic_evolution],
5657
'draconic_evolution-223565:3431261' : [project.debug_draconic_evolution],
5758
'redstone_flux-270789:2920436' : [project.debug_draconic_evolution, project.debug_thermal],

examples/postInit/cyclicmagic.groovy

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
2+
// Auto generated groovyscript example file
3+
// MODS_LOADED: cyclicmagic
4+
5+
println 'mod \'cyclicmagic\' detected, running script'
6+
7+
// DeHydrator:
8+
// Converts an input itemstack into an output itemstack.
9+
10+
mods.cyclicmagic.dehydrator.removeByInput(item('minecraft:clay'))
11+
mods.cyclicmagic.dehydrator.removeByOutput(item('minecraft:deadbush'))
12+
// mods.cyclicmagic.dehydrator.removeAll()
13+
14+
mods.cyclicmagic.dehydrator.recipeBuilder()
15+
.input(item('minecraft:gold_ingot'))
16+
.output(item('minecraft:clay'))
17+
.register()
18+
19+
mods.cyclicmagic.dehydrator.recipeBuilder()
20+
.input(ore('logWood'))
21+
.output(item('minecraft:clay') * 8)
22+
.time(100)
23+
.water(30)
24+
.register()
25+
26+
27+
// Hydrator:
28+
// Converts up to 4 input itemstacks and some amount of water into an output itemstack.
29+
30+
mods.cyclicmagic.hydrator.removeByInput(item('minecraft:dirt'))
31+
mods.cyclicmagic.hydrator.removeByOutput(item('minecraft:clay_ball'))
32+
// mods.cyclicmagic.hydrator.removeAll()
33+
34+
mods.cyclicmagic.hydrator.recipeBuilder()
35+
.input(item('minecraft:gold_ingot'))
36+
.output(item('minecraft:clay'))
37+
.register()
38+
39+
mods.cyclicmagic.hydrator.recipeBuilder()
40+
.input(ore('logWood'), ore('sand'), ore('gravel'), item('minecraft:diamond'))
41+
.output(item('minecraft:clay') * 8)
42+
.water(100)
43+
.register()
44+
45+
46+
// Melter:
47+
// Converts up to 4 input itemstacks into an output itemstack, while being placed above lava.
48+
49+
mods.cyclicmagic.melter.removeByInput(item('minecraft:snow'))
50+
mods.cyclicmagic.melter.removeByOutput(fluid('amber'))
51+
// mods.cyclicmagic.melter.removeAll()
52+
53+
mods.cyclicmagic.melter.recipeBuilder()
54+
.input(item('minecraft:gold_ingot'))
55+
.fluidOutput(fluid('water') * 175)
56+
.register()
57+
58+
mods.cyclicmagic.melter.recipeBuilder()
59+
.input(ore('logWood'), ore('sand'), ore('gravel'), item('minecraft:diamond'))
60+
.fluidOutput(fluid('lava') * 500)
61+
.register()
62+
63+
64+
// Packager:
65+
// Converts up to 6 input itemstacks into an output itemstack.
66+
67+
mods.cyclicmagic.packager.removeByInput(item('minecraft:grass'))
68+
mods.cyclicmagic.packager.removeByOutput(item('minecraft:melon_block'))
69+
// mods.cyclicmagic.packager.removeAll()
70+
71+
mods.cyclicmagic.packager.recipeBuilder()
72+
.input(item('minecraft:gold_ingot'))
73+
.output(item('minecraft:clay'))
74+
.register()
75+
76+
mods.cyclicmagic.packager.recipeBuilder()
77+
.input(ore('logWood'), ore('sand'), ore('gravel'), item('minecraft:diamond'), item('minecraft:diamond_block'), item('minecraft:gold_block'))
78+
.output(item('minecraft:clay') * 4)
79+
.register()
80+
81+
82+
// Solidifier:
83+
// Converts up to 4 input itemstacks and an input fluidstack into an output itemstack.
84+
85+
mods.cyclicmagic.solidifier.removeByInput(fluid('water'))
86+
mods.cyclicmagic.solidifier.removeByInput(item('minecraft:bucket'))
87+
mods.cyclicmagic.solidifier.removeByOutput(item('cyclicmagic:crystallized_obsidian'))
88+
// mods.cyclicmagic.solidifier.removeAll()
89+
90+
mods.cyclicmagic.solidifier.recipeBuilder()
91+
.input(item('minecraft:clay'))
92+
.fluidInput(fluid('water') * 175)
93+
.output(item('minecraft:gold_ingot') * 3)
94+
.register()
95+
96+
mods.cyclicmagic.solidifier.recipeBuilder()
97+
.input(ore('logWood'), ore('sand'), ore('gravel'), item('minecraft:diamond'))
98+
.fluidInput(fluid('lava') * 500)
99+
.output(item('minecraft:clay') * 2)
100+
.register()
101+
102+

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ debug_botania = false
2828
debug_calculator = false
2929
debug_chisel = false
3030
debug_compact_machines = false
31+
debug_cyclic = false
3132
debug_draconic_evolution = false
3233
debug_enderio = false
3334
debug_essentialcraft_4 = false

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.cleanroommc.groovyscript.compat.mods.botania.Botania;
1919
import com.cleanroommc.groovyscript.compat.mods.calculator.Calculator;
2020
import com.cleanroommc.groovyscript.compat.mods.chisel.Chisel;
21+
import com.cleanroommc.groovyscript.compat.mods.cyclic.Cyclic;
2122
import com.cleanroommc.groovyscript.compat.mods.compactmachines.CompactMachines;
2223
import com.cleanroommc.groovyscript.compat.mods.draconicevolution.DraconicEvolution;
2324
import com.cleanroommc.groovyscript.compat.mods.enderio.EnderIO;
@@ -85,6 +86,7 @@ public class ModSupport {
8586
public static final GroovyContainer<Calculator> CALCULATOR = new InternalModContainer<>("calculator", "Calculator", Calculator::new);
8687
public static final GroovyContainer<Chisel> CHISEL = new InternalModContainer<>("chisel", "Chisel", Chisel::new);
8788
public static final GroovyContainer<CompactMachines> COMPACT_MACHINES = new InternalModContainer<>("compactmachines3", "Compact Machines 3", CompactMachines::new, "compactmachines");
89+
public static final GroovyContainer<Cyclic> CYCLIC = new InternalModContainer<>("cyclicmagic", "Cyclic", Cyclic::new, "cyclic");
8890
public static final GroovyContainer<DraconicEvolution> DRACONIC_EVOLUTION = new InternalModContainer<>("draconicevolution", "Draconic Evolution", DraconicEvolution::new, "de");
8991
public static final GroovyContainer<EnderIO> ENDER_IO = new InternalModContainer<>("enderio", "Ender IO", EnderIO::new, "eio");
9092
public static final GroovyContainer<EssentialCraft> ESSENTIALCRAFT = new InternalModContainer<>("essentialcraft", "EssentialCraft 4", EssentialCraft::new, "ec4");
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.cleanroommc.groovyscript.compat.mods.cyclic;
2+
3+
import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer;
4+
5+
public class Cyclic extends GroovyPropertyContainer {
6+
7+
public final Dehydrator dehydrator = new Dehydrator();
8+
public final Hydrator hydrator = new Hydrator();
9+
public final Melter melter = new Melter();
10+
public final Packager packager = new Packager();
11+
public final Solidifier solidifier = new Solidifier();
12+
13+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package com.cleanroommc.groovyscript.compat.mods.cyclic;
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.SimpleObjectStream;
9+
import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder;
10+
import com.cleanroommc.groovyscript.registry.VirtualizedRegistry;
11+
import com.lothrazar.cyclicmagic.block.dehydrator.RecipeDeHydrate;
12+
import net.minecraft.item.ItemStack;
13+
import org.jetbrains.annotations.Nullable;
14+
15+
@RegistryDescription
16+
public class Dehydrator extends VirtualizedRegistry<RecipeDeHydrate> {
17+
18+
@RecipeBuilderDescription(example = {
19+
@Example(".input(item('minecraft:gold_ingot')).output(item('minecraft:clay'))"),
20+
@Example(".input(ore('logWood')).output(item('minecraft:clay') * 8).time(100).water(30)")
21+
})
22+
public RecipeBuilder recipeBuilder() {
23+
return new RecipeBuilder();
24+
}
25+
26+
@Override
27+
@GroovyBlacklist
28+
public void onReload() {
29+
RecipeDeHydrate.recipes.removeAll(removeScripted());
30+
RecipeDeHydrate.recipes.addAll(restoreFromBackup());
31+
}
32+
33+
public void add(RecipeDeHydrate recipe) {
34+
if (recipe == null) return;
35+
addScripted(recipe);
36+
RecipeDeHydrate.recipes.add(recipe);
37+
}
38+
39+
public boolean remove(RecipeDeHydrate recipe) {
40+
if (recipe == null) return false;
41+
addBackup(recipe);
42+
RecipeDeHydrate.recipes.remove(recipe);
43+
return true;
44+
}
45+
46+
@MethodDescription(example = @Example("item('minecraft:clay')"))
47+
public boolean removeByInput(IIngredient input) {
48+
return RecipeDeHydrate.recipes.removeIf(recipe -> {
49+
if (input.test(recipe.getRecipeInput())) {
50+
addBackup(recipe);
51+
return true;
52+
}
53+
return false;
54+
});
55+
}
56+
57+
@MethodDescription(example = @Example("item('minecraft:deadbush')"))
58+
public boolean removeByOutput(IIngredient output) {
59+
return RecipeDeHydrate.recipes.removeIf(recipe -> {
60+
if (output.test(recipe.getRecipeOutput())) {
61+
addBackup(recipe);
62+
return true;
63+
}
64+
return false;
65+
});
66+
}
67+
68+
@MethodDescription(priority = 2000, example = @Example(commented = true))
69+
public void removeAll() {
70+
RecipeDeHydrate.recipes.forEach(this::addBackup);
71+
RecipeDeHydrate.recipes.clear();
72+
}
73+
74+
@MethodDescription(type = MethodDescription.Type.QUERY)
75+
public SimpleObjectStream<RecipeDeHydrate> streamRecipes() {
76+
return new SimpleObjectStream<>(RecipeDeHydrate.recipes)
77+
.setRemover(this::remove);
78+
}
79+
80+
@Property(property = "input", valid = @Comp("1"))
81+
@Property(property = "output", valid = @Comp("1"))
82+
public static class RecipeBuilder extends AbstractRecipeBuilder<RecipeDeHydrate> {
83+
84+
@Property(defaultValue = "100", valid = @Comp(value = "0", type = Comp.Type.GTE))
85+
private int water = 100;
86+
@Property(defaultValue = "10", valid = @Comp(value = "0", type = Comp.Type.GTE))
87+
private int time = 10;
88+
89+
@RecipeBuilderMethodDescription
90+
public RecipeBuilder water(int water) {
91+
this.water = water;
92+
return this;
93+
}
94+
95+
@RecipeBuilderMethodDescription
96+
public RecipeBuilder time(int time) {
97+
this.time = time;
98+
return this;
99+
}
100+
101+
@Override
102+
public String getErrorMsg() {
103+
return "Error adding Cyclic Dehydrator recipe";
104+
}
105+
106+
@Override
107+
public void validate(GroovyLog.Msg msg) {
108+
validateItems(msg, 1, 1, 1, 1);
109+
validateFluids(msg);
110+
msg.add(water < 0, "water must be a non-negative integer, yet it was {}", water);
111+
msg.add(time < 0, "time must be a non-negative integer, yet it was {}", time);
112+
}
113+
114+
@Override
115+
@RecipeBuilderRegistrationMethod
116+
public @Nullable RecipeDeHydrate register() {
117+
if (!validate()) return null;
118+
RecipeDeHydrate recipe = null;
119+
for (ItemStack matchingStack : input.get(0).toMcIngredient().getMatchingStacks()) {
120+
recipe = new RecipeDeHydrate(matchingStack, output.get(0), time, water);
121+
ModSupport.CYCLIC.get().dehydrator.add(recipe);
122+
}
123+
return recipe;
124+
}
125+
}
126+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package com.cleanroommc.groovyscript.compat.mods.cyclic;
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.SimpleObjectStream;
9+
import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder;
10+
import com.cleanroommc.groovyscript.registry.VirtualizedRegistry;
11+
import com.google.common.collect.Lists;
12+
import com.lothrazar.cyclicmagic.block.hydrator.RecipeHydrate;
13+
import net.minecraft.item.ItemStack;
14+
import org.jetbrains.annotations.Nullable;
15+
16+
import java.util.Arrays;
17+
import java.util.List;
18+
import java.util.stream.Collectors;
19+
20+
@RegistryDescription
21+
public class Hydrator extends VirtualizedRegistry<RecipeHydrate> {
22+
23+
@RecipeBuilderDescription(example = {
24+
@Example(".input(item('minecraft:gold_ingot')).output(item('minecraft:clay'))"),
25+
@Example(".input(ore('logWood'), ore('sand'), ore('gravel'), item('minecraft:diamond')).output(item('minecraft:clay') * 8).water(100)")
26+
})
27+
public RecipeBuilder recipeBuilder() {
28+
return new RecipeBuilder();
29+
}
30+
31+
@Override
32+
@GroovyBlacklist
33+
public void onReload() {
34+
RecipeHydrate.recipes.removeAll(removeScripted());
35+
RecipeHydrate.recipes.addAll(restoreFromBackup());
36+
}
37+
38+
public void add(RecipeHydrate recipe) {
39+
if (recipe == null) return;
40+
addScripted(recipe);
41+
RecipeHydrate.recipes.add(recipe);
42+
}
43+
44+
public boolean remove(RecipeHydrate recipe) {
45+
if (recipe == null) return false;
46+
addBackup(recipe);
47+
RecipeHydrate.recipes.remove(recipe);
48+
return true;
49+
}
50+
51+
@MethodDescription(example = @Example("item('minecraft:dirt')"))
52+
public boolean removeByInput(IIngredient input) {
53+
return RecipeHydrate.recipes.removeIf(recipe -> {
54+
if (recipe.getRecipeInput().stream().anyMatch(input)) {
55+
addBackup(recipe);
56+
return true;
57+
}
58+
return false;
59+
});
60+
}
61+
62+
@MethodDescription(example = @Example("item('minecraft:clay_ball')"))
63+
public boolean removeByOutput(IIngredient output) {
64+
return RecipeHydrate.recipes.removeIf(recipe -> {
65+
if (output.test(recipe.getRecipeOutput())) {
66+
addBackup(recipe);
67+
return true;
68+
}
69+
return false;
70+
});
71+
}
72+
73+
@MethodDescription(priority = 2000, example = @Example(commented = true))
74+
public void removeAll() {
75+
RecipeHydrate.recipes.forEach(this::addBackup);
76+
RecipeHydrate.recipes.clear();
77+
}
78+
79+
@MethodDescription(type = MethodDescription.Type.QUERY)
80+
public SimpleObjectStream<RecipeHydrate> streamRecipes() {
81+
return new SimpleObjectStream<>(RecipeHydrate.recipes)
82+
.setRemover(this::remove);
83+
}
84+
85+
@Property(property = "input", valid = {@Comp(type = Comp.Type.GTE, value = "1"), @Comp(type = Comp.Type.LTE, value = "6")})
86+
@Property(property = "output", valid = @Comp("1"))
87+
public static class RecipeBuilder extends AbstractRecipeBuilder<RecipeHydrate> {
88+
89+
@Property(defaultValue = "25", valid = @Comp(value = "0", type = Comp.Type.GTE))
90+
private int water = 25;
91+
92+
@RecipeBuilderMethodDescription
93+
public RecipeBuilder water(int water) {
94+
this.water = water;
95+
return this;
96+
}
97+
98+
@Override
99+
public String getErrorMsg() {
100+
return "Error adding Cyclic Hydrator recipe";
101+
}
102+
103+
@Override
104+
public void validate(GroovyLog.Msg msg) {
105+
validateItems(msg, 1, 6, 1, 1);
106+
validateFluids(msg);
107+
msg.add(water < 0, "water must be a non-negative integer, yet it was {}", water);
108+
}
109+
110+
@Override
111+
@RecipeBuilderRegistrationMethod
112+
public @Nullable RecipeHydrate register() {
113+
if (!validate()) return null;
114+
RecipeHydrate recipe = null;
115+
List<List<ItemStack>> cartesian = Lists.cartesianProduct(input.stream().map(x -> Arrays.asList(x.toMcIngredient().getMatchingStacks())).collect(Collectors.toList()));
116+
for (List<ItemStack> stacks : cartesian) {
117+
recipe = new RecipeHydrate(stacks.toArray(new ItemStack[0]), output.get(0), water);
118+
ModSupport.CYCLIC.get().hydrator.add(recipe);
119+
}
120+
return recipe;
121+
}
122+
}
123+
}

0 commit comments

Comments
 (0)