Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
13a51c8
Add aspects to GT++ Materials
jude123412 Mar 10, 2026
08c7cd6
Merge branch 'master' into more-aspects
jude123412 Mar 10, 2026
d79fef0
Merge branch 'master' into more-aspects
jude123412 Mar 10, 2026
660c7aa
Add missing material Items + code Cleaning
jude123412 Mar 10, 2026
398dd9e
Merge branch 'more-aspects' of https://github.com/jude123412/NewHoriz…
jude123412 Mar 10, 2026
f08e8a9
Allow more than one primary aspect
jude123412 Mar 10, 2026
fc600b9
Metal or Gem?
jude123412 Mar 10, 2026
792565d
Merge branch 'master' into more-aspects
Dream-Master Mar 10, 2026
74ea0e0
Wasn't happy, now I am
jude123412 Mar 10, 2026
a5244f6
Merge branch 'more-aspects' of https://github.com/jude123412/NewHoriz…
jude123412 Mar 10, 2026
da05b3d
Merge branch 'master' into more-aspects
jude123412 Mar 11, 2026
e6e5343
Add blocks and frameboxs to registry, Rhugnor aspects and Lithium7 ch…
jude123412 Mar 11, 2026
4726b8c
Merge branch 'more-aspects' of https://github.com/jude123412/NewHoriz…
jude123412 Mar 11, 2026
849c4a7
Merge branch 'master' into more-aspects
jude123412 Mar 11, 2026
c7bfda1
Merge branch 'master' into more-aspects
jude123412 Mar 12, 2026
4c78188
Migrate Method to TCMaterialAspectHelper + the rest of prefixes :D
jude123412 Mar 12, 2026
e5ee146
Merge branch 'master' into more-aspects
jude123412 Mar 14, 2026
3da3087
Merge branch 'master' into more-aspects
jude123412 Mar 15, 2026
5f7f8a7
Migrate everything to use Function<Aspect[], AspectList>
jude123412 Mar 16, 2026
bd3b78c
Merge branch 'more-aspects' of https://github.com/jude123412/NewHoriz…
jude123412 Mar 16, 2026
2c35041
Merge branch 'master' into more-aspects
jude123412 Mar 17, 2026
caa89b0
Merge branch 'master' into more-aspects
jude123412 Mar 18, 2026
d0e1cbf
Merge branch 'master' into more-aspects
jude123412 Mar 19, 2026
91422de
Merge branch 'master' into more-aspects
jude123412 Mar 21, 2026
dd95e09
Merge branch 'master' into more-aspects
jude123412 Mar 23, 2026
dbebde5
Merge branch 'master' into more-aspects
jude123412 Mar 27, 2026
b1ed9e3
Merge branch 'master' into more-aspects
jude123412 Mar 28, 2026
f2efcef
Merge branch 'master' into more-aspects
jude123412 Mar 28, 2026
b9fcd09
Merge branch 'master' into more-aspects
jude123412 Mar 29, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import static gregtech.api.enums.Mods.IronTanks;
import static gregtech.api.enums.Mods.Minecraft;
import static gregtech.api.enums.Mods.RemoteIO;
import static gregtech.api.enums.Mods.Thaumcraft;
import static gregtech.api.recipe.RecipeMaps.assemblerRecipes;
import static gregtech.api.util.GTRecipeBuilder.SECONDS;
import static gregtech.api.util.GTRecipeConstants.QFT_CATALYST;
Expand All @@ -20,6 +21,7 @@

import com.dreammaster.block.BlockList;
import com.dreammaster.item.NHItemList;
import com.dreammaster.thaumcraft.TCMaterialAspectHelper;

import cpw.mods.fml.common.Optional;
import forestry.api.recipes.RecipeManagers;
Expand All @@ -42,7 +44,13 @@ public String getScriptName() {

@Override
public List<String> getDependencies() {
return Arrays.asList(EternalSingularity.ID, Forestry.ID, IndustrialCraft2.ID, IronTanks.ID, RemoteIO.ID);
return Arrays.asList(
EternalSingularity.ID,
Forestry.ID,
IndustrialCraft2.ID,
IronTanks.ID,
RemoteIO.ID,
Thaumcraft.ID);
}

@Override
Expand Down Expand Up @@ -72,6 +80,7 @@ public void loadRecipes() {
.metadata(QFT_CATALYST, GregtechItemList.TemporalHarmonyCatalyst.get(0)).metadata(QFT_FOCUS_TIER, 4)
.duration(20 * SECONDS).eut(TierEU.RECIPE_UMV).addTo(quantumForceTransformerRecipes);
addForestryRecipes();
addThaumcraftAspects();
}

@Optional.Method(modid = Mods.ModIDs.FORESTRY)
Expand Down Expand Up @@ -332,4 +341,34 @@ private void addForestryRecipes() {
'i',
GTOreDictUnificator.get(OrePrefixes.stickLong, Materials.WoodSealed, 1L));
}

private void addThaumcraftAspects() {
TCMaterialAspectHelper.registerMaterialAspects("Selenium", "metallum", "custom2");
TCMaterialAspectHelper.registerMaterialAspects("Iodine", "metallum", "sano");
TCMaterialAspectHelper.registerMaterialAspects("Rhenium", "metallum", "alienis");
TCMaterialAspectHelper.registerMaterialAspects("Thallium", "metallum", "strontio");
TCMaterialAspectHelper.registerMaterialAspects("Germanium", "metallum", "custom1");
TCMaterialAspectHelper.registerMaterialAspects("Polonium", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Radium", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Protactinium", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Curium", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Neptunium", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Fermium", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Lithium7", "potentia", "custom1");
TCMaterialAspectHelper.registerMaterialAspects("Uranium232", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Uranium233", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Plutonium238", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("AdvancedNitinol", "metallum", "custom2");
TCMaterialAspectHelper.registerMaterialAspects("AstralTitanium", "metallum", "custom4");
TCMaterialAspectHelper.registerMaterialAspects("CelestialTungsten", "metallum", "custom4");
TCMaterialAspectHelper.registerMaterialAspects("Hypogen", "metallum", "custom5");
TCMaterialAspectHelper.registerMaterialAspects("ChromaticGlass", "vitreus", "custom3");
TCMaterialAspectHelper.registerMaterialAspects("BlackMetal", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("WhiteMetal", "metallum", "custom5");
TCMaterialAspectHelper.registerMaterialAspects("AncientGranite", "perditio", "custom3");
TCMaterialAspectHelper.registerMaterialAspects("Runite", "perditio", "custom3");
TCMaterialAspectHelper.registerMaterialAspects("Dragonblood", "metallum", "terminus");
TCMaterialAspectHelper.registerMaterialAspects("Staballoy", "metallum", "radio");
TCMaterialAspectHelper.registerMaterialAspects("Rhugnor", "terminus", "tempus");
}
}
227 changes: 227 additions & 0 deletions src/main/java/com/dreammaster/thaumcraft/TCMaterialAspectHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
package com.dreammaster.thaumcraft;

import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;

import net.minecraftforge.oredict.OreDictionary;

import com.github.bsideup.jabel.Desugar;

import thaumcraft.api.ThaumcraftApi;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;

public class TCMaterialAspectHelper {

// Helper record passed to each rule
@Desugar
public record RuleContext(Aspect main, Aspect[] specials) {}

// Pre-cached common aspects
private static final Aspect PERDITIO = Aspect.getAspect("perditio");
private static final Aspect PERFODIO = Aspect.getAspect("perfodio");
private static final Aspect FABRICO = Aspect.getAspect("fabrico");
private static final Aspect MOTUS = Aspect.getAspect("motus");
private static final Aspect MACHINA = Aspect.getAspect("machina");
private static final Aspect INSTRUMENT = Aspect.getAspect("instrumentum");
private static final Aspect ORDO = Aspect.getAspect("ordo");
private static final Aspect METO = Aspect.getAspect("meto");
private static final Aspect ARBOR = Aspect.getAspect("arbor");
private static final Aspect ELECTRUM = Aspect.getAspect("electrum");
private static final Aspect TERRA = Aspect.getAspect("terra");

// Static cached rule table
private static final Map<String, Function<RuleContext, AspectList>> RULES = new LinkedHashMap<>();

static {
// Reusable rule combinators
Function<RuleContext, AspectList> main2special = ctx -> {
AspectList list = new AspectList().add(ctx.main(), 2);
for (Aspect a : ctx.specials()) list.add(a, 1);
return list;
};

Function<RuleContext, AspectList> main3special = ctx -> {
AspectList list = new AspectList().add(ctx.main(), 3);
for (Aspect a : ctx.specials()) list.add(a, 1);
return list;
};

// --- Declarative rules ---
RULES.put("dust", ctx -> {
AspectList list = new AspectList().add(ctx.main(), 2).add(PERDITIO, 1);
for (Aspect a : ctx.specials()) list.add(a, 1);
return list;
});

RULES.put("dustSmall", ctx -> new AspectList().add(PERDITIO, 1));
RULES.put("dustTiny", ctx -> new AspectList().add(PERDITIO, 1));

RULES.put("ingot", main3special);
RULES.put("ingotHot", main2special);
RULES.put("nugget", ctx -> new AspectList().add(ctx.main(), 1));

RULES.put("stick", ctx -> new AspectList().add(ctx.main(), 2).add(INSTRUMENT, 1));
RULES.put("stickLong", main2special);

RULES.put("bolt", ctx -> new AspectList().add(INSTRUMENT, 1));
RULES.put("screw", ctx -> new AspectList().add(INSTRUMENT, 3).add(FABRICO, 1).add(ORDO, 1));
RULES.put("ring", ctx -> new AspectList().add(INSTRUMENT, 3).add(FABRICO, 3).add(ORDO, 3).add(ctx.main(), 1));
RULES.put("foil", ctx -> new AspectList().add(FABRICO, 1));
RULES.put("wireFine", ctx -> new AspectList().add(ELECTRUM, 1));
RULES.put("gear", ctx -> {
AspectList list = new AspectList().add(ctx.main(), 2).add(MOTUS, 1).add(MACHINA, 1);
for (Aspect a : ctx.specials()) list.add(a, 2);
return list;
});
RULES.put("gearSmall", RULES.get("gear"));
RULES.put("rotor", ctx -> {
AspectList list = new AspectList().add(ctx.main(), 2);
for (Aspect a : ctx.specials()) list.add(a, 2);
return list;
});
RULES.put("spring", RULES.get("rotor"));
RULES.put(
"springSmall",
ctx -> new AspectList().add(INSTRUMENT, 5).add(FABRICO, 3).add(ORDO, 3).add(METO, 1).add(ARBOR, 1));

// Plate variants
String[] plateVariants = { "plate", "plateDouble", "plateTriple", "plateQuadruple", "plateQuintuple",
"plateDense", "plateSuperdense" };
for (String p : plateVariants) {
RULES.put(p, ctx -> {
AspectList list = new AspectList().add(ctx.main(), 2).add(FABRICO, 1);
for (Aspect a : ctx.specials()) list.add(a, 1);
return list;
});
}

// Tool head variants
String[] toolVariants = { "toolHeadSaw", "toolHeadHammer", "toolHeadFile", "toolHeadDrill", "toolHeadChainsaw",
"toolHeadWrench", "toolHeadBuzzSaw" };
for (String t : toolVariants) {
RULES.put(t, ctx -> {
AspectList list = new AspectList().add(ctx.main(), 2).add(INSTRUMENT, 2);
for (Aspect a : ctx.specials()) list.add(a, 1);
return list;
});
}

RULES.put("rawOre", main2special);
RULES.put("crushed", ctx -> new AspectList().add(PERFODIO, 1));
RULES.put("crushedPurified", RULES.get("crushed"));
RULES.put("crushedCentrifuged", RULES.get("crushed"));
RULES.put("dustImpure", ctx -> new AspectList().add(PERDITIO, 1));
RULES.put("dustPure", RULES.get("dustImpure"));

RULES.put("frameGt", ctx -> {
AspectList list = new AspectList().add(INSTRUMENT, 3).add(FABRICO, 3).add(ORDO, 3).add(ctx.main(), 3);
for (Aspect a : ctx.specials()) list.add(a, 1);
return list;
});
RULES.put("ore", ctx -> {
AspectList list = new AspectList().add(ctx.main(), 3).add(TERRA, 1);
for (Aspect a : ctx.specials()) list.add(a, 1);
return list;
});
RULES.put("block", ctx -> {
AspectList list = new AspectList().add(ctx.main(), 10);
for (Aspect a : ctx.specials()) list.add(a, 7);
return list;
});

RULES.put("pipeTiny", ctx -> new AspectList().add(ctx.main(), 1));
RULES.put("pipeSmall", ctx -> new AspectList().add(FABRICO, 1).add(ctx.main(), 1));
RULES.put("pipeNonuple", ctx -> new AspectList().add(FABRICO, 6).add(ctx.main(), 6));

RULES.put(
"wireGt01",
ctx -> new AspectList().add(FABRICO, 2).add(ctx.main(), 1).add(INSTRUMENT, 1).add(ORDO, 1));
RULES.put("pipeMedium", ctx -> {
AspectList list = new AspectList().add(ctx.main(), 4).add(FABRICO, 3);
for (Aspect a : ctx.specials()) list.add(a, 2);
list.add(INSTRUMENT, 1);
list.add(ORDO, 1);
return list;
});
RULES.put("pipeLarge", ctx -> {
AspectList list = new AspectList().add(ctx.main(), 9).add(FABRICO, 6);
for (Aspect a : ctx.specials()) list.add(a, 4);
list.add(INSTRUMENT, 3);
list.add(ORDO, 3);
list.add(MACHINA, 1);
return list;
});
RULES.put("pipeHuge", RULES.get("pipeLarge"));

RULES.put("pipeQuadruple", ctx -> {
AspectList list = new AspectList().add(ctx.main(), 12).add(FABRICO, 9);
for (Aspect a : ctx.specials()) list.add(a, 6);
list.add(INSTRUMENT, 3);
list.add(ORDO, 3);
return list;
});
RULES.put("wireGt02", ctx -> {
AspectList list = new AspectList().add(FABRICO, 3).add(ctx.main(), 1);
for (Aspect a : ctx.specials()) list.add(a, 1);
list.add(INSTRUMENT, 1);
list.add(ORDO, 1);
return list;
});
RULES.put("wireGt04", ctx -> {
AspectList list = new AspectList().add(FABRICO, 5).add(ctx.main(), 2);
for (Aspect a : ctx.specials()) list.add(a, 2);
list.add(INSTRUMENT, 2);
list.add(ORDO, 2);
return list;
});
RULES.put("wireGt08", ctx -> {
AspectList list = new AspectList().add(FABRICO, 7).add(ctx.main(), 4);
for (Aspect a : ctx.specials()) list.add(a, 4);
list.add(INSTRUMENT, 4);
list.add(ORDO, 4);
return list;
});
RULES.put("wireGt12", ctx -> {
AspectList list = new AspectList().add(FABRICO, 10).add(ctx.main(), 5);
for (Aspect a : ctx.specials()) list.add(a, 5);
list.add(INSTRUMENT, 5);
list.add(ORDO, 5);
return list;
});
RULES.put("wireGt16", ctx -> {
AspectList list = new AspectList().add(FABRICO, 12).add(ctx.main(), 7);
for (Aspect a : ctx.specials()) list.add(a, 7);
list.add(INSTRUMENT, 7);
list.add(ORDO, 7);
return list;
});
}

/**
* Aspect helper method for adding TC Aspects to GT5 Materials
*
* @param material (String format of Material name)
* @param mainAspect (String format of Aspect name)
* @param specialAspects (String format of Aspect name, Accepts multiple aspects in seperate Strings)
*/
public static void registerMaterialAspects(String material, String mainAspect, String... specialAspects) {
Aspect main = Aspect.getAspect(mainAspect);

Aspect[] specials = Arrays.stream(specialAspects).map(Aspect::getAspect).filter(Objects::nonNull)
.toArray(Aspect[]::new);

RuleContext ctx = new RuleContext(main, specials);

for (Map.Entry<String, Function<RuleContext, AspectList>> entry : RULES.entrySet()) {
String key = entry.getKey() + material;

if (!OreDictionary.getOres(key).isEmpty()) {
ThaumcraftApi.registerObjectTag(key, entry.getValue().apply(ctx));
}
}
}
}
Loading