diff --git a/gradle.properties b/gradle.properties index 0db9f98626..3fc1eed63d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,7 +44,7 @@ developmentEnvironmentUserName = Developer # - jabel: Jabel syntax-only support, compiles to J8 bytecode # - jvmDowngrader: Full modern Java via JVM Downgrader (syntax + stdlib APIs) # - modern: Native modern Java bytecode, no downgrading -enableModernJavaSyntax = jabel +enableModernJavaSyntax = jvmDowngrader # If set, ignores the above setting and compiles with the given toolchain. This may cause unexpected issues, # and should *not* be used in most situations. -1 disables this. @@ -65,7 +65,7 @@ enableModernJavaSyntax = jabel # - external: Another dependency provides stubs (no constraint, no warning) # - (empty): Warning reminding you to configure stubs # Note: 'shade' option requires you to verify license compliance, see: https://github.com/unimined/JvmDowngrader/blob/main/LICENSE.md -# jvmDowngraderStubsProvider = +jvmDowngraderStubsProvider = gtnhlib # Enables injecting missing generics into the decompiled source code for a better coding experience. # Turns most publicly visible List, Map, etc. into proper List, Map types. 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 0000000000..8f3a60b83f --- /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() { + sendCatalyst(RecipeHandlerBrewery.OVERLAY, "Botania:vial", -1); + sendCatalyst(RecipeHandlerBrewery.OVERLAY, "Botania:vial:1", -1); + sendCatalyst(RecipeHandlerBrewery.OVERLAY, "Botania:incenseStick", -1); + sendCatalyst(RecipeHandlerBrewery.OVERLAY, "Botania:bloodPendant", -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/NEIHelper.java b/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java new file mode 100644 index 0000000000..35fd265078 --- /dev/null +++ b/src/main/java/vazkii/botania/client/integration/nei/NEIHelper.java @@ -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 stack, int x, int y) { + renderItem.renderItemIntoGUI(font, textureManager, stack, x, y); + } +} 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 64e3bfe153..39f2d29f60 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,123 @@ public class RecipeHandlerBrewery extends TemplateRecipeHandler { - public class CachedBreweryRecipe extends CachedRecipe { - - public List inputs = new ArrayList<>(); - public PositionedStack output; - public int mana; - - 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)); - - output = new PositionedStack(recipe.getOutput(toVial), 87, 42); - } - - public CachedBreweryRecipe(RecipeBrew recipe) { - this(recipe, null); - } - - 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)); - - i++; - } - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); - } - - @Override - public PositionedStack getResult() { - return output; - } - - } - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.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 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(ItemStack result) { - if(result.getItem() instanceof IBrewItem) - for(RecipeBrew recipe : BotaniaAPI.brewRecipes) { - if(recipe == null) - continue; - - 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) - 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); - } - } + public static final String OVERLAY = "botania.brewery"; + + public class CachedBreweryRecipe extends CachedRecipe { + + public List inputs = new ArrayList<>(); + public PositionedStack output; + public int mana; + + 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)); + + output = new PositionedStack(recipe.getOutput(toVial), 87, 42); + } + + public CachedBreweryRecipe(RecipeBrew recipe) { + this(recipe, null); + } + + public void setIngredients(List inputs) { + int left = 96 - inputs.size() * 18 / 2; + + for (int i = 0; i < inputs.size(); i++) { + Object o = inputs.get(i); + if (o instanceof String oreName) { + o = OreDictionary.getOres(oreName); + } + this.inputs.add(new PositionedStack(o, left + i * 18, 6)); + } + } + + @Override + public List getIngredients() { + return inputs; + } + + @Override + public PositionedStack getResult() { + return output; + } + + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.brewery"); + } + + @Override + public String getOverlayIdentifier() { + return OVERLAY; + } + + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_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 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 brew)) return; + for (RecipeBrew recipe : BotaniaAPI.brewRecipes) { + if (recipe != null && brew.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; + CachedBreweryRecipe crecipe = new CachedBreweryRecipe(recipe); + if (ItemNBTHelper.cachedRecipeContainsWithNBT(crecipe.inputs, ingredient)) { + arecipes.add(crecipe); + } + } + } + } } 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 81a744c5bc..0940bb6115 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,8 +4,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.stream.Collectors; +import com.google.common.collect.Iterables; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.item.ItemStack; @@ -26,144 +26,122 @@ public class RecipeHandlerElvenTrade extends TemplateRecipeHandler { - public class CachedElvenTradeRecipe extends CachedRecipe { - - public List inputs = new ArrayList<>(); - public PositionedStack output; - - public CachedElvenTradeRecipe(RecipeElvenTrade recipe) { - if(recipe == null) - return; - - 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)); - - i++; - } - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); - } - - @Override - public PositionedStack getResult() { - return output; - } - - } - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.elvenTrade"); - } - - @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BLANK; - } - - @Override - public void loadTransferRects() { - 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); - 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("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) { - if(hasElvenKnowledge()) { - 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); - } - } - } - - // 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 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)); - } - } + public static final String OVERLAY = "botania.elvenTrade"; + + public class CachedElvenTradeRecipe extends CachedRecipe { + + public List inputs = new ArrayList<>(); + public PositionedStack output; + + public CachedElvenTradeRecipe(RecipeElvenTrade recipe) { + if (recipe == null) return; + setIngredients(recipe.getInputs()); + output = new PositionedStack(recipe.getOutput(), 107, 46); + } + + public void setIngredients(List inputs) { + for (int i = 0; i < inputs.size(); i++) { + Object o = inputs.get(i); + if (o instanceof String oreName) { + o = OreDictionary.getOres(oreName); + } + this.inputs.add(new PositionedStack(o, 60 + i * 18, 6)); + } + } + + @Override + public List getIngredients() { + return inputs; + } + + @Override + public PositionedStack getResult() { + return output; + } + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.elvenTrade"); + } + + @Override + public String getOverlayIdentifier() { + return OVERLAY; + } + + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BLANK; + } + + @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 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)); + } + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient) { + for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) { + CachedElvenTradeRecipe crecipe = new CachedElvenTradeRecipe(recipe); + if (crecipe.contains(crecipe.inputs, ingredient)) { + arecipes.add(crecipe); + } + } + } + + private Iterable filteredElvenTradeRecipes() { + return Iterables.filter( + BotaniaAPI.elvenTradeRecipes, + recipe -> recipe != null + && (recipe.getInputs().size() != 1 + || !stackSame(recipe.getOutput(), recipe.getInputs().getFirst()))); + } + + private boolean stackSame(ItemStack stack, Object obj) { + if (obj instanceof String oreName) { + return Iterables.any( + OreDictionary.getOres(oreName), + s -> ItemNBTHelper.areStacksSameTypeCraftingWithNBT(stack, s) + ); + } else { + return Iterables.any( + Arrays.asList(NEIServerUtils.extractRecipeItems(obj)), + s -> ItemNBTHelper.areStacksSameTypeCraftingWithNBT(stack, s) + ); + } + } } 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 9801c436d5..e3dd9daf19 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 @@ 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 getCycledIngredients(cycleticks / 20, 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 void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(84, 23, 24, 18), "crafting")); - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.floatingFlowers"); + } @Override - public String getGuiTexture() { - return "textures/gui/container/crafting_table.png"; + public String getOverlayIdentifier() { + return "crafting2x2"; } - @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())); - } - } - - @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)); - } - } + @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 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())); + } + } + + @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)); + } + } } 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 fe5d660c3c..c744edf5c2 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,21 +2,19 @@ * 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.item.ItemStack; import net.minecraft.util.EnumChatFormatting; @@ -26,129 +24,146 @@ 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 { - - public class CachedLexicaBotaniaRecipe extends CachedRecipe { - - public LexiconEntry entry; - public PositionedStack item; - public List otherStacks = new ArrayList<>(); - - 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; - } - - @Override - public List getIngredients() { - return otherStacks; - } - - @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 String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.lexica"); - } - - @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(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)); - - 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 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 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(ItemStack ingredient) { - // NO-OP - } + private static final ItemStack LEXICA = new ItemStack(ModItems.lexicon); + + public class CachedLexicaBotaniaRecipe extends CachedRecipe { + + public LexiconEntry entry; + public PositionedStack item; + + public CachedLexicaBotaniaRecipe(ItemStack stack, LexiconEntry entry) { + item = new PositionedStack(stack, 91, 5); + this.entry = entry; + } + + @Override + public PositionedStack getResult() { + return item; + } + + @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 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), getOverlayIdentifier())); + } + + @Override + public void drawBackground(int recipe) { + super.drawBackground(recipe); + + CachedLexicaBotaniaRecipe recipeObj = ((CachedLexicaBotaniaRecipe) arecipes.get(recipe)); + + NEIHelper.renderItemIntoGUI(LEXICA, 51, 5); + + GuiDraw.drawStringC( + EnumChatFormatting.UNDERLINE + StatCollector.translateToLocal(recipeObj.entry.getUnlocalizedName()), + 82, + 30, + 0x404040, + false); + + KnowledgeType type = recipeObj.entry.getKnowledgeType(); + GuiDraw.drawStringC( + type.color + StatCollector.translateToLocal(type.getUnlocalizedName()).replaceAll("&[0-9a-fklmnor]", ""), + 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 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); + } } 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 36e83b524b..ee6e880343 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,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 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,138 @@ public class RecipeHandlerManaPool extends TemplateRecipeHandler { - public class CachedManaPoolRecipe extends CachedRecipe { - - public List inputs = new ArrayList<>(); - public PositionedStack output; - public List otherStacks = new ArrayList<>(); - public int mana; - - 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)); - - 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)); - - 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)); - - output = new PositionedStack(recipe.getOutput(), 101, 37); - // This value is where the mana bar is stored initially - mana = recipe.getManaToConsume(); - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); - } - - @Override - public PositionedStack getResult() { - return output; - } - - @Override - public List getOtherStacks() { - return otherStacks; - } - - } - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.manaPool"); - } - - @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(70, 36, 18, 18), "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.translateToLocalFormatted("botaniamisc.neiratio", size); - font.drawString(localized, 84 - font.getStringWidth(localized) / 2, 71, 0x000000); - RenderTilePool.forceMana = true; - } - - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - if(outputId.equals("botania.manaPool")) { - for(RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { - if(recipe == null) - continue; - - arecipes.add(new CachedManaPoolRecipe(recipe)); - } - } else super.loadCraftingRecipes(outputId, results); - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - for(RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { - if(recipe == null) - continue; - - 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); - } - } + private static final ItemStack POOL = new ItemStack(ModBlocks.pool); + + public class CachedManaPoolRecipe extends CachedRecipe { + + private static final PositionedStack ALCHEMY = new PositionedStack(new ItemStack(ModBlocks.alchemyCatalyst), 10, 37); + private static final PositionedStack CONJURATION = new PositionedStack(new ItemStack(ModBlocks.conjurationCatalyst), 10, 37); + public PositionedStack input; + public PositionedStack output; + public PositionedStack catalyst; + public int mana; + + public CachedManaPoolRecipe(RecipeManaInfusion recipe) { + if (recipe == null) return; + + Object o = recipe.getInput(); + if (o instanceof String oreName) { + o = OreDictionary.getOres(oreName); + } + input = new PositionedStack(o, 42, 37); + + if (recipe.isAlchemy()) { + catalyst = ALCHEMY; + } else if (recipe.isConjuration()) { + catalyst = CONJURATION; + } + + output = new PositionedStack(recipe.getOutput(), 101, 37); + mana = recipe.getManaToConsume(); + } + + @Override + public PositionedStack getIngredient() { + return input; + } + + @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 getOverlayIdentifier() { + return "botania.manaPool"; + } + + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BLANK; + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(70, 36, 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); + // 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.translateToLocalFormatted("botaniamisc.neiratio", size); + GuiDraw.drawStringC(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(POOL, 71, 37); + GL11.glDisable(GL11.GL_DEPTH_TEST); + RenderHelper.disableStandardItemLighting(); + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results) { + if (outputId.equals(getOverlayIdentifier())) { + for (RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { + if (recipe == null) continue; + + arecipes.add(new CachedManaPoolRecipe(recipe)); + } + } else { + super.loadCraftingRecipes(outputId, results); + } + } + + @Override + public void loadCraftingRecipes(ItemStack result) { + for (RecipeManaInfusion recipe : BotaniaAPI.manaInfusionRecipes) { + if (recipe == null) continue; + + 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.positionedStackContainsWithNBT(crecipe.input, ingredient) || + ItemNBTHelper.positionedStackContainsWithNBT(crecipe.catalyst, ingredient)) { + arecipes.add(crecipe); + } + } + } } 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 80196b8a7f..41361936bc 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.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 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,137 @@ import vazkii.botania.common.core.helper.ItemNBTHelper; public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler { - - public class CachedPetalApothecaryRecipe extends CachedRecipe { - - public List inputs = new ArrayList<>(); - public PositionedStack output; - - 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 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); - - 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 getCycledIngredients(cycleticks / 20, inputs); - } - - @Override - public PositionedStack getResult() { - return output; - } - - } - - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.petalApothecary"); - } - - public String getRecipeID() { - return "botania.petalApothecary"; - } - - @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BLANK; - } - - @Override - public void loadTransferRects() { - 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); - 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 getRecipes() { - return BotaniaAPI.petalRecipes; - } - - public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) { - return new CachedPetalApothecaryRecipe(recipe); - } - - @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; - - 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); - } - } - + private static final ItemStack APOTHECARY = new ItemStack(ModBlocks.altar); + + public class CachedPetalApothecaryRecipe extends CachedRecipe { + public List inputs = new ArrayList<>(); + public PositionedStack output; + + public CachedPetalApothecaryRecipe(RecipePetals recipe, PositionedStack centerItem) { + this(recipe); + inputs.add(centerItem); + } + + public CachedPetalApothecaryRecipe(RecipePetals recipe) { + setIngredients(recipe.getInputs()); + output = new PositionedStack(recipe.getOutput(), 111, 21); + } + + 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); + + if (o instanceof String oreName) { + o = OreDictionary.getOres(oreName); + } + this.inputs.add(new PositionedStack(o, posX, posY)); + currentDegree += degreePerInput; + } + } + + @Override + public List getIngredients() { + return inputs; + } + + @Override + public PositionedStack getResult() { + return output; + } + } + + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.petalApothecary"); + } + + @Override + public String getOverlayIdentifier() { + return "botania.petalApothecary"; + } + + // Used by the Alfheim addon, identical to getOverlayIdentifier() + @Deprecated + public String getRecipeID() { + return "botania.petalApothecary"; + } + + @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 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 + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL11.GL_DEPTH_TEST); + NEIHelper.renderItemIntoGUI(getRenderItem(), 73, 55); + GL11.glDisable(GL11.GL_DEPTH_TEST); + RenderHelper.disableStandardItemLighting(); + } + + protected ItemStack getRenderItem() { + return APOTHECARY; + } + + public List getRecipes() { + return BotaniaAPI.petalRecipes; + } + + public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) { + ItemStack seedStack = new ItemStack(Items.wheat_seeds); + seedStack.setStackDisplayName(StatCollector.translateToLocal("botania.nei.anySeed")); + return new CachedPetalApothecaryRecipe(recipe, new PositionedStack(seedStack, 73, 39)); + } + + @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(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)); + } + } + } + + @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); + } + } + } } 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 f02d24a09c..33aad79e3b 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 @@ -1,8 +1,6 @@ package vazkii.botania.client.integration.nei.recipe; import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.List; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; @@ -13,6 +11,7 @@ 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 +22,102 @@ public class RecipeHandlerPureDaisy extends TemplateRecipeHandler { - public class CachedPureDaisyRecipe extends CachedRecipe { + private static final ItemStack DAISY = 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 PositionedStack inputs; + public PositionedStack output; - 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); - } + Object o = recipe.getInput(); + if (o instanceof String oreName) { + o = OreDictionary.getOres(oreName); + } else { + o = new ItemStack((Block) o); + } + inputs = new PositionedStack(o, 42, 23); + output = new PositionedStack(new ItemStack(recipe.getOutput()), 101, 23); + } - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 20, inputs); - } + @Override + public PositionedStack getIngredient() { + return inputs; + } - @Override - public PositionedStack getResult() { - return output; - } + @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"); + } @Override - public String getGuiTexture() { - return LibResources.GUI_NEI_BLANK; + public String getOverlayIdentifier() { + return "botania.pureDaisy"; } - @Override - public int recipiesPerPage() { - return 2; - } - - @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); - 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("botania.pureDaisy")) { - for(RecipePureDaisy recipe : BotaniaAPI.pureDaisyRecipes) { - if(recipe == null) - continue; - - 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; - - 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); - } - } + @Override + public String getGuiTexture() { + return LibResources.GUI_NEI_BLANK; + } + + @Override + public void loadTransferRects() { + transferRects.add(new RecipeTransferRect(new Rectangle(70, 22, 18, 18), getOverlayIdentifier())); + } + + @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(DAISY, 71, 23); + } + + @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(ItemStack result) { + 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); + } + } + } } 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 506ad540df..b38e9667a7 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,48 @@ public class RecipeHandlerRunicAltar extends RecipeHandlerPetalApothecary { - public class CachedRunicAltarRecipe extends CachedPetalApothecaryRecipe { + private static final ItemStack ALTAR = new ItemStack(ModBlocks.runeAltar); + private static final PositionedStack LIVINGROCK = new PositionedStack(new ItemStack(ModBlocks.livingrock), 73, 39); - 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; - } + public CachedRunicAltarRecipe(RecipeRuneAltar recipe, PositionedStack centerItem) { + super(recipe, centerItem); + manaUsage = recipe.getManaUsage(); + } + } - @Override - public String getRecipeName() { - return StatCollector.translateToLocal("botania.nei.runicAltar"); - } + @Override + public String getRecipeName() { + return StatCollector.translateToLocal("botania.nei.runicAltar"); + } - @Override - public String getRecipeID() { - return "botania.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 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 List getRecipes() { + return BotaniaAPI.runeAltarRecipes; + } + + @Override + public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) { + return new CachedRunicAltarRecipe((RecipeRuneAltar) recipe, LIVINGROCK); + } @Override - public CachedPetalApothecaryRecipe getCachedRecipe(RecipePetals recipe) { - return new CachedRunicAltarRecipe((RecipeRuneAltar) recipe); - } + protected ItemStack getRenderItem() { + return ALTAR; + } } diff --git a/src/main/java/vazkii/botania/common/Botania.java b/src/main/java/vazkii/botania/common/Botania.java index d6b8844dd1..892abdeb71 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 void preInit(FMLPreInitializationEvent event) { 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/helper/ItemNBTHelper.java b/src/main/java/vazkii/botania/common/core/helper/ItemNBTHelper.java index b0d64059c1..16a8ffb5e3 100644 --- a/src/main/java/vazkii/botania/common/core/helper/ItemNBTHelper.java +++ b/src/main/java/vazkii/botania/common/core/helper/ItemNBTHelper.java @@ -22,7 +22,6 @@ import javax.annotation.Nullable; import java.util.Collection; -import java.util.Set; public final class ItemNBTHelper { @@ -221,6 +220,7 @@ private static NBTBase get(NBTTagList tag, int idx) * NBT-friendly version of {@link codechicken.nei.recipe.TemplateRecipeHandler.CachedRecipe#contains(Collection, ItemStack)} */ public static boolean cachedRecipeContainsWithNBT(Collection ingredients, ItemStack ingredient) { + if (ingredients == null) return false; for (PositionedStack stack : ingredients) if (positionedStackContainsWithNBT(stack, ingredient)) return true; @@ -232,6 +232,7 @@ public static boolean cachedRecipeContainsWithNBT(Collection in * NBT-friendly version of {@link codechicken.nei.PositionedStack#contains(ItemStack)} */ public static boolean positionedStackContainsWithNBT(PositionedStack stack, ItemStack ingredient) { + if (stack == null) return false; for(ItemStack item : stack.items) if(areStacksSameTypeCraftingWithNBT(item, ingredient)) return true; 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 24c14e5f4d..23af5f918c 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.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; @@ -152,6 +153,10 @@ public void init(FMLInitializationEvent event) { new StatementAPIPlugin(); LexiconData.init(); + + if (Botania.neiLoaded) { + IMCForNEI.IMCSender(); + } } public void postInit(FMLPostInitializationEvent event) { diff --git a/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemFlightTiara.java b/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemFlightTiara.java index a81027f49a..aa519460d9 100644 --- a/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemFlightTiara.java +++ b/src/main/java/vazkii/botania/common/item/equipment/bauble/ItemFlightTiara.java @@ -10,14 +10,13 @@ */ package vazkii.botania.common.item.equipment.bauble; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; import java.util.ArrayList; +import java.util.HexFormat; import java.util.List; -import javax.xml.bind.annotation.adapters.HexBinaryAdapter; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; @@ -121,44 +120,44 @@ public void addHiddenTooltip(ItemStack stack, EntityPlayer player, List infoList.add(StatCollector.translateToLocal("botania.wings" + stack.getItemDamage())); } + /** + * The original solution for "16E1BDFD1D6AE1A954C9C5E1B2D9099780F3E1724541F1F2F77310B769CFFBAC" has been lost + * to time. It's supposed to be a 19 character long Matrix reference, but hash() is broken and gives + * inconsistent output, so it probably wouldn't even be recognized if you got it right. It was later + * replaced with the name of an Aqours single, but the name is too long for anvils in 1.7.10. + * It has been fixed to be consistent (and considerably simplified since doing weird random obfuscation before + * hashing is pointless at best), but it required replacing it with my own solution. + * If you have the original solution, I will gladly replace this one with it. + * Here are a few hints: + * It's the title of a song that aligns with Vazkii's interests. + * For authenticity, this song was released before this secret was originally added (2015). + * This song has a special segment only present in one of the single-member versions. + * -koolkrafter5 + */ @Override public void onEquipped(ItemStack stack, EntityLivingBase player) { super.onEquipped(stack, player); - if(stack.getItemDamage() != WING_TYPES && hash(stack.getDisplayName()).equals("16E1BDFD1D6AE1A954C9C5E1B2D9099780F3E1724541F1F2F77310B769CFFBAC")) { + if (stack.getItemDamage() != WING_TYPES && + hash(stack.getDisplayName()).equals("04E789FA6BC538F7645606141A1CFECECF4E84C301CB892779E761FD3FFF6386")) { stack.setItemDamage(WING_TYPES); stack.getTagCompound().removeTag("display"); } } String hash(String str) { - if(str != null) - try { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - return new HexBinaryAdapter().marshal(md.digest(salt(str).getBytes())); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return ""; + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] digest = md.digest(salt(str).getBytes(StandardCharsets.UTF_8)); + return HexFormat.of().withUpperCase().formatHex(digest); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return ""; + } } // Might as well be called sugar given it's not secure at all :D String salt(String str) { - str = str += "wowsuchsaltmuchsecurityverywow"; - SecureRandom rand = new SecureRandom(str.getBytes()); - int l = str.length(); - int steps = rand.nextInt(l); - char[] chrs = str.toCharArray(); - for(int i = 0; i < steps; i++) { - int indA = rand.nextInt(l); - int indB; - do { - indB = rand.nextInt(l); - } while(indB == indA); - char c = (char) (chrs[indA] ^ chrs[indB]); - chrs[indA] = c; - } - - return String.copyValueOf(chrs); + return str + "wowsuchsaltmuchsecurityverywow"; } @Override diff --git a/src/main/resources/assets/botania/lang/en_US.lang b/src/main/resources/assets/botania/lang/en_US.lang index 9fb5df7f68..fdd5245ba9 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!)