Skip to content

Commit 12e61c8

Browse files
authored
add Random Things compat (#253)
* Random Things * uni <3 !!!! * dont log uni if no inputs
1 parent 73e8d24 commit 12e61c8

File tree

8 files changed

+249
-0
lines changed

8 files changed

+249
-0
lines changed

dependencies.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ final def mod_dependencies = [
9797
'projecte-226410:2702991' : [project.debug_projecte],
9898
'athenaeum-284350:4633750' : [project.debug_pyrotech],
9999
'pyrotech-306676:4956838' : [project.debug_pyrotech],
100+
'random-things-59816:2905241' : [project.debug_random_things],
100101
'mystical_world-282940:3460961' : [project.debug_roots],
101102
'patchouli-306770:3162874' : [project.debug_roots, project.debug_natures_aura, project.debug_prodigytech],
102103
'prodigytech-297414:2769520' : [project.debug_prodigytech],

examples/postInit/randomthings.groovy

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
2+
// Auto generated groovyscript example file
3+
// MODS_LOADED: randomthings
4+
5+
log.info 'mod \'randomthings\' detected, running script'
6+
7+
// Anvil Crafting:
8+
// Converts two itemstacks into an itemstack in the Vanilla Anvil.
9+
10+
mods.randomthings.anvil.removeByInput(item('randomthings:obsidianskull'))
11+
mods.randomthings.anvil.removeByOutput(item('randomthings:lavawader'))
12+
// mods.randomthings.anvil.removeAll()
13+
14+
mods.randomthings.anvil.recipeBuilder()
15+
.input(item('minecraft:diamond_sword'), item('minecraft:boat'))
16+
.output(item('minecraft:diamond'))
17+
.cost(1)
18+
.register()
19+
20+
mods.randomthings.anvil.recipeBuilder()
21+
.input(item('minecraft:iron_sword'), item('minecraft:boat'))
22+
.output(item('minecraft:gold_ingot') * 16)
23+
.cost(50)
24+
.register()
25+
26+
27+
// Imbuing Station:
28+
// Converts four itemstacks into an itemstack in the Random Things Imbuing Station.
29+
30+
mods.randomthings.imbuing.removeByInput(item('minecraft:coal'))
31+
mods.randomthings.imbuing.removeByInput(item('minecraft:cobblestone'))
32+
mods.randomthings.imbuing.removeByOutput(item('randomthings:imbue:3'))
33+
// mods.randomthings.imbuing.removeAll()
34+
35+
mods.randomthings.imbuing.recipeBuilder()
36+
.mainInput(item('minecraft:clay'))
37+
.input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:gold_block'))
38+
.output(item('minecraft:diamond') * 8)
39+
.register()
40+
41+
mods.randomthings.imbuing.recipeBuilder()
42+
.mainInput(item('minecraft:diamond'))
43+
.input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:diamond'))
44+
.output(item('minecraft:gold_ingot'))
45+
.register()
46+
47+

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ debug_prodigytech = false
7373
debug_projecte = false
7474
debug_pyrotech = false
7575

76+
debug_random_things = false
7677
debug_roots = false
7778
debug_rustic = false
7879

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import com.cleanroommc.groovyscript.compat.mods.prodigytech.ProdigyTech;
5151
import com.cleanroommc.groovyscript.compat.mods.projecte.ProjectE;
5252
import com.cleanroommc.groovyscript.compat.mods.pyrotech.PyroTech;
53+
import com.cleanroommc.groovyscript.compat.mods.randomthings.RandomThings;
5354
import com.cleanroommc.groovyscript.compat.mods.roots.Roots;
5455
import com.cleanroommc.groovyscript.compat.mods.rustic.Rustic;
5556
import com.cleanroommc.groovyscript.compat.mods.tcomplement.TinkersComplement;
@@ -126,6 +127,7 @@ public class ModSupport {
126127
public static final GroovyContainer<ProdigyTech> PRODIGY_TECH = new InternalModContainer<>("prodigytech", "Prodigy Tech", ProdigyTech::new);
127128
public static final GroovyContainer<ProjectE> PROJECT_E = new InternalModContainer<>("projecte", "ProjectE", ProjectE::new);
128129
public static final GroovyContainer<PyroTech> PYROTECH = new InternalModContainer<>("pyrotech", "Pyrotech", PyroTech::new);
130+
public static final GroovyContainer<RandomThings> RANDOM_THINGS = new InternalModContainer<>("randomthings", "Random Things", RandomThings::new);
129131
public static final GroovyContainer<Roots> ROOTS = new InternalModContainer<>("roots", "Roots 3", Roots::new);
130132
public static final GroovyContainer<Rustic> RUSTIC = new InternalModContainer<>("rustic", "Rustic", Rustic::new);
131133
public static final GroovyContainer<TechReborn> TECH_REBORN = new InternalModContainer<>("techreborn", "Tech Reborn", TechReborn::new);
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.cleanroommc.groovyscript.compat.mods.randomthings;
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 lumien.randomthings.recipes.anvil.AnvilRecipe;
10+
import lumien.randomthings.recipes.anvil.AnvilRecipeHandler;
11+
import org.jetbrains.annotations.Nullable;
12+
13+
import java.util.Collection;
14+
15+
@RegistryDescription(admonition = {
16+
@Admonition(value = "groovyscript.wiki.randomthings.anvil.note0", type = Admonition.Type.TIP),
17+
@Admonition(value = "groovyscript.wiki.randomthings.anvil.note1", type = Admonition.Type.WARNING),
18+
@Admonition(value = "groovyscript.wiki.randomthings.anvil.note2", type = Admonition.Type.BUG, format = Admonition.Format.STANDARD),
19+
})
20+
public class Anvil extends StandardListRegistry<AnvilRecipe> {
21+
22+
@RecipeBuilderDescription(example = {
23+
@Example(".input(item('minecraft:diamond_sword'), item('minecraft:boat')).output(item('minecraft:diamond')).cost(1)"),
24+
@Example(".input(item('minecraft:iron_sword'), item('minecraft:boat')).output(item('minecraft:gold_ingot') * 16).cost(50)")
25+
})
26+
public RecipeBuilder recipeBuilder() {
27+
return new RecipeBuilder();
28+
}
29+
30+
@Override
31+
public Collection<AnvilRecipe> getRecipes() {
32+
return AnvilRecipeHandler.getAllRecipes();
33+
}
34+
35+
@MethodDescription(example = @Example("item('randomthings:obsidianskull')"))
36+
public boolean removeByInput(IIngredient input) {
37+
return getRecipes().removeIf(r -> (input.test(r.getFirst()) || input.test(r.getSecond())) && doAddBackup(r));
38+
}
39+
40+
@MethodDescription(example = @Example("item('randomthings:lavawader')"))
41+
public boolean removeByOutput(IIngredient output) {
42+
return getRecipes().removeIf(r -> output.test(r.getOutput()) && doAddBackup(r));
43+
}
44+
45+
@Property(property = "input", comp = @Comp(eq = 2))
46+
@Property(property = "output", comp = @Comp(eq = 1))
47+
public static class RecipeBuilder extends AbstractRecipeBuilder<AnvilRecipe> {
48+
49+
@Property(comp = @Comp(gt = 0))
50+
private int cost;
51+
52+
@RecipeBuilderMethodDescription
53+
public RecipeBuilder cost(int cost) {
54+
this.cost = cost;
55+
return this;
56+
}
57+
58+
@Override
59+
public String getErrorMsg() {
60+
return "Error adding Random Things Anvil recipe";
61+
}
62+
63+
@Override
64+
public void validate(GroovyLog.Msg msg) {
65+
validateItems(msg, 2, 2, 1, 1);
66+
validateFluids(msg);
67+
msg.add(cost <= 0, "cost must be greater than 0, yet it was {}", cost);
68+
}
69+
70+
@Override
71+
@RecipeBuilderRegistrationMethod
72+
public @Nullable AnvilRecipe register() {
73+
if (!validate()) return null;
74+
AnvilRecipe recipe = null;
75+
for (var input1 : input.get(0).getMatchingStacks()) {
76+
for (var input2 : input.get(1).getMatchingStacks()) {
77+
recipe = new AnvilRecipe(input1, input2, output.get(0), cost);
78+
ModSupport.RANDOM_THINGS.get().anvil.add(recipe);
79+
}
80+
}
81+
return recipe;
82+
}
83+
}
84+
}
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.cleanroommc.groovyscript.compat.mods.randomthings;
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 com.google.common.collect.Lists;
10+
import lumien.randomthings.recipes.imbuing.ImbuingRecipe;
11+
import lumien.randomthings.recipes.imbuing.ImbuingRecipeHandler;
12+
import net.minecraft.item.ItemStack;
13+
import net.minecraft.item.crafting.Ingredient;
14+
import org.jetbrains.annotations.Nullable;
15+
16+
import java.util.Arrays;
17+
import java.util.Collection;
18+
import java.util.stream.Collectors;
19+
20+
@RegistryDescription
21+
public class Imbuing extends StandardListRegistry<ImbuingRecipe> {
22+
23+
@RecipeBuilderDescription(example = {
24+
@Example(".mainInput(item('minecraft:clay')).input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:gold_block')).output(item('minecraft:diamond') * 8)"),
25+
@Example(".mainInput(item('minecraft:diamond')).input(item('minecraft:clay'), item('minecraft:gold_ingot'), item('minecraft:diamond')).output(item('minecraft:gold_ingot'))")
26+
})
27+
public RecipeBuilder recipeBuilder() {
28+
return new RecipeBuilder();
29+
}
30+
31+
@Override
32+
public Collection<ImbuingRecipe> getRecipes() {
33+
return ImbuingRecipeHandler.imbuingRecipes;
34+
}
35+
36+
@MethodDescription(example = {
37+
@Example("item('minecraft:cobblestone')"), @Example("item('minecraft:coal')")
38+
})
39+
public boolean removeByInput(IIngredient input) {
40+
return getRecipes().removeIf(r -> (input.test(r.toImbue()) || r.getIngredients().stream().anyMatch(input)) && doAddBackup(r));
41+
}
42+
43+
@MethodDescription(example = @Example("item('randomthings:imbue:3')"))
44+
public boolean removeByOutput(IIngredient output) {
45+
return getRecipes().removeIf(r -> output.test(r.getResult()) && doAddBackup(r));
46+
}
47+
48+
@Property(property = "input", comp = @Comp(eq = 3, unique = "groovyscript.wiki.randomthings.imbuing.input.required"))
49+
@Property(property = "output", comp = @Comp(eq = 1))
50+
public static class RecipeBuilder extends AbstractRecipeBuilder<ImbuingRecipe> {
51+
52+
@Property(comp = @Comp(not = "null"))
53+
private IIngredient mainInput;
54+
55+
@RecipeBuilderMethodDescription
56+
public RecipeBuilder mainInput(IIngredient mainInput) {
57+
this.mainInput = mainInput;
58+
return this;
59+
}
60+
61+
@Override
62+
public String getErrorMsg() {
63+
return "Error adding Random Things Imbuing recipe";
64+
}
65+
66+
@Override
67+
public void validate(GroovyLog.Msg msg) {
68+
validateItems(msg, 3, 3, 1, 1);
69+
validateFluids(msg);
70+
msg.add(mainInput == null, "mainInput must be defined");
71+
var uni = input.stream().distinct().count();
72+
msg.add(uni > 0 && uni < 3, "each input must be unique, yet only {}/3 of the inputs were unique. mainInput is not considered", uni);
73+
}
74+
75+
@Override
76+
@RecipeBuilderRegistrationMethod
77+
public @Nullable ImbuingRecipe register() {
78+
if (!validate()) return null;
79+
ImbuingRecipe recipe = null;
80+
var cartesian = Lists.cartesianProduct(input.stream().map(IIngredient::toMcIngredient).map(Ingredient::getMatchingStacks).map(Arrays::asList).collect(Collectors.toList()));
81+
for (var toImbue : mainInput.getMatchingStacks()) {
82+
for (var stacks : cartesian) {
83+
recipe = new ImbuingRecipe(toImbue, output.get(0), stacks.toArray(new ItemStack[0]));
84+
ModSupport.RANDOM_THINGS.get().imbuing.add(recipe);
85+
}
86+
}
87+
return recipe;
88+
}
89+
}
90+
}
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.randomthings;
2+
3+
import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer;
4+
5+
public class RandomThings extends GroovyPropertyContainer {
6+
7+
public final Imbuing imbuing = new Imbuing();
8+
public final Anvil anvil = new Anvil();
9+
10+
}

src/main/resources/assets/groovyscript/lang/en_us.lang

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1901,6 +1901,20 @@ groovyscript.wiki.projecte.transmutation.output.value=Sets the normal output blo
19011901
groovyscript.wiki.projecte.transmutation.altOutput.value=Sets the shift output blockstate
19021902

19031903

1904+
# Random Things
1905+
groovyscript.wiki.randomthings.anvil.title=Anvil Crafting
1906+
groovyscript.wiki.randomthings.anvil.description=Converts two itemstacks into an itemstack in the Vanilla Anvil.
1907+
groovyscript.wiki.randomthings.anvil.note0=Internally this uses a more restricted version of `AnvilUpdateEvent`, so consider using an event listener for that instead.
1908+
groovyscript.wiki.randomthings.anvil.note1=Consumes the entire stack in the Anvil, regardless of the amount actually required. To avoid issues, consider only using unstackable items.
1909+
groovyscript.wiki.randomthings.anvil.note2=When crafting any recipe done via this, if the output of the Anvil was picked up via clicking it, it will not be craftable again until restarting the game. Can be fixed with a mixin from Universal Tweaks.
1910+
groovyscript.wiki.randomthings.anvil.cost.value=Sets the cost of the recipe in levels consumed
1911+
1912+
groovyscript.wiki.randomthings.imbuing.title=Imbuing Station
1913+
groovyscript.wiki.randomthings.imbuing.description=Converts four itemstacks into an itemstack in the Random Things Imbuing Station.
1914+
groovyscript.wiki.randomthings.imbuing.mainInput.value=Sets the center IIngredient
1915+
groovyscript.wiki.randomthings.imbuing.input.required=each input item used must be unique
1916+
1917+
19041918
# Roots
19051919
groovyscript.wiki.roots.animal_harvest.title=Animal Harvest
19061920
groovyscript.wiki.roots.animal_harvest.description=Animal Harvest is a ritual that drops items from nearby mob's based on that mobs loottable without harming the mob. Only applies to allowed mobs.

0 commit comments

Comments
 (0)