Compare commits

...
Author SHA1 Message Date
Martin Robertz d81df81feb Merge remote-tracking branch 'origin/nei' into dev 2026-05-21 22:34:43 +02:00
Martin Robertz e344c7e86c Merge remote-tracking branch 'origin/master' into dev 2026-05-21 22:34:31 +02:00
Martin Robertz 3c70f6426f Merge branch 'master' into nei 2026-05-20 11:28:32 +02:00
Martin Robertz cd83ce621d Merge remote-tracking branch 'origin/nei' into dev 2026-05-07 19:10:52 +02:00
koolkrafter5 e95504c504 Merge branch 'master' into nei 2026-05-06 06:50:55 -04:00
koolkrafter5 f58f6f4754 Fix server crash 2026-03-21 02:03:53 -04:00
koolkrafter5 6f903ab7de Fix crash with Alfheim mod by working around stupid decisions made a decade ago 2026-03-21 00:55:06 -04:00
koolkrafter5 209101aa95 Clean up pure daisy handler. Add helper method to render items. 2026-03-20 22:48:16 -04:00
koolkrafter5 aada712207 Clean up apothecary and runic altar handlers. Remove the altars from the recipe ingredients and add seeds/livingrock. 2026-03-20 22:37:29 -04:00
koolkrafter5 9ee9b771c5 Move duplicate references to helper class and clean up string display 2026-03-20 21:39:57 -04:00
koolkrafter5 fac6a36248 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 2026-03-20 19:52:20 -04:00
koolkrafter5 63a0f35d54 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 2026-03-20 19:48:29 -04:00
koolkrafter5 e150175b3d Clean up floating flower handler and let it work with the inventory crafting grid 2026-03-20 18:25:07 -04:00
koolkrafter5 b4f98d7b7c Clean up elven trade handler and replace stream with loop 2026-03-20 18:10:56 -04:00
koolkrafter5 335bbcdd4b Clean up brewery handler and show usable brew containers as catalysts 2026-03-20 18:09:08 -04:00
koolkrafter5 ffcb1bf891 Remove deprecated recipiesPerPage 2026-03-20 17:27:56 -04:00
koolkrafter5 548286802a Remove commented out pointless elven knowledge check 2026-03-20 17:25:13 -04:00
koolkrafter5 730ccfec4b Remove deprecated getCycledIngredients 2026-03-20 17:23:23 -04:00
13 changed files with 782 additions and 675 deletions

No files matched your search

@@ -0,0 +1,20 @@
package vazkii.botania.client.integration.nei;
import cpw.mods.fml.common.event.FMLInterModComms;
import net.minecraft.nbt.NBTTagCompound;
public class IMCForNEI {
public static void IMCSender() {
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) {
NBTTagCompound nbt = new NBTTagCompound();
nbt.setString("handlerID", handlerName);
nbt.setString("itemName", stack);
nbt.setInteger("priority", priority);
FMLInterModComms.sendMessage("NotEnoughItems", "registerCatalystInfo", nbt);
}
}
@@ -0,0 +1,18 @@
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;
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);
}
}
@@ -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<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public int mana;
public List<PositionedStack> 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<Object> inputs) {
int left = 96 - inputs.size() * 18 / 2;
public void setIngredients(List<Object> 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<PositionedStack> getIngredients() {
return inputs;
}
@Override
public List<PositionedStack> getIngredients() {
return getCycledIngredients(cycleticks / 20, 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);
}
}
}
}
}
@@ -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,144 +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<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public List<PositionedStack> 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<Object> 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<Object> 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<PositionedStack> getIngredients() {
return getCycledIngredients(cycleticks / 20, inputs);
}
@Override
public List<PositionedStack> 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 int recipiesPerPage() {
return 1;
}
@Override
public void loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(35, 30, 48, 48), getOverlayIdentifier()));
}
@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 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);
}
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(getOverlayIdentifier())) {
for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) {
arecipes.add(new CachedElvenTradeRecipe(recipe));
}
} else {
super.loadCraftingRecipes(outputId, results);
}
}
@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);
}
@Override
public void loadCraftingRecipes(ItemStack result) {
for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) {
if (NEIServerUtils.areStacksSameTypeCrafting(recipe.getOutput(), result)) {
arecipes.add(new CachedElvenTradeRecipe(recipe));
}
}
}
@Override
public void loadCraftingRecipes(ItemStack result) {
if(hasElvenKnowledge()) {
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)) {
arecipes.add(crecipe);
}
}
}
@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);
}
}
}
private List<RecipeElvenTrade> filteredElvenTradeRecipes() {
List<RecipeElvenTrade> result = new ArrayList<>();
// hide dummy recipes
private List<RecipeElvenTrade> 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());
}
for (RecipeElvenTrade recipe : BotaniaAPI.elvenTradeRecipes) {
if (recipe == null) {
continue;
}
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));
}
}
// 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));
}
}
}
@@ -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<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public List<PositionedStack> 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<PositionedStack> getIngredients() {
return getCycledIngredients(cycleticks / 20, inputs);
}
@Override
public List<PositionedStack> 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));
}
}
}
@@ -2,21 +2,19 @@
* This class was created by <Vazkii>. It's distributed as
* part of the Botania Mod. Get the Source Code in github:
* https://github.com/Vazkii/Botania
*
* <p>
* Botania is Open Source and distributed under the
* Botania License: http://botaniamod.net/license.php
*
* <p>
* 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.item.ItemStack;
import net.minecraft.util.EnumChatFormatting;
@@ -26,129 +24,146 @@ 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 ItemStack lexicaStack = new ItemStack(ModItems.lexicon);
public class CachedLexicaBotaniaRecipe extends CachedRecipe {
public class CachedLexicaBotaniaRecipe extends CachedRecipe {
public LexiconEntry entry;
public PositionedStack item;
public List<PositionedStack> otherStacks = new ArrayList<>();
public LexiconEntry entry;
public PositionedStack item;
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 CachedLexicaBotaniaRecipe(ItemStack stack, LexiconEntry entry) {
item = new PositionedStack(stack, 91, 5);
this.entry = entry;
}
@Override
public List<PositionedStack> getIngredients() {
return otherStacks;
}
@Override
public PositionedStack getResult() {
return item;
}
@Override
public PositionedStack getResult() {
return item;
}
@Override
public boolean contains(Collection<PositionedStack> ingredients, ItemStack ingredient) {
return ingredient.getItem() == ModItems.lexicon;
}
@Override
public List<PositionedStack> getOtherStacks() {
return otherStacks;
}
}
@Override
public boolean contains(Collection<PositionedStack> ingredients, ItemStack ingredient) {
return ingredient.getItem() == ModItems.lexicon;
}
@Override
public String getRecipeName() {
return StatCollector.translateToLocal("botania.nei.lexica");
}
}
@Override
public String getOverlayIdentifier() {
return "botania.lexica";
}
@Override
public String getRecipeName() {
return StatCollector.translateToLocal("botania.nei.lexica");
}
@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(50, 4, 18, 18), getOverlayIdentifier()));
}
@Override
public int recipiesPerPage() {
return 1;
}
@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 void drawBackground(int recipe) {
super.drawBackground(recipe);
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);
}
CachedLexicaBotaniaRecipe recipeObj = ((CachedLexicaBotaniaRecipe) arecipes.get(recipe));
@Override
public void loadCraftingRecipes(String outputId, Object... results) {
if(outputId.equals("botania.lexica")) {
for(LexiconEntry entry : BotaniaAPI.getAllEntries()) {
List<ItemStack> stacks = entry.getDisplayedRecipes();
for(ItemStack stack : stacks)
arecipes.add(new CachedLexicaBotaniaRecipe(stack, entry));
}
} else super.loadCraftingRecipes(outputId, results);
}
NEIHelper.renderItemIntoGUI(lexicaStack, 51, 5);
@Override
public void loadCraftingRecipes(ItemStack result) {
for(LexiconEntry entry : BotaniaAPI.getAllEntries()) {
List<ItemStack> 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));
}
}
}
GuiDraw.drawStringC(
EnumChatFormatting.UNDERLINE + StatCollector.translateToLocal(recipeObj.entry.getUnlocalizedName()),
82,
30,
0x404040,
false);
@Override
public void loadUsageRecipes(ItemStack ingredient) {
// NO-OP
}
KnowledgeType type = recipeObj.entry.getKnowledgeType();
GuiDraw.drawStringC(
type.color + StatCollector.translateToLocal(type.getUnlocalizedName()).replaceAll("&.", ""),
82,
42,
0x404040,
false);
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 {
GuiDraw.drawStringC(
StatCollector.translateToLocal("botania.nei.lexicaSeparator"),
82,
80,
0x404040,
false);
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<ItemStack> 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<ItemStack> 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);
}
}
@@ -1,13 +1,9 @@
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.item.ItemStack;
import net.minecraft.util.StatCollector;
import net.minecraftforge.oredict.OreDictionary;
@@ -17,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;
@@ -28,120 +25,135 @@ import vazkii.botania.common.core.helper.ItemNBTHelper;
public class RecipeHandlerManaPool extends TemplateRecipeHandler {
public class CachedManaPoolRecipe extends CachedRecipe {
private static final ItemStack poolStack = new ItemStack(ModBlocks.pool);
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public List<PositionedStack> 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<PositionedStack> getIngredients() {
return getCycledIngredients(cycleticks / 20, 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<PositionedStack> 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 int recipiesPerPage() {
return 1;
}
@Override
public String getOverlayIdentifier() {
return "botania.manaPool";
}
@Override
public void loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(70, 36, 18, 18), "botania.manaPool"));
}
@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);
// 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 void loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(70, 36, 18, 18), getOverlayIdentifier()));
}
@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 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);
String size = GuiScreen.isShiftKeyDown() ? "1x " : "10x ";
String localized = StatCollector.translateToLocal("botaniamisc.neiratio");
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;
NEIHelper.renderItemIntoGUI(poolStack, 71, 37);
GL11.glDisable(GL11.GL_DEPTH_TEST);
RenderHelper.disableStandardItemLighting();
}
arecipes.add(new CachedManaPoolRecipe(recipe));
}
} else super.loadCraftingRecipes(outputId, results);
}
@Override
public void loadCraftingRecipes(String outputId, Object... results) {
if (outputId.equals(getOverlayIdentifier())) {
for (RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) {
if (recipe == null) continue;
@Override
public void loadCraftingRecipes(ItemStack result) {
for(RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) {
if(recipe == null)
continue;
arecipes.add(new CachedManaPoolRecipe(recipe));
}
} else {
super.loadCraftingRecipes(outputId, results);
}
}
if(ItemNBTHelper.areStacksSameTypeCraftingWithNBT(recipe.getOutput(), result))
arecipes.add(new CachedManaPoolRecipe(recipe));
}
}
@Override
public void loadCraftingRecipes(ItemStack result) {
for (RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) {
if (recipe == null) continue;
@Override
public void loadUsageRecipes(ItemStack ingredient) {
for(RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) {
if(recipe == null)
continue;
if (ItemNBTHelper.areStacksSameTypeCraftingWithNBT(recipe.getOutput(), result)) {
arecipes.add(new CachedManaPoolRecipe(recipe));
}
}
}
CachedManaPoolRecipe crecipe = new CachedManaPoolRecipe(recipe);
if(ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getIngredients(), ingredient) || ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.getOtherStacks(), ingredient))
arecipes.add(crecipe);
}
}
@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);
}
}
}
}
@@ -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,122 +24,143 @@ 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 class CachedPetalApothecaryRecipe extends CachedRecipe {
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public boolean renderItem;
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public CachedPetalApothecaryRecipe(RecipePetals recipe, boolean addCenterItem) {
setIngredients(recipe.getInputs());
output = new PositionedStack(recipe.getOutput(), 111, 21);
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, 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 CachedPetalApothecaryRecipe(RecipePetals recipe) {
this(recipe, true);
}
public CachedPetalApothecaryRecipe(RecipePetals recipe) {
this(recipe, true);
}
public void setIngredients(List<Object> inputs) {
float degreePerInput = 360F / inputs.size();
float currentDegree = -90F;
public void setIngredients(List<Object> 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<PositionedStack> getIngredients() {
return inputs;
}
@Override
public List<PositionedStack> getIngredients() {
return getCycledIngredients(cycleticks / 20, inputs);
}
@Override
public PositionedStack getResult() {
return output;
}
}
@Override
public PositionedStack getResult() {
return output;
}
@Override
public String getRecipeName() {
return StatCollector.translateToLocal("botania.nei.petalApothecary");
}
}
@Override
public String getOverlayIdentifier() {
return getRecipeID();
}
@Override
public String getRecipeName() {
return StatCollector.translateToLocal("botania.nei.petalApothecary");
}
// Used by the Alfheim addon
@Deprecated
public String getRecipeID() {
return "botania.petalApothecary";
}
public String getRecipeID() {
return "botania.petalApothecary";
}
@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(73, 56, 16, 16), getOverlayIdentifier()));
}
@Override
public void loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(72, 54, 18, 18), getRecipeID()));
}
@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 (!((CachedPetalApothecaryRecipe) arecipes.get(recipe)).renderItem) return;
RenderHelper.enableGUIStandardItemLighting();
GL11.glEnable(GL11.GL_DEPTH_TEST);
NEIHelper.renderItemIntoGUI(getRenderItem(), 73, 55);
GL11.glDisable(GL11.GL_DEPTH_TEST);
RenderHelper.disableStandardItemLighting();
}
@Override
public int recipiesPerPage() {
return 1;
}
protected ItemStack getRenderItem() {
return altarStack;
}
@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);
}
public List<? extends RecipePetals> getRecipes() {
return BotaniaAPI.petalRecipes;
}
public List<? extends RecipePetals> getRecipes() {
return BotaniaAPI.petalRecipes;
}
public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) {
return new CachedPetalApothecaryRecipe(recipe, true);
}
public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) {
return new CachedPetalApothecaryRecipe(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 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);
}
@Override
public void loadCraftingRecipes(ItemStack result) {
for (RecipePetals recipe : getRecipes()) {
if (recipe == null) continue;
@Override
public void loadCraftingRecipes(ItemStack result) {
for(RecipePetals recipe : getRecipes()){
if(recipe == null)
continue;
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));
}
}
}
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;
CachedPetalApothecaryRecipe crecipe = getCachedRecipe(recipe);
if(ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.inputs, ingredient) && recipe.getOutput().getItem() != Items.skull)
arecipes.add(crecipe);
}
}
@Override
public void loadUsageRecipes(ItemStack ingredient) {
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);
}
}
}
}
@@ -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,103 +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<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public List<PositionedStack> 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<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public List<PositionedStack> 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<PositionedStack> getIngredients() {
return getCycledIngredients(cycleticks / 20, inputs);
}
output = new PositionedStack(new ItemStack(recipe.getOutput()), 101, 23);
}
@Override
public PositionedStack getResult() {
return output;
}
@Override
public List<PositionedStack> getIngredients() {
return inputs;
}
@Override
public List<PositionedStack> getOtherStacks() {
return otherStacks;
}
@Override
public PositionedStack getResult() {
return output;
}
}
@Override
public List<PositionedStack> 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 int recipiesPerPage() {
return 2;
}
@Override
public void loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(70, 22, 18, 18), getOverlayIdentifier()));
}
@Override
public void loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(70, 22, 18, 18), "botania.pureDaisy"));
}
@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 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 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);
}
}
@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(ItemStack result) {
for (RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) {
if (recipe == null) continue;
arecipes.add(new CachedPureDaisyRecipe(recipe));
}
} else super.loadCraftingRecipes(outputId, results);
}
if (ItemNBTHelper.areStacksSameTypeCraftingWithNBT(new ItemStack(recipe.getOutput()), result)) {
arecipes.add(new CachedPureDaisyRecipe(recipe));
}
}
}
@Override
public void loadCraftingRecipes(ItemStack result) {
for(RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) {
if(recipe == null)
continue;
@Override
public void loadUsageRecipes(ItemStack ingredient) {
for (RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) {
if (recipe == null) continue;
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;
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);
}
}
}
}
@@ -14,44 +14,50 @@ 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 CachedPetalApothecaryRecipe {
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, false);
inputs.add(livingrock);
manaUsage = recipe.getManaUsage();
renderItem = true;
}
}
@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<? extends RecipePetals> getRecipes() {
return BotaniaAPI.runeAltarRecipes;
}
@Override
public CachedPetalApothecaryRecipe 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<? extends RecipePetals> getRecipes() {
return BotaniaAPI.runeAltarRecipes;
}
@Override
public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) {
return new CachedRunicAltarRecipe((RecipeRuneAltar) recipe);
}
protected ItemStack getRenderItem() {
return altarStack;
}
}
@@ -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);
@@ -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 (Botania.neiLoaded) {
IMCForNEI.IMCSender();
}
}
public void postInit(FMLPostInitializationEvent event) {
@@ -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!)