Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
58edd99
add mods to build.gradle
WaitingIdly Dec 16, 2022
d1899af
Merge branch 'heads/upstream/master' into roots
WaitingIdly Apr 12, 2023
fa6dc38
add mods to build.gradle again
WaitingIdly Apr 13, 2023
90513ca
add a ResourceLocation bracket handler
WaitingIdly May 5, 2023
adbc862
implement compat
WaitingIdly May 5, 2023
87fc39c
add compat examples
WaitingIdly May 5, 2023
3fd9ea8
disable debug_roots
WaitingIdly May 5, 2023
ad1cd82
consolidate recipe name into AbstractRecipeBuilder
WaitingIdly May 5, 2023
60db5f6
Merge branch 'heads/upstream/master' into roots
WaitingIdly May 5, 2023
11bddcd
Migrate to RFG
Rongmario May 14, 2023
fedac69
RFG tags, fix ThaumicJEI running without Thaumcraft
Rongmario May 14, 2023
57e40fd
Disable javadocs jar for now
Rongmario May 14, 2023
ec5ddef
initial support
Testure May 15, 2023
9e08b4d
Update gradle.properties
Testure May 15, 2023
c5ac25e
Allow changing entry knowledge type
Testure May 15, 2023
9627691
Vazkii pls
Testure May 16, 2023
7c715a9
Use string for orechid recipe
Testure May 16, 2023
6c2d122
Manually provide class for mini flower
Testure May 16, 2023
ac36f57
Fix crafting page crash
Testure May 16, 2023
e106dce
Merge pull request #54 from Testure/flowers
Rongmario May 16, 2023
f457ced
getOreWeightNether for OrechidIgnem's removeByOutput
Rongmario May 16, 2023
a1d5214
Stop firing AspectRegistryEvents
Rongmario May 17, 2023
70df3bb
TextFormatting bracket handler
Rongmario May 17, 2023
b318574
Item rarities
Rongmario May 17, 2023
3a91319
remap false
WaitingIdly May 17, 2023
28c75e1
Merge branch 'heads/upstream/master' into roots
WaitingIdly May 17, 2023
9135d34
Merge pull request #51 from WaitingIdly/roots
Rongmario May 18, 2023
88e2f45
Allow closures for setting item rarities
Rongmario May 18, 2023
7a4d096
It ain't clean, but it still is cleaner than before
Rongmario May 18, 2023
c649694
Allow player starting items to be reloadable
Rongmario May 18, 2023
f9c5ac7
Copy stacks
Rongmario May 18, 2023
aff9183
Migrate to RFG
Rongmario May 14, 2023
3de2ea0
RFG tags, fix ThaumicJEI running without Thaumcraft
Rongmario May 14, 2023
18c6723
Disable javadocs jar for now
Rongmario May 14, 2023
a9f1c48
Botania + Roots (and libs)
Rongmario May 18, 2023
c34d2d9
Merge remote-tracking branch 'origin/rfg' into rfg
Rongmario May 18, 2023
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
384 changes: 216 additions & 168 deletions build.gradle

Large diffs are not rendered by default.

459 changes: 459 additions & 0 deletions examples/roots.groovy

Large diffs are not rendered by default.

12 changes: 5 additions & 7 deletions examples/thaumcraft.groovy
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import net.minecraft.util.ResourceLocation

mods.thaumcraft.Crucible.removeByOutput(item('minecraft:gunpowder'))

mods.thaumcraft.Crucible.recipeBuilder()
Expand Down Expand Up @@ -52,7 +50,7 @@ mods.thaumcraft.ArcaneWorkbench.shapedBuilder()
// .chatColor(14013676)
// .component(aspect('cognito'))
// .component(aspect('perditio'))
// .image(new ResourceLocation('thaumcraft', 'textures/aspects/humor.png'))
// .image(resource('thaumcraft:textures/aspects/humor.png'))
// .register()

mods.thaumcraft.AspectHelper.aspectBuilder()
Expand Down Expand Up @@ -122,12 +120,12 @@ mods.thaumcraft.SmeltingBonus.removeByOutput(item('minecraft:gold_nugget'))
// .formulaAspect(aspect('ignis') * 5)
// .formulaAspect(aspect('terra') * 5)
// .formulaAspect(aspect('aqua') * 5)
// .icon(new ResourceLocation('thaumcraft', 'textures/aspects/humor.png'))
// .background(new ResourceLocation('thaumcraft', 'textures/gui/gui_research_back_1.jpg'))
// .background2(new ResourceLocation('thaumcraft', 'textures/gui/gui_research_back_over.png'))
// .icon(resource('thaumcraft:textures/aspects/humor.png'))
// .background(resource('thaumcraft:textures/gui/gui_research_back_1.jpg'))
// .background2(resource('thaumcraft:textures/gui/gui_research_back_over.png'))
// .register()
//
//mods.thaumcraft.Research.addResearchLocation(new ResourceLocation('thaumcraft', 'research/new.json'))
//mods.thaumcraft.Research.addResearchLocation(resource('thaumcraft:research/new.json'))

mods.thaumcraft.Research.addScannable('KNOWLEDGETYPEHUMOR', item('minecraft:pumpkin'))

Expand Down
9 changes: 2 additions & 7 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,10 @@ maven_group = com.cleanroommc
archives_base_name = groovyscript

groovy_version = 4.0.8

mod_ref_path=com.cleanroommc.groovyscript.GroovyScript

# Boilerplate Options
use_mixins = true
use_coremod = true

debug_load_all_mods = true

# Coremod Arguments
include_mod = true
coremod_plugin_class_name = com.cleanroommc.groovyscript.core.GroovyScriptCore

# Debug mod compat
Expand All @@ -31,6 +24,8 @@ debug_de = false
debug_ie = false
debug_enderio = false
debug_astral = false
debug_roots = false
debug_blood_magic = false
debug_tinkers = false
debug_extended_crafting = false
debug_botania = false
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
24 changes: 24 additions & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
pluginManagement {
repositories {
maven {
// RetroFuturaGradle
name = 'GTNH Maven'
url = 'http://jenkins.usrv.eu:8081/nexus/content/groups/public/'
allowInsecureProtocol = true
mavenContent {
includeGroup 'com.gtnewhorizons'
includeGroup 'com.gtnewhorizons.retrofuturagradle'
}
}
gradlePluginPortal()
mavenCentral()
mavenLocal()
}
}

plugins {
// Automatic toolchain provisioning
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.4.0'
}

rootProject.name = archives_base_name
6 changes: 3 additions & 3 deletions src/main/java/com/cleanroommc/groovyscript/GroovyScript.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,12 @@
@Mod.EventBusSubscriber(modid = GroovyScript.ID)
public class GroovyScript {

public static final String ID = "@MODID@";
public static final String ID = Tags.ID;
public static final String NAME = "GroovyScript";
public static final String VERSION = "@VERSION@";
public static final String VERSION = Tags.VERSION;

public static final String MC_VERSION = "1.12.2";
public static final String GROOVY_VERSION = "@GROOVY_VERSION@";
public static final String GROOVY_VERSION = Tags.GROOVY_VERSION;

public static final Logger LOGGER = LogManager.getLogger(ID);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.cleanroommc.groovyscript.api;

import org.jetbrains.annotations.ApiStatus;

public interface IScriptReloadable {

@GroovyBlacklist
@ApiStatus.OverrideOnly
void onReload();

@GroovyBlacklist
@ApiStatus.OverrideOnly
void afterScriptLoad();

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import net.minecraft.item.ItemStack;
import net.minecraft.potion.Potion;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
Expand Down Expand Up @@ -56,6 +57,7 @@ public static BracketHandler<?> getBracketHandler(String key) {
}

public static void init() {
registerBracketHandler("resource", ResourceLocationBracketHandler.INSTANCE);
registerBracketHandler("ore", s -> s.contains("*") ? OreDictWildcardIngredient.of(s) : new OreDictIngredient(s));
registerBracketHandler("item", ItemBracketHandler.INSTANCE, () -> ItemStack.EMPTY);
registerBracketHandler("liquid", BracketHandlerManager::parseFluidStack);
Expand All @@ -77,6 +79,15 @@ public static void init() {
}
return null;
});
registerBracketHandler("textformat", s -> {
TextFormatting textformat = TextFormatting.getValueByName(s);
if (textformat == null) {
try {
textformat = TextFormatting.fromColorIndex(Integer.parseInt(s));
} catch (NumberFormatException ignored) { }
}
return textformat;
});
}

public static FluidStack parseFluidStack(String s) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.cleanroommc.groovyscript.brackets;

import com.cleanroommc.groovyscript.api.IBracketHandler;
import net.minecraft.util.ResourceLocation;

import static com.cleanroommc.groovyscript.brackets.BracketHandlerManager.SPLITTER;

public class ResourceLocationBracketHandler implements IBracketHandler<ResourceLocation> {

public static final ResourceLocationBracketHandler INSTANCE = new ResourceLocationBracketHandler();

private ResourceLocationBracketHandler() {
}

@Override
public ResourceLocation parse(String mainArg, Object[] args) {
String[] parts = mainArg.split(SPLITTER);
if (parts.length > 1) {
return new ResourceLocation(parts[0], parts[1]);
}

if (args.length > 1 || (args.length == 1 && !(args[0] instanceof String))) {
throw new IllegalArgumentException("Arguments not valid for bracket handler. Use 'resource(String)' or 'resource(String mod, String path)'");
}
return new ResourceLocation(mainArg, (String) args[0]);
}

@Override
public ResourceLocation parse(String arg) {
String[] parts = arg.split(SPLITTER);
if (parts.length < 2) {
return null;
}
return new ResourceLocation(parts[0], parts[1]);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
import com.cleanroommc.groovyscript.api.IDynamicGroovyProperty;
import com.cleanroommc.groovyscript.compat.mods.astralsorcery.AstralSorcery;
import com.cleanroommc.groovyscript.compat.mods.bloodmagic.BloodMagic;
import com.cleanroommc.groovyscript.compat.mods.botania.Botania;
import com.cleanroommc.groovyscript.compat.mods.draconicevolution.DraconicEvolution;
import com.cleanroommc.groovyscript.compat.mods.enderio.EnderIO;
import com.cleanroommc.groovyscript.compat.mods.extendedcrafting.ExtendedCrafting;
import com.cleanroommc.groovyscript.compat.mods.ic2.IC2;
import com.cleanroommc.groovyscript.compat.mods.immersiveengineering.ImmersiveEngineering;
import com.cleanroommc.groovyscript.compat.mods.jei.JustEnoughItems;
import com.cleanroommc.groovyscript.compat.mods.mekanism.Mekanism;
import com.cleanroommc.groovyscript.compat.mods.roots.Roots;
import com.cleanroommc.groovyscript.compat.mods.tcomplement.TinkersComplement;
import com.cleanroommc.groovyscript.compat.mods.thaumcraft.Thaumcraft;
import com.cleanroommc.groovyscript.compat.mods.thermalexpansion.ThermalExpansion;
Expand Down Expand Up @@ -38,11 +40,13 @@ public class ModSupport implements IDynamicGroovyProperty {
public static final Container<EnderIO> ENDER_IO = new Container<>("enderio", "Ender IO", EnderIO::new, "eio");
public static final Container<JustEnoughItems> JEI = new Container<>("jei", "Just Enough Items", JustEnoughItems::new, "hei");
public static final Container<Thaumcraft> THAUMCRAFT = new Container<>("thaumcraft", "Thaumcraft", Thaumcraft::new, "tc", "thaum");
public static final Container<Botania> BOTANIA = new Container<>("botania", "Botania", Botania::new);
public static final Container<Mekanism> MEKANISM = new Container<>("mekanism", "Mekanism", Mekanism::new);
public static final Container<ThermalExpansion> THERMAL_EXPANSION = new Container<>("thermalexpansion", "Thermal Expansion", ThermalExpansion::new, "te", "thermal");
public static final Container<TinkersConstruct> TINKERS_CONSTRUCT = new Container<>("tconstruct", "Tinkers' Construct", TinkersConstruct::new, "ticon", "tinkersconstruct");
public static final Container<TinkersComplement> TINKERS_COMPLEMENT = new Container<>("tcomplement", "Tinkers Complement", TinkersComplement::new, "tcomp", "tinkerscomplement");
public static final Container<DraconicEvolution> DRACONIC_EVO = new Container<>("draconicevolution", "Draconic Evolution", DraconicEvolution::new, "de");
public static final Container<Roots> ROOTS = new Container<>("roots", "Roots 3", Roots::new);
public static final Container<BloodMagic> BLOOD_MAGIC = new Container<>("bloodmagic", "Blood Magic: Alchemical Wizardry", BloodMagic::new, "bm");
public static final Container<ImmersiveEngineering> IMMERSIVE_ENGINEERING = new Container<>("immersiveengineering", "Immersive Engineering", ImmersiveEngineering::new, "ie");
public static final Container<IC2> INDUSTRIALCRAFT = new Container<>("ic2", "Industrial Craft 2", IC2::new, "industrialcraft");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.cleanroommc.groovyscript.compat.mods.botania;

import com.cleanroommc.groovyscript.api.GroovyBlacklist;
import com.cleanroommc.groovyscript.api.GroovyLog;
import com.cleanroommc.groovyscript.api.IIngredient;
import com.cleanroommc.groovyscript.helper.SimpleObjectStream;
import com.cleanroommc.groovyscript.helper.ingredient.OreDictIngredient;
import com.cleanroommc.groovyscript.helper.recipe.AbstractRecipeBuilder;
import com.cleanroommc.groovyscript.registry.VirtualizedRegistry;
import net.minecraft.item.ItemStack;
import org.jetbrains.annotations.Nullable;
import vazkii.botania.api.BotaniaAPI;
import vazkii.botania.api.recipe.RecipePetals;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Apothecary extends VirtualizedRegistry<RecipePetals> {

public RecipeBuilder recipeBuilder() {
return new RecipeBuilder();
}

@Override
@GroovyBlacklist
public void onReload() {
removeScripted().forEach(BotaniaAPI.petalRecipes::remove);
BotaniaAPI.petalRecipes.addAll(restoreFromBackup());
}

public RecipePetals add(ItemStack output, IIngredient... inputs) {
RecipePetals recipe = new RecipePetals(output, Arrays.stream(inputs).map(i -> i instanceof OreDictIngredient ? ((OreDictIngredient) i).getOreDict() : i.getMatchingStacks()[0]).toArray());
add(recipe);
return recipe;
}

public void add(RecipePetals recipe) {
if (recipe == null) return;
addScripted(recipe);
BotaniaAPI.petalRecipes.add(recipe);
}

public boolean remove(RecipePetals recipe) {
if (recipe == null) return false;
addBackup(recipe);
return BotaniaAPI.petalRecipes.remove(recipe);
}

public boolean removeByOutput(IIngredient output) {
if (BotaniaAPI.petalRecipes.removeIf(recipe -> {
boolean found = output.test(recipe.getOutput());
if (found) addBackup(recipe);
return found;
})) return true;

GroovyLog.msg("Error removing Botania Apothecary recipe")
.add("could not find recipe with output {}", output)
.error()
.post();
return false;
}

public boolean removeByInput(IIngredient... inputs) {
List<Object> converted = Arrays.stream(inputs).map(i -> i instanceof OreDictIngredient ? ((OreDictIngredient) i).getOreDict() : i.getMatchingStacks()[0]).collect(Collectors.toList());
if (BotaniaAPI.petalRecipes.removeIf(recipe -> {
boolean found = converted.stream().allMatch(o -> recipe.getInputs().stream().anyMatch(i -> o instanceof String ? o.equals(i) : ItemStack.areItemStacksEqual((ItemStack) i, (ItemStack) o)));
if (found) addBackup(recipe);
return found;
})) return true;

GroovyLog.msg("Error removing Botania Apothecary recipe")
.add("could not find recipe with inputs {}", converted)
.error()
.post();
return false;
}

public boolean removeByInputs(IIngredient... inputs) {
return removeByInput(inputs);
}

public void removeAll() {
BotaniaAPI.petalRecipes.forEach(this::addBackup);
BotaniaAPI.petalRecipes.clear();
}

public SimpleObjectStream<RecipePetals> streamRecipes() {
return new SimpleObjectStream<>(BotaniaAPI.petalRecipes).setRemover(this::remove);
}

public class RecipeBuilder extends AbstractRecipeBuilder<RecipePetals> {

@Override
public String getErrorMsg() {
return "Error adding Botania Apothecary recipe";
}

@Override
public void validate(GroovyLog.Msg msg) {
validateFluids(msg, 0, 0, 0, 0);
validateItems(msg, 1, 20, 1, 1);
}

@Override
public @Nullable RecipePetals register() {
if (!validate()) return null;
RecipePetals recipe = new RecipePetals(output.get(0), input.stream().map(i -> i instanceof OreDictIngredient ? ((OreDictIngredient) i).getOreDict() : i.getMatchingStacks()[0]).toArray());
add(recipe);
return recipe;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.cleanroommc.groovyscript.compat.mods.botania;

import com.cleanroommc.groovyscript.brackets.BracketHandlerManager;
import com.cleanroommc.groovyscript.compat.mods.ModPropertyContainer;
import vazkii.botania.api.BotaniaAPI;
import vazkii.botania.api.lexicon.LexiconCategory;
import vazkii.botania.api.lexicon.LexiconEntry;

public class Botania extends ModPropertyContainer {

public final ElvenTrade elvenTrade = new ElvenTrade();
public final ManaInfusion manaInfusion = new ManaInfusion();
public final PureDaisy pureDaisy = new PureDaisy();
public final Apothecary apothecary = new Apothecary();
public final Orechid orechid = new Orechid();
public final OrechidIgnem orechidIgnem = new OrechidIgnem();
public final RuneAltar runeAltar = new RuneAltar();
public final Brew brew = new Brew();
public final Lexicon lexicon = new Lexicon();
public final Knowledge knowledge = new Knowledge();
public final Magnet magnet = new Magnet();
public final Flowers flowers = new Flowers();

public Botania() {
addRegistry(elvenTrade);
addRegistry(manaInfusion);
addRegistry(pureDaisy);
addRegistry(apothecary);
addRegistry(orechid);
addRegistry(orechidIgnem);
addRegistry(runeAltar);
addRegistry(brew);
addRegistry(lexicon.category);
addRegistry(lexicon.entry);
addRegistry(lexicon.page);
addRegistry(knowledge);
addRegistry(magnet);
}

public static LexiconCategory getCategory(String name) {
for (LexiconCategory category : BotaniaAPI.getAllCategories())
if (category.getUnlocalizedName().equals(name)) return category;
return null;
}

public static LexiconEntry getEntry(String name) {
for (LexiconEntry entry : BotaniaAPI.getAllEntries())
if (entry.getUnlocalizedName().equals(name)) return entry;
return null;
}

@Override
public void initialize() {
BracketHandlerManager.registerBracketHandler("brew", s -> BotaniaAPI.brewMap.getOrDefault(s, BotaniaAPI.fallbackBrew));
}
}
Loading