Skip to content

Commit 4a0cfc2

Browse files
authored
add Blood Arsenal compat (#284)
* add Blood Arsenal compat * add Infusion alias for SanguineInfusion * good at alphabets
1 parent 6c77c5b commit 4a0cfc2

File tree

7 files changed

+281
-3
lines changed

7 files changed

+281
-3
lines changed

dependencies.gradle

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,15 @@ final def mod_dependencies = [
4242
'lemonlib-306926:2639879' : [project.debug_arcane_world],
4343
'arcane-world-302852:2972860' : [project.debug_arcane_world],
4444
'astralsorcery-sorcery-241721:3044416' : [project.debug_astral],
45-
'baubles-227083:2518667' : [project.debug_astral, project.debug_botania, project.debug_botania_tweaks, project.debug_botanic_additions, project.debug_essentialcraft_4, project.debug_extra_botany, project.debug_thaum],
45+
'baubles-227083:2518667' : [project.debug_blood_arsenal, project.debug_astral, project.debug_botania, project.debug_botania_tweaks, project.debug_botanic_additions, project.debug_essentialcraft_4, project.debug_extra_botany, project.debug_thaum],
4646
'the-aurorian-352137:4981736' : [project.debug_aurorian],
4747
'avaritia_1_10-261348:3143349' : [project.debug_avaritia],
4848
'atum-2-59621:3116599' : [project.debug_atum],
4949
'bwm-core-294335:2624990' : [project.debug_better_with_mods],
5050
'bwm-suite-246760:3289033' : [project.debug_better_with_mods],
51-
'blood-magic-224791:2822288' : [project.debug_blood_magic],
52-
'guide-api-228832:2645992' : [project.debug_blood_magic, project.debug_woot],
51+
'blood-arsenal-228823:2904183' : [project.debug_blood_arsenal],
52+
'blood-magic-224791:2822288' : [project.debug_blood_arsenal, project.debug_blood_magic],
53+
'guide-api-228832:2645992' : [project.debug_blood_arsenal, project.debug_blood_magic, project.debug_woot],
5354
'botania-225643:3330934' : [project.debug_botania, project.debug_botania_tweaks, project.debug_botanic_additions, project.debug_extra_botany],
5455
'botania-tweaks-295114:3092102' : [project.debug_botania_tweaks],
5556
'botanic-additions-310637:2939405' : [project.debug_botanic_additions],
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
2+
// Auto generated groovyscript example file
3+
// MODS_LOADED: bloodarsenal
4+
5+
log.info 'mod \'bloodarsenal\' detected, running script'
6+
7+
// Sanguine Infusion:
8+
// Converts an input infusion itemstack and up to 8 input surrounding itemstacks into an output itemstack, consuming Life
9+
// Essence from the network to do so when the Infusion de Sanguine Ritual is activated. Alternatively, instead of consuming
10+
// an infusion item, adds or upgrades a modifier to the given stasis tool, with the ability to increase the quantity of
11+
// inputs consumed based on level.
12+
13+
// mods.bloodarsenal.sanguine_infusion.removeBlacklist(WayofTime.bloodmagic.iface.ISigil.class)
14+
mods.bloodarsenal.sanguine_infusion.removeByInput(item('minecraft:feather'))
15+
mods.bloodarsenal.sanguine_infusion.removeByInput(item('bloodmagic:bound_axe'))
16+
// mods.bloodarsenal.sanguine_infusion.removeByModifierKey('beneficial_potion')
17+
mods.bloodarsenal.sanguine_infusion.removeByOutput(item('bloodarsenal:stasis_pickaxe'))
18+
// mods.bloodarsenal.sanguine_infusion.removeAll()
19+
// mods.bloodarsenal.sanguine_infusion.removeAllBlacklist()
20+
21+
mods.bloodarsenal.sanguine_infusion.recipeBuilder()
22+
.infuse(item('minecraft:gold_ingot'))
23+
.input(item('minecraft:clay'))
24+
.output(item('minecraft:diamond'))
25+
.cost(1000)
26+
.register()
27+
28+
mods.bloodarsenal.sanguine_infusion.recipeBuilder()
29+
.infuse(item('minecraft:emerald'))
30+
.input(item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64)
31+
.output(item('minecraft:diamond') * 64)
32+
.cost(5000)
33+
.register()
34+
35+
mods.bloodarsenal.sanguine_infusion.recipeBuilder()
36+
.infuse(item('minecraft:gold_ingot'))
37+
.input(item('minecraft:clay'), item('minecraft:diamond'))
38+
.output(item('minecraft:diamond'))
39+
.register()
40+
41+
mods.bloodarsenal.sanguine_infusion.recipeBuilder()
42+
.input(item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2)
43+
.modifier('xperienced')
44+
.levelMultiplier(3)
45+
.cost(3000)
46+
.register()
47+
48+
49+
// mods.bloodarsenal.sanguine_infusion.addBlacklist(WayofTime.bloodmagic.iface.ISigil.class)
50+

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ debug_aurorian = false
2727
debug_avaritia = false
2828

2929
debug_better_with_mods = false
30+
debug_blood_arsenal = false
3031
debug_blood_magic = false
3132
debug_botania = false
3233
debug_botania_tweaks = 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
@@ -15,6 +15,7 @@
1515
import com.cleanroommc.groovyscript.compat.mods.atum.Atum;
1616
import com.cleanroommc.groovyscript.compat.mods.avaritia.Avaritia;
1717
import com.cleanroommc.groovyscript.compat.mods.betterwithmods.BetterWithMods;
18+
import com.cleanroommc.groovyscript.compat.mods.bloodarsenal.BloodArsenal;
1819
import com.cleanroommc.groovyscript.compat.mods.bloodmagic.BloodMagic;
1920
import com.cleanroommc.groovyscript.compat.mods.botania.Botania;
2021
import com.cleanroommc.groovyscript.compat.mods.botaniatweaks.BotaniaTweaks;
@@ -95,6 +96,7 @@ public class ModSupport {
9596
public static final GroovyContainer<Atum> ATUM = new InternalModContainer<>("atum", "Atum 2", Atum::new);
9697
public static final GroovyContainer<Avaritia> AVARITIA = new InternalModContainer<>("avaritia", "Avaritia", Avaritia::new);
9798
public static final GroovyContainer<BetterWithMods> BETTER_WITH_MODS = new InternalModContainer<>("betterwithmods", "Better With Mods", BetterWithMods::new);
99+
public static final GroovyContainer<BloodArsenal> BLOOD_ARSENAL = new InternalModContainer<>("bloodarsenal", "Blood Arsenal", BloodArsenal::new);
98100
public static final GroovyContainer<BloodMagic> BLOOD_MAGIC = new InternalModContainer<>("bloodmagic", "Blood Magic: Alchemical Wizardry", BloodMagic::new, "bm");
99101
public static final GroovyContainer<Botania> BOTANIA = new InternalModContainer<>("botania", "Botania", Botania::new);
100102
public static final GroovyContainer<BotaniaTweaks> BOTANIA_TWEAKS = new InternalModContainer<>("botania_tweaks", "Botania Tweaks", BotaniaTweaks::new);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.cleanroommc.groovyscript.compat.mods.bloodarsenal;
2+
3+
import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer;
4+
5+
public class BloodArsenal extends GroovyPropertyContainer {
6+
7+
public final SanguineInfusion sanguineInfusion = new SanguineInfusion();
8+
}
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
package com.cleanroommc.groovyscript.compat.mods.bloodarsenal;
2+
3+
import arcaratus.bloodarsenal.recipe.RecipeFilter;
4+
import arcaratus.bloodarsenal.recipe.RecipeSanguineInfusion;
5+
import arcaratus.bloodarsenal.recipe.SanguineInfusionRecipeRegistry;
6+
import com.cleanroommc.groovyscript.api.GroovyLog;
7+
import com.cleanroommc.groovyscript.api.IIngredient;
8+
import com.cleanroommc.groovyscript.api.documentation.annotations.*;
9+
import com.cleanroommc.groovyscript.compat.mods.ModSupport;
10+
import com.cleanroommc.groovyscript.helper.Alias;
11+
import com.cleanroommc.groovyscript.helper.ingredient.OreDictIngredient;
12+
import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder;
13+
import com.cleanroommc.groovyscript.registry.AbstractReloadableStorage;
14+
import com.cleanroommc.groovyscript.registry.StandardListRegistry;
15+
import net.minecraft.item.crafting.Ingredient;
16+
import org.apache.commons.lang3.tuple.Pair;
17+
import org.jetbrains.annotations.Nullable;
18+
19+
import java.util.ArrayList;
20+
import java.util.Collection;
21+
import java.util.List;
22+
23+
@RegistryDescription(admonition = @Admonition("groovyscript.wiki.bloodarsenal.sanguine_infusion.note0"))
24+
public class SanguineInfusion extends StandardListRegistry<RecipeSanguineInfusion> {
25+
26+
@SuppressWarnings("rawtypes")
27+
private final AbstractReloadableStorage<Class> blacklistStorage = new AbstractReloadableStorage<>();
28+
29+
public SanguineInfusion() {
30+
super(Alias.generateOfClassAnd(SanguineInfusion.class, "Infusion"));
31+
}
32+
33+
private static boolean containsInput(IIngredient input, List<Pair<Ingredient, Integer>> list) {
34+
for (var pair : list) {
35+
for (var stack : pair.getKey().getMatchingStacks()) {
36+
if (input.test(stack)) return true;
37+
}
38+
}
39+
return false;
40+
}
41+
42+
@Override
43+
public Collection<RecipeSanguineInfusion> getRecipes() {
44+
return SanguineInfusionRecipeRegistry.getInfusionRecipes();
45+
}
46+
47+
@SuppressWarnings("rawtypes")
48+
public Collection<Class> getBlacklistedClasses() {
49+
return SanguineInfusionRecipeRegistry.getBlacklistedClasses();
50+
}
51+
52+
@Override
53+
public void onReload() {
54+
super.onReload();
55+
var list = getBlacklistedClasses();
56+
list.removeAll(blacklistStorage.removeScripted());
57+
list.addAll(blacklistStorage.restoreFromBackup());
58+
}
59+
60+
@RecipeBuilderDescription(example = {
61+
@Example(".infuse(item('minecraft:gold_ingot')).input(item('minecraft:clay')).output(item('minecraft:diamond')).cost(1000)"),
62+
@Example(".infuse(item('minecraft:emerald')).input(item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64, item('minecraft:clay') * 64).output(item('minecraft:diamond') * 64).cost(5000)"),
63+
@Example(".infuse(item('minecraft:gold_ingot')).input(item('minecraft:clay'), item('minecraft:diamond')).output(item('minecraft:diamond'))"),
64+
@Example(".input(item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2, item('minecraft:gold_ingot') * 2).modifier('xperienced').levelMultiplier(3).cost(3000)")
65+
})
66+
public RecipeBuilder recipeBuilder() {
67+
return new RecipeBuilder();
68+
}
69+
70+
@MethodDescription(example = {
71+
@Example("item('minecraft:feather')"), @Example("item('bloodmagic:bound_axe')")
72+
})
73+
public void removeByInput(IIngredient input) {
74+
getRecipes().removeIf(r -> (input.test(r.getInfuse()) || containsInput(input, r.getInputs())) && doAddBackup(r));
75+
}
76+
77+
@MethodDescription(example = @Example("item('bloodarsenal:stasis_pickaxe')"))
78+
public void removeByOutput(IIngredient output) {
79+
getRecipes().removeIf(r -> output.test(r.getOutput()) && doAddBackup(r));
80+
}
81+
82+
@MethodDescription(example = @Example(value = "'beneficial_potion'", commented = true))
83+
public void removeByModifierKey(String key) {
84+
getRecipes().removeIf(r -> key.equals(r.getModifierKey()) && doAddBackup(r));
85+
}
86+
87+
@MethodDescription(type = MethodDescription.Type.ADDITION, example = @Example(value = "WayofTime.bloodmagic.iface.ISigil.class", commented = true))
88+
public boolean addBlacklist(@SuppressWarnings("rawtypes") Class clazz) {
89+
return clazz != null && getBlacklistedClasses().add(clazz) && blacklistStorage.addScripted(clazz);
90+
}
91+
92+
@MethodDescription(example = @Example(value = "WayofTime.bloodmagic.iface.ISigil.class", commented = true))
93+
public boolean removeBlacklist(@SuppressWarnings("rawtypes") Class clazz) {
94+
return clazz != null && getBlacklistedClasses().removeIf(x -> x == clazz) && blacklistStorage.addBackup(clazz);
95+
}
96+
97+
@MethodDescription(priority = 2000, example = @Example(commented = true))
98+
public void removeAllBlacklist() {
99+
var list = getBlacklistedClasses();
100+
list.forEach(blacklistStorage::addBackup);
101+
list.clear();
102+
}
103+
104+
@Property(property = "input", comp = @Comp(gte = 1, lte = 8))
105+
@Property(property = "output", comp = @Comp(gte = 0, lte = 1))
106+
public static class RecipeBuilder extends AbstractRecipeBuilder<RecipeSanguineInfusion> {
107+
108+
@Property(comp = @Comp(gte = 0))
109+
private int levelMultiplier;
110+
@Property(comp = @Comp(gte = 0))
111+
private int cost;
112+
@Property
113+
private String modifier;
114+
@Property
115+
private IIngredient infuse;
116+
@Property
117+
private IIngredient filter;
118+
119+
@RecipeBuilderMethodDescription
120+
public RecipeBuilder levelMultiplier(int levelMultiplier) {
121+
this.levelMultiplier = levelMultiplier;
122+
return this;
123+
}
124+
125+
@RecipeBuilderMethodDescription
126+
public RecipeBuilder cost(int cost) {
127+
this.cost = cost;
128+
return this;
129+
}
130+
131+
@RecipeBuilderMethodDescription
132+
public RecipeBuilder modifier(String modifier) {
133+
this.modifier = modifier;
134+
return this;
135+
}
136+
137+
@RecipeBuilderMethodDescription
138+
public RecipeBuilder infuse(IIngredient infuse) {
139+
this.infuse = infuse;
140+
return this;
141+
}
142+
143+
@RecipeBuilderMethodDescription
144+
public RecipeBuilder filter(IIngredient filter) {
145+
this.filter = filter;
146+
return this;
147+
}
148+
149+
@Override
150+
public String getErrorMsg() {
151+
return "Error adding Blood Arsenal Sanguine Infusion recipe";
152+
}
153+
154+
@Override
155+
public void validate(GroovyLog.Msg msg) {
156+
validateFluids(msg);
157+
158+
if (modifier == null) {
159+
validateItems(msg, 1, 8, 1, 1);
160+
msg.add(infuse == null, "infuse was null and modifier was null, yet one must be defined");
161+
msg.add(levelMultiplier != 0, "levelMultiplier was set to the non-default value of {} while modifier was null, yet it has no effect without modifier being set", levelMultiplier);
162+
} else {
163+
validateItems(msg, 1, 8, 0, 0);
164+
msg.add(infuse != null, "infuse was not null and modifier was not null, yet only one must be defined");
165+
msg.add(filter != null, "filter was not null and modifier was not null, yet filter has no effect when modifier is not null");
166+
msg.add(levelMultiplier < 0, "levelMultiplier must be a nonnegative integer, yet it was {}", levelMultiplier);
167+
}
168+
169+
msg.add(cost < 0, "cost must be a nonnegative integer, yet it was {}", cost);
170+
}
171+
172+
@SuppressWarnings("unchecked")
173+
@Override
174+
@RecipeBuilderRegistrationMethod
175+
public @Nullable RecipeSanguineInfusion register() {
176+
if (!validate()) return null;
177+
List<Pair<Object, Integer>> inputs = new ArrayList<>();
178+
for (var ingredient : input) {
179+
if (ingredient instanceof OreDictIngredient ore) {
180+
inputs.add(Pair.of(ore.getOreDict(), ingredient.getAmount()));
181+
} else {
182+
inputs.add(Pair.of(ingredient.getMatchingStacks()[0], ingredient.getAmount()));
183+
}
184+
}
185+
if (filter != null) inputs.add(Pair.of(new RecipeFilter(filter), 0));
186+
187+
RecipeSanguineInfusion recipe = null;
188+
if (modifier == null) {
189+
for (var stack : infuse.getMatchingStacks()) {
190+
recipe = new RecipeSanguineInfusion(output.get(0), cost, stack, inputs.toArray(new Pair[0]));
191+
ModSupport.BLOOD_ARSENAL.get().sanguineInfusion.add(recipe);
192+
}
193+
} else {
194+
recipe = new RecipeSanguineInfusion(cost, modifier, inputs.toArray(new Pair[0]));
195+
recipe.setLevelMultiplier(levelMultiplier);
196+
ModSupport.BLOOD_ARSENAL.get().sanguineInfusion.add(recipe);
197+
}
198+
return recipe;
199+
}
200+
}
201+
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,21 @@ groovyscript.wiki.betterwithmods.turntable.rotations.value=Sets the number of ro
559559
groovyscript.wiki.betterwithmods.turntable.outputBlock.value=Sets the blockstate that replaces the input block
560560

561561

562+
# Blood Arsenal
563+
groovyscript.wiki.bloodarsenal.sanguine_infusion.title=Sanguine Infusion
564+
groovyscript.wiki.bloodarsenal.sanguine_infusion.description=Converts an input infusion itemstack and up to 8 input surrounding itemstacks into an output itemstack, consuming Life Essence from the network to do so when the Infusion de Sanguine Ritual is activated. Alternatively, instead of consuming an infusion item, adds or upgrades a modifier to the given stasis tool, with the ability to increase the quantity of inputs consumed based on level.
565+
groovyscript.wiki.bloodarsenal.sanguine_infusion.note0=Blacklisting classes only have effect in conjunction with a recipe using a `filter` and a respective of a Modifier that overrides `getSpecialNBT` to save the relevant filtered stack. The `filter` can only be used for modifier recipes. By default, the relevant Modifiers are `bad_potion`, `beneficial_potion`, and `sigil`.
566+
groovyscript.wiki.bloodarsenal.sanguine_infusion.cost.value=Sets the Life Essence cost
567+
groovyscript.wiki.bloodarsenal.sanguine_infusion.filter.value=Sets the filter the recipe
568+
groovyscript.wiki.bloodarsenal.sanguine_infusion.infuse.value=Sets the item being infused
569+
groovyscript.wiki.bloodarsenal.sanguine_infusion.modifier.value=Sets the modifier key
570+
groovyscript.wiki.bloodarsenal.sanguine_infusion.levelMultiplier.value=Sets the amount inputs are multiplied for higher levels of the modifier
571+
groovyscript.wiki.bloodarsenal.sanguine_infusion.removeByModifierKey=Removes all recipes with the given modifier key
572+
groovyscript.wiki.bloodarsenal.sanguine_infusion.addBlacklist=Remove the given class from the blacklist
573+
groovyscript.wiki.bloodarsenal.sanguine_infusion.removeBlacklist=Add the given class to the blacklist
574+
groovyscript.wiki.bloodarsenal.sanguine_infusion.removeAllBlacklist=Removes all entries from the blacklist
575+
576+
562577
# Blood Magic
563578
groovyscript.wiki.bloodmagic.max_tier.required=less than `AltarTier.MAXTIERS`, which is determined by the config option `enableTierSixEvenThoughThereIsNoContent`
564579

0 commit comments

Comments
 (0)