From 6e25ac5343fb3f644f7ef305b73e1c7f97541a7c Mon Sep 17 00:00:00 2001
From: LazyFleshWasTaken <40587985+LazyFleshWasTaken@users.noreply.github.com>
Date: Sun, 8 Feb 2026 12:28:58 -0800
Subject: [PATCH 01/17] Convert to config
---
.../java/fox/spiteful/forbidden/Config.java | 104 ++++++++++++++++++
.../forbidden/items/ForbiddenItems.java | 32 +++---
2 files changed, 120 insertions(+), 16 deletions(-)
diff --git a/src/main/java/fox/spiteful/forbidden/Config.java b/src/main/java/fox/spiteful/forbidden/Config.java
index 00e4316..210737e 100644
--- a/src/main/java/fox/spiteful/forbidden/Config.java
+++ b/src/main/java/fox/spiteful/forbidden/Config.java
@@ -63,6 +63,23 @@ public class Config {
public static boolean emc = true;
// public static boolean eewand = true;
+ public static int infernalCoreCap = 150;
+ public static int witchwoodCoreCap = 100;
+ public static int livingwoodCoreCap = 100;
+ public static int dreamwoodCoreCap = 100;
+ public static int taintedCoreCap = 150;
+ public static int profaneCoreCap = 50;
+ public static int bloodCoreCap = 100;
+ public static int dreamwoodStaffCap = 250;
+ public static int bloodStaffCap = 50;
+ public static int witchwoodStaffCap = 50;
+
+ public static double vinteumDiscount = .9;
+ public static double alchemicalDiscount = .9;
+ public static double manasteelDiscount = .9;
+ public static double elementiumDiscount = .8;
+ public static double terrasteelDiscount = 1.8;
+
public static int bloodvis = 5;
public static int manavis = 8;
@@ -191,6 +208,93 @@ public static void configurate(File targ) {
.getInt(bloodvis);
manavis = conf.get("power converters", "Mana to Vis", manavis, "How much Mana 0.01 Vis is worth")
.getInt(manavis);
+
+ infernalCoreCap = conf.get(
+ "wand cores",
+ "infernalCoreCap",
+ infernalCoreCap,
+ "How much capacity the Inferal Wand Core will have (Default: 150)").getInt(infernalCoreCap);
+ taintedCoreCap = conf.get(
+ "wand cores",
+ "taintedCoreCap",
+ taintedCoreCap,
+ "How much capacity the Tainted Wand Core will have (Default: 150)").getInt(taintedCoreCap);
+ profaneCoreCap = conf.get(
+ "wand cores",
+ "profaneCoreCap",
+ profaneCoreCap,
+ "How much capacity the Profane Wand Core will have (Default: 50)").getInt(profaneCoreCap);
+ witchwoodCoreCap = conf
+ .get(
+ "wand cores",
+ "witchwoodCoreCap",
+ witchwoodCoreCap,
+ "How much capacity the Witchwood Wand Core will have (Default: 100)")
+ .getInt(witchwoodCoreCap);
+ livingwoodCoreCap = conf
+ .get(
+ "wand cores",
+ "livingwoodCoreCap",
+ livingwoodCoreCap,
+ "How much capacity the Livingwood Wand Core will have (Default: 150)")
+ .getInt(livingwoodCoreCap);
+ dreamwoodCoreCap = conf.get(
+ "wand cores",
+ "dreamwoodCoreCap",
+ dreamwoodCoreCap,
+ "How much capacity the Dreamwood Wand Core will (Default: 100)").getInt(dreamwoodCoreCap);
+ bloodCoreCap = conf.get(
+ "wand cores",
+ "bloodCoreCap",
+ bloodCoreCap,
+ "How much capacity the Blood Wand Core will have (Default: 100)").getInt(bloodCoreCap);
+ dreamwoodStaffCap = conf.get(
+ "wand cores",
+ "dreamwoodStaffCap",
+ dreamwoodStaffCap,
+ "How much capacity the Dreamwood Staff will have (Default: 250)").getInt(dreamwoodStaffCap);
+ bloodStaffCap = conf.get(
+ "wand cores",
+ "bloodStaffCap",
+ bloodStaffCap,
+ "How much capacity the Blood Staff will have (Default: 50)").getInt(bloodStaffCap);
+ witchwoodStaffCap = conf.get(
+ "wand cores",
+ "witchwoodStaffCap",
+ witchwoodStaffCap,
+ "How much capacity the Witchwood Staff will have (Default: 50)").getInt(witchwoodStaffCap);
+
+ vinteumDiscount = conf.get(
+ "wand caps",
+ "vinteumDiscount",
+ vinteumDiscount,
+ "How much discount the Vinteum Caps will have (Default: .9)").getDouble(vinteumDiscount);
+ alchemicalDiscount = conf.get(
+ "wand caps",
+ "alchemicalDiscount",
+ alchemicalDiscount,
+ "How much discount the Alchemical Caps will have (Default: .9)" + '\n'
+ + "Has a 10% additional discount on Aqua")
+ .getDouble(alchemicalDiscount);
+ manasteelDiscount = conf.get(
+ "wand caps",
+ "manasteelDiscount",
+ manasteelDiscount,
+ "How much discount the Manasteel Caps will have Default: .9)").getDouble(manasteelDiscount);
+ elementiumDiscount = conf
+ .get(
+ "wand caps",
+ "elementiumDiscount",
+ elementiumDiscount,
+ "How much discount the Elementium Caps will have (Default: .8)")
+ .getDouble(elementiumDiscount);
+ terrasteelDiscount = conf
+ .get(
+ "wand caps",
+ "terrasteelDiscount",
+ terrasteelDiscount,
+ "How much discount the Terrasteel Caps will have (Default: 1.8)")
+ .getDouble(terrasteelDiscount);
} catch (Exception e) {
LogHandler.log(Level.ERROR, e, "Had a problem loading its configuration.");
} finally {
diff --git a/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java b/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
index 6a47a13..8acf030 100644
--- a/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
+++ b/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
@@ -150,14 +150,14 @@ public static void addItems() {
GameRegistry.registerItem(wandCap, "WandCaps");
WAND_ROD_TAINTED = new WandRod(
"tainted",
- 150,
+ Config.taintedCoreCap,
new ItemStack(wandCore, 1, 0),
12,
new TaintedWandUpdate(),
new ResourceLocation("forbidden", "textures/models/wand_rod_tainted.png"));
WAND_ROD_INFERNAL = new WandRod(
"infernal",
- 150,
+ Config.infernalCoreCap,
new ItemStack(wandCore, 1, 1),
12,
new InfernalWandUpdate(),
@@ -172,28 +172,28 @@ public static void addItems() {
WAND_ROD_NEUTRONIUM.setGlowing(true);
WAND_ROD_BLOOD = new WandRod(
"blood",
- 100,
+ Config.bloodCoreCap,
new ItemStack(wandCore, 1, 3),
12,
new BloodWandUpdate(),
new ResourceLocation("forbidden", "textures/models/wand_rod_blood.png"));
WAND_ROD_WITCHWOOD = new WandRod(
"witchwood",
- 100,
+ Config.witchwoodCoreCap,
new ItemStack(wandCore, 1, 4),
12,
new ManaWandUpdate(),
new ResourceLocation("forbidden", "textures/models/wand_rod_witchwood.png"));
WAND_ROD_LIVINGWOOD = new WandRod(
"livingwood",
- 100,
+ Config.livingwoodCoreCap,
new ItemStack(wandCore, 1, 7),
12,
new YandereWandUpdate(),
new ResourceLocation("forbidden", "textures/models/wand_rod_livingwood.png"));
WAND_ROD_DREAMWOOD = new WandRod(
"dreamwood",
- 100,
+ Config.dreamwoodCoreCap,
new ItemStack(wandCore, 1, 11),
12,
new YandereWandUpdate(),
@@ -206,7 +206,7 @@ public static void addItems() {
new ResourceLocation("forbidden", "textures/models/wand_rod_equivalent.png"));
WAND_ROD_PROFANE = new WandRod(
"profane",
- 50,
+ Config.profaneCoreCap,
new ItemStack(wandCore, 1, 5),
12,
new ProfaneWandUpdate(),
@@ -219,7 +219,7 @@ public static void addItems() {
new ResourceLocation("forbidden", "textures/models/wand_rod_profaned.png"));
STAFF_ROD_BLOOD = new StaffRod(
"blood",
- 50,
+ Config.bloodStaffCap,
new ItemStack(wandCore, 1, 9),
24,
new BloodStaffUpdate(),
@@ -234,14 +234,14 @@ public static void addItems() {
STAFF_ROD_NEUTRONIUM.setGlowing(true);
STAFF_ROD_WITCHWOOD = new StaffRod(
"witchwood",
- 50,
+ Config.witchwoodStaffCap,
new ItemStack(wandCore, 1, 10),
24,
new ManaStaffUpdate(),
new ResourceLocation("forbidden", "textures/models/wand_rod_witchwood.png"));
STAFF_ROD_DREAMWOOD = new StaffRod(
"dreamwood",
- 250,
+ Config.dreamwoodStaffCap,
new ItemStack(wandCore, 1, 13),
25,
new YandereWandUpdate(),
@@ -255,33 +255,33 @@ public static void addItems() {
new ResourceLocation("forbidden", "textures/models/wand_cap_orichalcum.png"));
WAND_CAP_ALCHEMICAL = new DarkWandCap(
"alchemical",
- 0.9F,
+ (float) (Config.alchemicalDiscount) / 100F,
Arrays.asList(new Aspect[] { Aspect.WATER }),
- 0.8F,
+ (float) (Config.vinteumDiscount) - .10F,
new ItemStack(wandCap, 1, 0),
7,
new ResourceLocation("forbidden", "textures/models/wand_cap_alchemical.png"));
WAND_CAP_VINTEUM = new DarkWandCap(
"vinteum",
- 0.9F,
+ (float) (Config.vinteumDiscount),
new ItemStack(wandCap, 1, 1),
6,
new ResourceLocation("forbidden", "textures/models/wand_cap_vinteum.png"));
WAND_CAP_MANASTEEL = new DarkWandCap(
"manasteel",
- 0.9F,
+ (float) (Config.manasteelDiscount),
new ItemStack(wandCap, 1, 3),
6,
new ResourceLocation("forbidden", "textures/models/wand_cap_manasteel.png"));
WAND_CAP_ELEMENTIUM = new DarkWandCap(
"elementium",
- 0.8F,
+ (float) (Config.elementiumDiscount),
new ItemStack(wandCap, 1, 5),
9,
new ResourceLocation("forbidden", "textures/models/wand_cap_elementium.png"));
WAND_CAP_TERRASTEEL = new DarkWandCap(
"terrasteel",
- 1.8F,
+ (float) (Config.terrasteelDiscount),
new ItemStack(wandCap, 1, 2),
1,
new ResourceLocation("forbidden", "textures/models/wand_cap_terrasteel.png"));
From a524b5feaa8f52f97aa46a5035c009c2b2103402 Mon Sep 17 00:00:00 2001
From: LazyFleshWasTaken <40587985+LazyFleshWasTaken@users.noreply.github.com>
Date: Sun, 8 Feb 2026 15:00:22 -0800
Subject: [PATCH 02/17] Trying to figure out formatting, its... going
---
src/main/java/fox/spiteful/forbidden/Forbidden.java | 10 ++++++++++
.../java/fox/spiteful/forbidden/ForbiddenResearch.java | 3 ++-
src/main/resources/assets/forbidden/lang/en_US.lang | 2 +-
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/src/main/java/fox/spiteful/forbidden/Forbidden.java b/src/main/java/fox/spiteful/forbidden/Forbidden.java
index 1a5179d..0f1e482 100644
--- a/src/main/java/fox/spiteful/forbidden/Forbidden.java
+++ b/src/main/java/fox/spiteful/forbidden/Forbidden.java
@@ -1,5 +1,8 @@
package fox.spiteful.forbidden;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.resources.IReloadableResourceManager;
+import net.minecraft.client.resources.IResourceManager;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
@@ -88,5 +91,12 @@ public void outro(FMLPostInitializationEvent event) {
wandLord = new WandOverlord();
WandTriggerRegistry.registerWandBlockTrigger(wandLord, 1, Blocks.obsidian, 0);
WandTriggerRegistry.registerWandBlockTrigger(wandLord, 1, Blocks.netherrack, 0);
+
+ if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager manager) {
+ manager.registerReloadListener(
+ (IResourceManager manager2) -> {
+ ForbiddenResearch.addResearch();
+ });
+ }
}
}
diff --git a/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java b/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
index 0e1c967..db27349 100644
--- a/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
+++ b/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
@@ -10,6 +10,7 @@
import fox.spiteful.forbidden.blocks.ForbiddenBlocks;
import fox.spiteful.forbidden.compat.Compat;
import fox.spiteful.forbidden.items.ForbiddenItems;
+import net.minecraft.util.StatCollector;
import thaumcraft.api.ThaumcraftApi;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
@@ -478,7 +479,7 @@ public static void addTaint() {
3,
new ItemStack(ForbiddenItems.wandCore, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_tainted.1"),
+ new ResearchPage[] { new ResearchPage(StatCollector.translateToLocalFormatted("forbidden.research_page.ROD_tainted.1", Config.taintedCoreCap)),
new ResearchPage((InfusionRecipe) recipes.get("WandRodTainted")) })
.setParents(new String[] { "ROD_silverwood", "TAINTSHOVEL", "INFUSION" }).setConcealed()
.registerResearchItem();
diff --git a/src/main/resources/assets/forbidden/lang/en_US.lang b/src/main/resources/assets/forbidden/lang/en_US.lang
index 7cb8ee6..2d9d972 100644
--- a/src/main/resources/assets/forbidden/lang/en_US.lang
+++ b/src/main/resources/assets/forbidden/lang/en_US.lang
@@ -199,7 +199,7 @@ forbidden.research_page.TAINTPICK.1=By infusing a thaumium pickaxe with taint, y
#
forbidden.research_name.ROD_tainted=Tainted Wand Core
forbidden.research_text.ROD_tainted=Squiggly vis storage
-forbidden.research_page.ROD_tainted.1=Tainted Lands are places of great and terrible power for those Thaumaturges who know how to tap into them.
The Tainted Wand Core can store up to 150 vis of each type and slowly replenishes itself up to 10% in every aspect as long as it is being held inside of a Tainted Land. While the wand is held in your hand, it can also feed off of taint coursing through your veins, randomly restoring vis every time you take damage from flux taint.
+forbidden.research_page.ROD_tainted.1=Tainted Lands are places of great and terrible power for those Thaumaturges who know how to tap into them.
The Tainted Wand Core can store up to %d vis of each type and slowly replenishes itself up to 10% in every aspect as long as it is being held inside of a Tainted Land. While the wand is held in your hand, it can also feed off of taint coursing through your veins, randomly restoring vis every time you take damage from flux taint.
#
forbidden.research_name.TAINTTREE=Tainted Tree
forbidden.research_text.TAINTTREE=The root of flux bears gross fruit
From 1ce3b952dc3288e7b9e60de0ae5685aaf39f49d9 Mon Sep 17 00:00:00 2001
From: LazyFleshWasTaken <40587985+LazyFleshWasTaken@users.noreply.github.com>
Date: Sun, 8 Feb 2026 20:29:56 -0800
Subject: [PATCH 03/17] Well, the formatting is on the way... except, class not
found exception
---
dependencies.gradle | 1 +
.../fox/spiteful/forbidden/Forbidden.java | 7 ----
.../spiteful/forbidden/ForbiddenResearch.java | 13 +++++--
.../spiteful/forbidden/compat/BloodMagic.java | 35 +++++++++++++------
.../fox/spiteful/forbidden/compat/Compat.java | 27 ++++++++++----
.../forbidden/compat/ForbiddenBotany.java | 12 +++++--
.../assets/forbidden/lang/en_US.lang | 16 ++++-----
7 files changed, 72 insertions(+), 39 deletions(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index ad4fe6c..27ac351 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -7,6 +7,7 @@ dependencies {
compileOnly('com.github.GTNewHorizons:BloodMagic:1.8.5:dev')
compileOnly('com.github.GTNewHorizons:Botania:1.13.4-GTNH:api')
compileOnly("com.github.GTNewHorizons:AppleCore:3.3.7:dev")
+ compileOnly("com.github.GTNewHorizons:GTNHLib:0.9.13:dev")
compileOnly('curse.maven:ee3-65509:2305023')
diff --git a/src/main/java/fox/spiteful/forbidden/Forbidden.java b/src/main/java/fox/spiteful/forbidden/Forbidden.java
index 0f1e482..2403d38 100644
--- a/src/main/java/fox/spiteful/forbidden/Forbidden.java
+++ b/src/main/java/fox/spiteful/forbidden/Forbidden.java
@@ -91,12 +91,5 @@ public void outro(FMLPostInitializationEvent event) {
wandLord = new WandOverlord();
WandTriggerRegistry.registerWandBlockTrigger(wandLord, 1, Blocks.obsidian, 0);
WandTriggerRegistry.registerWandBlockTrigger(wandLord, 1, Blocks.netherrack, 0);
-
- if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager manager) {
- manager.registerReloadListener(
- (IResourceManager manager2) -> {
- ForbiddenResearch.addResearch();
- });
- }
}
}
diff --git a/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java b/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
index db27349..4e2f290 100644
--- a/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
+++ b/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
@@ -7,10 +7,11 @@
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.ResourceLocation;
+import com.gtnewhorizon.gtnhlib.api.thaumcraft.FormattedResearchPage;
+
import fox.spiteful.forbidden.blocks.ForbiddenBlocks;
import fox.spiteful.forbidden.compat.Compat;
import fox.spiteful.forbidden.items.ForbiddenItems;
-import net.minecraft.util.StatCollector;
import thaumcraft.api.ThaumcraftApi;
import thaumcraft.api.aspects.Aspect;
import thaumcraft.api.aspects.AspectList;
@@ -297,7 +298,10 @@ public static void addInfernalism() {
3,
new ItemStack(ForbiddenItems.wandCore, 1, 1)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_infernal.1"),
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_infernal.1",
+ new Integer[] { Config.infernalCoreCap }),
new ResearchPage((InfusionRecipe) recipes.get("WandRodInfernal")),
new ResearchPage("forbidden.research_page.ROD_infernal.2") })
.setParents(new String[] { "ROD_silverwood", "INFUSION", "NETHERSHARDS" }).setConcealed()
@@ -479,7 +483,10 @@ public static void addTaint() {
3,
new ItemStack(ForbiddenItems.wandCore, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage(StatCollector.translateToLocalFormatted("forbidden.research_page.ROD_tainted.1", Config.taintedCoreCap)),
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_tainted.1",
+ new Integer[] { Config.taintedCoreCap }),
new ResearchPage((InfusionRecipe) recipes.get("WandRodTainted")) })
.setParents(new String[] { "ROD_silverwood", "TAINTSHOVEL", "INFUSION" }).setConcealed()
.registerResearchItem();
diff --git a/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java b/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
index 5fada20..ad18204 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
@@ -8,6 +8,8 @@
import org.apache.logging.log4j.Level;
+import com.gtnewhorizon.gtnhlib.api.thaumcraft.FormattedResearchPage;
+
import WayofTime.alchemicalWizardry.api.alchemy.AlchemicalPotionCreationHandler;
import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipeRegistry;
import WayofTime.alchemicalWizardry.api.bindingRegistry.BindingRegistry;
@@ -91,11 +93,13 @@ public static void stab() {
-1,
-3,
3,
- new ItemStack(ForbiddenItems.wandCore, 1, 3)))
- .setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_blood.1"),
- new ResearchPage(blood_recipe),
- new ResearchPage("forbidden.research_page.ROD_blood.2") })
+ new ItemStack(ForbiddenItems.wandCore, 1, 3))).setPages(
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_blood.1",
+ new Integer[] { Config.bloodCoreCap }),
+ new ResearchPage(blood_recipe),
+ new ResearchPage("forbidden.research_page.ROD_blood.2") })
.setParents(new String[] { "ROD_silverwood", "INFUSION", "BLOODMAGIC" }).setConcealed()
.registerResearchItem();
ThaumcraftApi.addWarpToResearch("ROD_blood", 2);
@@ -116,9 +120,13 @@ public static void stab() {
-3,
-2,
2,
- new ItemStack(ForbiddenItems.wandCore, 1, 9))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_blood_staff.1"),
- new ResearchPage(blood_staff) })
+ new ItemStack(ForbiddenItems.wandCore, 1, 9)))
+ .setPages(
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_blood_staff.1",
+ new Integer[] { Config.bloodStaffCap }),
+ new ResearchPage(blood_staff) })
.setParents(new String[] { "ROD_silverwood_staff", "ROD_blood" }).setSpecial()
.setConcealed().registerResearchItem();
@@ -138,9 +146,14 @@ public static void stab() {
-3,
-3,
2,
- new ItemStack(ForbiddenItems.wandCap, 1, 0))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CAP_alchemical.1"),
- new ResearchPage(alchemical_recipe) })
+ new ItemStack(ForbiddenItems.wandCap, 1, 0)))
+ .setPages(
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.CAP_alchemical.1",
+ new Double[] { Config.alchemicalDiscount * 100 - 10,
+ Config.alchemicalDiscount * 100 }),
+ new ResearchPage(alchemical_recipe) })
.setParents(new String[] { "ROD_blood", "CAP_gold" }).setSecondary().setConcealed()
.registerResearchItem();
}
diff --git a/src/main/java/fox/spiteful/forbidden/compat/Compat.java b/src/main/java/fox/spiteful/forbidden/compat/Compat.java
index b20ed38..a93a471 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/Compat.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/Compat.java
@@ -7,6 +7,7 @@
import org.apache.logging.log4j.Level;
+import com.gtnewhorizon.gtnhlib.api.thaumcraft.FormattedResearchPage;
import com.pahimar.ee3.api.exchange.EnergyValueRegistryProxy;
import cpw.mods.fml.common.Loader;
@@ -166,9 +167,13 @@ public static void compatify() {
-3,
1,
3,
- new ItemStack(ForbiddenItems.wandCore, 1, 4))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_witchwood.1"),
- new ResearchPage(witchwood_recipe) })
+ new ItemStack(ForbiddenItems.wandCore, 1, 4)))
+ .setPages(
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_witchwood.1",
+ new Integer[] { Config.witchwoodCoreCap }),
+ new ResearchPage(witchwood_recipe) })
.setParents(new String[] { "SCHOOLS", "ROD_silverwood", "INFUSION" }).setConcealed()
.registerResearchItem();
ThaumcraftApi.addWarpToResearch("ROD_witchwood", 2);
@@ -191,7 +196,11 @@ public static void compatify() {
1,
new ItemStack(ForbiddenItems.wandCap, 1, 1)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CAP_vinteum.1"),
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.CAP_vinteum.1",
+ new Double[] { Config.vinteumDiscount * 100 - 10,
+ Config.vinteumDiscount * 100 }),
new ResearchPage(vinteum_recipe) })
.setParents(new String[] { "ROD_witchwood", "CAP_thaumium" }).setSecondary()
.setConcealed().registerResearchItem();
@@ -212,9 +221,13 @@ public static void compatify() {
-3,
-1,
2,
- new ItemStack(ForbiddenItems.wandCore, 1, 10))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_witchwood_staff.1"),
- new ResearchPage(witchwood_staff) })
+ new ItemStack(ForbiddenItems.wandCore, 1, 10)))
+ .setPages(
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_witchwood_staff.1",
+ new Integer[] { Config.witchwoodStaffCap }),
+ new ResearchPage(witchwood_staff) })
.setParents(new String[] { "ROD_silverwood_staff", "ROD_witchwood" }).setSpecial()
.setConcealed().registerResearchItem();
} catch (Exception e) {
diff --git a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
index 97ef9b2..f779116 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
@@ -14,6 +14,8 @@
import org.apache.logging.log4j.Level;
+import com.gtnewhorizon.gtnhlib.api.thaumcraft.FormattedResearchPage;
+
import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipeRegistry;
import cpw.mods.fml.common.registry.GameRegistry;
import fox.spiteful.forbidden.Config;
@@ -123,9 +125,13 @@ public static void flowerPowerHippymancy() {
1,
2,
2,
- new ItemStack(ForbiddenItems.wandCap, 1, 3))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CAP_manasteel.1"),
- new ResearchPage(manasteel_cap) })
+ new ItemStack(ForbiddenItems.wandCap, 1, 3)))
+ .setPages(
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.CAP_manasteel.1",
+ new Double[] { Config.manasteelDiscount * 100 }),
+ new ResearchPage(manasteel_cap) })
.setParents(new String[] { "ROD_livingwood" }).setSecondary().setConcealed()
.registerResearchItem();
BotaniaAPI.registerManaInfusionRecipe(
diff --git a/src/main/resources/assets/forbidden/lang/en_US.lang b/src/main/resources/assets/forbidden/lang/en_US.lang
index 2d9d972..18d9ae3 100644
--- a/src/main/resources/assets/forbidden/lang/en_US.lang
+++ b/src/main/resources/assets/forbidden/lang/en_US.lang
@@ -211,7 +211,7 @@ forbidden.research_page.TAINTSTONE.1=Tainted Lands aren't very safe places to be
#
forbidden.research_name.ROD_infernal=Infernal Wand Core
forbidden.research_text.ROD_infernal=Devilish vis storage
-forbidden.research_page.ROD_infernal.1=A great and powerful thaumaturge like you deserves a powerful and imposing wand befitting your station. Some hippy silverwood wand just won't cut it. You need a wand that will serve as your scepter of authority.
You've discovered a way to create a wand infused with the power of the Nether. The Infernal Wand Core can hold up to 150 vis and will slowly replenish its supply of Ignis up to 20%. While within the Nether, the wand will also replenish its other aspects to 10%.
+forbidden.research_page.ROD_infernal.1=A great and powerful thaumaturge like you deserves a powerful and imposing wand befitting your station. Some hippy silverwood wand just won't cut it. You need a wand that will serve as your scepter of authority.
You've discovered a way to create a wand infused with the power of the Nether. The Infernal Wand Core can hold up to %s vis and will slowly replenish its supply of Ignis up to 20%. While within the Nether, the wand will also replenish its other aspects to 10%.
forbidden.research_page.ROD_infernal.2=The wand also imbues you with some protection from the Nether's hazards, extinguishing you if you are on fire or protecting you from the effects of Withering as long as it is in your inventory. While the wand is held in your hand, it will completely protect you from all fire damage.
#
forbidden.research_name.ROD_profane=Profane Wand
@@ -224,20 +224,20 @@ forbidden.research_page.ROD_soul.1=You've discovered a way to tap the energy flo
#
forbidden.research_name.ROD_blood=Blood Wand Core
forbidden.research_text.ROD_blood=Alchemical vis storage
-forbidden.research_page.ROD_blood.1=You've created a bridge between Thaumaturgy and Alchemical Wizardry. The Blood Wand can store up to 100 vis and will gradually fill itself using Life Points.
The wand will bind itself to the first person to pick it up. As long as the rod is empty, it will try to fill itself using LP from its owner's network. If there are not enough Life Points to fuel it, it will resort to drawing health from whoever is carrying it, but this conversion is less efficient. If it has no LP to draw from and its holder falls below three hearts, the wand stops charging itself.
+forbidden.research_page.ROD_blood.1=You've created a bridge between Thaumaturgy and Alchemical Wizardry. The Blood Wand can store up to %s vis and will gradually fill itself using Life Points.
The wand will bind itself to the first person to pick it up. As long as the rod is empty, it will try to fill itself using LP from its owner's network. If there are not enough Life Points to fuel it, it will resort to drawing health from whoever is carrying it, but this conversion is less efficient. If it has no LP to draw from and its holder falls below three hearts, the wand stops charging itself.
forbidden.research_page.ROD_blood.2=The infusion process alone isn't enough to complete a Blood Wand. Once the Inert Blood Rod has been infused, it must be imbued with life essence in a Blood Altar to be completed.
#
forbidden.research_name.ROD_blood_staff=Blood Staff Core
forbidden.research_text.ROD_blood_staff=Staff of the Blood Magus
-forbidden.research_page.ROD_blood_staff.1=The Blood Wand is useful, but it just charges so slowly. It's time to create a magical implement that can hold up in sustained combat.
Unlike most staves, the Blood Staff holds only 50 vis instead of the 100 its wand form can. Where it truly shines is its ability to recharge vis at a rapid rate. As long as the Blood Staff is held in your hotbar, it will recharge its vis from its owner's LP network four times as quickly as a normal Blood Wand. This voraciousness comes at a price, however. Unlike the wand, the Blood Staff can and will kill whoever's holding it if it doesn't recieve enough LP.
+forbidden.research_page.ROD_blood_staff.1=The Blood Wand is useful, but it just charges so slowly. It's time to create a magical implement that can hold up in sustained combat.
Unlike most staves, the Blood Staff holds only %s vis instead of the 100 its wand form can. Where it truly shines is its ability to recharge vis at a rapid rate. As long as the Blood Staff is held in your hotbar, it will recharge its vis from its owner's LP network four times as quickly as a normal Blood Wand. This voraciousness comes at a price, however. Unlike the wand, the Blood Staff can and will kill whoever's holding it if it doesn't recieve enough LP.
#
forbidden.research_name.ROD_witchwood=Witchwood Wand Core
forbidden.research_text.ROD_witchwood=Mana converter
-forbidden.research_page.ROD_witchwood.1=By creating a wand core out of Witchwood, you've discovered a way to convert mana into Vis. The Witchwood Wand Core holds up to 100 vis and will gradually charge itself at the cost of 140 mana per point of vis.
Further research may reveal ways to lower this price.
+forbidden.research_page.ROD_witchwood.1=By creating a wand core out of Witchwood, you've discovered a way to convert mana into Vis. The Witchwood Wand Core holds up to %s vis and will gradually charge itself at the cost of 140 mana per point of vis.
Further research may reveal ways to lower this price.
#
forbidden.research_name.ROD_witchwood_staff=Witchwood Staff Core
forbidden.research_text.ROD_witchwood_staff=Staff of the Arcanist
-forbidden.research_page.ROD_witchwood_staff.1=The Witchwood Wand eats far too much magical power and charges far too slowly to stand up in sustained combat. It's time for something a little more efficient at channeling arcane power.
Unlike most staves, the Witchwood Staff can only hold 50 vis. Its true strength lies in how quickly it recharges itself. The staff regains vis at over twice the rate of the Witchwood Wand. Furthermore, the staff uses considerably less magical power than the Witchwood Wand, only needing 100 mana per point of vis, if used without the appropriate cap.
+forbidden.research_page.ROD_witchwood_staff.1=The Witchwood Wand eats far too much magical power and charges far too slowly to stand up in sustained combat. It's time for something a little more efficient at channeling arcane power.
Unlike most staves, the Witchwood Staff can only hold %s vis. Its true strength lies in how quickly it recharges itself. The staff regains vis at over twice the rate of the Witchwood Wand. Furthermore, the staff uses considerably less magical power than the Witchwood Wand, only needing 100 mana per point of vis, if used without the appropriate cap.
#
forbidden.research_name.ROD_livingwood=Livingwood Wand Core
forbidden.research_text.ROD_livingwood=Botanical vis storage
@@ -249,11 +249,11 @@ forbidden.research_page.ROD_dreamwood_staff.1=Livingwood is a useful material, b
#
forbidden.research_name.CAP_alchemical=Alchemical Caps
forbidden.research_text.CAP_alchemical=When Thaumium isn't bloody enough
-forbidden.research_page.CAP_alchemical.1=You've developed a wand cap that merges Thaumaturgy and Alchemical Wizardry. Alchemical Caps are very effective at channeling Aqua, only using 80% of the normal vis cost. For everything else, they offer only a 90% rate.
If combined with a Bloody Wand Core, Alchemical Caps discount the amount of LP consumed by the wand, costing only 900 LP per vis. The caps also cause all attacks from a blood wand to inflict Weakness.
+forbidden.research_page.CAP_alchemical.1=You've developed a wand cap that merges Thaumaturgy and Alchemical Wizardry. Alchemical Caps are very effective at channeling Aqua, only using %s% of the normal vis cost. For everything else, they offer only a %s% rate.
If combined with a Bloody Wand Core, Alchemical Caps discount the amount of LP consumed by the wand, costing only 900 LP per vis. The caps also cause all attacks from a blood wand to inflict Weakness.
#
forbidden.research_name.CAP_vinteum=Vinteum Caps
forbidden.research_text.CAP_vinteum=Magical wand caps
-forbidden.research_page.CAP_vinteum.1=By infusing a Thaumium cap with Vinteum, you create a cap that, when combined with a Witchwood Wand Core, lowers its mana cost to only 80 per point of vis.
The Thaumium cap seems to meld well with Vinteum, offering the same 90% vis rate.
+forbidden.research_page.CAP_vinteum.1=By infusing a Thaumium cap with Vinteum, you create a cap that, when combined with a Witchwood Wand Core, lowers its mana cost to only %s% per point of vis.
The Thaumium cap seems to meld well with Vinteum, offering the same %s% vis rate.
#
forbidden.research_name.CAP_soul=Ender Caps
forbidden.research_text.CAP_soul=Protection for your soul
@@ -261,7 +261,7 @@ forbidden.research_page.CAP_soul.1=You've created a wand cap that can safely cha
#
forbidden.research_name.CAP_manasteel=Manasteel Caps
forbidden.research_text.CAP_manasteel=The secret of mana
-forbidden.research_page.CAP_manasteel.1=Manasteel has very useful properties when it comes to mana manipulation. When crafted into a wand cap, it offers a 90% vis rate. If combined with a wand that can consume mana, it also makes the mana conversion process more efficient.
In order to be used in the creation of a wand, the Inert Manasteel Caps must be infused in a Mana Pool.
+forbidden.research_page.CAP_manasteel.1=Manasteel has very useful properties when it comes to mana manipulation. When crafted into a wand cap, it offers a %s% vis rate. If combined with a wand that can consume mana, it also makes the mana conversion process more efficient.
In order to be used in the creation of a wand, the Inert Manasteel Caps must be infused in a Mana Pool.
#
forbidden.research_name.CAP_elementium=Elementium Caps
forbidden.research_text.CAP_elementium=Eco Friendly Wand Caps
From 631e1bac7e006e671ec67d71c5befada7d2afa79 Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 02:50:32 -0500
Subject: [PATCH 04/17] Update Baubles
---
dependencies.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index 27ac351..ef10840 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -2,7 +2,7 @@
dependencies {
api('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev')
- api('com.github.GTNewHorizons:Baubles:1.0.4:dev')
+ api('com.github.GTNewHorizons:Baubles-Expanded:2.2.6-GTNH:dev')
compileOnly('com.github.GTNewHorizons:BloodMagic:1.8.5:dev')
compileOnly('com.github.GTNewHorizons:Botania:1.13.4-GTNH:api')
From eb32916d2019c395ca7ad4ba66beff436b17baa4 Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:06:06 -0500
Subject: [PATCH 05/17] Set GTNHLib to api
---
dependencies.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dependencies.gradle b/dependencies.gradle
index ef10840..f8157cb 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -3,11 +3,11 @@
dependencies {
api('thaumcraft:Thaumcraft:1.7.10-4.2.3.5:dev')
api('com.github.GTNewHorizons:Baubles-Expanded:2.2.6-GTNH:dev')
+ api("com.github.GTNewHorizons:GTNHLib:0.9.13:dev")
compileOnly('com.github.GTNewHorizons:BloodMagic:1.8.5:dev')
compileOnly('com.github.GTNewHorizons:Botania:1.13.4-GTNH:api')
compileOnly("com.github.GTNewHorizons:AppleCore:3.3.7:dev")
- compileOnly("com.github.GTNewHorizons:GTNHLib:0.9.13:dev")
compileOnly('curse.maven:ee3-65509:2305023')
From 7159ecaff5f9a2e9b841a71f879de05d965a1f40 Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:07:04 -0500
Subject: [PATCH 06/17] Fix formatting errors
---
src/main/resources/assets/forbidden/lang/en_US.lang | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/main/resources/assets/forbidden/lang/en_US.lang b/src/main/resources/assets/forbidden/lang/en_US.lang
index 18d9ae3..e135b82 100644
--- a/src/main/resources/assets/forbidden/lang/en_US.lang
+++ b/src/main/resources/assets/forbidden/lang/en_US.lang
@@ -199,7 +199,7 @@ forbidden.research_page.TAINTPICK.1=By infusing a thaumium pickaxe with taint, y
#
forbidden.research_name.ROD_tainted=Tainted Wand Core
forbidden.research_text.ROD_tainted=Squiggly vis storage
-forbidden.research_page.ROD_tainted.1=Tainted Lands are places of great and terrible power for those Thaumaturges who know how to tap into them.
The Tainted Wand Core can store up to %d vis of each type and slowly replenishes itself up to 10% in every aspect as long as it is being held inside of a Tainted Land. While the wand is held in your hand, it can also feed off of taint coursing through your veins, randomly restoring vis every time you take damage from flux taint.
+forbidden.research_page.ROD_tainted.1=Tainted Lands are places of great and terrible power for those Thaumaturges who know how to tap into them.
The Tainted Wand Core can store up to %d vis of each type and slowly replenishes itself up to 10%% in every aspect as long as it is being held inside of a Tainted Land. While the wand is held in your hand, it can also feed off of taint coursing through your veins, randomly restoring vis every time you take damage from flux taint.
#
forbidden.research_name.TAINTTREE=Tainted Tree
forbidden.research_text.TAINTTREE=The root of flux bears gross fruit
@@ -211,7 +211,7 @@ forbidden.research_page.TAINTSTONE.1=Tainted Lands aren't very safe places to be
#
forbidden.research_name.ROD_infernal=Infernal Wand Core
forbidden.research_text.ROD_infernal=Devilish vis storage
-forbidden.research_page.ROD_infernal.1=A great and powerful thaumaturge like you deserves a powerful and imposing wand befitting your station. Some hippy silverwood wand just won't cut it. You need a wand that will serve as your scepter of authority.
You've discovered a way to create a wand infused with the power of the Nether. The Infernal Wand Core can hold up to %s vis and will slowly replenish its supply of Ignis up to 20%. While within the Nether, the wand will also replenish its other aspects to 10%.
+forbidden.research_page.ROD_infernal.1=A great and powerful thaumaturge like you deserves a powerful and imposing wand befitting your station. Some hippy silverwood wand just won't cut it. You need a wand that will serve as your scepter of authority.
You've discovered a way to create a wand infused with the power of the Nether. The Infernal Wand Core can hold up to %s vis and will slowly replenish its supply of Ignis up to 20%%. While within the Nether, the wand will also replenish its other aspects to 10%%.
forbidden.research_page.ROD_infernal.2=The wand also imbues you with some protection from the Nether's hazards, extinguishing you if you are on fire or protecting you from the effects of Withering as long as it is in your inventory. While the wand is held in your hand, it will completely protect you from all fire damage.
#
forbidden.research_name.ROD_profane=Profane Wand
@@ -249,11 +249,11 @@ forbidden.research_page.ROD_dreamwood_staff.1=Livingwood is a useful material, b
#
forbidden.research_name.CAP_alchemical=Alchemical Caps
forbidden.research_text.CAP_alchemical=When Thaumium isn't bloody enough
-forbidden.research_page.CAP_alchemical.1=You've developed a wand cap that merges Thaumaturgy and Alchemical Wizardry. Alchemical Caps are very effective at channeling Aqua, only using %s% of the normal vis cost. For everything else, they offer only a %s% rate.
If combined with a Bloody Wand Core, Alchemical Caps discount the amount of LP consumed by the wand, costing only 900 LP per vis. The caps also cause all attacks from a blood wand to inflict Weakness.
+forbidden.research_page.CAP_alchemical.1=You've developed a wand cap that merges Thaumaturgy and Alchemical Wizardry. Alchemical Caps are very effective at channeling Aqua, only using %s%% of the normal vis cost. For everything else, they offer only a %s%% rate.
If combined with a Bloody Wand Core, Alchemical Caps discount the amount of LP consumed by the wand, costing only 900 LP per vis. The caps also cause all attacks from a blood wand to inflict Weakness.
#
forbidden.research_name.CAP_vinteum=Vinteum Caps
forbidden.research_text.CAP_vinteum=Magical wand caps
-forbidden.research_page.CAP_vinteum.1=By infusing a Thaumium cap with Vinteum, you create a cap that, when combined with a Witchwood Wand Core, lowers its mana cost to only %s% per point of vis.
The Thaumium cap seems to meld well with Vinteum, offering the same %s% vis rate.
+forbidden.research_page.CAP_vinteum.1=By infusing a Thaumium cap with Vinteum, you create a cap that, when combined with a Witchwood Wand Core, lowers its mana cost to only %s%% per point of vis.
The Thaumium cap seems to meld well with Vinteum, offering the same %s%% vis rate.
#
forbidden.research_name.CAP_soul=Ender Caps
forbidden.research_text.CAP_soul=Protection for your soul
@@ -261,7 +261,7 @@ forbidden.research_page.CAP_soul.1=You've created a wand cap that can safely cha
#
forbidden.research_name.CAP_manasteel=Manasteel Caps
forbidden.research_text.CAP_manasteel=The secret of mana
-forbidden.research_page.CAP_manasteel.1=Manasteel has very useful properties when it comes to mana manipulation. When crafted into a wand cap, it offers a %s% vis rate. If combined with a wand that can consume mana, it also makes the mana conversion process more efficient.
In order to be used in the creation of a wand, the Inert Manasteel Caps must be infused in a Mana Pool.
+forbidden.research_page.CAP_manasteel.1=Manasteel has very useful properties when it comes to mana manipulation. When crafted into a wand cap, it offers a %s%% vis rate. If combined with a wand that can consume mana, it also makes the mana conversion process more efficient.
In order to be used in the creation of a wand, the Inert Manasteel Caps must be infused in a Mana Pool.
#
forbidden.research_name.CAP_elementium=Elementium Caps
forbidden.research_text.CAP_elementium=Eco Friendly Wand Caps
From b7a685b15400f153dd43685fb8afc802984f5c3f Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:23:19 -0500
Subject: [PATCH 07/17] Fix more formatting
---
.../assets/forbidden/lang/en_US.lang | 20 +++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/src/main/resources/assets/forbidden/lang/en_US.lang b/src/main/resources/assets/forbidden/lang/en_US.lang
index e135b82..d9a57a4 100644
--- a/src/main/resources/assets/forbidden/lang/en_US.lang
+++ b/src/main/resources/assets/forbidden/lang/en_US.lang
@@ -199,7 +199,7 @@ forbidden.research_page.TAINTPICK.1=By infusing a thaumium pickaxe with taint, y
#
forbidden.research_name.ROD_tainted=Tainted Wand Core
forbidden.research_text.ROD_tainted=Squiggly vis storage
-forbidden.research_page.ROD_tainted.1=Tainted Lands are places of great and terrible power for those Thaumaturges who know how to tap into them.
The Tainted Wand Core can store up to %d vis of each type and slowly replenishes itself up to 10%% in every aspect as long as it is being held inside of a Tainted Land. While the wand is held in your hand, it can also feed off of taint coursing through your veins, randomly restoring vis every time you take damage from flux taint.
+forbidden.research_page.ROD_tainted.1=Tainted Lands are places of great and terrible power for those Thaumaturges who know how to tap into them.
The Tainted Wand Core can store up to %d vis of each type and slowly replenishes itself up to 10%% in every aspect as long as it is being held inside of a Tainted Land. While the wand is held in your hand, it can also feed off of taint coursing through your veins, randomly restoring vis every time you take damage from flux taint.
#
forbidden.research_name.TAINTTREE=Tainted Tree
forbidden.research_text.TAINTTREE=The root of flux bears gross fruit
@@ -211,8 +211,8 @@ forbidden.research_page.TAINTSTONE.1=Tainted Lands aren't very safe places to be
#
forbidden.research_name.ROD_infernal=Infernal Wand Core
forbidden.research_text.ROD_infernal=Devilish vis storage
-forbidden.research_page.ROD_infernal.1=A great and powerful thaumaturge like you deserves a powerful and imposing wand befitting your station. Some hippy silverwood wand just won't cut it. You need a wand that will serve as your scepter of authority.
You've discovered a way to create a wand infused with the power of the Nether. The Infernal Wand Core can hold up to %s vis and will slowly replenish its supply of Ignis up to 20%%. While within the Nether, the wand will also replenish its other aspects to 10%%.
-forbidden.research_page.ROD_infernal.2=The wand also imbues you with some protection from the Nether's hazards, extinguishing you if you are on fire or protecting you from the effects of Withering as long as it is in your inventory. While the wand is held in your hand, it will completely protect you from all fire damage.
+forbidden.research_page.ROD_infernal.1=A great and powerful thaumaturge like you deserves a powerful and imposing wand befitting your station. Some hippy silverwood wand just won't cut it. You need a wand that will serve as your scepter of authority.
You've discovered a way to create a wand infused with the power of the Nether. The Infernal Wand Core can hold up to %s vis and will slowly replenish its supply of Ignis up to 20%%. While within the Nether, the wand will also replenish its other aspects to 10%%.
+forbidden.research_page.ROD_infernal.2=The wand also imbues you with some protection from the Nether's hazards, extinguishing you if you are on fire or protecting you from the effects of Withering as long as it is in your inventory. While the wand is held in your hand, it will completely protect you from all fire damage.
#
forbidden.research_name.ROD_profane=Profane Wand
forbidden.research_text.ROD_profane=Sign on the dotted line
@@ -233,11 +233,11 @@ forbidden.research_page.ROD_blood_staff.1=The Blood Wand is useful, but it just
#
forbidden.research_name.ROD_witchwood=Witchwood Wand Core
forbidden.research_text.ROD_witchwood=Mana converter
-forbidden.research_page.ROD_witchwood.1=By creating a wand core out of Witchwood, you've discovered a way to convert mana into Vis. The Witchwood Wand Core holds up to %s vis and will gradually charge itself at the cost of 140 mana per point of vis.
Further research may reveal ways to lower this price.
+forbidden.research_page.ROD_witchwood.1=By creating a wand core out of Witchwood, you've discovered a way to convert mana into Vis. The Witchwood Wand Core holds up to %s vis and will gradually charge itself at the cost of 140 mana per point of vis.
Further research may reveal ways to lower this price.
#
forbidden.research_name.ROD_witchwood_staff=Witchwood Staff Core
forbidden.research_text.ROD_witchwood_staff=Staff of the Arcanist
-forbidden.research_page.ROD_witchwood_staff.1=The Witchwood Wand eats far too much magical power and charges far too slowly to stand up in sustained combat. It's time for something a little more efficient at channeling arcane power.
Unlike most staves, the Witchwood Staff can only hold %s vis. Its true strength lies in how quickly it recharges itself. The staff regains vis at over twice the rate of the Witchwood Wand. Furthermore, the staff uses considerably less magical power than the Witchwood Wand, only needing 100 mana per point of vis, if used without the appropriate cap.
+forbidden.research_page.ROD_witchwood_staff.1=The Witchwood Wand eats far too much magical power and charges far too slowly to stand up in sustained combat. It's time for something a little more efficient at channeling arcane power.
Unlike most staves, the Witchwood Staff can only hold %s vis. Its true strength lies in how quickly it recharges itself. The staff regains vis at over twice the rate of the Witchwood Wand. Furthermore, the staff uses considerably less magical power than the Witchwood Wand, only needing 100 mana per point of vis, if used without the appropriate cap.
#
forbidden.research_name.ROD_livingwood=Livingwood Wand Core
forbidden.research_text.ROD_livingwood=Botanical vis storage
@@ -249,23 +249,23 @@ forbidden.research_page.ROD_dreamwood_staff.1=Livingwood is a useful material, b
#
forbidden.research_name.CAP_alchemical=Alchemical Caps
forbidden.research_text.CAP_alchemical=When Thaumium isn't bloody enough
-forbidden.research_page.CAP_alchemical.1=You've developed a wand cap that merges Thaumaturgy and Alchemical Wizardry. Alchemical Caps are very effective at channeling Aqua, only using %s%% of the normal vis cost. For everything else, they offer only a %s%% rate.
If combined with a Bloody Wand Core, Alchemical Caps discount the amount of LP consumed by the wand, costing only 900 LP per vis. The caps also cause all attacks from a blood wand to inflict Weakness.
+forbidden.research_page.CAP_alchemical.1=You've developed a wand cap that merges Thaumaturgy and Alchemical Wizardry. Alchemical Caps are very effective at channeling Aqua, only using %d%% of the normal vis cost. For everything else, they offer only a %d%% rate.
If combined with a Bloody Wand Core, Alchemical Caps discount the amount of LP consumed by the wand, costing only 900 LP per vis. The caps also cause all attacks from a blood wand to inflict Weakness.
#
forbidden.research_name.CAP_vinteum=Vinteum Caps
forbidden.research_text.CAP_vinteum=Magical wand caps
-forbidden.research_page.CAP_vinteum.1=By infusing a Thaumium cap with Vinteum, you create a cap that, when combined with a Witchwood Wand Core, lowers its mana cost to only %s%% per point of vis.
The Thaumium cap seems to meld well with Vinteum, offering the same %s%% vis rate.
+forbidden.research_page.CAP_vinteum.1=By infusing a Thaumium cap with Vinteum, you create a cap that, when combined with a Witchwood Wand Core, lowers its mana cost to only %s%% per point of vis.
The Thaumium cap seems to meld well with Vinteum, offering a %d%% vis rate.
#
forbidden.research_name.CAP_soul=Ender Caps
forbidden.research_text.CAP_soul=Protection for your soul
-forbidden.research_page.CAP_soul.1=You've created a wand cap that can safely channel the destructive energy of The End. Ender Caps have an 80% vis rate on Perditio, but only 90% for other aspects.
When combined with an Eldritch Wand Core, Ender Caps also reduce the amount of corruption your soul suffers from channeling vis out of the End.
+forbidden.research_page.CAP_soul.1=You've created a wand cap that can safely channel the destructive energy of The End. Ender Caps have an 80% vis rate on Perditio, but only 90% for other aspects.
When combined with an Eldritch Wand Core, Ender Caps also reduce the amount of corruption your soul suffers from channeling vis out of the End.
#
forbidden.research_name.CAP_manasteel=Manasteel Caps
forbidden.research_text.CAP_manasteel=The secret of mana
-forbidden.research_page.CAP_manasteel.1=Manasteel has very useful properties when it comes to mana manipulation. When crafted into a wand cap, it offers a %s%% vis rate. If combined with a wand that can consume mana, it also makes the mana conversion process more efficient.
In order to be used in the creation of a wand, the Inert Manasteel Caps must be infused in a Mana Pool.
+forbidden.research_page.CAP_manasteel.1=Manasteel has very useful properties when it comes to mana manipulation. When crafted into a wand cap, it offers a %d%% vis rate. If combined with a wand that can consume mana, it also makes the mana conversion process more efficient.
In order to be used in the creation of a wand, the Inert Manasteel Caps must be infused in a Mana Pool.
#
forbidden.research_name.CAP_elementium=Elementium Caps
forbidden.research_text.CAP_elementium=Eco Friendly Wand Caps
-forbidden.research_page.CAP_elementium.1=Alfheim seems to be a world steeped in magical power, and Elementium is no exception. When crafted into a wand cap and treated with the right materials, Elementium Caps have an exceptional ability to channel vis. When combined with a wand or staff that uses mana, they'll also reduce the mana conversion rate.
Elementium's pretty pink color is just icing on the cake.
+forbidden.research_page.CAP_elementium.1=Alfheim seems to be a world steeped in magical power, and Elementium is no exception. When crafted into a wand cap and treated with the right materials, Elementium Caps have an exceptional ability to channel vis, giving a %d%% vis cost. When combined with a wand or staff that uses mana, they'll also reduce the mana conversion rate.
Elementium's pretty pink color is just icing on the cake.
#
forbidden.research_name.CAP_terrasteel=Terrasteel Caps
forbidden.research_text.CAP_terrasteel=Completion!
From 5fdf619d93d3605f72fa416c0879c1113987ca35 Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:23:27 -0500
Subject: [PATCH 08/17] Remove double spaces
---
.../assets/forbidden/lang/en_US.lang | 24 +++++++++----------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/main/resources/assets/forbidden/lang/en_US.lang b/src/main/resources/assets/forbidden/lang/en_US.lang
index d9a57a4..361bb3c 100644
--- a/src/main/resources/assets/forbidden/lang/en_US.lang
+++ b/src/main/resources/assets/forbidden/lang/en_US.lang
@@ -174,7 +174,7 @@ forbidden.research_page.NETHERSHARDS.3=Wrath Shards crystallize around acts of v
#
forbidden.research_name.SKULLAXE=Axe of the Skulltaker
forbidden.research_text.SKULLAXE=Off with their heads!
-forbidden.research_page.SKULLAXE.1=Some monsters just really boil your blood. Skeletons! Always clacking around and using you for target practice. Or those Creepers! They just creep around blowing things up like they own the place! You wish you could just chop all their smug heads off and place them on pikes.
Fortunately, you've discovered an item that will let you do just that. The Axe of the Skulltaker has a chance to remove the heads of monsters it slays. It might even work on other humans! Unfortunately, the infusion leaves the axe far too bloodthirsty to effectively cleave through boring plant matter.
+forbidden.research_page.SKULLAXE.1=Some monsters just really boil your blood. Skeletons! Always clacking around and using you for target practice. Or those Creepers! They just creep around blowing things up like they own the place! You wish you could just chop all their smug heads off and place them on pikes.
Fortunately, you've discovered an item that will let you do just that. The Axe of the Skulltaker has a chance to remove the heads of monsters it slays. It might even work on other humans! Unfortunately, the infusion leaves the axe far too bloodthirsty to effectively cleave through boring plant matter.
#
forbidden.research_name.RINGFOOD=Ring of Nutrition
forbidden.research_text.RINGFOOD=Cheese puffs prevent scurvy, right?
@@ -182,7 +182,7 @@ forbidden.research_page.RINGFOOD.1=People keep scolding you. They insist that yo
#
forbidden.research_name.ARCANECAKE=Thaumic Cake
forbidden.research_text.ARCANECAKE=Let them eat cake.
-forbidden.research_page.ARCANECAKE.1=If there's one thing you love, it's cake. You would eat its delicious goodness all day if you could, but it always runs out in the end.
To remedy this, you have devised a recipe to infuse a cake with longevity-enhancing magic. The Thaumic Cake lasts significantly longer than a mundane one and will slowly repair itself as long as there's at least a sliver left. The enchantments are unstable, however, and the cake cannot be moved again through conventional means once placed down.
+forbidden.research_page.ARCANECAKE.1=If there's one thing you love, it's cake. You would eat its delicious goodness all day if you could, but it always runs out in the end.
To remedy this, you have devised a recipe to infuse a cake with longevity-enhancing magic. The Thaumic Cake lasts significantly longer than a mundane one and will slowly repair itself as long as there's at least a sliver left. The enchantments are unstable, however, and the cake cannot be moved again through conventional means once placed down.
#
forbidden.research_name.FOCUSBLINK=Wand Focus: Blink
forbidden.research_text.FOCUSBLINK=Better than a stupid Ender Pearl
@@ -190,8 +190,8 @@ forbidden.research_page.FOCUSBLINK.1=Ugh.
The only thing that sucks more
#
forbidden.research_name.TAINTSHOVEL=Shovel of the Purifier
forbidden.research_text.TAINTSHOVEL=Like a hot knife through really gross butter
-forbidden.research_page.TAINTSHOVEL.1=Sometimes, the easiest way to remove patches of taint is to just physically remove them.
By reinforcing a thaumium shovel with Silverwood and Order Shards, you have created a tool capable of combating Taint. The Shovel of the Purifier can dig through pulpy tainted lands as effectively as it can through normal earth.
If held in your hand and right-clicked, the shovel will purify all flux goo and gas from a small radius at the cost of durability. You no longer have to clean up infusion mishaps with a piece of cobblestone!
-forbidden.research_page.TAINTSHOVEL.2=When digging through taint with the shovel, there's a chance that the twisted energies released will crystallize into Taint Shards. Unlike other tainted materials, the crystalline pattern keeps these shards stable enough to carry around.
+forbidden.research_page.TAINTSHOVEL.1=Sometimes, the easiest way to remove patches of taint is to just physically remove them.
By reinforcing a thaumium shovel with Silverwood and Order Shards, you have created a tool capable of combating Taint. The Shovel of the Purifier can dig through pulpy tainted lands as effectively as it can through normal earth.
If held in your hand and right-clicked, the shovel will purify all flux goo and gas from a small radius at the cost of durability. You no longer have to clean up infusion mishaps with a piece of cobblestone!
+forbidden.research_page.TAINTSHOVEL.2=When digging through taint with the shovel, there's a chance that the twisted energies released will crystallize into Taint Shards. Unlike other tainted materials, the crystalline pattern keeps these shards stable enough to carry around.
#
forbidden.research_name.TAINTPICK=Pickaxe of Distortion
forbidden.research_text.TAINTPICK=Obsidian Buster
@@ -277,18 +277,18 @@ forbidden.research_page.TRANSEMERALD.1=You have discovered a way to multiply eme
#
forbidden.research_name.BLACKFLOWER=Umbral Rose
forbidden.research_text.BLACKFLOWER=Save the squid!
-forbidden.research_page.BLACKFLOWER.1=There's no sight more pathetic than a soggy Thaumaturge. For all your great and miraculous powers, you still have to go jump in the nearest lake and hunt for squids every time you want to refill your inkwell.
You're done squid hunting. By infusing a rose with tenebrae and victus, you create a flower that spreads like a weed and whose petals can be crushed for ink.
+forbidden.research_page.BLACKFLOWER.1=There's no sight more pathetic than a soggy Thaumaturge. For all your great and miraculous powers, you still have to go jump in the nearest lake and hunt for squids every time you want to refill your inkwell.
You're done squid hunting. By infusing a rose with tenebrae and victus, you create a flower that spreads like a weed and whose petals can be crushed for ink.
#
forbidden.research_name.WRATHCAGE=Wrath Cage
forbidden.research_text.WRATHCAGE=Neverending battle
forbidden.research_page.WRATHCAGE.1=Sometimes, it's not enough to just kill something. Sure, slaying a single monster may be rather cathartic, but imagine just mowing down a crowd of the obnoxious little jerks.
To that end, you've discovered a way to recreate the monster spawners found in the ancient ruins. Unlike the original monster spawners, the Wrath Cage responds to redstone controls instead of the presence of human beings and can run much faster than the ancient devices.
forbidden.research_page.WRATHCAGE.2=However, you haven't been able to duplicate the original method of infinite creation. For every creature spawned, the Wrath Cage requires a bit of essentia piped into its internal reserves. The device will accept different types of essentia depending on the creature it is attuned to. Alternatively, piping Ira into the cage can serve as a fuel. The cage can also accept Desidia for some reason.
Right-clicking the Wrath Cage with a Diabolist Fork will cycle the cage between the different fuel types, changing which essentia it applies suction to.
-forbidden.research_page.WRATHCAGE.3=To attune a wrath cage to a specific creature, right click on it with an imprinted crystal. Slaying a compatible creature with a Diabolist Fork while carrying a blank imprinting crystal will attune the crystal to that monster.
+forbidden.research_page.WRATHCAGE.3=To attune a wrath cage to a specific creature, right click on it with an imprinted crystal. Slaying a compatible creature with a Diabolist Fork while carrying a blank imprinting crystal will attune the crystal to that monster.
#
forbidden.research_name.FORK=Diabolist Fork
forbidden.research_text.FORK=Arcane tinkering tool
forbidden.research_page.FORK.1=You've created a tool to help you tinker with various infernal contraptions. The quartz prongs on the Diabolist Fork allow it to attune itself to arcane energies.
Along with being used to tune devices, the fork also makes for a functional weapon.
More information should appear in the following pages as you uncover more research.
-forbidden.research_page.FORK.wc=If the Diabolist Fork is used to slay a compatible creature with a Blank Imprinting Crystal in your inventory, it will imprint on the crystal. The Imprinted Crystal can then be used to attune a Wrath Cage to that monster.
The fork can also be used to adjust which essentia type a Wrath Cage is using for fuel. Simply right click on the Wrath Cage with the Diabolist Fork to cycle between the three different fuel types.
+forbidden.research_page.FORK.wc=If the Diabolist Fork is used to slay a compatible creature with a Blank Imprinting Crystal in your inventory, it will imprint on the crystal. The Imprinted Crystal can then be used to attune a Wrath Cage to that monster.
The fork can also be used to adjust which essentia type a Wrath Cage is using for fuel. Simply right click on the Wrath Cage with the Diabolist Fork to cycle between the three different fuel types.
#
forbidden.research_name.MORPHTOOLS=Chameleon Tools
forbidden.research_text.MORPHTOOLS=There's an enchantment for that...
@@ -296,7 +296,7 @@ forbidden.research_page.MORPHTOOLS.1=Chameleon Tools are like three tools in one
#
forbidden.research_name.CLUSTER=Enchantment: Fiery Core
forbidden.research_text.CLUSTER=Chameleon of the Core
-forbidden.research_page.CLUSTER.1=You've discovered an enchantment to allow the Chameleon Pickaxe to imitate the effects of the Pickaxe of the Core. A Chameleon Pickaxe with the Fiery Core enchantment has a chance of dropping clusters when mining certain ores. Clusters are a lot purer than raw ore and can be smelted for two of the ore's normal smelting result. Higher levels of Fiery Core increase the chance of dropping clusters.
+forbidden.research_page.CLUSTER.1=You've discovered an enchantment to allow the Chameleon Pickaxe to imitate the effects of the Pickaxe of the Core. A Chameleon Pickaxe with the Fiery Core enchantment has a chance of dropping clusters when mining certain ores. Clusters are a lot purer than raw ore and can be smelted for two of the ore's normal smelting result. Higher levels of Fiery Core increase the chance of dropping clusters.
#
forbidden.research_name.IMPACT=Enchantment: Impact
forbidden.research_text.IMPACT=Someday that wall is gonna fall.
@@ -308,7 +308,7 @@ forbidden.research_page.GREEDY.1=You've discovered a weapon enchantment that all
#
forbidden.research_name.CONSUMING=Enchantment: Consuming
forbidden.research_text.CONSUMING=Garbage Disposal
-forbidden.research_page.CONSUMING.1=Sick of having to empty your pack of worthless junk, you've devised an enchantment that will automatically destroy common, unwanted materials. Any Cobblestone, Dirt, Gravel, or Netherrack mined by a Consuming tool will be destroyed instead of falling to the ground.
+forbidden.research_page.CONSUMING.1=Sick of having to empty your pack of worthless junk, you've devised an enchantment that will automatically destroy common, unwanted materials. Any Cobblestone, Dirt, Gravel, or Netherrack mined by a Consuming tool will be destroyed instead of falling to the ground.
#
forbidden.research_name.WRATH=Enchantment: Wrath
forbidden.research_text.WRATH=When every problem is a nail, all you want is a bigger hammer.
@@ -320,7 +320,7 @@ forbidden.research_page.EDUCATIONAL.1=You've created an enchantment to infuse a
#
forbidden.research_name.CORRUPTING=Enchantment: Corrupting
forbidden.research_text.CORRUPTING=A bad influence on shards
-forbidden.research_page.CORRUPTING.1=The Nether is great and all, but it's also kind of a... Hell Hole.
The Corrupting enchant allows you to harvest Nether Shards without having to be in the Nether. A pickaxe enchanted with Corrupting will randomly corrupt harvested elemental shards, changing them into nether shards. The shards only seem susceptible while they are encased in infused stone, so corrupting a shard cluster will have no effect.
+forbidden.research_page.CORRUPTING.1=The Nether is great and all, but it's also kind of a... Hell Hole.
The Corrupting enchant allows you to harvest Nether Shards without having to be in the Nether. A pickaxe enchanted with Corrupting will randomly corrupt harvested elemental shards, changing them into nether shards. The shards only seem susceptible while they are encased in infused stone, so corrupting a shard cluster will have no effect.
#
forbidden.research_name.VOIDTOUCHED=Enchantment: Voidtouched
forbidden.research_text.VOIDTOUCHED=Colour Out of Space
@@ -366,11 +366,11 @@ forbidden.research_page.PRIMEWELL.1=You've learned things humans weren't meant t
#
forbidden.research_name.RIDINGCROP=Riding Crop
forbidden.research_text.RIDINGCROP=Motivating Pain
-forbidden.research_page.RIDINGCROP.1=A riding crop is, as its name suggests, a tool used to motivate mounts to move faster. Right clicking with it in your hand while riding a horse or other mount will give the mount a quick lash of pain and cause it to move faster for a little while.
You could hit other creatures with the crop too, but what would possess you to do something like that?
+forbidden.research_page.RIDINGCROP.1=A riding crop is, as its name suggests, a tool used to motivate mounts to move faster. Right clicking with it in your hand while riding a horse or other mount will give the mount a quick lash of pain and cause it to move faster for a little while.
You could hit other creatures with the crop too, but what would possess you to do something like that?
#
forbidden.research_name.HELLFIRE=Lord of Hellfire
forbidden.research_text.HELLFIRE=Never get stranded again
-forbidden.research_page.HELLFIRE.1=Getting stranded in the Nether is the worst. You go through all the trouble of grabbing what you need, but before you can go home, some stupid ghast decides to rain on your parade by blasting the portal shut. Sure, this can be amended by carrying a flint and steel around, but who actually walks around with those things?
You've discovered a way to use vis in your wand to light fires on certain materials. Right click with a focus-less wand in your hand on the top of netherrack or obsidian to light a flame using some Ignis from your wand.
+forbidden.research_page.HELLFIRE.1=Getting stranded in the Nether is the worst. You go through all the trouble of grabbing what you need, but before you can go home, some stupid ghast decides to rain on your parade by blasting the portal shut. Sure, this can be amended by carrying a flint and steel around, but who actually walks around with those things?
You've discovered a way to use vis in your wand to light fires on certain materials. Right click with a focus-less wand in your hand on the top of netherrack or obsidian to light a flame using some Ignis from your wand.
#
forbidden.research_name.EUCLIDAISY=Euclidaisy
forbidden.research_text.EUCLIDAISY=Mai waifu's power level is over 9000 in the name of the moon! Believe it!
From 7c65f81b92d3c4ea69836d4ace63cb7f9b97b575 Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:23:44 -0500
Subject: [PATCH 09/17] Add discount to elementium cap page
---
.../java/fox/spiteful/forbidden/compat/ForbiddenBotany.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
index f779116..5493185 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
@@ -202,7 +202,7 @@ public static void flowerPowerHippymancy() {
3,
4,
new ItemStack(ForbiddenItems.wandCap, 1, 5))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CAP_elementium.1"),
+ new ResearchPage[] { new FormattedResearchPage("forbidden.research_page.CAP_elementium.1", new Double[] {Config.elementiumDiscount * 100}),
new ResearchPage(elementium_cap_inert), new ResearchPage(elementium_cap) })
.setParents(new String[] { "ROD_dreamwood_staff" }).setConcealed()
.registerResearchItem();
From 9f01c88b9f6165dbcbb8195fe6e55d2080ea77df Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:26:33 -0500
Subject: [PATCH 10/17] Spotless
---
src/main/java/fox/spiteful/forbidden/Forbidden.java | 3 ---
.../java/fox/spiteful/forbidden/compat/ForbiddenBotany.java | 5 ++++-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/java/fox/spiteful/forbidden/Forbidden.java b/src/main/java/fox/spiteful/forbidden/Forbidden.java
index 2403d38..1a5179d 100644
--- a/src/main/java/fox/spiteful/forbidden/Forbidden.java
+++ b/src/main/java/fox/spiteful/forbidden/Forbidden.java
@@ -1,8 +1,5 @@
package fox.spiteful.forbidden;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.resources.IReloadableResourceManager;
-import net.minecraft.client.resources.IResourceManager;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
diff --git a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
index 5493185..f0079b9 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
@@ -202,7 +202,10 @@ public static void flowerPowerHippymancy() {
3,
4,
new ItemStack(ForbiddenItems.wandCap, 1, 5))).setPages(
- new ResearchPage[] { new FormattedResearchPage("forbidden.research_page.CAP_elementium.1", new Double[] {Config.elementiumDiscount * 100}),
+ new ResearchPage[] {
+ new FormattedResearchPage(
+ "forbidden.research_page.CAP_elementium.1",
+ new Double[] { Config.elementiumDiscount * 100 }),
new ResearchPage(elementium_cap_inert), new ResearchPage(elementium_cap) })
.setParents(new String[] { "ROD_dreamwood_staff" }).setConcealed()
.registerResearchItem();
From c98ce43a8f56c6fff1553aa3c126498f0c8289bb Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:33:13 -0500
Subject: [PATCH 11/17] Clean up research classes
---
.../spiteful/forbidden/ForbiddenResearch.java | 268 ++++++++----------
.../spiteful/forbidden/compat/BloodMagic.java | 76 ++---
.../forbidden/compat/ForbiddenBotany.java | 129 +++++----
3 files changed, 238 insertions(+), 235 deletions(-)
diff --git a/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java b/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
index 4e2f290..1321744 100644
--- a/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
+++ b/src/main/java/fox/spiteful/forbidden/ForbiddenResearch.java
@@ -44,9 +44,9 @@ public static void addResearch() {
1,
new ItemStack(ForbiddenItems.crystalwell, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CRYSTALWELL.1"),
- new ResearchPage((IArcaneRecipe) recipes.get("Crystalwell")) })
- .setParents(new String[] { "RESEARCH" }).registerResearchItem();
+ new ResearchPage("forbidden.research_page.CRYSTALWELL.1"),
+ new ResearchPage((IArcaneRecipe) recipes.get("Crystalwell")))
+ .setParents("RESEARCH").registerResearchItem();
else(new DarkResearchItem(
"CRYSTALWELL",
"FORBIDDEN",
@@ -56,9 +56,9 @@ public static void addResearch() {
1,
new ItemStack(ForbiddenItems.crystalwell, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CRYSTALWELL.1b"),
- new ResearchPage((IArcaneRecipe) recipes.get("Crystalwell")) })
- .setParents(new String[] { "RESEARCH" }).registerResearchItem();
+ new ResearchPage("forbidden.research_page.CRYSTALWELL.1b"),
+ new ResearchPage((IArcaneRecipe) recipes.get("Crystalwell")))
+ .setParents("RESEARCH").registerResearchItem();
(new DarkResearchItem(
"PRIMEWELL",
@@ -69,9 +69,9 @@ public static void addResearch() {
1,
new ItemStack(ForbiddenItems.primewell, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.PRIMEWELL.1"),
- new ResearchPage((IArcaneRecipe) recipes.get("Primewell")) })
- .setParents(new String[] { "PRIMPEARL" }).setConcealed().registerResearchItem();
+ new ResearchPage("forbidden.research_page.PRIMEWELL.1"),
+ new ResearchPage((IArcaneRecipe) recipes.get("Primewell")))
+ .setParents("PRIMPEARL").setConcealed().registerResearchItem();
if (Config.emeraldTrans) (new DarkResearchItem(
"TRANSEMERALD",
"FORBIDDEN",
@@ -81,9 +81,9 @@ public static void addResearch() {
3,
new ItemStack(ForbiddenItems.resource, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.TRANSEMERALD.1"),
- new ResearchPage((CrucibleRecipe) recipes.get("TransEmerald")) })
- .setSecondary().setConcealed().setParents(new String[] { "TRANSGOLD" }).registerResearchItem();
+ new ResearchPage("forbidden.research_page.TRANSEMERALD.1"),
+ new ResearchPage((CrucibleRecipe) recipes.get("TransEmerald")))
+ .setSecondary().setConcealed().setParents("TRANSGOLD").registerResearchItem();
(new DarkResearchItem(
"BLACKFLOWER",
"FORBIDDEN",
@@ -93,10 +93,10 @@ public static void addResearch() {
1,
new ItemStack(ForbiddenBlocks.blackFlower, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.BLACKFLOWER.1"),
- new ResearchPage((CrucibleRecipe) recipes.get("BlackFlower")),
- new ResearchPage((IRecipe) recipes.get("BlackInk")) })
- .setAspectTriggers(new Aspect[] { Aspect.SENSES }).registerResearchItem();
+ new ResearchPage("forbidden.research_page.BLACKFLOWER.1"),
+ new ResearchPage((CrucibleRecipe) recipes.get("BlackFlower")),
+ new ResearchPage((IRecipe) recipes.get("BlackInk")))
+ .setAspectTriggers(Aspect.SENSES).registerResearchItem();
(new DarkResearchItem(
"RIDINGCROP",
"FORBIDDEN",
@@ -106,8 +106,8 @@ public static void addResearch() {
0,
new ItemStack(ForbiddenItems.ridingCrop)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.RIDINGCROP.1"),
- new ResearchPage((IRecipe) recipes.get("RidingCrop")) })
+ new ResearchPage("forbidden.research_page.RIDINGCROP.1"),
+ new ResearchPage((IRecipe) recipes.get("RidingCrop")))
.setStub().setRound().setAutoUnlock().registerResearchItem();
if (Config.enchanting) {
@@ -120,10 +120,9 @@ public static void addResearch() {
1,
new ResourceLocation("forbidden", "textures/misc/consuming.png")))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CONSUMING.1"),
- new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Consuming")) })
- .setParents(new String[] { "INFUSIONENCHANTMENT" }).setSecondary().setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.CONSUMING.1"),
+ new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Consuming")))
+ .setParents("INFUSIONENCHANTMENT").setSecondary().setConcealed().registerResearchItem();
(new DarkResearchItem(
"EDUCATIONAL",
"FORBIDDEN",
@@ -133,10 +132,9 @@ public static void addResearch() {
2,
new ResourceLocation("forbidden", "textures/misc/educational.png")))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.EDUCATIONAL.1"),
- new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Educational")) })
- .setParents(new String[] { "INFUSIONENCHANTMENT" }).setSecondary().setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.EDUCATIONAL.1"),
+ new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Educational")))
+ .setParents("INFUSIONENCHANTMENT").setSecondary().setConcealed().registerResearchItem();
}
if (Compat.botan || Compat.bm || Compat.am2) (new DarkResearchItem(
@@ -146,8 +144,7 @@ public static void addResearch() {
-1,
1,
0,
- new ItemStack(Blocks.enchanting_table)))
- .setPages(new ResearchPage[] { new ResearchPage("forbidden.research_page.SCHOOLS.1") })
+ new ItemStack(Blocks.enchanting_table))).setPages(new ResearchPage("forbidden.research_page.SCHOOLS.1"))
.setRound().setStub().setAutoUnlock().registerResearchItem();
}
@@ -161,9 +158,9 @@ public static void addInfernalism() {
0,
new ItemStack(ForbiddenItems.deadlyShards, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.NETHERSHARDS.1"),
- new ResearchPage("forbidden.research_page.NETHERSHARDS.2"),
- new ResearchPage("forbidden.research_page.NETHERSHARDS.3") })
+ new ResearchPage("forbidden.research_page.NETHERSHARDS.1"),
+ new ResearchPage("forbidden.research_page.NETHERSHARDS.2"),
+ new ResearchPage("forbidden.research_page.NETHERSHARDS.3"))
.setStub().setRound().setAutoUnlock().registerResearchItem();
else(new DarkResearchItem(
"NETHERSHARDS",
@@ -174,9 +171,9 @@ public static void addInfernalism() {
0,
new ItemStack(ForbiddenItems.deadlyShards, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.NETHERSHARDS.1"),
- new ResearchPage("forbidden.research_page.NETHERSHARDS.2b"),
- new ResearchPage("forbidden.research_page.NETHERSHARDS.3") })
+ new ResearchPage("forbidden.research_page.NETHERSHARDS.1"),
+ new ResearchPage("forbidden.research_page.NETHERSHARDS.2b"),
+ new ResearchPage("forbidden.research_page.NETHERSHARDS.3"))
.setStub().setRound().setAutoUnlock().registerResearchItem();
(new DarkResearchItem(
@@ -186,11 +183,9 @@ public static void addInfernalism() {
-8,
-8,
1,
- new ItemStack(Blocks.fire)))
- .setPages(new ResearchPage[] { new ResearchPage("forbidden.research_page.HELLFIRE.1") })
- .setRound().registerResearchItem().setHidden()
- .setAspectTriggers(new Aspect[] { DarkAspects.NETHER })
- .setParents(new String[] { "NETHERSHARDS" });
+ new ItemStack(Blocks.fire))).setPages(new ResearchPage("forbidden.research_page.HELLFIRE.1")).setRound()
+ .registerResearchItem().setHidden().setAspectTriggers(DarkAspects.NETHER)
+ .setParents("NETHERSHARDS");
(new DarkResearchItem(
"ROD_profane",
"FORBIDDEN",
@@ -199,9 +194,8 @@ public static void addInfernalism() {
-8,
0,
new ItemStack(ForbiddenItems.wandCore, 1, 5)))
- .setPages(new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_profane.1") })
- .setRound().registerResearchItem().setHidden().setParents(new String[] { "NETHERSHARDS" })
- .setStub();
+ .setPages(new ResearchPage("forbidden.research_page.ROD_profane.1")).setRound()
+ .registerResearchItem().setHidden().setParents("NETHERSHARDS").setStub();
if (!Config.noLust) (new DarkResearchItem(
"SUBCOLLAR",
"FORBIDDEN",
@@ -212,10 +206,10 @@ public static void addInfernalism() {
2,
new ItemStack(ForbiddenItems.subCollar)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.SUBCOLLAR.1"),
- new ResearchPage((InfusionRecipe) recipes.get("SubCollar")) })
- .setParents(new String[] { "NETHERSHARDS", "VISAMULET", "INFUSION" }).setHidden()
- .setAspectTriggers(new Aspect[] { DarkAspects.LUST }).registerResearchItem();
+ new ResearchPage("forbidden.research_page.SUBCOLLAR.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("SubCollar")))
+ .setParents("NETHERSHARDS", "VISAMULET", "INFUSION").setHidden()
+ .setAspectTriggers(DarkAspects.LUST).registerResearchItem();
(new DarkResearchItem(
"SKULLAXE",
@@ -226,10 +220,9 @@ public static void addInfernalism() {
2,
new ItemStack(ForbiddenItems.skullAxe)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.SKULLAXE.1"),
- new ResearchPage((InfusionRecipe) recipes.get("SkullAxe")) })
- .setParents(new String[] { "NETHERSHARDS", "THAUMIUM", "INFUSION" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.SKULLAXE.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("SkullAxe")))
+ .setParents("NETHERSHARDS", "THAUMIUM", "INFUSION").setConcealed().registerResearchItem();
ThaumcraftApi.addWarpToResearch("SKULLAXE", 1);
if (Config.gluttony != 1) {
(new DarkResearchItem(
@@ -241,9 +234,9 @@ public static void addInfernalism() {
2,
new ItemStack(ForbiddenItems.ringFood)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.RINGFOOD.1"),
- new ResearchPage((IArcaneRecipe) recipes.get("RingFood")) })
- .setParents(new String[] { "NETHERSHARDS" }).registerResearchItem();
+ new ResearchPage("forbidden.research_page.RINGFOOD.1"),
+ new ResearchPage((IArcaneRecipe) recipes.get("RingFood")))
+ .setParents("NETHERSHARDS").registerResearchItem();
(new DarkResearchItem(
"ARCANECAKE",
"FORBIDDEN",
@@ -253,11 +246,10 @@ public static void addInfernalism() {
2,
new ItemStack(ForbiddenItems.arcaneCakeItem)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ARCANECAKE.1"),
- new ResearchPage((InfusionRecipe) recipes.get("ArcaneCake")) })
- .setParents(new String[] { "NETHERSHARDS", "INFUSION" })
- .setAspectTriggers(new Aspect[] { DarkAspects.GLUTTONY }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.ARCANECAKE.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("ArcaneCake")))
+ .setParents("NETHERSHARDS", "INFUSION").setAspectTriggers(DarkAspects.GLUTTONY)
+ .setConcealed().registerResearchItem();
}
(new DarkResearchItem(
"FOCUSBLINK",
@@ -269,9 +261,9 @@ public static void addInfernalism() {
2,
new ItemStack(ForbiddenItems.blinkFocus)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.FOCUSBLINK.1"),
- new ResearchPage((InfusionRecipe) recipes.get("FocusBlink")) })
- .setConcealed().setParents(new String[] { "NETHERSHARDS", "INFUSION" }).registerResearchItem();
+ new ResearchPage("forbidden.research_page.FOCUSBLINK.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("FocusBlink")))
+ .setConcealed().setParents("NETHERSHARDS", "INFUSION").registerResearchItem();
(new DarkResearchItem(
"MORPHTOOLS",
"FORBIDDEN",
@@ -281,13 +273,13 @@ public static void addInfernalism() {
4,
new ItemStack(ForbiddenItems.morphPickaxe)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.MORPHTOOLS.1"),
- new ResearchPage((InfusionRecipe) recipes.get("MorphPick")),
- new ResearchPage((InfusionRecipe) recipes.get("MorphSword")),
- new ResearchPage((InfusionRecipe) recipes.get("MorphShovel")),
- new ResearchPage((InfusionRecipe) recipes.get("MorphAxe")) })
- .setParentsHidden(new String[] { "THAUMIUM", "INFUSIONENCHANTMENT" })
- .setParents(new String[] { "NETHERSHARDS" }).setConcealed().registerResearchItem();
+ new ResearchPage("forbidden.research_page.MORPHTOOLS.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("MorphPick")),
+ new ResearchPage((InfusionRecipe) recipes.get("MorphSword")),
+ new ResearchPage((InfusionRecipe) recipes.get("MorphShovel")),
+ new ResearchPage((InfusionRecipe) recipes.get("MorphAxe")))
+ .setParentsHidden("THAUMIUM", "INFUSIONENCHANTMENT").setParents("NETHERSHARDS").setConcealed()
+ .registerResearchItem();
ThaumcraftApi.addWarpToResearch("MORPHTOOLS", 4);
(new DarkResearchItem(
"ROD_infernal",
@@ -298,14 +290,12 @@ public static void addInfernalism() {
3,
new ItemStack(ForbiddenItems.wandCore, 1, 1)))
.setPages(
- new ResearchPage[] {
- new FormattedResearchPage(
- "forbidden.research_page.ROD_infernal.1",
- new Integer[] { Config.infernalCoreCap }),
- new ResearchPage((InfusionRecipe) recipes.get("WandRodInfernal")),
- new ResearchPage("forbidden.research_page.ROD_infernal.2") })
- .setParents(new String[] { "ROD_silverwood", "INFUSION", "NETHERSHARDS" }).setConcealed()
- .registerResearchItem();
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_infernal.1",
+ new Integer[] { Config.infernalCoreCap }),
+ new ResearchPage((InfusionRecipe) recipes.get("WandRodInfernal")),
+ new ResearchPage("forbidden.research_page.ROD_infernal.2"))
+ .setParents("ROD_silverwood", "INFUSION", "NETHERSHARDS").setConcealed().registerResearchItem();
ThaumcraftApi.addWarpToResearch("ROD_infernal", 2);
if (Config.enchanting) {
@@ -318,10 +308,9 @@ public static void addInfernalism() {
4,
new ResourceLocation("forbidden", "textures/misc/wrath.png")))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.WRATH.1"),
- new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Wrath")) })
- .setParents(new String[] { "NETHERSHARDS", "INFUSIONENCHANTMENT" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.WRATH.1"),
+ new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Wrath")))
+ .setParents("NETHERSHARDS", "INFUSIONENCHANTMENT").setConcealed().registerResearchItem();
ThaumcraftApi.addWarpToResearch("WRATH", 3);
if (Config.greedyEnch) (new DarkResearchItem(
"GREEDY",
@@ -332,10 +321,9 @@ public static void addInfernalism() {
2,
new ResourceLocation("forbidden", "textures/misc/greedy.png")))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.GREEDY.1"),
- new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Greedy")) })
- .setParents(new String[] { "NETHERSHARDS", "INFUSIONENCHANTMENT" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.GREEDY.1"),
+ new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Greedy")))
+ .setParents("NETHERSHARDS", "INFUSIONENCHANTMENT").setConcealed().registerResearchItem();
(new DarkResearchItem(
"CORRUPTING",
"FORBIDDEN",
@@ -345,10 +333,9 @@ public static void addInfernalism() {
1,
new ResourceLocation("forbidden", "textures/misc/corrupting.png")))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CORRUPTING.1"),
- new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Corrupting")) })
- .setParents(new String[] { "NETHERSHARDS", "INFUSIONENCHANTMENT" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.CORRUPTING.1"),
+ new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Corrupting")))
+ .setParents("NETHERSHARDS", "INFUSIONENCHANTMENT").setConcealed().registerResearchItem();
(new DarkResearchItem(
"CLUSTER",
@@ -359,9 +346,9 @@ public static void addInfernalism() {
3,
new ResourceLocation("forbidden", "textures/misc/lucrative.png")))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CLUSTER.1"),
- new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Cluster")) })
- .setParents(new String[] { "MORPHTOOLS", "ELEMENTALPICK" }).setSecondary().setConcealed()
+ new ResearchPage("forbidden.research_page.CLUSTER.1"),
+ new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Cluster")))
+ .setParents("MORPHTOOLS", "ELEMENTALPICK").setSecondary().setConcealed()
.registerResearchItem();
(new DarkResearchItem(
"IMPACT",
@@ -373,10 +360,9 @@ public static void addInfernalism() {
3,
new ResourceLocation("forbidden", "textures/misc/impact.png")))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.IMPACT.1"),
- new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Impact")) })
- .setParents(new String[] { "MORPHTOOLS", "ELEMENTALSHOVEL" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.IMPACT.1"),
+ new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Impact")))
+ .setParents("MORPHTOOLS", "ELEMENTALSHOVEL").setConcealed().registerResearchItem();
(new DarkResearchItem(
"VOIDTOUCHED",
"FORBIDDEN",
@@ -387,10 +373,9 @@ public static void addInfernalism() {
4,
new ResourceLocation("forbidden", "textures/misc/voidtouched.png")))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.VOIDTOUCHED.1"),
- new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Voidtouched")) })
- .setParents(new String[] { "MORPHTOOLS", "VOIDMETAL" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.VOIDTOUCHED.1"),
+ new ResearchPage((InfusionEnchantmentRecipe) recipes.get("Voidtouched")))
+ .setParents("MORPHTOOLS", "VOIDMETAL").setConcealed().registerResearchItem();
ThaumcraftApi.addWarpToResearch("VOIDTOUCHED", 3);
}
@@ -404,11 +389,11 @@ public static void addInfernalism() {
0,
new ItemStack(ForbiddenItems.fork)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.FORK.1"),
- new ResearchPage((InfusionRecipe) recipes.get("Fork")),
- new ResearchPage("WRATHCAGE", "forbidden.research_page.FORK.wc") })
- .setParents(new String[] { "INFUSION", "NETHERSHARDS", "THAUMIUM" }).setSecondary()
- .setConcealed().registerResearchItem();
+ new ResearchPage("forbidden.research_page.FORK.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("Fork")),
+ new ResearchPage("WRATHCAGE", "forbidden.research_page.FORK.wc"))
+ .setParents("INFUSION", "NETHERSHARDS", "THAUMIUM").setSecondary().setConcealed()
+ .registerResearchItem();
if (Config.wrathCost > 0) (new DarkResearchItem(
"WRATHCAGE",
"FORBIDDEN",
@@ -418,14 +403,13 @@ public static void addInfernalism() {
4,
new ItemStack(ForbiddenBlocks.wrathCage)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.WRATHCAGE.1"),
- new ResearchPage((InfusionRecipe) recipes.get("WrathCage")),
- new ResearchPage("forbidden.research_page.WRATHCAGE.2"),
- new ResearchPage("forbidden.research_page.WRATHCAGE.3"),
- new ResearchPage((CrucibleRecipe) recipes.get("MobCrystal")) })
- .setParents(new String[] { "FORK" })
- .setParentsHidden(new String[] { "INFUSION", "THAUMIUM", "DISTILESSENTIA" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.WRATHCAGE.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("WrathCage")),
+ new ResearchPage("forbidden.research_page.WRATHCAGE.2"),
+ new ResearchPage("forbidden.research_page.WRATHCAGE.3"),
+ new ResearchPage((CrucibleRecipe) recipes.get("MobCrystal")))
+ .setParents("FORK").setParentsHidden("INFUSION", "THAUMIUM", "DISTILESSENTIA")
+ .setConcealed().registerResearchItem();
else(new DarkResearchItem(
"WRATHCAGE",
"FORBIDDEN",
@@ -435,13 +419,12 @@ public static void addInfernalism() {
4,
new ItemStack(ForbiddenBlocks.wrathCage)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.WRATHCAGE.1"),
- new ResearchPage((InfusionRecipe) recipes.get("WrathCage")),
- new ResearchPage("forbidden.research_page.WRATHCAGE.3"),
- new ResearchPage((CrucibleRecipe) recipes.get("MobCrystal")) })
- .setParents(new String[] { "FORK" })
- .setParentsHidden(new String[] { "INFUSION", "THAUMIUM", "DISTILESSENTIA" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.WRATHCAGE.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("WrathCage")),
+ new ResearchPage("forbidden.research_page.WRATHCAGE.3"),
+ new ResearchPage((CrucibleRecipe) recipes.get("MobCrystal")))
+ .setParents("FORK").setParentsHidden("INFUSION", "THAUMIUM", "DISTILESSENTIA")
+ .setConcealed().registerResearchItem();
ThaumcraftApi.addWarpToResearch("WRATHCAGE", 3);
ThaumcraftApi.addWarpToItem(new ItemStack(ForbiddenBlocks.wrathCage, 1), 5);
}
@@ -457,11 +440,10 @@ public static void addTaint() {
2,
new ItemStack(ForbiddenItems.taintShovel)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.TAINTSHOVEL.1"),
- new ResearchPage((InfusionRecipe) recipes.get("TaintShovel")),
- new ResearchPage("forbidden.research_page.TAINTSHOVEL.2") })
- .setParents(new String[] { "THAUMIUM", "INFUSION", "ETHEREALBLOOM" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.TAINTSHOVEL.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("TaintShovel")),
+ new ResearchPage("forbidden.research_page.TAINTSHOVEL.2"))
+ .setParents("THAUMIUM", "INFUSION", "ETHEREALBLOOM").setConcealed().registerResearchItem();
(new DarkResearchItem(
"TAINTPICK",
"FORBIDDEN",
@@ -471,9 +453,9 @@ public static void addTaint() {
2,
new ItemStack(ForbiddenItems.taintPickaxe)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.TAINTPICK.1"),
- new ResearchPage((InfusionRecipe) recipes.get("TaintPick")) })
- .setParents(new String[] { "THAUMIUM", "INFUSION" }).setConcealed().registerResearchItem();
+ new ResearchPage("forbidden.research_page.TAINTPICK.1"),
+ new ResearchPage((InfusionRecipe) recipes.get("TaintPick")))
+ .setParents("THAUMIUM", "INFUSION").setConcealed().registerResearchItem();
(new DarkResearchItem(
"ROD_tainted",
"FORBIDDEN",
@@ -483,13 +465,11 @@ public static void addTaint() {
3,
new ItemStack(ForbiddenItems.wandCore, 1, 0)))
.setPages(
- new ResearchPage[] {
- new FormattedResearchPage(
- "forbidden.research_page.ROD_tainted.1",
- new Integer[] { Config.taintedCoreCap }),
- new ResearchPage((InfusionRecipe) recipes.get("WandRodTainted")) })
- .setParents(new String[] { "ROD_silverwood", "TAINTSHOVEL", "INFUSION" }).setConcealed()
- .registerResearchItem();
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_tainted.1",
+ new Integer[] { Config.taintedCoreCap }),
+ new ResearchPage((InfusionRecipe) recipes.get("WandRodTainted")))
+ .setParents("ROD_silverwood", "TAINTSHOVEL", "INFUSION").setConcealed().registerResearchItem();
(new DarkResearchItem(
"TAINTTREE",
"FORBIDDEN",
@@ -499,12 +479,11 @@ public static void addTaint() {
3,
new ItemStack(ForbiddenBlocks.taintSapling)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.TAINTTREE.1"),
- new ResearchPage((CrucibleRecipe) recipes.get("TaintTree")),
- new ResearchPage((IRecipe) recipes.get("TaintPlank")),
- new ResearchPage(new ItemStack(ForbiddenBlocks.taintLog, 1, 0)) })
- .setParents(new String[] { "THAUMIUM", "INFUSION", "ETHEREALBLOOM" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.TAINTTREE.1"),
+ new ResearchPage((CrucibleRecipe) recipes.get("TaintTree")),
+ new ResearchPage((IRecipe) recipes.get("TaintPlank")),
+ new ResearchPage(new ItemStack(ForbiddenBlocks.taintLog, 1, 0)))
+ .setParents("THAUMIUM", "INFUSION", "ETHEREALBLOOM").setConcealed().registerResearchItem();
ThaumcraftApi.addWarpToResearch("TAINTTREE", 1);
ThaumcraftApi.addWarpToItem(new ItemStack(ForbiddenBlocks.taintSapling, 1, 0), 1);
(new DarkResearchItem(
@@ -516,11 +495,10 @@ public static void addTaint() {
2,
new ItemStack(ForbiddenBlocks.taintStone, 1, 1)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.TAINTSTONE.1"),
- new ResearchPage((IArcaneRecipe) recipes.get("TaintStone")),
- new ResearchPage((IRecipe) recipes.get("TaintBrick")) })
- .setParents(new String[] { "THAUMIUM", "INFUSION", "ETHEREALBLOOM" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.TAINTSTONE.1"),
+ new ResearchPage((IArcaneRecipe) recipes.get("TaintStone")),
+ new ResearchPage((IRecipe) recipes.get("TaintBrick")))
+ .setParents("THAUMIUM", "INFUSION", "ETHEREALBLOOM").setConcealed().registerResearchItem();
ThaumcraftApi.addWarpToResearch("ROD_tainted", 2);
}
}
diff --git a/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java b/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
index ad18204..e515ad8 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
@@ -60,9 +60,8 @@ public static void stab() {
-1,
0,
new ResourceLocation("alchemicalwizardry", "textures/items/SacrificialDagger.png")))
- .setPages(new ResearchPage[] { new ResearchPage("forbidden.research_page.BLOODMAGIC.1") })
- .setParents(new String[] { "SCHOOLS" }).setRound().setStub().setAutoUnlock()
- .registerResearchItem();
+ .setPages(new ResearchPage("forbidden.research_page.BLOODMAGIC.1")).setParents("SCHOOLS")
+ .setRound().setStub().setAutoUnlock().registerResearchItem();
if (Config.crossWand) {
@@ -93,14 +92,14 @@ public static void stab() {
-1,
-3,
3,
- new ItemStack(ForbiddenItems.wandCore, 1, 3))).setPages(
- new ResearchPage[] {
+ new ItemStack(ForbiddenItems.wandCore, 1, 3)))
+ .setPages(
new FormattedResearchPage(
"forbidden.research_page.ROD_blood.1",
new Integer[] { Config.bloodCoreCap }),
new ResearchPage(blood_recipe),
- new ResearchPage("forbidden.research_page.ROD_blood.2") })
- .setParents(new String[] { "ROD_silverwood", "INFUSION", "BLOODMAGIC" }).setConcealed()
+ new ResearchPage("forbidden.research_page.ROD_blood.2"))
+ .setParents("ROD_silverwood", "INFUSION", "BLOODMAGIC").setConcealed()
.registerResearchItem();
ThaumcraftApi.addWarpToResearch("ROD_blood", 2);
@@ -109,9 +108,13 @@ public static void stab() {
new ItemStack(ForbiddenItems.wandCore, 1, 9),
(new AspectList()).add(Aspect.ENTROPY, 26).add(Aspect.FIRE, 26).add(Aspect.WATER, 26)
.add(Aspect.AIR, 26).add(Aspect.EARTH, 26).add(Aspect.ORDER, 26),
- new Object[] { "__D", "_B_", "B__", Character.valueOf('B'),
- new ItemStack(ForbiddenItems.wandCore, 1, 3), Character.valueOf('D'),
- new ItemStack(demonShard) });
+ "__D",
+ "_B_",
+ "B__",
+ 'B',
+ new ItemStack(ForbiddenItems.wandCore, 1, 3),
+ Character.valueOf('D'),
+ new ItemStack(demonShard));
(new DarkResearchItem(
"ROD_blood_staff",
"FORBIDDEN",
@@ -122,13 +125,12 @@ public static void stab() {
2,
new ItemStack(ForbiddenItems.wandCore, 1, 9)))
.setPages(
- new ResearchPage[] {
- new FormattedResearchPage(
- "forbidden.research_page.ROD_blood_staff.1",
- new Integer[] { Config.bloodStaffCap }),
- new ResearchPage(blood_staff) })
- .setParents(new String[] { "ROD_silverwood_staff", "ROD_blood" }).setSpecial()
- .setConcealed().registerResearchItem();
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_blood_staff.1",
+ new Integer[] { Config.bloodStaffCap }),
+ new ResearchPage(blood_staff))
+ .setParents("ROD_silverwood_staff", "ROD_blood").setSpecial().setConcealed()
+ .registerResearchItem();
InfusionRecipe alchemical_recipe = ThaumcraftApi.addInfusionCraftingRecipe(
"CAP_alchemical",
@@ -148,13 +150,12 @@ public static void stab() {
2,
new ItemStack(ForbiddenItems.wandCap, 1, 0)))
.setPages(
- new ResearchPage[] {
- new FormattedResearchPage(
- "forbidden.research_page.CAP_alchemical.1",
- new Double[] { Config.alchemicalDiscount * 100 - 10,
- Config.alchemicalDiscount * 100 }),
- new ResearchPage(alchemical_recipe) })
- .setParents(new String[] { "ROD_blood", "CAP_gold" }).setSecondary().setConcealed()
+ new FormattedResearchPage(
+ "forbidden.research_page.CAP_alchemical.1",
+ new Double[] { Config.alchemicalDiscount * 100 - 10,
+ Config.alchemicalDiscount * 100 }),
+ new ResearchPage(alchemical_recipe))
+ .setParents("ROD_blood", "CAP_gold").setSecondary().setConcealed()
.registerResearchItem();
}
@@ -162,8 +163,10 @@ public static void stab() {
"BLOODWELL",
new ItemStack(ForbiddenItems.bloodwell, 1, 0),
(new AspectList()).add(Aspect.WATER, 10).add(Aspect.EARTH, 10),
- new Object[] { new ItemStack(Items.feather, 1, 0), new ItemStack(bloodBucket, 1, 0),
- new ItemStack(Items.glass_bottle, 1, 0), new ItemStack(crapOrb, 1, 0) });
+ new ItemStack(Items.feather, 1, 0),
+ new ItemStack(bloodBucket, 1, 0),
+ new ItemStack(Items.glass_bottle, 1, 0),
+ new ItemStack(crapOrb, 1, 0));
(new DarkResearchItem(
"BLOODWELL",
"FORBIDDEN",
@@ -174,9 +177,9 @@ public static void stab() {
1,
new ItemStack(ForbiddenItems.bloodwell, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.BLOODWELL.1"),
- new ResearchPage(bloodwell_recipe) })
- .setParents(new String[] { "BLOODMAGIC" }).registerResearchItem();
+ new ResearchPage("forbidden.research_page.BLOODWELL.1"),
+ new ResearchPage(bloodwell_recipe))
+ .setParents("BLOODMAGIC").registerResearchItem();
InfusionRecipe blood_rapier = ThaumcraftApi.addInfusionCraftingRecipe(
"BLOODRAPIER",
@@ -199,10 +202,9 @@ public static void stab() {
3,
new ItemStack(ForbiddenItems.bloodRapier, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.BLOODRAPIER.1"),
- new ResearchPage(blood_rapier) })
- .setParents(new String[] { "BLOODMAGIC", "INFUSION", "VOIDMETAL" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage("forbidden.research_page.BLOODRAPIER.1"),
+ new ResearchPage(blood_rapier))
+ .setParents("BLOODMAGIC", "INFUSION", "VOIDMETAL").setConcealed().registerResearchItem();
ThaumcraftApi.addWarpToResearch("BLOODRAPIER", 2);
ThaumcraftApi.addWarpToItem(new ItemStack(ForbiddenItems.bloodRapier), 2);
@@ -231,10 +233,10 @@ public static void stab() {
4,
new ItemStack(ForbiddenItems.bloodOrb, 1, 0)))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ELDRITCHORB.1"),
- new ResearchPage(eldritch_orb) })
- .setParents(new String[] { "BLOODMAGIC", "INFUSION", "PRIMPEARL", "VOIDMETAL" })
- .setConcealed().setSpecial().registerResearchItem();
+ new ResearchPage("forbidden.research_page.ELDRITCHORB.1"),
+ new ResearchPage(eldritch_orb))
+ .setParents("BLOODMAGIC", "INFUSION", "PRIMPEARL", "VOIDMETAL").setConcealed().setSpecial()
+ .registerResearchItem();
ThaumcraftApi.addWarpToResearch("ELDRITCHORB", 3);
ThaumcraftApi.addWarpToItem(new ItemStack(ForbiddenItems.bloodOrb), 5);
diff --git a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
index f0079b9..c5fd865 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
@@ -48,36 +48,45 @@ public static void flowerPowerHippymancy() {
Item lexicon = Compat.getItem("Botania", "lexicon");
try {
- Class stupidLib = Class.forName("vazkii.botania.common.lib.LibOreDict");
+ Class> stupidLib = Class.forName("vazkii.botania.common.lib.LibOreDict");
Field nugget = stupidLib.getDeclaredField("MANASTEEL_NUGGET");
} catch (Exception e) {
- e.printStackTrace();
- LogHandler.log(Level.INFO, "Somebody's using an outdated version of Botania.");
+ LogHandler.log(Level.INFO, e, "Somebody's using an outdated version of Botania.");
CraftingManager.getInstance().addRecipe(
new ItemStack(resource, 1, 0),
- new Object[] { "###", "###", "###", Character.valueOf('#'),
- new ItemStack(ForbiddenItems.resource, 1, 2) });
+ "###",
+ "###",
+ "###",
+ '#',
+ new ItemStack(ForbiddenItems.resource, 1, 2));
CraftingManager.getInstance().addRecipe(
new ItemStack(ForbiddenItems.resource, 9, 2),
- new Object[] { "#", Character.valueOf('#'), new ItemStack(resource, 1, 0) });
+ "#",
+ '#',
+ new ItemStack(resource, 1, 0));
CraftingManager.getInstance().addRecipe(
new ItemStack(resource, 1, 7),
- new Object[] { "###", "###", "###", Character.valueOf('#'),
- new ItemStack(ForbiddenItems.resource, 1, 4) });
+ "###",
+ "###",
+ "###",
+ '#',
+ new ItemStack(ForbiddenItems.resource, 1, 4));
CraftingManager.getInstance().addRecipe(
new ItemStack(ForbiddenItems.resource, 9, 4),
- new Object[] { "#", Character.valueOf('#'), new ItemStack(resource, 1, 7) });
+ "#",
+ '#',
+ new ItemStack(resource, 1, 7));
}
OreDictionary.registerOre("nuggetManasteel", new ItemStack(ForbiddenItems.resource, 1, 2));
OreDictionary.registerOre("nuggetElvenElementium", new ItemStack(ForbiddenItems.resource, 1, 4));
(new DarkResearchItem("BOTANY", "FORBIDDEN", "[B]", new AspectList(), -3, 3, 0, new ItemStack(lexicon)))
- .setPages(new ResearchPage[] { new ResearchPage("forbidden.research_page.BOTANY.1") })
- .setParents(new String[] { "SCHOOLS" }).setRound().setStub().setAutoUnlock().registerResearchItem();
+ .setPages(new ResearchPage("forbidden.research_page.BOTANY.1")).setParents("SCHOOLS").setRound()
+ .setStub().setAutoUnlock().registerResearchItem();
if (Config.crossWand) {
@@ -100,10 +109,11 @@ public static void flowerPowerHippymancy() {
-1,
3,
3,
- new ItemStack(ForbiddenItems.wandCore, 1, 7))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_livingwood.1"),
- new ResearchPage(livingwood_rod) })
- .setParents(new String[] { "BOTANY", "ROD_silverwood", "INFUSION" }).setConcealed()
+ new ItemStack(ForbiddenItems.wandCore, 1, 7)))
+ .setPages(
+ new ResearchPage("forbidden.research_page.ROD_livingwood.1"),
+ new ResearchPage(livingwood_rod))
+ .setParents("BOTANY", "ROD_silverwood", "INFUSION").setConcealed()
.registerResearchItem();
ThaumcraftApi.addWarpToResearch("ROD_livingwood", 2);
BotaniaAPI.registerManaInfusionRecipe(
@@ -116,7 +126,10 @@ public static void flowerPowerHippymancy() {
new ItemStack(ForbiddenItems.wandCap, 1, 4),
(new AspectList()).add(Aspect.ENTROPY, 6).add(Aspect.FIRE, 6).add(Aspect.WATER, 6)
.add(Aspect.AIR, 6).add(Aspect.EARTH, 6).add(Aspect.ORDER, 6),
- new Object[] { "NNN", "N N", Character.valueOf('N'), "nuggetManasteel" });
+ "NNN",
+ "N N",
+ 'N',
+ "nuggetManasteel");
(new DarkResearchItem(
"CAP_manasteel",
"FORBIDDEN",
@@ -127,13 +140,11 @@ public static void flowerPowerHippymancy() {
2,
new ItemStack(ForbiddenItems.wandCap, 1, 3)))
.setPages(
- new ResearchPage[] {
- new FormattedResearchPage(
- "forbidden.research_page.CAP_manasteel.1",
- new Double[] { Config.manasteelDiscount * 100 }),
- new ResearchPage(manasteel_cap) })
- .setParents(new String[] { "ROD_livingwood" }).setSecondary().setConcealed()
- .registerResearchItem();
+ new FormattedResearchPage(
+ "forbidden.research_page.CAP_manasteel.1",
+ new Double[] { Config.manasteelDiscount * 100 }),
+ new ResearchPage(manasteel_cap))
+ .setParents("ROD_livingwood").setSecondary().setConcealed().registerResearchItem();
BotaniaAPI.registerManaInfusionRecipe(
new ItemStack(ForbiddenItems.wandCap, 1, 3),
new ItemStack(ForbiddenItems.wandCap, 1, 4),
@@ -155,9 +166,13 @@ public static void flowerPowerHippymancy() {
new ItemStack(ForbiddenItems.wandCore, 1, 13),
(new AspectList()).add(Aspect.ENTROPY, 26).add(Aspect.FIRE, 26).add(Aspect.WATER, 26)
.add(Aspect.AIR, 26).add(Aspect.EARTH, 26).add(Aspect.ORDER, 26),
- new Object[] { "__D", "_B_", "B__", Character.valueOf('B'),
- new ItemStack(ForbiddenItems.wandCore, 1, 11), Character.valueOf('D'),
- new ItemStack(resource, 1, 9) });
+ "__D",
+ "_B_",
+ "B__",
+ 'B',
+ new ItemStack(ForbiddenItems.wandCore, 1, 11),
+ 'D',
+ new ItemStack(resource, 1, 9));
BotaniaAPI.registerManaInfusionRecipe(
new ItemStack(ForbiddenItems.wandCore, 1, 11),
new ItemStack(ForbiddenItems.wandCore, 1, 12),
@@ -170,11 +185,13 @@ public static void flowerPowerHippymancy() {
1,
3,
2,
- new ItemStack(ForbiddenItems.wandCore, 1, 13))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.ROD_dreamwood_staff.1"),
- new ResearchPage(dreamwood_staff), new ResearchPage(dreamwood_rod) })
- .setParents(new String[] { "ROD_livingwood", "ROD_silverwood_staff" })
- .setSiblings(new String[] { "ROD_dreamwood" }).setConcealed().registerResearchItem();
+ new ItemStack(ForbiddenItems.wandCore, 1, 13)))
+ .setPages(
+ new ResearchPage("forbidden.research_page.ROD_dreamwood_staff.1"),
+ new ResearchPage(dreamwood_staff),
+ new ResearchPage(dreamwood_rod))
+ .setParents("ROD_livingwood", "ROD_silverwood_staff").setSiblings("ROD_dreamwood")
+ .setConcealed().registerResearchItem();
(new DarkResearchItem("ROD_dreamwood", "FORBIDDEN")).setVirtual().registerResearchItem();
IArcaneRecipe elementium_cap_inert = ThaumcraftApi.addArcaneCraftingRecipe(
@@ -182,7 +199,10 @@ public static void flowerPowerHippymancy() {
new ItemStack(ForbiddenItems.wandCap, 1, 6),
(new AspectList()).add(Aspect.ENTROPY, 27).add(Aspect.FIRE, 27).add(Aspect.WATER, 27)
.add(Aspect.AIR, 27).add(Aspect.EARTH, 27).add(Aspect.ORDER, 27),
- new Object[] { "NNN", "N N", Character.valueOf('N'), "nuggetElvenElementium" });
+ "NNN",
+ "N N",
+ 'N',
+ "nuggetElvenElementium");
InfusionRecipe elementium_cap = ThaumcraftApi.addInfusionCraftingRecipe(
"CAP_elementium",
new ItemStack(ForbiddenItems.wandCap, 1, 5),
@@ -201,18 +221,21 @@ public static void flowerPowerHippymancy() {
3,
3,
4,
- new ItemStack(ForbiddenItems.wandCap, 1, 5))).setPages(
- new ResearchPage[] {
+ new ItemStack(ForbiddenItems.wandCap, 1, 5)))
+ .setPages(
new FormattedResearchPage(
"forbidden.research_page.CAP_elementium.1",
new Double[] { Config.elementiumDiscount * 100 }),
- new ResearchPage(elementium_cap_inert), new ResearchPage(elementium_cap) })
- .setParents(new String[] { "ROD_dreamwood_staff" }).setConcealed()
- .registerResearchItem();
+ new ResearchPage(elementium_cap_inert),
+ new ResearchPage(elementium_cap))
+ .setParents("ROD_dreamwood_staff").setConcealed().registerResearchItem();
IRecipe terrasteel_cap = new ShapedOreRecipe(
new ItemStack(ForbiddenItems.wandCap, 1, 2),
- new Object[] { "NNN", "N N", Character.valueOf('N'), "nuggetTerrasteel" });
+ "NNN",
+ "N N",
+ 'N',
+ "nuggetTerrasteel");
CraftingManager.getInstance().getRecipeList().add(terrasteel_cap);
(new DarkResearchItem(
"CAP_terrasteel",
@@ -222,11 +245,11 @@ public static void flowerPowerHippymancy() {
3,
2,
1,
- new ItemStack(ForbiddenItems.wandCap, 1, 2))).setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.CAP_terrasteel.1"),
- new ResearchPage(terrasteel_cap) })
- .setParents(new String[] { "CAP_manasteel" }).setConcealed().setSecondary()
- .registerResearchItem();
+ new ItemStack(ForbiddenItems.wandCap, 1, 2)))
+ .setPages(
+ new ResearchPage("forbidden.research_page.CAP_terrasteel.1"),
+ new ResearchPage(terrasteel_cap))
+ .setParents("CAP_manasteel").setConcealed().setSecondary().registerResearchItem();
}
BotaniaAPI.registerSubTile("euclidaisy", SubTileEuclidaisy.class);
@@ -259,9 +282,9 @@ public static void flowerPowerHippymancy() {
2,
euclidaisy))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.EUCLIDAISY.1"),
- new ResearchPage(euclid) })
- .setParents(new String[] { "BOTANY", "INFUSION" }).setConcealed().registerResearchItem();
+ new ResearchPage("forbidden.research_page.EUCLIDAISY.1"),
+ new ResearchPage(euclid))
+ .setParents("BOTANY", "INFUSION").setConcealed().registerResearchItem();
BotaniaAPI.registerSubTile("whisperweed", SubTileWhisperweed.class);
BotaniaAPI.registerSubTileSignature(SubTileWhisperweed.class, new DarkSignature("whisperweed"));
@@ -279,7 +302,7 @@ public static void flowerPowerHippymancy() {
whisperweed,
(new AspectList()).add(Aspect.FIRE, 10).add(Aspect.WATER, 10).add(Aspect.EARTH, 10)
.add(Aspect.AIR, 10).add(Aspect.ORDER, 10).add(Aspect.ENTROPY, 10),
- new ItemStack[] { new ItemStack(Blocks.tallgrass, 1, 1), new ItemStack(resource, 1, 2),
+ (Object) new ItemStack[] { new ItemStack(Blocks.tallgrass, 1, 1), new ItemStack(resource, 1, 2),
new ItemStack(resource, 1, 6), new ItemStack(ConfigItems.itemResource, 1, 9),
new ItemStack(petal, 1, 7), new ItemStack(petal, 1, 10), new ItemStack(rune, 1, 14),
new ItemStack(ConfigItems.itemResource, 1, 6) });
@@ -293,9 +316,9 @@ public static void flowerPowerHippymancy() {
1,
whisperweed))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.WHISPERWEED.1"),
- new ResearchPage(whispercraft) })
- .setParents(new String[] { "BOTANY" }).setConcealed().registerResearchItem();
+ new ResearchPage("forbidden.research_page.WHISPERWEED.1"),
+ new ResearchPage(whispercraft))
+ .setParents("BOTANY").setConcealed().registerResearchItem();
BotaniaAPI.registerSubTile("tainthistle", SubTileTainthistle.class);
BotaniaAPI.registerSubTileSignature(SubTileTainthistle.class, new DarkSignature("tainthistle"));
@@ -327,9 +350,9 @@ public static void flowerPowerHippymancy() {
2,
tainthistle))
.setPages(
- new ResearchPage[] { new ResearchPage("forbidden.research_page.TAINTHISTLE.1"),
- new ResearchPage(thistlecraft) })
- .setParents(new String[] { "BOTANY", "INFUSION" }).setConcealed().registerResearchItem();
+ new ResearchPage("forbidden.research_page.TAINTHISTLE.1"),
+ new ResearchPage(thistlecraft))
+ .setParents("BOTANY", "INFUSION").setConcealed().registerResearchItem();
if (Compat.bm) {
BotaniaAPI.registerSubTile("bloodthorn", SubTileBloodthorn.class);
From b7a6ac486fb1d3192bac5957aad52f7a28042d0a Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:34:50 -0500
Subject: [PATCH 12/17] This should match the profane wand
---
src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java b/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
index 8acf030..a5adcdc 100644
--- a/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
+++ b/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
@@ -213,7 +213,7 @@ public static void addItems() {
new ResourceLocation("forbidden", "textures/models/wand_rod_profane.png"));
WAND_ROD_PROFANED = new WandRod(
"profaned",
- 50,
+ Config.profaneCoreCap,
new ItemStack(Blocks.bedrock, 1),
12,
new ResourceLocation("forbidden", "textures/models/wand_rod_profaned.png"));
From 76ce26befaa20eaea3b52e26b9787912988f1e5d Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Thu, 12 Feb 2026 03:38:46 -0500
Subject: [PATCH 13/17] Use the right discount config for alchemical caps
---
src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java b/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
index a5adcdc..4ffaa97 100644
--- a/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
+++ b/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
@@ -257,7 +257,7 @@ public static void addItems() {
"alchemical",
(float) (Config.alchemicalDiscount) / 100F,
Arrays.asList(new Aspect[] { Aspect.WATER }),
- (float) (Config.vinteumDiscount) - .10F,
+ (float) (Config.alchemicalDiscount) - .10F,
new ItemStack(wandCap, 1, 0),
7,
new ResourceLocation("forbidden", "textures/models/wand_cap_alchemical.png"));
From e0a5380ca2419aeea3caa9dd0f24735945ace72f Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Fri, 27 Feb 2026 18:31:26 -0500
Subject: [PATCH 14/17] Remove more boxing and fix formatting
---
.../spiteful/forbidden/compat/BloodMagic.java | 2 +-
.../fox/spiteful/forbidden/compat/Compat.java | 55 ++++++++++---------
.../forbidden/compat/ForbiddenBotany.java | 12 ++--
.../forbidden/items/ForbiddenItems.java | 16 +++---
4 files changed, 45 insertions(+), 40 deletions(-)
diff --git a/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java b/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
index e515ad8..7a27b78 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
@@ -113,7 +113,7 @@ public static void stab() {
"B__",
'B',
new ItemStack(ForbiddenItems.wandCore, 1, 3),
- Character.valueOf('D'),
+ 'D',
new ItemStack(demonShard));
(new DarkResearchItem(
"ROD_blood_staff",
diff --git a/src/main/java/fox/spiteful/forbidden/compat/Compat.java b/src/main/java/fox/spiteful/forbidden/compat/Compat.java
index a93a471..9b9897f 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/Compat.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/Compat.java
@@ -62,7 +62,7 @@ public static void compatify() {
try {
kami = Class.forName("thaumic.tinkerer.common.core.handler.ConfigHandler").getField("enableKami")
.getBoolean(null);
- } catch (Exception e) {}
+ } catch (Exception ignored) {}
}
if (kami) {
@@ -142,8 +142,8 @@ public static void compatify() {
if (Config.crossWand && am2) {
try {
- Class amItems = Class.forName("am2.items.ItemsCommonProxy");
- Class amBlocks = Class.forName("am2.blocks.BlocksCommonProxy");
+ Class> amItems = Class.forName("am2.items.ItemsCommonProxy");
+ Class> amBlocks = Class.forName("am2.blocks.BlocksCommonProxy");
Item essence = (Item) (amItems.getField("essence").get(null));
Item amOre = (Item) (amItems.getField("itemOre").get(null));
Block witchwood = (Block) (amBlocks.getField("witchwoodLog").get(null));
@@ -169,12 +169,11 @@ public static void compatify() {
3,
new ItemStack(ForbiddenItems.wandCore, 1, 4)))
.setPages(
- new ResearchPage[] {
- new FormattedResearchPage(
- "forbidden.research_page.ROD_witchwood.1",
- new Integer[] { Config.witchwoodCoreCap }),
- new ResearchPage(witchwood_recipe) })
- .setParents(new String[] { "SCHOOLS", "ROD_silverwood", "INFUSION" }).setConcealed()
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_witchwood.1",
+ new Integer[] { Config.witchwoodCoreCap }),
+ new ResearchPage(witchwood_recipe))
+ .setParents("SCHOOLS", "ROD_silverwood", "INFUSION").setConcealed()
.registerResearchItem();
ThaumcraftApi.addWarpToResearch("ROD_witchwood", 2);
@@ -196,23 +195,26 @@ public static void compatify() {
1,
new ItemStack(ForbiddenItems.wandCap, 1, 1)))
.setPages(
- new ResearchPage[] {
- new FormattedResearchPage(
- "forbidden.research_page.CAP_vinteum.1",
- new Double[] { Config.vinteumDiscount * 100 - 10,
- Config.vinteumDiscount * 100 }),
- new ResearchPage(vinteum_recipe) })
- .setParents(new String[] { "ROD_witchwood", "CAP_thaumium" }).setSecondary()
- .setConcealed().registerResearchItem();
+ new FormattedResearchPage(
+ "forbidden.research_page.CAP_vinteum.1",
+ new Double[] { Config.vinteumDiscount * 100 - 10,
+ Config.vinteumDiscount * 100 }),
+ new ResearchPage(vinteum_recipe))
+ .setParents("ROD_witchwood", "CAP_thaumium").setSecondary().setConcealed()
+ .registerResearchItem();
IArcaneRecipe witchwood_staff = ThaumcraftApi.addArcaneCraftingRecipe(
"ROD_witchwood_staff",
new ItemStack(ForbiddenItems.wandCore, 1, 10),
(new AspectList()).add(Aspect.ENTROPY, 26).add(Aspect.FIRE, 26).add(Aspect.WATER, 26)
.add(Aspect.AIR, 26).add(Aspect.EARTH, 26).add(Aspect.ORDER, 26),
- new Object[] { "__D", "_B_", "B__", Character.valueOf('B'),
- new ItemStack(ForbiddenItems.wandCore, 1, 4), Character.valueOf('D'),
- new ItemStack(essence, 1, 10) });
+ "__D",
+ "_B_",
+ "B__",
+ 'B',
+ new ItemStack(ForbiddenItems.wandCore, 1, 4),
+ 'D',
+ new ItemStack(essence, 1, 10));
(new DarkResearchItem(
"ROD_witchwood_staff",
"FORBIDDEN",
@@ -223,13 +225,12 @@ public static void compatify() {
2,
new ItemStack(ForbiddenItems.wandCore, 1, 10)))
.setPages(
- new ResearchPage[] {
- new FormattedResearchPage(
- "forbidden.research_page.ROD_witchwood_staff.1",
- new Integer[] { Config.witchwoodStaffCap }),
- new ResearchPage(witchwood_staff) })
- .setParents(new String[] { "ROD_silverwood_staff", "ROD_witchwood" }).setSpecial()
- .setConcealed().registerResearchItem();
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_witchwood_staff.1",
+ new Integer[] { Config.witchwoodStaffCap }),
+ new ResearchPage(witchwood_staff))
+ .setParents("ROD_silverwood_staff", "ROD_witchwood").setSpecial().setConcealed()
+ .registerResearchItem();
} catch (Exception e) {
LogHandler.log(Level.INFO, e, "Forbidden Magic was slain by a Hecate.");
am2 = false;
diff --git a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
index c5fd865..e44bb39 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
@@ -302,10 +302,14 @@ public static void flowerPowerHippymancy() {
whisperweed,
(new AspectList()).add(Aspect.FIRE, 10).add(Aspect.WATER, 10).add(Aspect.EARTH, 10)
.add(Aspect.AIR, 10).add(Aspect.ORDER, 10).add(Aspect.ENTROPY, 10),
- (Object) new ItemStack[] { new ItemStack(Blocks.tallgrass, 1, 1), new ItemStack(resource, 1, 2),
- new ItemStack(resource, 1, 6), new ItemStack(ConfigItems.itemResource, 1, 9),
- new ItemStack(petal, 1, 7), new ItemStack(petal, 1, 10), new ItemStack(rune, 1, 14),
- new ItemStack(ConfigItems.itemResource, 1, 6) });
+ new ItemStack(Blocks.tallgrass, 1, 1),
+ new ItemStack(resource, 1, 2),
+ new ItemStack(resource, 1, 6),
+ new ItemStack(ConfigItems.itemResource, 1, 9),
+ new ItemStack(petal, 1, 7),
+ new ItemStack(petal, 1, 10),
+ new ItemStack(rune, 1, 14),
+ new ItemStack(ConfigItems.itemResource, 1, 6));
(new DarkResearchItem(
"WHISPERWEED",
"FORBIDDEN",
diff --git a/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java b/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
index ed41646..07afe6f 100644
--- a/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
+++ b/src/main/java/fox/spiteful/forbidden/items/ForbiddenItems.java
@@ -1,6 +1,6 @@
package fox.spiteful.forbidden.items;
-import java.util.Arrays;
+import java.util.Collections;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
@@ -258,33 +258,33 @@ public static void addItems() {
new ResourceLocation("forbidden", "textures/models/wand_cap_orichalcum.png"));
WAND_CAP_ALCHEMICAL = new DarkWandCap(
"alchemical",
- (float) (Config.alchemicalDiscount) / 100F,
- Arrays.asList(new Aspect[] { Aspect.WATER }),
- (float) (Config.alchemicalDiscount) - .10F,
+ (float) Config.alchemicalDiscount,
+ Collections.singletonList(Aspect.WATER),
+ (float) Config.alchemicalDiscount - .10F,
new ItemStack(wandCap, 1, 0),
7,
new ResourceLocation("forbidden", "textures/models/wand_cap_alchemical.png"));
WAND_CAP_VINTEUM = new DarkWandCap(
"vinteum",
- (float) (Config.vinteumDiscount),
+ (float) Config.vinteumDiscount,
new ItemStack(wandCap, 1, 1),
6,
new ResourceLocation("forbidden", "textures/models/wand_cap_vinteum.png"));
WAND_CAP_MANASTEEL = new DarkWandCap(
"manasteel",
- (float) (Config.manasteelDiscount),
+ (float) Config.manasteelDiscount,
new ItemStack(wandCap, 1, 3),
6,
new ResourceLocation("forbidden", "textures/models/wand_cap_manasteel.png"));
WAND_CAP_ELEMENTIUM = new DarkWandCap(
"elementium",
- (float) (Config.elementiumDiscount),
+ (float) Config.elementiumDiscount,
new ItemStack(wandCap, 1, 5),
9,
new ResourceLocation("forbidden", "textures/models/wand_cap_elementium.png"));
WAND_CAP_TERRASTEEL = new DarkWandCap(
"terrasteel",
- (float) (Config.terrasteelDiscount),
+ (float) Config.terrasteelDiscount,
new ItemStack(wandCap, 1, 2),
1,
new ResourceLocation("forbidden", "textures/models/wand_cap_terrasteel.png"));
From 7ae7297af74addff20195f2ed8c73cbaae8fe0ac Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Fri, 27 Feb 2026 19:17:33 -0500
Subject: [PATCH 15/17] Update README.md with dependency information
---
README.md | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index cfe1973..053cc29 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,19 @@
ForbiddenMagic
==============
-Forbidden Magic is a small Minecraft mod written as an add-on for the mod [Thaumcraft](http://www.minecraftforum.net/topic/2011841-). It adds a few magical artifacts of a more sinister bent to the game as well as several interactions between Thaumcraft and other magic-themed mods such as [Blood Magic](http://www.minecraftforum.net/topic/1899223-) or [Ars Magica 2](http://www.minecraftforum.net/topic/2028696-/).
+Forbidden Magic is a small Minecraft mod written as an add-on for the mod [Thaumcraft](http://www.minecraftforum.net/topic/2011841-). It adds a few magical artifacts of a more sinister bent to the game as well as several interactions between Thaumcraft and other magic-themed mods such as [Blood Magic](http://www.minecraftforum.net/topic/1899223-) or [Ars Magica 2](http://www.minecraftforum.net/topic/2028696-/).
Forbidden Magic's source and binary are subject to the terms of the WTF Public License.
+
+This mod requires the following mods:
+* [Thaumcraft 4](http://www.minecraftforum.net/topic/2011841-)
+* [Baubles](https://github.com/GTNewHorizons/Baubles-Expanded/)
+* [GTNHLib](https://github.com/GTNewHorizons/GTNHLib)
+
+Extra content is available if any of the following mods are also present:
+* [Botania](https://github.com/GTNewHorizons/Botania/): Wand cores and caps that regenerate vis with Botania's mana and three new magical flowers.
+* [Blood Magic](https://github.com/GTNewHorizons/BloodMagic): Wand cores and caps that regenerate vis by draining your Soul Network, a bigger blood orb, an anti-blood mage weapon, better scribing tools, and a new ritual. Also adds yet another new flower if Botania is also present.
+* [Ars Magica 2](https://www.curseforge.com/minecraft/mc-mods/ars-magica-2): Wand cores and caps that regenerate vis with AM2's mana.
+* [Special Mobs](https://github.com/GTNewHorizons/SpecialMobs/): Add aspects to all the mobs and allow them to be spawned in the Wrath Cage.
+* [Twilight Forest](https://github.com/GTNewHorizons/twilightforest/): Allow its mobs to be spawned in the Wrath Cage.
+* [Equivalent Exchange 3](https://www.curseforge.com/minecraft/mc-mods/ee3): Add EMC values to various Thaumcraft and Forbidden Magic blocks and items.
\ No newline at end of file
From 3a991fa713c37398c6f1d462b8e4d8b9c1babb1e Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Fri, 27 Feb 2026 20:06:40 -0500
Subject: [PATCH 16/17] Add more formatted numbers to research text, switch %s
to %d, and improve information
---
.../spiteful/forbidden/compat/BloodMagic.java | 2 +-
.../forbidden/compat/ForbiddenBotany.java | 12 ++++++---
.../assets/forbidden/lang/en_US.lang | 26 +++++++++----------
3 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java b/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
index 7a27b78..8a8bb51 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/BloodMagic.java
@@ -127,7 +127,7 @@ public static void stab() {
.setPages(
new FormattedResearchPage(
"forbidden.research_page.ROD_blood_staff.1",
- new Integer[] { Config.bloodStaffCap }),
+ new Integer[] { Config.bloodStaffCap, Config.bloodCoreCap }),
new ResearchPage(blood_staff))
.setParents("ROD_silverwood_staff", "ROD_blood").setSpecial().setConcealed()
.registerResearchItem();
diff --git a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
index e44bb39..8d7c878 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/ForbiddenBotany.java
@@ -111,7 +111,9 @@ public static void flowerPowerHippymancy() {
3,
new ItemStack(ForbiddenItems.wandCore, 1, 7)))
.setPages(
- new ResearchPage("forbidden.research_page.ROD_livingwood.1"),
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_livingwood.1",
+ new Integer[] { Config.livingwoodCoreCap }),
new ResearchPage(livingwood_rod))
.setParents("BOTANY", "ROD_silverwood", "INFUSION").setConcealed()
.registerResearchItem();
@@ -187,7 +189,9 @@ public static void flowerPowerHippymancy() {
2,
new ItemStack(ForbiddenItems.wandCore, 1, 13)))
.setPages(
- new ResearchPage("forbidden.research_page.ROD_dreamwood_staff.1"),
+ new FormattedResearchPage(
+ "forbidden.research_page.ROD_dreamwood_staff.1",
+ new Integer[] { Config.dreamwoodCoreCap, Config.dreamwoodStaffCap }),
new ResearchPage(dreamwood_staff),
new ResearchPage(dreamwood_rod))
.setParents("ROD_livingwood", "ROD_silverwood_staff").setSiblings("ROD_dreamwood")
@@ -247,7 +251,9 @@ public static void flowerPowerHippymancy() {
1,
new ItemStack(ForbiddenItems.wandCap, 1, 2)))
.setPages(
- new ResearchPage("forbidden.research_page.CAP_terrasteel.1"),
+ new FormattedResearchPage(
+ "forbidden.research_page.CAP_terrasteel.1",
+ new Double[] { Config.terrasteelDiscount * 100 }),
new ResearchPage(terrasteel_cap))
.setParents("CAP_manasteel").setConcealed().setSecondary().registerResearchItem();
}
diff --git a/src/main/resources/assets/forbidden/lang/en_US.lang b/src/main/resources/assets/forbidden/lang/en_US.lang
index 361bb3c..866dac3 100644
--- a/src/main/resources/assets/forbidden/lang/en_US.lang
+++ b/src/main/resources/assets/forbidden/lang/en_US.lang
@@ -199,7 +199,7 @@ forbidden.research_page.TAINTPICK.1=By infusing a thaumium pickaxe with taint, y
#
forbidden.research_name.ROD_tainted=Tainted Wand Core
forbidden.research_text.ROD_tainted=Squiggly vis storage
-forbidden.research_page.ROD_tainted.1=Tainted Lands are places of great and terrible power for those Thaumaturges who know how to tap into them.
The Tainted Wand Core can store up to %d vis of each type and slowly replenishes itself up to 10%% in every aspect as long as it is being held inside of a Tainted Land. While the wand is held in your hand, it can also feed off of taint coursing through your veins, randomly restoring vis every time you take damage from flux taint.
+forbidden.research_page.ROD_tainted.1=Tainted Lands are places of great and terrible power for those Thaumaturges who know how to tap into them.
The Tainted Wand Core can store up to %d vis of each type and slowly replenishes itself up to 10%% of its capacity in every aspect as long as it is being held inside of a Tainted Land. While the wand is held in your hand, it can also feed off of taint coursing through your veins, randomly restoring vis every time you take damage from flux taint.
#
forbidden.research_name.TAINTTREE=Tainted Tree
forbidden.research_text.TAINTTREE=The root of flux bears gross fruit
@@ -211,7 +211,7 @@ forbidden.research_page.TAINTSTONE.1=Tainted Lands aren't very safe places to be
#
forbidden.research_name.ROD_infernal=Infernal Wand Core
forbidden.research_text.ROD_infernal=Devilish vis storage
-forbidden.research_page.ROD_infernal.1=A great and powerful thaumaturge like you deserves a powerful and imposing wand befitting your station. Some hippy silverwood wand just won't cut it. You need a wand that will serve as your scepter of authority.
You've discovered a way to create a wand infused with the power of the Nether. The Infernal Wand Core can hold up to %s vis and will slowly replenish its supply of Ignis up to 20%%. While within the Nether, the wand will also replenish its other aspects to 10%%.
+forbidden.research_page.ROD_infernal.1=A great and powerful thaumaturge like you deserves a powerful and imposing wand befitting your station. Some hippy silverwood wand just won't cut it. You need a wand that will serve as your scepter of authority.
You've discovered a way to create a wand infused with the power of the Nether. The Infernal Wand Core can hold up to %d vis and will slowly replenish its supply of Ignis up to 20%%. While within the Nether, the wand will also replenish its other aspects to 10%%.
forbidden.research_page.ROD_infernal.2=The wand also imbues you with some protection from the Nether's hazards, extinguishing you if you are on fire or protecting you from the effects of Withering as long as it is in your inventory. While the wand is held in your hand, it will completely protect you from all fire damage.
#
forbidden.research_name.ROD_profane=Profane Wand
@@ -224,36 +224,36 @@ forbidden.research_page.ROD_soul.1=You've discovered a way to tap the energy flo
#
forbidden.research_name.ROD_blood=Blood Wand Core
forbidden.research_text.ROD_blood=Alchemical vis storage
-forbidden.research_page.ROD_blood.1=You've created a bridge between Thaumaturgy and Alchemical Wizardry. The Blood Wand can store up to %s vis and will gradually fill itself using Life Points.
The wand will bind itself to the first person to pick it up. As long as the rod is empty, it will try to fill itself using LP from its owner's network. If there are not enough Life Points to fuel it, it will resort to drawing health from whoever is carrying it, but this conversion is less efficient. If it has no LP to draw from and its holder falls below three hearts, the wand stops charging itself.
-forbidden.research_page.ROD_blood.2=The infusion process alone isn't enough to complete a Blood Wand. Once the Inert Blood Rod has been infused, it must be imbued with life essence in a Blood Altar to be completed.
+forbidden.research_page.ROD_blood.1=You've created a bridge between Thaumaturgy and Alchemical Wizardry. The Blood Wand can store up to %d vis and will gradually fill itself using 1,000 LP per point of vis.
The wand will bind itself to the first person to pick it up. As long as the rod is not full and is being carried, it will try to fill itself using LP from its owner's network. If there is not enough LP to fuel it, it will resort to drawing health from its carrier, but this conversion is less efficient. If it has no LP to draw from and its holder falls below three hearts, the wand stops charging itself.
+forbidden.research_page.ROD_blood.2=The infusion process alone isn't enough to complete a Blood Wand. Once the Inert Blood Rod has been infused, it must be imbued with life essence in a Blood Altar to ignite its thirst for blood.
#
forbidden.research_name.ROD_blood_staff=Blood Staff Core
forbidden.research_text.ROD_blood_staff=Staff of the Blood Magus
-forbidden.research_page.ROD_blood_staff.1=The Blood Wand is useful, but it just charges so slowly. It's time to create a magical implement that can hold up in sustained combat.
Unlike most staves, the Blood Staff holds only %s vis instead of the 100 its wand form can. Where it truly shines is its ability to recharge vis at a rapid rate. As long as the Blood Staff is held in your hotbar, it will recharge its vis from its owner's LP network four times as quickly as a normal Blood Wand. This voraciousness comes at a price, however. Unlike the wand, the Blood Staff can and will kill whoever's holding it if it doesn't recieve enough LP.
+forbidden.research_page.ROD_blood_staff.1=The Blood Wand is useful, but it just charges so slowly. It's time to create a magical implement that can hold up in sustained combat.
Unlike most staves, the Blood Staff holds only %d vis instead of the %d its wand form can. Where it truly shines is its ability to recharge vis at a rapid rate. As long as the Blood Staff is held in your hotbar, it will recharge its vis from its owner's LP network four times as quickly as a normal Blood Wand. This voraciousness comes at a price, however. Unlike the wand, the Blood Staff can and will kill whoever's holding it if it doesn't receive enough LP.
#
forbidden.research_name.ROD_witchwood=Witchwood Wand Core
forbidden.research_text.ROD_witchwood=Mana converter
-forbidden.research_page.ROD_witchwood.1=By creating a wand core out of Witchwood, you've discovered a way to convert mana into Vis. The Witchwood Wand Core holds up to %s vis and will gradually charge itself at the cost of 140 mana per point of vis.
Further research may reveal ways to lower this price.
+forbidden.research_page.ROD_witchwood.1=By creating a wand core out of Witchwood, you've discovered a way to convert mana into Vis. The Witchwood Wand Core holds up to %d vis and will gradually charge itself at the cost of 140 mana per point of vis.
Further research may reveal ways to lower this price.
#
forbidden.research_name.ROD_witchwood_staff=Witchwood Staff Core
forbidden.research_text.ROD_witchwood_staff=Staff of the Arcanist
-forbidden.research_page.ROD_witchwood_staff.1=The Witchwood Wand eats far too much magical power and charges far too slowly to stand up in sustained combat. It's time for something a little more efficient at channeling arcane power.
Unlike most staves, the Witchwood Staff can only hold %s vis. Its true strength lies in how quickly it recharges itself. The staff regains vis at over twice the rate of the Witchwood Wand. Furthermore, the staff uses considerably less magical power than the Witchwood Wand, only needing 100 mana per point of vis, if used without the appropriate cap.
+forbidden.research_page.ROD_witchwood_staff.1=The Witchwood Wand eats far too much magical power and charges far too slowly to stand up in sustained combat. It's time for something a little more efficient at channeling arcane power.
Unlike most staves, the Witchwood Staff can only hold %d vis. Its true strength lies in how quickly it recharges itself. The staff regains vis at over twice the rate of the Witchwood Wand. Furthermore, the staff uses considerably less magical power than the Witchwood Wand, only needing 100 mana per point of vis.
#
forbidden.research_name.ROD_livingwood=Livingwood Wand Core
forbidden.research_text.ROD_livingwood=Botanical vis storage
-forbidden.research_page.ROD_livingwood.1=Livingwood has the fantastic ability to manipulate mana. When combined with the right reagents, it can even convert mana into vis.
The Livingwood Wand will quickly draw mana from storage items in your inventory in order to charge itself.
The infusion process burns the livingwood out, unfortunately. Once infused, the wand rod must be charged in a mana pool in order to be re-awakened.
+forbidden.research_page.ROD_livingwood.1=Livingwood has the fantastic ability to manipulate mana. When combined with the right reagents, it can be fashioned into a wand core capable of storing %d vis and can even convert mana into vis.
The Livingwood Wand will quickly draw mana from storage items in your inventory or worn as baubles in order to charge itself.
The infusion process burns the livingwood out, unfortunately. Once infused, the wand rod must be charged in a mana pool in order to be re-awakened.
#
forbidden.research_name.ROD_dreamwood_staff=Dreamwood Staff
forbidden.research_text.ROD_dreamwood_staff=Sweet dreams are made of these
-forbidden.research_page.ROD_dreamwood_staff.1=Livingwood is a useful material, but it can't seem to withstand the amount of arcane power needed to make a staff. The elves' dreamwood seems to be up to task, however.
Staves made of dreamwood hold significantly more vis than the equivalent wand and are able to apply more potent power when using foci.
As with livingwood, dreamwood rods must be infused in a mana pool to fully awaken.
+forbidden.research_page.ROD_dreamwood_staff.1=Livingwood is a useful material, but it can't seem to withstand the amount of arcane power needed to make a staff. The elves' dreamwood seems to be up to task, however.
Dreamwood wands can hold %d vis, while staves made of dreamwood hold %d vis and are able to apply more potent power when using foci.
As with livingwood, dreamwood rods must be infused in a mana pool to fully awaken.
#
forbidden.research_name.CAP_alchemical=Alchemical Caps
forbidden.research_text.CAP_alchemical=When Thaumium isn't bloody enough
-forbidden.research_page.CAP_alchemical.1=You've developed a wand cap that merges Thaumaturgy and Alchemical Wizardry. Alchemical Caps are very effective at channeling Aqua, only using %d%% of the normal vis cost. For everything else, they offer only a %d%% rate.
If combined with a Bloody Wand Core, Alchemical Caps discount the amount of LP consumed by the wand, costing only 900 LP per vis. The caps also cause all attacks from a blood wand to inflict Weakness.
+forbidden.research_page.CAP_alchemical.1=You've developed a wand cap that merges Thaumaturgy and Alchemical Wizardry. Alchemical Caps are very effective at channeling Aqua, only using %d%% of the normal vis cost. For everything else, they offer a %d%% rate.
If combined with a Blood Rod or Blood Staff Core, Alchemical Caps discount the amount of LP consumed by the wand, costing only 900 LP per vis. Attacks made with such a wand will also inflict a high level of Weakness to its targets.
#
forbidden.research_name.CAP_vinteum=Vinteum Caps
forbidden.research_text.CAP_vinteum=Magical wand caps
-forbidden.research_page.CAP_vinteum.1=By infusing a Thaumium cap with Vinteum, you create a cap that, when combined with a Witchwood Wand Core, lowers its mana cost to only %s%% per point of vis.
The Thaumium cap seems to meld well with Vinteum, offering a %d%% vis rate.
+forbidden.research_page.CAP_vinteum.1=By infusing a Thaumium cap with Vinteum, you create a cap that, when combined with a Witchwood Rod or Witchwood Staff Core, lowers its mana cost by about half.
The Thaumium cap seems to meld well with Vinteum, offering a %d%% vis rate.
#
forbidden.research_name.CAP_soul=Ender Caps
forbidden.research_text.CAP_soul=Protection for your soul
@@ -265,11 +265,11 @@ forbidden.research_page.CAP_manasteel.1=Manasteel has very useful properties whe
#
forbidden.research_name.CAP_elementium=Elementium Caps
forbidden.research_text.CAP_elementium=Eco Friendly Wand Caps
-forbidden.research_page.CAP_elementium.1=Alfheim seems to be a world steeped in magical power, and Elementium is no exception. When crafted into a wand cap and treated with the right materials, Elementium Caps have an exceptional ability to channel vis, giving a %d%% vis cost. When combined with a wand or staff that uses mana, they'll also reduce the mana conversion rate.
Elementium's pretty pink color is just icing on the cake.
+forbidden.research_page.CAP_elementium.1=Alfheim seems to be a world steeped in magical power, and Elementium is no exception. When crafted into a wand cap and treated with the right materials, Elementium Caps have an exceptional ability to channel vis, giving a %d%% vis cost. When combined with a wand or staff that uses mana, they'll also improve the mana conversion rate.
Elementium's pretty pink color is just icing on the cake.
#
forbidden.research_name.CAP_terrasteel=Terrasteel Caps
forbidden.research_text.CAP_terrasteel=Completion!
-forbidden.research_page.CAP_terrasteel.1=Sweet Baby Haruhi, this was a terrible idea. What were you thinking?
Terrasteel's oversaturation of mana gives it many of the qualities of the earth it's named after: Strength, durability, density, and... extreme resistance to energy. Terrasteel's sheer inability to channel vis causes most vis to just dissipate harmlessly against it instead of being focused out of the wand.
Apparently just making caps out of every material under the sun isn't a great idea.
+forbidden.research_page.CAP_terrasteel.1=Sweet Baby Haruhi, this was a terrible idea. What were you thinking?
Terrasteel's oversaturation of mana gives it many of the qualities of the earth it's named after: strength, durability, density, and... extreme resistance to energy. Terrasteel's sheer inability to channel vis causes most of it to just dissipate harmlessly against it instead of being focused out of the wand, resulting in vis costs being %d%% of what they are normally.
Apparently just making caps out of every material under the sun isn't a great idea.
#
forbidden.research_name.TRANSEMERALD=Emerald Transmutation
forbidden.research_text.TRANSEMERALD=Transformation of valuables into emerald
From 129d3bb5d15cdea7ad4b965eea3da4b5ad44ee82 Mon Sep 17 00:00:00 2001
From: koolkrafter5
Date: Fri, 27 Feb 2026 20:36:36 -0500
Subject: [PATCH 17/17] Fix vinteum cap research
---
src/main/java/fox/spiteful/forbidden/compat/Compat.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/main/java/fox/spiteful/forbidden/compat/Compat.java b/src/main/java/fox/spiteful/forbidden/compat/Compat.java
index 9b9897f..eed4229 100644
--- a/src/main/java/fox/spiteful/forbidden/compat/Compat.java
+++ b/src/main/java/fox/spiteful/forbidden/compat/Compat.java
@@ -197,8 +197,7 @@ public static void compatify() {
.setPages(
new FormattedResearchPage(
"forbidden.research_page.CAP_vinteum.1",
- new Double[] { Config.vinteumDiscount * 100 - 10,
- Config.vinteumDiscount * 100 }),
+ new Double[] { Config.vinteumDiscount * 100 }),
new ResearchPage(vinteum_recipe))
.setParents("ROD_witchwood", "CAP_thaumium").setSecondary().setConcealed()
.registerResearchItem();