Skip to content
Merged
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
2 changes: 2 additions & 0 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ final def mod_dependencies = [
'lemonlib-306926:2639879' : [project.debug_arcane_world, project.debug_arcane_world_rotn],
'arcane-world-302852:2972860' : [project.debug_arcane_world],
'arcane-world-rotn-edition-475553:3523150' : [project.debug_arcane_world_rotn],
'armor-plus-237366:2952741' : [project.debug_armor_plus],
'thedragonlib-248055:2580332' : [project.debug_armor_plus],
'astralsorcery-sorcery-241721:3044416' : [project.debug_astral],
'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],
'the-aurorian-352137:4981736' : [project.debug_aurorian],
Expand Down
118 changes: 118 additions & 0 deletions examples/postInit/armorplus.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@

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

log.info 'mod \'armorplus\' detected, running script'

// Champion Bench:
// A normal crafting recipe, but with a 9x9 grid and in the Champion Bench.

// mods.armorplus.champion_bench.removeByOutput()
// mods.armorplus.champion_bench.removeAll()


mods.armorplus.champion_bench.shapedBuilder()
.output(item('minecraft:stone') * 64)
.matrix('DLLLLLDDD',
' DNIGIND',
'DDDNIGIND',
' DLLLLLD')
.key('D', item('minecraft:diamond'))
.key('L', item('minecraft:redstone'))
.key('N', item('minecraft:stone'))
.key('I', item('minecraft:iron_ingot'))
.key('G', item('minecraft:gold_ingot'))
.register()


mods.armorplus.champion_bench.shapelessBuilder()
.output(item('minecraft:clay') * 32)
.input(item('minecraft:diamond'), item('minecraft:diamond'), item('minecraft:diamond'), item('minecraft:diamond'), item('minecraft:diamond'), item('minecraft:diamond'), item('minecraft:diamond'), item('minecraft:diamond'))
.register()


// High-Tech Bench:
// A normal crafting recipe, but with a 5x5 grid and in the High-Tech Bench.

mods.armorplus.high_tech_bench.removeByOutput(item('armorplus:emerald_helmet'))
// mods.armorplus.high_tech_bench.removeAll()


mods.armorplus.high_tech_bench.shapedBuilder()
.output(item('minecraft:diamond') * 32)
.matrix([[item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:gold_ingot')],
[item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:gold_ingot')],
[item('minecraft:gold_ingot'), item('minecraft:gold_ingot'), item('minecraft:gold_ingot')]])
.register()


mods.armorplus.high_tech_bench.shapelessBuilder()
.output(item('minecraft:clay') * 8)
.input(item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'))
.register()


// Lava Infuser:
// Convert input itemstack to output itemstack over a second, with the ability to reward a configurable amount of
// experience based on the output itemstack. Consumes lava at a rate of 1 bucket per 10 seconds.

mods.armorplus.lava_infuser.removeByInput(item('armorplus:lava_crystal'))
mods.armorplus.lava_infuser.removeByOutput(item('armorplus:lava_infused_obsidian'))
// mods.armorplus.lava_infuser.removeAll()

mods.armorplus.lava_infuser.recipeBuilder()
.input(item('minecraft:gold_ingot'))
.output(item('minecraft:clay') * 2)
.register()

mods.armorplus.lava_infuser.recipeBuilder()
.input(item('minecraft:clay'))
.output(item('minecraft:diamond'))
.experience(5.0d)
.register()


// Ultimate Bench:
// A normal crafting recipe, but with a 7x7 grid and in the Ultimate Bench.

mods.armorplus.ultimate_bench.removeByOutput(item('armorplus:the_ultimate_helmet'))
// mods.armorplus.ultimate_bench.removeAll()


mods.armorplus.ultimate_bench.shapedBuilder()
.output(item('minecraft:diamond'))
.matrix('BXXXBX')
.mirrored()
.key('B', item('minecraft:stone'))
.key('X', item('minecraft:gold_ingot'))
.register()


mods.armorplus.ultimate_bench.shapelessBuilder()
.output(item('minecraft:stone') * 64)
.input(item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'))
.register()


// WorkBench:
// A normal crafting recipe, but with a 3x3 grid and in the WorkBench.

mods.armorplus.work_bench.removeByOutput(item('armorplus:the_gift_of_the_gods'))
// mods.armorplus.work_bench.removeAll()


mods.armorplus.work_bench.shapedBuilder()
.output(item('minecraft:stone') * 8)
.matrix('BXX')
.mirrored()
.key('B', item('minecraft:stone'))
.key('X', item('minecraft:gold_ingot'))
.register()


mods.armorplus.work_bench.shapelessBuilder()
.output(item('minecraft:clay') * 8)
.input(item('minecraft:stone'), item('minecraft:stone'), item('minecraft:stone'))
.register()


1 change: 1 addition & 0 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ debug_applied_energistics_2 = false
debug_arcane_archives = false
debug_arcane_world = false
debug_arcane_world_rotn = false
debug_armor_plus = false
debug_astral = false
debug_atum = false
debug_aurorian = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import com.cleanroommc.groovyscript.compat.mods.appliedenergistics2.AppliedEnergistics2;
import com.cleanroommc.groovyscript.compat.mods.arcanearchives.ArcaneArchives;
import com.cleanroommc.groovyscript.compat.mods.arcaneworld.ArcaneWorld;
import com.cleanroommc.groovyscript.compat.mods.armorplus.ArmorPlus;
import com.cleanroommc.groovyscript.compat.mods.astralsorcery.AstralSorcery;
import com.cleanroommc.groovyscript.compat.mods.atum.Atum;
import com.cleanroommc.groovyscript.compat.mods.avaritia.Avaritia;
Expand Down Expand Up @@ -101,6 +102,7 @@ public class ModSupport {
public static final GroovyContainer<AppliedEnergistics2> APPLIED_ENERGISTICS_2 = new InternalModContainer<>("appliedenergistics2", "Applied Energistics 2", AppliedEnergistics2::new, "ae2");
public static final GroovyContainer<ArcaneArchives> ARCANE_ARCHIVES = new InternalModContainer<>("arcanearchives", "Arcane Archives", ArcaneArchives::new);
public static final GroovyContainer<ArcaneWorld> ARCANE_WORLD = new InternalModContainer<>("arcaneworld", "Arcane World", ArcaneWorld::new);
public static final GroovyContainer<ArmorPlus> ARMOR_PLUS = new InternalModContainer<>("armorplus", "Armor Plus", ArmorPlus::new);
public static final GroovyContainer<AstralSorcery> ASTRAL_SORCERY = new InternalModContainer<>("astralsorcery", "Astral Sorcery", AstralSorcery::new, "astral");
public static final GroovyContainer<Atum> ATUM = new InternalModContainer<>("atum", "Atum 2", Atum::new);
public static final GroovyContainer<Avaritia> AVARITIA = new InternalModContainer<>("avaritia", "Avaritia", Avaritia::new);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.cleanroommc.groovyscript.compat.mods.armorplus;

import com.cleanroommc.groovyscript.api.IIngredient;
import com.cleanroommc.groovyscript.api.documentation.annotations.MethodDescription;
import com.cleanroommc.groovyscript.api.documentation.annotations.RecipeBuilderDescription;
import com.cleanroommc.groovyscript.core.mixin.armorplus.BaseCraftingManagerAccessor;
import com.cleanroommc.groovyscript.registry.StandardListRegistry;
import com.sofodev.armorplus.api.crafting.IRecipe;
import com.sofodev.armorplus.api.crafting.base.BaseCraftingManager;

import java.util.Collection;

public abstract class AbstractBenchRegistry extends StandardListRegistry<IRecipe> {

public abstract BaseCraftingManager getInstance();

@Override
public Collection<IRecipe> getRecipes() {
return getInstance().getRecipeList();
}

private int size() {
return ((BaseCraftingManagerAccessor) getInstance()).getSize();
}

@RecipeBuilderDescription
public BenchRecipeBuilder.Shaped shapedBuilder() {
return new BenchRecipeBuilder.Shaped(this, size());
}

@RecipeBuilderDescription
public BenchRecipeBuilder.Shapeless shapelessBuilder() {
return new BenchRecipeBuilder.Shapeless(this, size());
}

// so the <init> of BaseCraftingManager does this sorting... before any recipes are added to the list. and never again.
// @Override
// public void afterScriptLoad() {
// getInstance().getRecipeList().sort((left, right) -> Integer.compare(right.getRecipeSize(), left.getRecipeSize()));
// }

@MethodDescription
public boolean removeByOutput(IIngredient output) {
return getRecipes().removeIf(x -> output.test(x.getRecipeOutput()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.cleanroommc.groovyscript.compat.mods.armorplus;

import com.cleanroommc.groovyscript.compat.mods.GroovyPropertyContainer;

public class ArmorPlus extends GroovyPropertyContainer {

public final ChampionBench championBench = new ChampionBench();
public final HighTechBench highTechBench = new HighTechBench();
public final LavaInfuser lavaInfuser = new LavaInfuser();
public final UltimateBench ultimateBench = new UltimateBench();
public final WorkBench workBench = new WorkBench();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.cleanroommc.groovyscript.compat.mods.armorplus;

import com.cleanroommc.groovyscript.api.GroovyLog;
import com.cleanroommc.groovyscript.api.documentation.annotations.RecipeBuilderRegistrationMethod;
import com.cleanroommc.groovyscript.helper.ingredient.IngredientHelper;
import com.cleanroommc.groovyscript.registry.AbstractCraftingRecipeBuilder;
import com.sofodev.armorplus.api.crafting.IRecipe;
import com.sofodev.armorplus.api.crafting.IShapedRecipe;

public interface BenchRecipeBuilder {

class Shaped extends AbstractCraftingRecipeBuilder.AbstractShaped<IRecipe> implements BenchRecipeBuilder {

private final AbstractBenchRegistry registry;

public Shaped(AbstractBenchRegistry registry, int size) {
super(size, size);
this.registry = registry;
}

@Override
@RecipeBuilderRegistrationMethod
public IRecipe register() {
GroovyLog.Msg msg = GroovyLog.msg("Error adding shaped Armor Plus Bench recipe")
.error()
.add((keyBasedMatrix == null || keyBasedMatrix.length == 0) && (ingredientMatrix == null || ingredientMatrix.isEmpty()), () -> "No matrix was defined")
.add(keyBasedMatrix != null && ingredientMatrix != null, () -> "A key based matrix AND a ingredient based matrix was defined. This is not allowed!");
if (msg.postIfNotEmpty()) return null;
msg.add(IngredientHelper.isEmpty(this.output), () -> "Output must not be empty");
IShapedRecipe recipe = null;
if (keyBasedMatrix != null) {
recipe = validateShape(msg, errors, keyBasedMatrix, keyMap, ((width1, height1, ingredients) -> BenchShapedRecipe.make(width, output, ingredients, width1, height1, mirrored, recipeFunction, recipeAction)));
} else if (ingredientMatrix != null) {
recipe = validateShape(msg, ingredientMatrix, ((width1, height1, ingredients) -> BenchShapedRecipe.make(width, output.copy(), ingredients, width1, height1, mirrored, recipeFunction, recipeAction)));
}
if (msg.postIfNotEmpty()) return null;
if (recipe != null) {
registry.add(recipe);
}
return recipe;
}
}

class Shapeless extends AbstractCraftingRecipeBuilder.AbstractShapeless<IRecipe> implements BenchRecipeBuilder {

private final AbstractBenchRegistry registry;

public Shapeless(AbstractBenchRegistry registry, int size) {
super(size, size);
this.registry = registry;
}

public boolean validate() {
GroovyLog.Msg msg = GroovyLog.msg("Error adding shapeless Armor Plus Bench recipe").error();
msg.add(IngredientHelper.isEmpty(this.output), () -> "Output must not be empty");
msg.add(ingredients.isEmpty(), () -> "inputs must not be empty");
msg.add(ingredients.size() > width * height, () -> "maximum inputs are " + (width * height) + " but found " + ingredients.size());
return !msg.postIfNotEmpty();
}

@Override
@RecipeBuilderRegistrationMethod
public IRecipe register() {
if (!validate()) return null;
IRecipe recipe = BenchShapelessRecipe.make(output.copy(), ingredients, recipeFunction, recipeAction);
registry.add(recipe);
return recipe;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.cleanroommc.groovyscript.compat.mods.armorplus;

import com.cleanroommc.groovyscript.api.IIngredient;
import com.cleanroommc.groovyscript.compat.vanilla.ShapedCraftingRecipe;
import com.sofodev.armorplus.api.crafting.IRecipe;
import com.sofodev.armorplus.api.crafting.IShapedRecipe;
import com.sofodev.armorplus.api.crafting.base.BaseShapedOreRecipe;
import com.sofodev.armorplus.common.container.base.InventoryCraftingImproved;
import groovy.lang.Closure;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.NonNullList;
import net.minecraft.world.World;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Arrays;
import java.util.List;

public class BenchShapedRecipe extends BaseShapedOreRecipe implements IRecipe, IShapedRecipe {

private final int size;
private final ShapedCraftingRecipe groovyRecipe;
private final Object[] input;

private BenchShapedRecipe(int size, ShapedCraftingRecipe groovyRecipe, Object[] shapeDummy, Object[] input) {
super(size, groovyRecipe.getRecipeOutput(), shapeDummy);
this.size = size;
this.groovyRecipe = groovyRecipe;
this.input = input;
}

public static BenchShapedRecipe make(int size, ItemStack output, List<IIngredient> input, int width, int height, boolean mirrored, @Nullable Closure<ItemStack> recipeFunction, @Nullable Closure<Void> recipeAction) {
ShapedCraftingRecipe recipe = new ShapedCraftingRecipe(output, input, width, height, mirrored, recipeFunction, recipeAction);
Object[] jeiInput = new Object[width * height];
for (int i = 0; i < recipe.getIngredients().size(); i++) {
jeiInput[i] = Arrays.asList(recipe.getIngredients().get(i).getMatchingStacks());
}
Object[] shapeDummy = new Object[height + 2];
var row = StringUtils.repeat(' ', width);
int i = 0;
while (i < height) {
shapeDummy[i++] = row;
}
shapeDummy[i++] = ' ';
shapeDummy[i] = ItemStack.EMPTY;

return new BenchShapedRecipe(size, recipe, shapeDummy, jeiInput);
}

public @NotNull NonNullList<Ingredient> getIngredients() {
return groovyRecipe.getIngredients();
}

@Override
public int getRecipeWidth() {
return size;
}

@Override
public int getRecipeHeight() {
return size;
}

@Override
public boolean matches(@NotNull InventoryCraftingImproved inv, @NotNull World world) {
return groovyRecipe.matches(inv, world);
}

@Override
public @NotNull ItemStack getCraftingResult(@NotNull InventoryCraftingImproved inv) {
return groovyRecipe.getCraftingResult(inv);
}

@Override
public int getRecipeSize() {
return size * size;
}

@Override
public @NotNull ItemStack getRecipeOutput() {
return groovyRecipe.getRecipeOutput();
}

@Override
public Object[] getInput() {
return this.input;
}

@Override
public NonNullList<ItemStack> getRemainingItems(InventoryCraftingImproved inv) {
return groovyRecipe.getRemainingItems(inv);
}
}
Loading