From 730ccfec4bdb32996814d2041311a80c79c5d156 Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 17:23:23 -0400 Subject: [PATCH 01/13] Remove deprecated getCycledIngredients --- .../client/integration/nei/recipe/RecipeHandlerBrewery.java | 2 +- .../client/integration/nei/recipe/RecipeHandlerElvenTrade.java | 2 +- .../integration/nei/recipe/RecipeHandlerFloatingFlowers.java | 2 +- .../client/integration/nei/recipe/RecipeHandlerManaPool.java | 2 +- .../integration/nei/recipe/RecipeHandlerPetalApothecary.java | 2 +- .../client/integration/nei/recipe/RecipeHandlerPureDaisy.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerBrewery.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerBrewery.java index 64e3bfe15..15680bb19 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerBrewery.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerBrewery.java @@ -65,7 +65,7 @@ public class RecipeHandlerBrewery extends TemplateRecipeHandler { @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); + return inputs; } @Override diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java index 81a744c5b..39e8fd365 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java @@ -52,7 +52,7 @@ public class RecipeHandlerElvenTrade extends TemplateRecipeHandler { @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); + return inputs; } @Override diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerFloatingFlowers.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerFloatingFlowers.java index 9801c436d..2c3a3a832 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerFloatingFlowers.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerFloatingFlowers.java @@ -31,7 +31,7 @@ public class RecipeHandlerFloatingFlowers extends TemplateRecipeHandler { @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); + return inputs; } @Override diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java index 6f5af8490..b7a4c43bc 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java @@ -56,7 +56,7 @@ public class RecipeHandlerManaPool extends TemplateRecipeHandler { @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); + return inputs; } @Override diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java index 80196b8a7..820e77085 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java @@ -56,7 +56,7 @@ public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); + return inputs; } @Override diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java index f02d24a09..10c996d10 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java @@ -43,7 +43,7 @@ public class RecipeHandlerPureDaisy extends TemplateRecipeHandler { @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); + return inputs; } @Override From 548286802a5026d8e7f525e3de8dfcbcb770db1a Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 17:25:07 -0400 Subject: [PATCH 02/13] Remove commented out pointless elven knowledge check --- .../nei/recipe/RecipeHandlerElvenTrade.java | 56 ++++++------------- 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java index 39e8fd365..7ae460a8a 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java @@ -94,53 +94,33 @@ public class RecipeHandlerElvenTrade extends TemplateRecipeHandler { RenderItem.getInstance().renderIcon(35, 29, BlockAlfPortal.portalTex, 48, 48); } - private static boolean hasElvenKnowledge() { - /*EntityPlayer player = Minecraft.getMinecraft().thePlayer; - if (player != null) { - for (ItemStack stack : player.inventory.mainInventory) { - if (stack != null && stack.getItem() instanceof ILexicon) { - ILexicon lexicon = (ILexicon) stack.getItem(); - if (lexicon.isKnowledgeUnlocked(stack, BotaniaAPI.elvenKnowledge)) { - return true; - } - } - } - } - return false;*/ - return true; - } - @Override public void loadCraftingRecipes(String outputId, Object... results) { - if(outputId.equals("botania.elvenTrade") && hasElvenKnowledge()) { - if(hasElvenKnowledge()) { - for(RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { - arecipes.add(new CachedElvenTradeRecipe(recipe)); - } - } - } else super.loadCraftingRecipes(outputId, results); + if (outputId.equals("botania.elvenTrade")) { + for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { + arecipes.add(new CachedElvenTradeRecipe(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } } @Override public void loadCraftingRecipes(ItemStack result) { - if(hasElvenKnowledge()) { - for(RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { - if(NEIServerUtils.areStacksSameTypeCrafting(recipe.getOutput(), result)) - arecipes.add(new CachedElvenTradeRecipe(recipe)); - } - } - } + for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { + if (NEIServerUtils.areStacksSameTypeCrafting(recipe.getOutput(), result)) + arecipes.add(new CachedElvenTradeRecipe(recipe)); + } + } @Override public void loadUsageRecipes(ItemStack ingredient) { - if(hasElvenKnowledge()) { - for(RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { - CachedElvenTradeRecipe crecipe = new CachedElvenTradeRecipe(recipe); - if(crecipe.contains(crecipe.inputs, ingredient)) - arecipes.add(crecipe); - } - } - } + for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { + CachedElvenTradeRecipe crecipe = new CachedElvenTradeRecipe(recipe); + if (crecipe.contains(crecipe.inputs, ingredient)) + arecipes.add(crecipe); + } + } // hide dummy recipes private List filteredElvenTradeRecipes() { From ffcb1bf89127380737297a32a1c31d0a15a9572a Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 17:27:56 -0400 Subject: [PATCH 03/13] Remove deprecated recipiesPerPage --- .../integration/nei/recipe/RecipeHandlerElvenTrade.java | 5 ----- .../integration/nei/recipe/RecipeHandlerLexicaBotania.java | 5 ----- .../client/integration/nei/recipe/RecipeHandlerManaPool.java | 5 ----- .../integration/nei/recipe/RecipeHandlerPetalApothecary.java | 5 ----- .../integration/nei/recipe/RecipeHandlerPureDaisy.java | 5 ----- 5 files changed, 25 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java index 7ae460a8a..2919bfdbe 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java @@ -77,11 +77,6 @@ public class RecipeHandlerElvenTrade extends TemplateRecipeHandler { transferRects.add(new RecipeTransferRect(new Rectangle(35, 30, 48, 48), "botania.elvenTrade")); } - @Override - public int recipiesPerPage() { - return 1; - } - @Override public void drawBackground(int recipe) { super.drawBackground(recipe); diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java index fe5d660c3..26edc2296 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java @@ -77,11 +77,6 @@ public class RecipeHandlerLexicaBotania extends TemplateRecipeHandler { public String getGuiTexture() { return LibResources.GUI_NEI_BLANK; } - - @Override - public int recipiesPerPage() { - return 1; - } @Override public void loadTransferRects() { diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java index b7a4c43bc..193a37780 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java @@ -81,11 +81,6 @@ public class RecipeHandlerManaPool extends TemplateRecipeHandler { return LibResources.GUI_NEI_BLANK; } - @Override - public int recipiesPerPage() { - return 1; - } - @Override public void loadTransferRects() { transferRects.add(new RecipeTransferRect(new Rectangle(70, 36, 18, 18), "botania.manaPool")); diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java index 820e77085..42696ea2b 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java @@ -85,11 +85,6 @@ public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { transferRects.add(new RecipeTransferRect(new Rectangle(72, 54, 18, 18), getRecipeID())); } - @Override - public int recipiesPerPage() { - return 1; - } - @Override public void drawBackground(int recipe) { super.drawBackground(recipe); diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java index 10c996d10..c2fcc00e8 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java @@ -68,11 +68,6 @@ public class RecipeHandlerPureDaisy extends TemplateRecipeHandler { return LibResources.GUI_NEI_BLANK; } - @Override - public int recipiesPerPage() { - return 2; - } - @Override public void loadTransferRects() { transferRects.add(new RecipeTransferRect(new Rectangle(70, 22, 18, 18), "botania.pureDaisy")); From 335bbcdd4b31d80fc1a20a6b14d754034c82e5a6 Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 17:34:05 -0400 Subject: [PATCH 04/13] Clean up brewery handler and show usable brew containers as catalysts --- .../client/integration/nei/IMCForNEI.java | 22 ++ .../nei/recipe/RecipeHandlerBrewery.java | 197 +++++++++--------- .../common/core/proxy/CommonProxy.java | 6 + 3 files changed, 131 insertions(+), 94 deletions(-) create mode 100644 src/main/java/vazkii/botania/client/integration/nei/IMCForNEI.java diff --git a/src/main/java/vazkii/botania/client/integration/nei/IMCForNEI.java b/src/main/java/vazkii/botania/client/integration/nei/IMCForNEI.java new file mode 100644 index 000000000..f6699d7c6 --- /dev/null +++ b/src/main/java/vazkii/botania/client/integration/nei/IMCForNEI.java @@ -0,0 +1,22 @@ +package vazkii.botania.client.integration.nei; + +import cpw.mods.fml.common.event.FMLInterModComms; +import net.minecraft.nbt.NBTTagCompound; +import vazkii.botania.client.integration.nei.recipe.RecipeHandlerBrewery; + +public class IMCForNEI { + public static void IMCSender() { + String brewery = new RecipeHandlerBrewery().getOverlayIdentifier(); + sendCatalyst(brewery, "Botania:vial", -1); + sendCatalyst(brewery, "Botania:vial:1", -1); + sendCatalyst(brewery, "Botania:incenseStick", -1); + } + + private static void sendCatalyst(String handlerName, String stack, int priority) { + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setString("handlerID", handlerName); + nbt.setString("itemName", stack); + nbt.setInteger("priority", priority); + FMLInterModComms.sendMessage("NotEnoughItems", "registerCatalystInfo", nbt); + } +} diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerBrewery.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerBrewery.java index 15680bb19..e94c32364 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerBrewery.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerBrewery.java @@ -23,118 +23,127 @@ import codechicken.nei.recipe.TemplateRecipeHandler; public class RecipeHandlerBrewery extends TemplateRecipeHandler { - public class CachedBreweryRecipe extends CachedRecipe { + public class CachedBreweryRecipe extends CachedRecipe { - public List inputs = new ArrayList<>(); - public PositionedStack output; - public int mana; + public List inputs = new ArrayList<>(); + public PositionedStack output; + public int mana; - public CachedBreweryRecipe(RecipeBrew recipe, ItemStack vial) { - if(recipe == null) - return; + public CachedBreweryRecipe(RecipeBrew recipe, ItemStack vial) { + if (recipe == null) return; - setIngredients(recipe.getInputs()); - ItemStack toVial; - if (vial == null) - toVial = new ItemStack(ModItems.vial); - else - toVial = vial.copy(); - toVial.stackSize = 1; - inputs.add(new PositionedStack(toVial, 39, 42)); + setIngredients(recipe.getInputs()); + ItemStack toVial; + if (vial == null) { + toVial = new ItemStack(ModItems.vial); + } else { + toVial = vial.copy(); + } + toVial.stackSize = 1; + inputs.add(new PositionedStack(toVial, 39, 42)); - output = new PositionedStack(recipe.getOutput(toVial), 87, 42); - } + output = new PositionedStack(recipe.getOutput(toVial), 87, 42); + } - public CachedBreweryRecipe(RecipeBrew recipe) { - this(recipe, null); - } + public CachedBreweryRecipe(RecipeBrew recipe) { + this(recipe, null); + } - public void setIngredients(List inputs) { - int left = 96 - inputs.size() * 18 / 2; + public void setIngredients(List inputs) { + int left = 96 - inputs.size() * 18 / 2; - int i = 0; - for (Object o : inputs) { - if (o instanceof String) - this.inputs.add(new PositionedStack(OreDictionary.getOres((String) o), left + i * 18, 6)); - else - this.inputs.add(new PositionedStack(o, left + i * 18, 6)); + int i = 0; + for (Object o : inputs) { + if (o instanceof String) { + this.inputs.add(new PositionedStack(OreDictionary.getOres((String) o), left + i * 18, 6)); + } else { + this.inputs.add(new PositionedStack(o, left + i * 18, 6)); + } + i++; + } + } - i++; - } - } + @Override + public List getIngredients() { + return inputs; + } - @Override - public List getIngredients() { - return inputs; - } + @Override + public PositionedStack getResult() { + return output; + } - @Override - public PositionedStack getResult() { - return output; - } + } - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.brewery"); + } - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.brewery"); - } + @Override + public String getOverlayIdentifier() { + return "botania.brewery"; + } - @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BREWERY; - } + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BREWERY; + } - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(87, 25, 15, 14), "botania.brewery")); - } + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(87, 25, 15, 14), getOverlayIdentifier())); + } - @Override - public void drawBackground(int recipe) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 166, 65); - } + @Override + public void drawBackground(int recipe) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 166, 65); + } - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - if(outputId.equals("botania.brewery")) - for(RecipeBrew recipe : BotaniaAPI.brewRecipes) - arecipes.add(new CachedBreweryRecipe(recipe)); - else super.loadCraftingRecipes(outputId, results); - } + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(getOverlayIdentifier())) { + for (RecipeBrew recipe : BotaniaAPI.brewRecipes) { + arecipes.add(new CachedBreweryRecipe(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } - @Override - public void loadCraftingRecipes(ItemStack result) { - if(result.getItem() instanceof IBrewItem) - for(RecipeBrew recipe : BotaniaAPI.brewRecipes) { - if(recipe == null) - continue; + @Override + public void loadCraftingRecipes(ItemStack result) { + if (!(result.getItem() instanceof IBrewItem)) { + return; + } + for (RecipeBrew recipe : BotaniaAPI.brewRecipes) { + if (recipe != null && ((IBrewItem) result.getItem()).getBrew(result) == recipe.getBrew()) { + arecipes.add(new CachedBreweryRecipe(recipe)); + } + } + } - if(((IBrewItem) result.getItem()).getBrew(result) == recipe.getBrew()) - arecipes.add(new CachedBreweryRecipe(recipe)); - } - } + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if (ingredient.getItem() instanceof IBrewContainer) { + for (RecipeBrew recipe : BotaniaAPI.brewRecipes) { + if (recipe != null && recipe.getOutput(ingredient) != null) { + arecipes.add(new CachedBreweryRecipe(recipe, ingredient)); + } + } + } else { + for (RecipeBrew recipe : BotaniaAPI.brewRecipes) { + if (recipe == null) + continue; - @Override - public void loadUsageRecipes(ItemStack ingredient) { - if(ingredient.getItem() instanceof IBrewContainer) { - for(RecipeBrew recipe : BotaniaAPI.brewRecipes) { - if(recipe == null) - continue; - - if(recipe.getOutput(ingredient) != null) - arecipes.add(new CachedBreweryRecipe(recipe, ingredient)); - } - } else for(RecipeBrew recipe : BotaniaAPI.brewRecipes) { - if(recipe == null) - continue; - - CachedBreweryRecipe crecipe = new CachedBreweryRecipe(recipe); - if(ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.inputs, ingredient)) - arecipes.add(crecipe); - } - } + CachedBreweryRecipe crecipe = new CachedBreweryRecipe(recipe); + if (ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.inputs, ingredient)) { + arecipes.add(crecipe); + } + } + } + } } diff --git a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java index 24c14e5f4..19f743fee 100644 --- a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java +++ b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java @@ -33,6 +33,7 @@ import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.lexicon.ITwoNamedPage; import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.api.lexicon.LexiconPage; +import vazkii.botania.client.integration.nei.IMCForNEI; import vazkii.botania.common.Botania; import vazkii.botania.common.achievement.ModAchievements; import vazkii.botania.common.block.ModBlocks; @@ -84,6 +85,7 @@ import vazkii.botania.common.world.SkyblockWorldEvents; import vazkii.botania.common.world.WorldTypeSkyblock; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLLog; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLPostInitializationEvent; @@ -152,6 +154,10 @@ public class CommonProxy { new StatementAPIPlugin(); LexiconData.init(); + + if (Loader.isModLoaded("NotEnoughItems")) { + IMCForNEI.IMCSender(); + } } public void postInit(FMLPostInitializationEvent event) { From b4f98d7b7cfeeef63f49191c6892e746043c01f3 Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 18:10:56 -0400 Subject: [PATCH 05/13] Clean up elven trade handler and replace stream with loop --- .../nei/recipe/RecipeHandlerElvenTrade.java | 185 +++++++++--------- 1 file changed, 97 insertions(+), 88 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java index 2919bfdbe..a44d07844 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerElvenTrade.java @@ -4,7 +4,6 @@ import java.awt.Rectangle; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.texture.TextureMap; @@ -26,119 +25,129 @@ import vazkii.botania.common.core.helper.ItemNBTHelper; public class RecipeHandlerElvenTrade extends TemplateRecipeHandler { - public class CachedElvenTradeRecipe extends CachedRecipe { + public class CachedElvenTradeRecipe extends CachedRecipe { - public List inputs = new ArrayList<>(); - public PositionedStack output; + public List inputs = new ArrayList<>(); + public PositionedStack output; - public CachedElvenTradeRecipe(RecipeElvenTrade recipe) { - if(recipe == null) - return; + public CachedElvenTradeRecipe(RecipeElvenTrade recipe) { + if (recipe == null) + return; - setIngredients(recipe.getInputs()); - output = new PositionedStack(recipe.getOutput(), 107, 46); - } + setIngredients(recipe.getInputs()); + output = new PositionedStack(recipe.getOutput(), 107, 46); + } - public void setIngredients(List inputs) { - int i = 0; - for(Object o : inputs) { - if(o instanceof String) - this.inputs.add(new PositionedStack(OreDictionary.getOres((String) o), 60 + i * 18, 6)); - else this.inputs.add(new PositionedStack(o, 60 + i * 18, 6)); + public void setIngredients(List inputs) { + int i = 0; + for (Object o : inputs) { + if (o instanceof String) { + this.inputs.add(new PositionedStack(OreDictionary.getOres((String) o), 60 + i * 18, 6)); + } else { + this.inputs.add(new PositionedStack(o, 60 + i * 18, 6)); + } - i++; - } - } + i++; + } + } - @Override - public List getIngredients() { - return inputs; - } + @Override + public List getIngredients() { + return inputs; + } - @Override - public PositionedStack getResult() { - return output; - } + @Override + public PositionedStack getResult() { + return output; + } - } + } - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.elvenTrade"); - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.elvenTrade"); + } - @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BLANK; - } + @Override + public String getOverlayIdentifier() { + return "botania.elvenTrade"; + } - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(35, 30, 48, 48), "botania.elvenTrade")); - } + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BLANK; + } - @Override - public void drawBackground(int recipe) { - super.drawBackground(recipe); - GL11.glEnable(GL11.GL_BLEND); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.7F); - GuiDraw.changeTexture(LibResources.GUI_ELVEN_TRADE_OVERLAY); - GuiDraw.drawTexturedModalRect(30, 10, 17, 17, 100, 80); - GL11.glDisable(GL11.GL_BLEND); - GuiDraw.changeTexture(TextureMap.locationBlocksTexture); - RenderItem.getInstance().renderIcon(35, 29, BlockAlfPortal.portalTex, 48, 48); - } + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(35, 30, 48, 48), getOverlayIdentifier())); + } - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - if (outputId.equals("botania.elvenTrade")) { + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.7F); + GuiDraw.changeTexture(LibResources.GUI_ELVEN_TRADE_OVERLAY); + GuiDraw.drawTexturedModalRect(30, 10, 17, 17, 100, 80); + GL11.glDisable(GL11.GL_BLEND); + GuiDraw.changeTexture(TextureMap.locationBlocksTexture); + RenderItem.getInstance().renderIcon(35, 29, BlockAlfPortal.portalTex, 48, 48); + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(getOverlayIdentifier())) { for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { arecipes.add(new CachedElvenTradeRecipe(recipe)); } } else { - super.loadCraftingRecipes(outputId, results); - } - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { - if (NEIServerUtils.areStacksSameTypeCrafting(recipe.getOutput(), result)) - arecipes.add(new CachedElvenTradeRecipe(recipe)); + super.loadCraftingRecipes(outputId, results); } } - @Override - public void loadUsageRecipes(ItemStack ingredient) { + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { + if (NEIServerUtils.areStacksSameTypeCrafting(recipe.getOutput(), result)) { + arecipes.add(new CachedElvenTradeRecipe(recipe)); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { CachedElvenTradeRecipe crecipe = new CachedElvenTradeRecipe(recipe); - if (crecipe.contains(crecipe.inputs, ingredient)) + if (crecipe.contains(crecipe.inputs, ingredient)) { arecipes.add(crecipe); + } } } - // hide dummy recipes - private List filteredElvenTradeRecipes() { - return BotaniaAPI.elvenTradeRecipes - .stream() - .filter(recipe -> { - if (recipe == null) { - return false; - } - if (recipe.getInputs().size() == 1) { - return !stackSame(recipe.getOutput(), recipe.getInputs().get(0)); - } - return true; - }) - .collect(Collectors.toList()); - } + private List filteredElvenTradeRecipes() { + List result = new ArrayList<>(); - private boolean stackSame(ItemStack stack, Object obj) { - if (obj instanceof String) { - return OreDictionary.getOres((String) obj).stream().anyMatch(s -> ItemNBTHelper.areStacksSameTypeCraftingWithNBT(stack, s)); - } else { - return Arrays.stream(NEIServerUtils.extractRecipeItems(obj)).anyMatch(s -> ItemNBTHelper.areStacksSameTypeCraftingWithNBT(stack, s)); - } - } + for (RecipeElvenTrade recipe : BotaniaAPI.elvenTradeRecipes) { + if (recipe == null) { + continue; + } + + // Don't show dummy recipes where input and output are the same + if (recipe.getInputs().size() != 1 || !stackSame(recipe.getOutput(), recipe.getInputs().get(0))) { + result.add(recipe); + } + } + + return result; + } + + private boolean stackSame(ItemStack stack, Object obj) { + if (obj instanceof String) { + return OreDictionary.getOres((String) obj).stream().anyMatch(s -> ItemNBTHelper.areStacksSameTypeCraftingWithNBT(stack, s)); + } else { + return Arrays.stream(NEIServerUtils.extractRecipeItems(obj)).anyMatch(s -> ItemNBTHelper.areStacksSameTypeCraftingWithNBT(stack, s)); + } + } } From e150175b3d35020199ceae0d4f18bae1a7aea022 Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 18:25:07 -0400 Subject: [PATCH 06/13] Clean up floating flower handler and let it work with the inventory crafting grid --- .../recipe/RecipeHandlerFloatingFlowers.java | 97 ++++++++++--------- 1 file changed, 51 insertions(+), 46 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerFloatingFlowers.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerFloatingFlowers.java index 2c3a3a832..e3dd9daf1 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerFloatingFlowers.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerFloatingFlowers.java @@ -17,65 +17,70 @@ import codechicken.nei.recipe.TemplateRecipeHandler; public class RecipeHandlerFloatingFlowers extends TemplateRecipeHandler { - public class CachedFloatingFlowerRecipe extends CachedRecipe { + public class CachedFloatingFlowerRecipe extends CachedRecipe { - public List inputs = new ArrayList<>(); - public PositionedStack output; + public List inputs = new ArrayList<>(); + public PositionedStack output; - public CachedFloatingFlowerRecipe(ItemStack floatingFlower, ItemStack specialFlower, ItemStack output) { - inputs.add(new PositionedStack(floatingFlower, 25, 6)); - inputs.add(new PositionedStack(specialFlower, 43, 6)); - this.output = new PositionedStack(output, 119, 24); - this.output.setMaxSize(1); - } + public CachedFloatingFlowerRecipe(ItemStack floatingFlower, ItemStack specialFlower, ItemStack output) { + inputs.add(new PositionedStack(floatingFlower, 25, 6)); + inputs.add(new PositionedStack(specialFlower, 43, 6)); + this.output = new PositionedStack(output, 119, 24); + this.output.setMaxSize(1); + } - @Override - public List getIngredients() { - return inputs; - } + @Override + public List getIngredients() { + return inputs; + } - @Override - public PositionedStack getResult() { - return output; - } + @Override + public PositionedStack getResult() { + return output; + } - } + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.floatingFlowers"); + } @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.floatingFlowers"); + public String getOverlayIdentifier() { + return "crafting2x2"; } - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(84, 23, 24, 18), "crafting")); - } + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(84, 23, 24, 18), "crafting")); + } - @Override - public String getGuiTexture() { - return "textures/gui/container/crafting_table.png"; - } + @Override + public String getGuiTexture() { + return "textures/gui/container/crafting_table.png"; + } - @Override - public void loadCraftingRecipes(ItemStack result) { - if(Block.getBlockFromItem(result.getItem()) instanceof BlockFloatingSpecialFlower) { - ItemStack floatingFlower = new ItemStack(ModBlocks.floatingFlower, 1, OreDictionary.WILDCARD_VALUE); - ItemStack specialFlower = new ItemStack(ModBlocks.specialFlower); - specialFlower.setTagCompound((NBTTagCompound) result.getTagCompound().copy()); + @Override + public void loadCraftingRecipes(ItemStack result) { + if (Block.getBlockFromItem(result.getItem()) instanceof BlockFloatingSpecialFlower) { + ItemStack floatingFlower = new ItemStack(ModBlocks.floatingFlower, 1, OreDictionary.WILDCARD_VALUE); + ItemStack specialFlower = new ItemStack(ModBlocks.specialFlower); + specialFlower.setTagCompound((NBTTagCompound) result.getTagCompound().copy()); - arecipes.add(new CachedFloatingFlowerRecipe(floatingFlower, specialFlower, result.copy())); - } - } + arecipes.add(new CachedFloatingFlowerRecipe(floatingFlower, specialFlower, result.copy())); + } + } - @Override - public void loadUsageRecipes(ItemStack ingredient) { - if(Block.getBlockFromItem(ingredient.getItem()) instanceof BlockSpecialFlower) { - ItemStack floatingFlower = new ItemStack(ModBlocks.floatingFlower, 1, OreDictionary.WILDCARD_VALUE); - ItemStack result = new ItemStack(ModBlocks.floatingSpecialFlower); - result.setTagCompound((NBTTagCompound) ingredient.getTagCompound().copy()); + @Override + public void loadUsageRecipes(ItemStack ingredient) { + if (Block.getBlockFromItem(ingredient.getItem()) instanceof BlockSpecialFlower) { + ItemStack floatingFlower = new ItemStack(ModBlocks.floatingFlower, 1, OreDictionary.WILDCARD_VALUE); + ItemStack result = new ItemStack(ModBlocks.floatingSpecialFlower); + result.setTagCompound((NBTTagCompound) ingredient.getTagCompound().copy()); - arecipes.add(new CachedFloatingFlowerRecipe(floatingFlower, ingredient.copy(), result)); - } - } + arecipes.add(new CachedFloatingFlowerRecipe(floatingFlower, ingredient.copy(), result)); + } + } } From 63a0f35d54a28aa454ce1799988181862cc8818b Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 18:57:15 -0400 Subject: [PATCH 07/13] Clean up lexica info handler, make the transfer rect actually work by just rendering the lexica item rather than adding it as an itemstack, and show information when looking both for recipes and usages --- .../recipe/RecipeHandlerLexicaBotania.java | 212 +++++++++--------- 1 file changed, 111 insertions(+), 101 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java index 26edc2296..e34452d4d 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java @@ -2,22 +2,22 @@ * This class was created by . It's distributed as * part of the Botania Mod. Get the Source Code in github: * https://github.com/Vazkii/Botania - * + *

* Botania is Open Source and distributed under the * Botania License: http://botaniamod.net/license.php - * + *

* File Created @ [12/12/2015, 23:25:47 (GMT)] */ package vazkii.botania.client.integration.nei.recipe; import java.awt.Rectangle; -import java.util.ArrayList; import java.util.Collection; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; @@ -34,116 +34,126 @@ import codechicken.nei.recipe.TemplateRecipeHandler; public class RecipeHandlerLexicaBotania extends TemplateRecipeHandler { - public class CachedLexicaBotaniaRecipe extends CachedRecipe { + private static final RenderItem renderItem = new RenderItem(); + private static final Minecraft mc = Minecraft.getMinecraft(); + private static final ItemStack lexicaStack = new ItemStack(ModItems.lexicon); - public LexiconEntry entry; - public PositionedStack item; - public List otherStacks = new ArrayList<>(); + public class CachedLexicaBotaniaRecipe extends CachedRecipe { - public CachedLexicaBotaniaRecipe(ItemStack stack, LexiconEntry entry) { - otherStacks.add(new PositionedStack(new ItemStack(ModItems.lexicon), 51, 5)); - item = new PositionedStack(stack, 91, 5); - this.entry = entry; - } + public LexiconEntry entry; + public PositionedStack item; - @Override - public List getIngredients() { - return otherStacks; - } + public CachedLexicaBotaniaRecipe(ItemStack stack, LexiconEntry entry) { + item = new PositionedStack(stack, 91, 5); + this.entry = entry; + } - @Override - public PositionedStack getResult() { - return item; - } + @Override + public PositionedStack getResult() { + return item; + } - @Override - public List getOtherStacks() { - return otherStacks; - } + @Override + public boolean contains(Collection ingredients, ItemStack ingredient) { + return ingredient.getItem() == ModItems.lexicon; + } - @Override - public boolean contains(Collection ingredients, ItemStack ingredient) { - return ingredient.getItem() == ModItems.lexicon; - } + } - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.lexica"); + } - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.lexica"); - } + @Override + public String getOverlayIdentifier() { + return "botania.lexica"; + } - @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BLANK; - } - - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(50, 4, 18, 18), "botania.lexica")); - } - - @Override - public void drawBackground(int recipe) { - super.drawBackground(recipe); - - FontRenderer font = Minecraft.getMinecraft().fontRenderer; - CachedLexicaBotaniaRecipe recipeObj = ((CachedLexicaBotaniaRecipe) arecipes.get(recipe)); + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BLANK; + } - String s = EnumChatFormatting.UNDERLINE + StatCollector.translateToLocal(recipeObj.entry.getUnlocalizedName()); - font.drawString(s, 82 - font.getStringWidth(s) / 2, 30, 4210752); - - KnowledgeType type = recipeObj.entry.getKnowledgeType(); - s = type.color + StatCollector.translateToLocal(type.getUnlocalizedName()).replaceAll("\\&.", ""); - font.drawString(s, 82 - font.getStringWidth(s) / 2, 42, 4210752); - - s = "\"" + StatCollector.translateToLocal(recipeObj.entry.getTagline()) + "\""; - PageText.renderText(5, 42, 160, 200, s); - - String key = LexiconRecipeMappings.stackToString(recipeObj.item.item); - String quickInfo = "botania.nei.quickInfo:" + key; - String quickInfoLocal = StatCollector.translateToLocal(quickInfo); - - if(GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown() && Minecraft.getMinecraft().gameSettings.advancedItemTooltips) - s = "name: " + key; - else if(quickInfo.equals(quickInfoLocal)) - s = StatCollector.translateToLocal("botania.nei.lexicaNoInfo"); - else { - s = StatCollector.translateToLocal("botania.nei.lexicaSeparator"); - font.drawString(s, 82 - font.getStringWidth(s) / 2, 80, 4210752); - s = quickInfoLocal; - } - - PageText.renderText(5, 80, 160, 200, s); - } + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(50, 4, 18, 18), getOverlayIdentifier())); + } - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - if(outputId.equals("botania.lexica")) { - for(LexiconEntry entry : BotaniaAPI.getAllEntries()) { - List stacks = entry.getDisplayedRecipes(); - for(ItemStack stack : stacks) - arecipes.add(new CachedLexicaBotaniaRecipe(stack, entry)); - } - } else super.loadCraftingRecipes(outputId, results); - } + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); - @Override - public void loadCraftingRecipes(ItemStack result) { - for(LexiconEntry entry : BotaniaAPI.getAllEntries()) { - List stacks = entry.getDisplayedRecipes(); - for(ItemStack stack : stacks) { - String key1 = LexiconRecipeMappings.stackToString(stack); - String key2 = LexiconRecipeMappings.stackToString(result); - if(key1.equals(key2)) - arecipes.add(new CachedLexicaBotaniaRecipe(stack, entry)); - } - } - } + FontRenderer font = Minecraft.getMinecraft().fontRenderer; + CachedLexicaBotaniaRecipe recipeObj = ((CachedLexicaBotaniaRecipe) arecipes.get(recipe)); - @Override - public void loadUsageRecipes(ItemStack ingredient) { - // NO-OP - } + renderItem.renderItemAndEffectIntoGUI(font, mc.getTextureManager(), lexicaStack, 51, 5); + + String s = EnumChatFormatting.UNDERLINE + StatCollector.translateToLocal(recipeObj.entry.getUnlocalizedName()); + font.drawString(s, 82 - font.getStringWidth(s) / 2, 30, 0x404040); + + KnowledgeType type = recipeObj.entry.getKnowledgeType(); + s = type.color + StatCollector.translateToLocal(type.getUnlocalizedName()).replaceAll("&.", ""); + font.drawString(s, 82 - font.getStringWidth(s) / 2, 42, 0x404040); + + s = "\"" + StatCollector.translateToLocal(recipeObj.entry.getTagline()) + "\""; + PageText.renderText(5, 42, 160, 200, s); + + String key = LexiconRecipeMappings.stackToString(recipeObj.item.item); + String quickInfo = "botania.nei.quickInfo:" + key; + String quickInfoLocal = StatCollector.translateToLocal(quickInfo); + + if (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown() && Minecraft.getMinecraft().gameSettings.advancedItemTooltips) + s = "name: " + key; + else if (quickInfo.equals(quickInfoLocal)) + s = StatCollector.translateToLocal("botania.nei.lexicaNoInfo"); + else { + font.drawString( + StatCollector.translateToLocal("botania.nei.lexicaSeparator"), + 82 - font.getStringWidth(s) / 2, + 80, + 0x404040); + s = quickInfoLocal; + } + + PageText.renderText(5, 80, 160, 200, s); + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(getOverlayIdentifier())) { + for (LexiconEntry entry : BotaniaAPI.getAllEntries()) { + List stacks = entry.getDisplayedRecipes(); + for (ItemStack stack : stacks) + arecipes.add(new CachedLexicaBotaniaRecipe(stack, entry)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (LexiconEntry entry : BotaniaAPI.getAllEntries()) { + List stacks = entry.getDisplayedRecipes(); + for (ItemStack stack : stacks) { + String key1 = LexiconRecipeMappings.stackToString(stack); + String key2 = LexiconRecipeMappings.stackToString(result); + if (key1.equals(key2)) { + arecipes.add(new CachedLexicaBotaniaRecipe(stack, entry)); + } + } + } + } + + @Override + public void loadUsageRecipes(String outputId, Object... ingredients) { + loadCraftingRecipes(outputId, ingredients); + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + loadCraftingRecipes(ingredient); + } } From fac6a36248ad3db5f00850e1852968d9f4630e3d Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 19:52:20 -0400 Subject: [PATCH 08/13] Clean up mana pool handler and make the transfer rect actually work by just rendering the mana pool item rather than adding it as an itemstack --- .../nei/recipe/RecipeHandlerManaPool.java | 204 ++++++++++-------- 1 file changed, 110 insertions(+), 94 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java index 193a37780..4340b5fb9 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java @@ -1,13 +1,12 @@ package vazkii.botania.client.integration.nei.recipe; import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.item.Item; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; @@ -28,115 +27,132 @@ import vazkii.botania.common.core.helper.ItemNBTHelper; public class RecipeHandlerManaPool extends TemplateRecipeHandler { - public class CachedManaPoolRecipe extends CachedRecipe { + private static final RenderItem renderItem = new RenderItem(); + private static final Minecraft mc = Minecraft.getMinecraft(); + private static final ItemStack poolStack = new ItemStack(ModBlocks.pool); - public List inputs = new ArrayList<>(); - public PositionedStack output; - public List otherStacks = new ArrayList<>(); - public int mana; + public class CachedManaPoolRecipe extends CachedRecipe { - public CachedManaPoolRecipe(RecipeManaInfusion recipe) { - if(recipe == null) - return; - inputs.add(new PositionedStack(new ItemStack(ModBlocks.pool, 1, recipe.getOutput().getItem() == Item.getItemFromBlock(ModBlocks.pool) ? 2 : 0), 71, 37)); + public PositionedStack input; + public PositionedStack output; + public PositionedStack catalyst; + public int mana; - if(recipe.getInput() instanceof String) - inputs.add(new PositionedStack(OreDictionary.getOres((String) recipe.getInput()), 42, 37)); - else inputs.add(new PositionedStack(recipe.getInput(), 42, 37)); + public CachedManaPoolRecipe(RecipeManaInfusion recipe) { + if (recipe == null) return; - if(recipe.isAlchemy()) - otherStacks.add(new PositionedStack(new ItemStack(ModBlocks.alchemyCatalyst), 10, 37)); - else if (recipe.isConjuration()) - otherStacks.add(new PositionedStack(new ItemStack(ModBlocks.conjurationCatalyst), 10, 37)); + if (recipe.getInput() instanceof String) { + input = new PositionedStack(OreDictionary.getOres((String) recipe.getInput()), 42, 37); + } else { + input = new PositionedStack(recipe.getInput(), 42, 37); + } - output = new PositionedStack(recipe.getOutput(), 101, 37); - // This value is where the mana bar is stored initially - mana = recipe.getManaToConsume(); - } + if (recipe.isAlchemy()) { + catalyst = new PositionedStack(new ItemStack(ModBlocks.alchemyCatalyst), 10, 37); + } else if (recipe.isConjuration()) { + catalyst = new PositionedStack(new ItemStack(ModBlocks.conjurationCatalyst), 10, 37); + } - @Override - public List getIngredients() { - return inputs; - } + output = new PositionedStack(recipe.getOutput(), 101, 37); + mana = recipe.getManaToConsume(); + } - @Override - public PositionedStack getResult() { - return output; - } + @Override + public PositionedStack getIngredient() { + return input; + } - @Override - public List getOtherStacks() { - return otherStacks; - } + @Override + public PositionedStack getResult() { + return output; + } - } + @Override + public PositionedStack getOtherStack() { + return catalyst; + } - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.manaPool"); - } + } - @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BLANK; - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.manaPool"); + } - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(70, 36, 18, 18), "botania.manaPool")); - } + @Override + public String getOverlayIdentifier() { + return "botania.manaPool"; + } - @Override - public void drawBackground(int recipe) { - super.drawBackground(recipe); - GL11.glEnable(GL11.GL_BLEND); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); - // Mana infusion is the mana pool, super weird. - GuiDraw.changeTexture(LibResources.GUI_MANA_INFUSION_OVERLAY); - GuiDraw.drawTexturedModalRect(45, 20, 38, 35, 92, 50); - // Below is where the mana bar actually drawn. - int tempMana = ((CachedManaPoolRecipe) arecipes.get(recipe)).mana; - HUDHandler.renderManaBar(32, 80, 0x0000FF, 0.75F, GuiScreen.isShiftKeyDown() ? tempMana : tempMana * 10, TilePool.MAX_MANA / 10); - FontRenderer font = Minecraft.getMinecraft().fontRenderer; - String size = GuiScreen.isShiftKeyDown() ? "1x " : "10x "; - String localized = StatCollector.translateToLocal("botaniamisc.neiratio"); - font.drawString(size + localized, 84 - font.getStringWidth(size + localized) / 2, 71, 0x000000); - RenderTilePool.forceMana = true; - } + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BLANK; + } - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - if(outputId.equals("botania.manaPool")) { - for(RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { - if(recipe == null) - continue; + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(70, 36, 18, 18), getOverlayIdentifier())); + } - arecipes.add(new CachedManaPoolRecipe(recipe)); - } - } else super.loadCraftingRecipes(outputId, results); - } + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + // Arrows + GuiDraw.changeTexture(LibResources.GUI_MANA_INFUSION_OVERLAY); + GuiDraw.drawTexturedModalRect(45, 20, 38, 35, 92, 50); + // Mana bar + int tempMana = ((CachedManaPoolRecipe) arecipes.get(recipe)).mana; + HUDHandler.renderManaBar(32, 80, 0x0000FF, 0.75F, GuiScreen.isShiftKeyDown() ? tempMana : tempMana * 10, TilePool.MAX_MANA / 10); + FontRenderer font = Minecraft.getMinecraft().fontRenderer; + String size = GuiScreen.isShiftKeyDown() ? "1x " : "10x "; + String localized = StatCollector.translateToLocal("botaniamisc.neiratio"); + font.drawString(size + localized, 84 - font.getStringWidth(size + localized) / 2, 71, 0x000000); + GL11.glDisable(GL11.GL_BLEND); + // Mana pool item + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL11.GL_DEPTH_TEST); + RenderTilePool.forceMana = true; + renderItem.renderItemIntoGUI(font, mc.getTextureManager(), poolStack, 71, 37); + GL11.glDisable(GL11.GL_DEPTH_TEST); + RenderHelper.disableStandardItemLighting(); + } - @Override - public void loadCraftingRecipes(ItemStack result) { - for(RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { - if(recipe == null) - continue; + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(getOverlayIdentifier())) { + for (RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { + if (recipe == null) continue; - if(ItemNBTHelper.areStacksSameTypeCraftingWithNBT(recipe.getOutput(), result)) - arecipes.add(new CachedManaPoolRecipe(recipe)); - } - } + arecipes.add(new CachedManaPoolRecipe(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } - @Override - public void loadUsageRecipes(ItemStack ingredient) { - for(RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { - if(recipe == null) - continue; + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { + if (recipe == null) continue; - CachedManaPoolRecipe crecipe = new CachedManaPoolRecipe(recipe); - if(ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getIngredients(), ingredient) || ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getOtherStacks(), ingredient)) - arecipes.add(crecipe); - } - } + if (ItemNBTHelper.areStacksSameTypeCraftingWithNBT(recipe.getOutput(), result)) { + arecipes.add(new CachedManaPoolRecipe(recipe)); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { + if (recipe == null) continue; + + CachedManaPoolRecipe crecipe = new CachedManaPoolRecipe(recipe); + if (ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getIngredients(), ingredient) || ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getOtherStacks(), ingredient)) { + arecipes.add(crecipe); + } + } + } } From 9ee9b771c5b57cd9c9ee15dd42cadb47b6aca604 Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 21:39:57 -0400 Subject: [PATCH 09/13] Move duplicate references to helper class and clean up string display --- .../client/integration/nei/NEIHelper.java | 13 ++++++ .../recipe/RecipeHandlerLexicaBotania.java | 42 ++++++++++++------- .../nei/recipe/RecipeHandlerManaPool.java | 19 +++++---- 3 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java diff --git a/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java b/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java new file mode 100644 index 000000000..cd369c687 --- /dev/null +++ b/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java @@ -0,0 +1,13 @@ +package vazkii.botania.client.integration.nei; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.texture.TextureManager; + +public class NEIHelper { + public static final RenderItem renderItem = new RenderItem(); + public static final Minecraft mc = Minecraft.getMinecraft(); + public static final TextureManager textureManager = mc.getTextureManager(); + public static final FontRenderer font = mc.fontRenderer; +} diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java index e34452d4d..ad619642c 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java @@ -15,9 +15,7 @@ import java.util.Collection; import java.util.List; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; @@ -26,16 +24,15 @@ import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.lexicon.KnowledgeType; import vazkii.botania.api.lexicon.LexiconEntry; import vazkii.botania.api.lexicon.LexiconRecipeMappings; +import vazkii.botania.client.integration.nei.NEIHelper; import vazkii.botania.client.lib.LibResources; import vazkii.botania.common.item.ModItems; import vazkii.botania.common.lexicon.page.PageText; +import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; public class RecipeHandlerLexicaBotania extends TemplateRecipeHandler { - - private static final RenderItem renderItem = new RenderItem(); - private static final Minecraft mc = Minecraft.getMinecraft(); private static final ItemStack lexicaStack = new ItemStack(ModItems.lexicon); public class CachedLexicaBotaniaRecipe extends CachedRecipe { @@ -84,35 +81,48 @@ public class RecipeHandlerLexicaBotania extends TemplateRecipeHandler { public void drawBackground(int recipe) { super.drawBackground(recipe); - FontRenderer font = Minecraft.getMinecraft().fontRenderer; CachedLexicaBotaniaRecipe recipeObj = ((CachedLexicaBotaniaRecipe) arecipes.get(recipe)); - renderItem.renderItemAndEffectIntoGUI(font, mc.getTextureManager(), lexicaStack, 51, 5); + NEIHelper.renderItem.renderItemIntoGUI(NEIHelper.font, NEIHelper.textureManager, lexicaStack, 51, 5); - String s = EnumChatFormatting.UNDERLINE + StatCollector.translateToLocal(recipeObj.entry.getUnlocalizedName()); - font.drawString(s, 82 - font.getStringWidth(s) / 2, 30, 0x404040); + GuiDraw.drawStringC( + EnumChatFormatting.UNDERLINE + StatCollector.translateToLocal(recipeObj.entry.getUnlocalizedName()), + 82, + 30, + 0x404040, + false); KnowledgeType type = recipeObj.entry.getKnowledgeType(); - s = type.color + StatCollector.translateToLocal(type.getUnlocalizedName()).replaceAll("&.", ""); - font.drawString(s, 82 - font.getStringWidth(s) / 2, 42, 0x404040); + GuiDraw.drawStringC( + type.color + StatCollector.translateToLocal(type.getUnlocalizedName()).replaceAll("&.", ""), + 82, + 42, + 0x404040, + false); - s = "\"" + StatCollector.translateToLocal(recipeObj.entry.getTagline()) + "\""; - PageText.renderText(5, 42, 160, 200, s); + PageText.renderText( + 5, + 42, + 160, + 200, + "\"" + StatCollector.translateToLocal(recipeObj.entry.getTagline()) + "\""); String key = LexiconRecipeMappings.stackToString(recipeObj.item.item); String quickInfo = "botania.nei.quickInfo:" + key; String quickInfoLocal = StatCollector.translateToLocal(quickInfo); + String s; if (GuiScreen.isShiftKeyDown() && GuiScreen.isCtrlKeyDown() && Minecraft.getMinecraft().gameSettings.advancedItemTooltips) s = "name: " + key; else if (quickInfo.equals(quickInfoLocal)) s = StatCollector.translateToLocal("botania.nei.lexicaNoInfo"); else { - font.drawString( + GuiDraw.drawStringC( StatCollector.translateToLocal("botania.nei.lexicaSeparator"), - 82 - font.getStringWidth(s) / 2, + 82, 80, - 0x404040); + 0x404040, + false); s = quickInfoLocal; } diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java index 4340b5fb9..2e275328a 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java @@ -2,11 +2,8 @@ package vazkii.botania.client.integration.nei.recipe; import java.awt.Rectangle; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; @@ -16,6 +13,7 @@ import org.lwjgl.opengl.GL11; import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.recipe.RecipeManaInfusion; import vazkii.botania.client.core.handler.HUDHandler; +import vazkii.botania.client.integration.nei.NEIHelper; import vazkii.botania.client.lib.LibResources; import vazkii.botania.client.render.tile.RenderTilePool; import vazkii.botania.common.block.ModBlocks; @@ -27,8 +25,6 @@ import vazkii.botania.common.core.helper.ItemNBTHelper; public class RecipeHandlerManaPool extends TemplateRecipeHandler { - private static final RenderItem renderItem = new RenderItem(); - private static final Minecraft mc = Minecraft.getMinecraft(); private static final ItemStack poolStack = new ItemStack(ModBlocks.pool); public class CachedManaPoolRecipe extends CachedRecipe { @@ -104,17 +100,22 @@ public class RecipeHandlerManaPool extends TemplateRecipeHandler { GuiDraw.drawTexturedModalRect(45, 20, 38, 35, 92, 50); // Mana bar int tempMana = ((CachedManaPoolRecipe) arecipes.get(recipe)).mana; - HUDHandler.renderManaBar(32, 80, 0x0000FF, 0.75F, GuiScreen.isShiftKeyDown() ? tempMana : tempMana * 10, TilePool.MAX_MANA / 10); - FontRenderer font = Minecraft.getMinecraft().fontRenderer; + HUDHandler.renderManaBar( + 32, + 80, + 0x0000FF, + 0.75F, + GuiScreen.isShiftKeyDown() ? tempMana : tempMana * 10, + TilePool.MAX_MANA / 10); String size = GuiScreen.isShiftKeyDown() ? "1x " : "10x "; String localized = StatCollector.translateToLocal("botaniamisc.neiratio"); - font.drawString(size + localized, 84 - font.getStringWidth(size + localized) / 2, 71, 0x000000); + GuiDraw.drawStringC(size + localized, 84, 71, 0x000000, false); GL11.glDisable(GL11.GL_BLEND); // Mana pool item RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL11.GL_DEPTH_TEST); RenderTilePool.forceMana = true; - renderItem.renderItemIntoGUI(font, mc.getTextureManager(), poolStack, 71, 37); + NEIHelper.renderItem.renderItemIntoGUI(NEIHelper.font, NEIHelper.textureManager, poolStack, 71, 37); GL11.glDisable(GL11.GL_DEPTH_TEST); RenderHelper.disableStandardItemLighting(); } From aada712207a4dad26d8724305aa1b4d47119f1bd Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 22:13:30 -0400 Subject: [PATCH 10/13] Clean up apothecary and runic altar handlers. Remove the altars from the recipe ingredients and add seeds/livingrock. --- .../recipe/RecipeHandlerPetalApothecary.java | 209 ++++++++++-------- .../nei/recipe/RecipeHandlerRunicAltar.java | 73 +++--- .../resources/assets/botania/lang/en_US.lang | 2 + 3 files changed, 161 insertions(+), 123 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java index 42696ea2b..e20ce714f 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java @@ -4,6 +4,7 @@ import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; @@ -13,6 +14,7 @@ import org.lwjgl.opengl.GL11; import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.recipe.RecipePetals; +import vazkii.botania.client.integration.nei.NEIHelper; import vazkii.botania.client.lib.LibResources; import vazkii.botania.common.block.ModBlocks; import codechicken.lib.gui.GuiDraw; @@ -22,117 +24,146 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import vazkii.botania.common.core.helper.ItemNBTHelper; public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { + private static final ItemStack altarStack = new ItemStack(ModBlocks.altar); - public class CachedPetalApothecaryRecipe extends CachedRecipe { + public abstract class CachedCircleRecipe extends CachedRecipe { - public List inputs = new ArrayList<>(); - public PositionedStack output; + public List inputs = new ArrayList<>(); + public PositionedStack output; + public boolean renderItem; - public CachedPetalApothecaryRecipe(RecipePetals recipe, boolean addCenterItem) { - setIngredients(recipe.getInputs()); - output = new PositionedStack(recipe.getOutput(), 111, 21); - if(addCenterItem) - inputs.add(new PositionedStack(new ItemStack(ModBlocks.altar), 73, 55)); - } + public CachedCircleRecipe(RecipePetals recipe) { + setIngredients(recipe.getInputs()); + output = new PositionedStack(recipe.getOutput(), 111, 21); + renderItem = true; + } - public CachedPetalApothecaryRecipe(RecipePetals recipe) { - this(recipe, true); - } + public void setIngredients(List inputs) { + float degreePerInput = 360F / inputs.size(); + float currentDegree = -90F; - public void setIngredients(List inputs) { - float degreePerInput = 360F / inputs.size(); - float currentDegree = -90F; + for (Object o : inputs) { + int posX = (int) Math.round(73 + Math.cos(currentDegree * Math.PI / 180D) * 32); + int posY = (int) Math.round(55 + Math.sin(currentDegree * Math.PI / 180D) * 32); - for(Object o : inputs) { - int posX = (int) Math.round(73 + Math.cos(currentDegree * Math.PI / 180D) * 32); - int posY = (int) Math.round(55 + Math.sin(currentDegree * Math.PI / 180D) * 32); + if (o instanceof String) { + this.inputs.add(new PositionedStack(OreDictionary.getOres((String) o), posX, posY)); + } else { + this.inputs.add(new PositionedStack(o, posX, posY)); + } + currentDegree += degreePerInput; + } + } - if(o instanceof String) - this.inputs.add(new PositionedStack(OreDictionary.getOres((String) o), posX, posY)); - else this.inputs.add(new PositionedStack(o, posX, posY)); - currentDegree += degreePerInput; - } - } + @Override + public List getIngredients() { + return inputs; + } - @Override - public List getIngredients() { - return inputs; - } + @Override + public PositionedStack getResult() { + return output; + } + } - @Override - public PositionedStack getResult() { - return output; - } + public class CachedPetalApothecaryRecipe extends CachedCircleRecipe { + ItemStack seedStack = new ItemStack(Items.wheat_seeds); - } + public CachedPetalApothecaryRecipe(RecipePetals recipe) { + super(recipe); + seedStack.setStackDisplayName(StatCollector.translateToLocal("botania.nei.anySeed")); + inputs.add(new PositionedStack(seedStack, 73, 39)); + } - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.petalApothecary"); - } + // Used by the Alfheim addon + @SuppressWarnings("unused") + public CachedPetalApothecaryRecipe(RecipePetals recipe, boolean addCenterItem) { + super(recipe); + renderItem = addCenterItem; + } + } - public String getRecipeID() { - return "botania.petalApothecary"; - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.petalApothecary"); + } - @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BLANK; - } + @Override + public String getOverlayIdentifier() { + return "botania.petalApothecary"; + } - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(72, 54, 18, 18), getRecipeID())); - } + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BLANK; + } - @Override - public void drawBackground(int recipe) { - super.drawBackground(recipe); - GL11.glEnable(GL11.GL_BLEND); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); - GuiDraw.changeTexture(LibResources.GUI_PETAL_OVERLAY); - GuiDraw.drawTexturedModalRect(45, 10, 38, 7, 92, 92); - } + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(73, 56, 16, 16), getOverlayIdentifier())); + } - public List getRecipes() { - return BotaniaAPI.petalRecipes; - } + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + // Background circle graphic + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + GuiDraw.changeTexture(LibResources.GUI_PETAL_OVERLAY); + GuiDraw.drawTexturedModalRect(45, 10, 38, 7, 92, 92); + // Item + if (!((CachedCircleRecipe) arecipes.get(recipe)).renderItem) return; + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL11.GL_DEPTH_TEST); + NEIHelper.renderItem.renderItemIntoGUI(NEIHelper.font, NEIHelper.textureManager, getRenderItem(), 73, 55); + GL11.glDisable(GL11.GL_DEPTH_TEST); + RenderHelper.disableStandardItemLighting(); + } - public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) { - return new CachedPetalApothecaryRecipe(recipe); - } + protected ItemStack getRenderItem() { + return altarStack; + } - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - if(outputId.equals(getRecipeID())) { - for(RecipePetals recipe : getRecipes()) - if(recipe.getOutput().getItem() != Items.skull) - arecipes.add(getCachedRecipe(recipe)); - } else super.loadCraftingRecipes(outputId, results); - } + public List getRecipes() { + return BotaniaAPI.petalRecipes; + } - @Override - public void loadCraftingRecipes(ItemStack result) { - for(RecipePetals recipe : getRecipes()){ - if(recipe == null) - continue; + public CachedCircleRecipe getCachedRecipe(RecipePetals recipe) { + return new CachedPetalApothecaryRecipe(recipe); + } - if(recipe.getOutput().stackTagCompound != null && ItemNBTHelper.areStacksSameTypeWithNBT(recipe.getOutput(), result) || recipe.getOutput().stackTagCompound == null && NEIServerUtils.areStacksSameTypeCrafting(recipe.getOutput(), result) && recipe.getOutput().getItem() != Items.skull) - arecipes.add(getCachedRecipe(recipe)); - } - } + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(getOverlayIdentifier())) { + for (RecipePetals recipe : getRecipes()) + if (recipe.getOutput().getItem() != Items.skull) + arecipes.add(getCachedRecipe(recipe)); + } else { + super.loadCraftingRecipes(outputId, results); + } + } - @Override - public void loadUsageRecipes(ItemStack ingredient) { - for(RecipePetals recipe : getRecipes()) { - if(recipe == null) - continue; + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipePetals recipe : getRecipes()) { + if (recipe == null) continue; - CachedPetalApothecaryRecipe crecipe = getCachedRecipe(recipe); - if(ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.inputs, ingredient) && recipe.getOutput().getItem() != Items.skull) - arecipes.add(crecipe); - } - } + if (recipe.getOutput().stackTagCompound != null && ItemNBTHelper.areStacksSameTypeWithNBT(recipe.getOutput(), result) || recipe.getOutput().stackTagCompound == null && NEIServerUtils.areStacksSameTypeCrafting(recipe.getOutput(), result) && recipe.getOutput().getItem() != Items.skull) { + arecipes.add(getCachedRecipe(recipe)); + } + } + } + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (RecipePetals recipe : getRecipes()) { + if (recipe == null) continue; + + CachedCircleRecipe crecipe = getCachedRecipe(recipe); + if (ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.inputs, ingredient) && recipe.getOutput().getItem() != Items.skull) { + arecipes.add(crecipe); + } + } + } } diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerRunicAltar.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerRunicAltar.java index 506ad540d..b1b5fc08d 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerRunicAltar.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerRunicAltar.java @@ -14,44 +14,49 @@ import codechicken.nei.PositionedStack; public class RecipeHandlerRunicAltar extends RecipeHandlerPetalApothecary { - public class CachedRunicAltarRecipe extends CachedPetalApothecaryRecipe { + private static final ItemStack altarStack = new ItemStack(ModBlocks.runeAltar); - public int manaUsage; + public class CachedRunicAltarRecipe extends CachedCircleRecipe { - public CachedRunicAltarRecipe(RecipeRuneAltar recipe) { - super(recipe, false); - if(recipe == null) - return; - manaUsage = recipe.getManaUsage(); - inputs.add(new PositionedStack(new ItemStack(ModBlocks.runeAltar), 73, 55)); - } + public int manaUsage; + private static final PositionedStack livingrock = new PositionedStack(new ItemStack(ModBlocks.livingrock), 73, 39); - } + public CachedRunicAltarRecipe(RecipeRuneAltar recipe) { + super(recipe); + inputs.add(livingrock); + manaUsage = recipe.getManaUsage(); + } + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.runicAltar"); + } + + @Override + public String getOverlayIdentifier() { + return "botania.runicAltar"; + } + + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + HUDHandler.renderManaBar(32, 113, 0x0000FF, 0.75F, ((CachedRunicAltarRecipe) arecipes.get(recipe)).manaUsage, TilePool.MAX_MANA / 10); + } + + @Override + public List getRecipes() { + return BotaniaAPI.runeAltarRecipes; + } + + @Override + public CachedCircleRecipe getCachedRecipe(RecipePetals recipe) { + return new CachedRunicAltarRecipe((RecipeRuneAltar) recipe); + } @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.runicAltar"); - } - - @Override - public String getRecipeID() { - return "botania.runicAltar"; - } - - @Override - public void drawBackground(int recipe) { - super.drawBackground(recipe); - HUDHandler.renderManaBar(32, 113, 0x0000FF, 0.75F, ((CachedRunicAltarRecipe) arecipes.get(recipe)).manaUsage, TilePool.MAX_MANA / 10); - } - - @Override - public List getRecipes() { - return BotaniaAPI.runeAltarRecipes; - } - - @Override - public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) { - return new CachedRunicAltarRecipe((RecipeRuneAltar) recipe); - } + protected ItemStack getRenderItem() { + return altarStack; + } } diff --git a/src/main/resources/assets/botania/lang/en_US.lang b/src/main/resources/assets/botania/lang/en_US.lang index f7d6279cc..a951b9d87 100644 --- a/src/main/resources/assets/botania/lang/en_US.lang +++ b/src/main/resources/assets/botania/lang/en_US.lang @@ -184,6 +184,8 @@ botania.nei.pureDaisy=Pure Daisy botania.nei.lexica=Lexica Botania nei.options.keys.gui.botania_corporea_request=Corporea Request +botania.nei.anySeed=Any Seed + botania.nei.lexicaSeparator=Extra Info: botania.nei.lexicaNoInfo=(there's no Extra Info for this entry, sorry!) From 209101aa95e900688fe2946e532cb3d62f3afe89 Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Fri, 20 Mar 2026 22:48:16 -0400 Subject: [PATCH 11/13] Clean up pure daisy handler. Add helper method to render items. --- .../client/integration/nei/NEIHelper.java | 5 + .../recipe/RecipeHandlerLexicaBotania.java | 2 +- .../nei/recipe/RecipeHandlerManaPool.java | 2 +- .../recipe/RecipeHandlerPetalApothecary.java | 2 +- .../nei/recipe/RecipeHandlerPureDaisy.java | 158 ++++++++++-------- 5 files changed, 92 insertions(+), 77 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java b/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java index cd369c687..4432d9464 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java +++ b/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java @@ -4,10 +4,15 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.item.ItemStack; public class NEIHelper { public static final RenderItem renderItem = new RenderItem(); public static final Minecraft mc = Minecraft.getMinecraft(); public static final TextureManager textureManager = mc.getTextureManager(); public static final FontRenderer font = mc.fontRenderer; + + public static void renderItemIntoGUI(ItemStack flowerStack, int x, int y) { + renderItem.renderItemIntoGUI(font, textureManager, flowerStack, x, y); + } } diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java index ad619642c..6a16b1990 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerLexicaBotania.java @@ -83,7 +83,7 @@ public class RecipeHandlerLexicaBotania extends TemplateRecipeHandler { CachedLexicaBotaniaRecipe recipeObj = ((CachedLexicaBotaniaRecipe) arecipes.get(recipe)); - NEIHelper.renderItem.renderItemIntoGUI(NEIHelper.font, NEIHelper.textureManager, lexicaStack, 51, 5); + NEIHelper.renderItemIntoGUI(lexicaStack, 51, 5); GuiDraw.drawStringC( EnumChatFormatting.UNDERLINE + StatCollector.translateToLocal(recipeObj.entry.getUnlocalizedName()), diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java index 2e275328a..92b72c6d1 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java @@ -115,7 +115,7 @@ public class RecipeHandlerManaPool extends TemplateRecipeHandler { RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL11.GL_DEPTH_TEST); RenderTilePool.forceMana = true; - NEIHelper.renderItem.renderItemIntoGUI(NEIHelper.font, NEIHelper.textureManager, poolStack, 71, 37); + NEIHelper.renderItemIntoGUI(poolStack, 71, 37); GL11.glDisable(GL11.GL_DEPTH_TEST); RenderHelper.disableStandardItemLighting(); } diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java index e20ce714f..7c638cc6d 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java @@ -115,7 +115,7 @@ public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { if (!((CachedCircleRecipe) arecipes.get(recipe)).renderItem) return; RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL11.GL_DEPTH_TEST); - NEIHelper.renderItem.renderItemIntoGUI(NEIHelper.font, NEIHelper.textureManager, getRenderItem(), 73, 55); + NEIHelper.renderItemIntoGUI(getRenderItem(), 73, 55); GL11.glDisable(GL11.GL_DEPTH_TEST); RenderHelper.disableStandardItemLighting(); } diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java index c2fcc00e8..8b0fc8bf7 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPureDaisy.java @@ -13,6 +13,7 @@ import org.lwjgl.opengl.GL11; import vazkii.botania.api.BotaniaAPI; import vazkii.botania.api.recipe.RecipePureDaisy; +import vazkii.botania.client.integration.nei.NEIHelper; import vazkii.botania.client.lib.LibResources; import vazkii.botania.common.core.helper.ItemNBTHelper; import vazkii.botania.common.item.block.ItemBlockSpecialFlower; @@ -23,98 +24,107 @@ import codechicken.nei.recipe.TemplateRecipeHandler; public class RecipeHandlerPureDaisy extends TemplateRecipeHandler { - public class CachedPureDaisyRecipe extends CachedRecipe { + private static final ItemStack flowerStack = ItemBlockSpecialFlower.ofType(LibBlockNames.SUBTILE_PUREDAISY); - public List inputs = new ArrayList<>(); - public PositionedStack output; - public List otherStacks = new ArrayList<>(); + public class CachedPureDaisyRecipe extends CachedRecipe { - public CachedPureDaisyRecipe(RecipePureDaisy recipe) { - if(recipe == null) - return; - inputs.add(new PositionedStack(ItemBlockSpecialFlower.ofType(LibBlockNames.SUBTILE_PUREDAISY), 71, 23)); + public List inputs = new ArrayList<>(); + public PositionedStack output; + public List otherStacks = new ArrayList<>(); - if(recipe.getInput() instanceof String) - inputs.add(new PositionedStack(OreDictionary.getOres((String) recipe.getInput()), 42, 23)); - else inputs.add(new PositionedStack(new ItemStack((Block) recipe.getInput()), 42, 23)); + public CachedPureDaisyRecipe(RecipePureDaisy recipe) { + if (recipe == null) return; - output = new PositionedStack(new ItemStack(recipe.getOutput()), 101, 23); - } + if (recipe.getInput() instanceof String) { + inputs.add(new PositionedStack(OreDictionary.getOres((String) recipe.getInput()), 42, 23)); + } else { + inputs.add(new PositionedStack(new ItemStack((Block) recipe.getInput()), 42, 23)); + } - @Override - public List getIngredients() { - return inputs; - } + output = new PositionedStack(new ItemStack(recipe.getOutput()), 101, 23); + } - @Override - public PositionedStack getResult() { - return output; - } + @Override + public List getIngredients() { + return inputs; + } - @Override - public List getOtherStacks() { - return otherStacks; - } + @Override + public PositionedStack getResult() { + return output; + } - } + @Override + public List getOtherStacks() { + return otherStacks; + } + + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.pureDaisy"); + } @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.pureDaisy"); + public String getOverlayIdentifier() { + return "botania.pureDaisy"; } - @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BLANK; - } + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BLANK; + } - @Override - public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(70, 22, 18, 18), "botania.pureDaisy")); - } + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(70, 22, 18, 18), getOverlayIdentifier())); + } - @Override - public void drawBackground(int recipe) { - super.drawBackground(recipe); - GL11.glEnable(GL11.GL_BLEND); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); - GuiDraw.changeTexture(LibResources.GUI_PURE_DAISY_OVERLAY); - GuiDraw.drawTexturedModalRect(45, 10, 0, 0, 65, 44); - } + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + // Arrows + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); + GuiDraw.changeTexture(LibResources.GUI_PURE_DAISY_OVERLAY); + GuiDraw.drawTexturedModalRect(48, 10, 0, 0, 65, 44); + // Flower item + NEIHelper.renderItemIntoGUI(flowerStack, 71, 23); + } - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - if(outputId.equals("botania.pureDaisy")) { - for(RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { - if(recipe == null) - continue; + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(getOverlayIdentifier())) { + for (RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { + if (recipe != null) arecipes.add(new CachedPureDaisyRecipe(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } - arecipes.add(new CachedPureDaisyRecipe(recipe)); - } - } else super.loadCraftingRecipes(outputId, results); - } + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { + if (recipe == null) continue; - @Override - public void loadCraftingRecipes(ItemStack result) { - for(RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { - if(recipe == null) - continue; + if (ItemNBTHelper.areStacksSameTypeCraftingWithNBT(new ItemStack(recipe.getOutput()), result)) { + arecipes.add(new CachedPureDaisyRecipe(recipe)); + } + } + } - if(ItemNBTHelper.areStacksSameTypeCraftingWithNBT(new ItemStack(recipe.getOutput()), result)) - arecipes.add(new CachedPureDaisyRecipe(recipe)); - } - } + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { + if (recipe == null) continue; - @Override - public void loadUsageRecipes(ItemStack ingredient) { - for(RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { - if(recipe == null) - continue; - - CachedPureDaisyRecipe crecipe = new CachedPureDaisyRecipe(recipe); - if(ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getIngredients(), ingredient) || ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getOtherStacks(), ingredient)) - arecipes.add(crecipe); - } - } + CachedPureDaisyRecipe crecipe = new CachedPureDaisyRecipe(recipe); + if (ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getIngredients(), ingredient) || ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getOtherStacks(), ingredient)) { + arecipes.add(crecipe); + } + } + } } From 6f903ab7dea1ec2bdf586c51bc05a4f5bce063e3 Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Sat, 21 Mar 2026 00:53:50 -0400 Subject: [PATCH 12/13] Fix crash with Alfheim mod by working around stupid decisions made a decade ago --- .../recipe/RecipeHandlerPetalApothecary.java | 47 +++++++++---------- .../nei/recipe/RecipeHandlerRunicAltar.java | 7 +-- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java index 7c638cc6d..08559cd96 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerPetalApothecary.java @@ -26,16 +26,24 @@ import vazkii.botania.common.core.helper.ItemNBTHelper; public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { private static final ItemStack altarStack = new ItemStack(ModBlocks.altar); - public abstract class CachedCircleRecipe extends CachedRecipe { - + public class CachedPetalApothecaryRecipe extends CachedRecipe { public List inputs = new ArrayList<>(); public PositionedStack output; public boolean renderItem; - public CachedCircleRecipe(RecipePetals recipe) { + public CachedPetalApothecaryRecipe(RecipePetals recipe, boolean addCenterItem) { setIngredients(recipe.getInputs()); output = new PositionedStack(recipe.getOutput(), 111, 21); - renderItem = true; + renderItem = addCenterItem; + if (addCenterItem) { + ItemStack seedStack = new ItemStack(Items.wheat_seeds); + seedStack.setStackDisplayName(StatCollector.translateToLocal("botania.nei.anySeed")); + inputs.add(new PositionedStack(seedStack, 73, 39)); + } + } + + public CachedPetalApothecaryRecipe(RecipePetals recipe) { + this(recipe, true); } public void setIngredients(List inputs) { @@ -66,23 +74,6 @@ public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { } } - public class CachedPetalApothecaryRecipe extends CachedCircleRecipe { - ItemStack seedStack = new ItemStack(Items.wheat_seeds); - - public CachedPetalApothecaryRecipe(RecipePetals recipe) { - super(recipe); - seedStack.setStackDisplayName(StatCollector.translateToLocal("botania.nei.anySeed")); - inputs.add(new PositionedStack(seedStack, 73, 39)); - } - - // Used by the Alfheim addon - @SuppressWarnings("unused") - public CachedPetalApothecaryRecipe(RecipePetals recipe, boolean addCenterItem) { - super(recipe); - renderItem = addCenterItem; - } - } - @Override public String getRecipeName() { return StatCollector.translateToLocal("botania.nei.petalApothecary"); @@ -90,6 +81,12 @@ public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { @Override public String getOverlayIdentifier() { + return getRecipeID(); + } + + // Used by the Alfheim addon + @Deprecated + public String getRecipeID() { return "botania.petalApothecary"; } @@ -112,7 +109,7 @@ public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { GuiDraw.changeTexture(LibResources.GUI_PETAL_OVERLAY); GuiDraw.drawTexturedModalRect(45, 10, 38, 7, 92, 92); // Item - if (!((CachedCircleRecipe) arecipes.get(recipe)).renderItem) return; + if (!((CachedPetalApothecaryRecipe) arecipes.get(recipe)).renderItem) return; RenderHelper.enableGUIStandardItemLighting(); GL11.glEnable(GL11.GL_DEPTH_TEST); NEIHelper.renderItemIntoGUI(getRenderItem(), 73, 55); @@ -128,8 +125,8 @@ public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { return BotaniaAPI.petalRecipes; } - public CachedCircleRecipe getCachedRecipe(RecipePetals recipe) { - return new CachedPetalApothecaryRecipe(recipe); + public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) { + return new CachedPetalApothecaryRecipe(recipe, true); } @Override @@ -159,7 +156,7 @@ public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { for (RecipePetals recipe : getRecipes()) { if (recipe == null) continue; - CachedCircleRecipe crecipe = getCachedRecipe(recipe); + CachedPetalApothecaryRecipe crecipe = getCachedRecipe(recipe); if (ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.inputs, ingredient) && recipe.getOutput().getItem() != Items.skull) { arecipes.add(crecipe); } diff --git a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerRunicAltar.java b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerRunicAltar.java index b1b5fc08d..598029d24 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerRunicAltar.java +++ b/src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerRunicAltar.java @@ -16,15 +16,16 @@ public class RecipeHandlerRunicAltar extends RecipeHandlerPetalApothecary { private static final ItemStack altarStack = new ItemStack(ModBlocks.runeAltar); - public class CachedRunicAltarRecipe extends CachedCircleRecipe { + public class CachedRunicAltarRecipe extends CachedPetalApothecaryRecipe { public int manaUsage; private static final PositionedStack livingrock = new PositionedStack(new ItemStack(ModBlocks.livingrock), 73, 39); public CachedRunicAltarRecipe(RecipeRuneAltar recipe) { - super(recipe); + super(recipe, false); inputs.add(livingrock); manaUsage = recipe.getManaUsage(); + renderItem = true; } } @@ -50,7 +51,7 @@ public class RecipeHandlerRunicAltar extends RecipeHandlerPetalApothecary { } @Override - public CachedCircleRecipe getCachedRecipe(RecipePetals recipe) { + public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) { return new CachedRunicAltarRecipe((RecipeRuneAltar) recipe); } From f58f6f4754a63368d2d04d84c55bff4647462f5a Mon Sep 17 00:00:00 2001 From: koolkrafter5 Date: Sat, 21 Mar 2026 01:53:49 -0400 Subject: [PATCH 13/13] Fix server crash --- .../vazkii/botania/client/integration/nei/IMCForNEI.java | 8 +++----- src/main/java/vazkii/botania/common/Botania.java | 2 ++ .../vazkii/botania/common/core/proxy/CommonProxy.java | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/vazkii/botania/client/integration/nei/IMCForNEI.java b/src/main/java/vazkii/botania/client/integration/nei/IMCForNEI.java index f6699d7c6..ebdae9c33 100644 --- a/src/main/java/vazkii/botania/client/integration/nei/IMCForNEI.java +++ b/src/main/java/vazkii/botania/client/integration/nei/IMCForNEI.java @@ -2,14 +2,12 @@ package vazkii.botania.client.integration.nei; import cpw.mods.fml.common.event.FMLInterModComms; import net.minecraft.nbt.NBTTagCompound; -import vazkii.botania.client.integration.nei.recipe.RecipeHandlerBrewery; public class IMCForNEI { public static void IMCSender() { - String brewery = new RecipeHandlerBrewery().getOverlayIdentifier(); - sendCatalyst(brewery, "Botania:vial", -1); - sendCatalyst(brewery, "Botania:vial:1", -1); - sendCatalyst(brewery, "Botania:incenseStick", -1); + sendCatalyst("botania.brewery", "Botania:vial", -1); + sendCatalyst("botania.brewery", "Botania:vial:1", -1); + sendCatalyst("botania.brewery", "Botania:incenseStick", -1); } private static void sendCatalyst(String handlerName, String stack, int priority) { diff --git a/src/main/java/vazkii/botania/common/Botania.java b/src/main/java/vazkii/botania/common/Botania.java index d6b8844dd..892abdeb7 100644 --- a/src/main/java/vazkii/botania/common/Botania.java +++ b/src/main/java/vazkii/botania/common/Botania.java @@ -43,6 +43,7 @@ public class Botania { public static boolean etFuturumLoaded = false; public static boolean storageDrawersLoaded = false; public static boolean structureLibLoaded = false; + public static boolean neiLoaded = false; public static ILightHelper lightHelper; @@ -63,6 +64,7 @@ public class Botania { etFuturumLoaded = Loader.isModLoaded("etfuturum"); storageDrawersLoaded = Loader.isModLoaded("StorageDrawers"); structureLibLoaded = Loader.isModLoaded("structurelib"); + neiLoaded = Loader.isModLoaded("NotEnoughItems"); lightHelper = coloredLightsLoaded ? new LightHelperColored() : new LightHelperVanilla(); proxy.preInit(event); diff --git a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java index 19f743fee..c0bdab82f 100644 --- a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java +++ b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java @@ -155,7 +155,7 @@ public class CommonProxy { LexiconData.init(); - if (Loader.isModLoaded("NotEnoughItems")) { + if (Botania.neiLoaded) { IMCForNEI.IMCSender(); } }