Compare commits

...
Author SHA1 Message Date
koolkrafter5 9e1e20cd42 Directly return the Iterable 2026-06-02 18:11:18 -04:00
koolkrafter5 dc0ecf382b Use reassignmnent here too 2026-06-02 18:05:30 -04:00
koolkrafter5 d9940264f5 Remove reference to getRecipeID 2026-06-02 17:57:56 -04:00
koolkrafter5 afa5ba13a2 Use constructors intelligently 2026-06-02 17:56:39 -04:00
koolkrafter5 48b03707bb Remove extra parens 2026-06-02 17:52:52 -04:00
koolkrafter5 6bef147998 Configure jvmdg to use gtnhlib stubs 2026-06-02 17:52:40 -04:00
koolkrafter5 f2fd81e78d Remove redundant null check 2026-06-02 17:49:14 -04:00
koolkrafter5 5863743e31 Use reassignments when making these PositionedStacks 2026-05-29 20:59:10 -04:00
koolkrafter5 87bad36550 Clean up apothecary and runic handler center items 2026-05-29 20:45:26 -04:00
koolkrafter5 33490aa266 Modify pure daisy to single ingredient and remove unused otherStacks 2026-05-29 20:41:02 -04:00
koolkrafter5 c1bac66d2a Use positionedStackContainsWithNBT 2026-05-29 20:37:06 -04:00
koolkrafter5 5e59b54f97 Remove unused import 2026-05-29 20:24:06 -04:00
koolkrafter5 b82655ed64 Fix name for renderItemIntoGUI param 2026-05-29 20:23:56 -04:00
koolkrafter5 2be7ea42a8 Cache these catalysts and rename other cached item stacks 2026-05-29 20:23:38 -04:00
koolkrafter5 3848b29049 Narrow regex 2026-05-29 20:13:07 -04:00
koolkrafter5 461bed9235 Fix name for consistency 2026-05-29 20:12:09 -04:00
koolkrafter5 a1a073d24f Clean elven trade handler 2026-05-28 15:05:50 -04:00
koolkrafter5 f164e3843d Use jvmdg and fix tiara easter egg. JAXB was removed from the standard jdk and using SecureRandom before comparing against a static hash was broken. I needed to make a new solution for it, see the comment on onEquipped. 2026-05-28 15:01:28 -04:00
koolkrafter5 96f3f498fb Clean brewery handler 2026-05-28 12:38:20 -04:00
koolkrafter5 63c2b39207 Fix server crash 2026-05-28 12:19:49 -04:00
koolkrafter5 5656619999 Fix crash with Alfheim mod by working around stupid decisions made a decade ago 2026-05-28 12:19:49 -04:00
koolkrafter5 f5ec5fb95f Clean up pure daisy handler. Add helper method to render items. 2026-05-28 12:19:49 -04:00
koolkrafter5 d8b9f5bb11 Clean up apothecary and runic altar handlers. Remove the altars from the recipe ingredients and add seeds/livingrock. 2026-05-28 12:19:49 -04:00
koolkrafter5 64795d2cf6 Move duplicate references to helper class and clean up string display 2026-05-28 12:19:47 -04:00
koolkrafter5 9fca30df29 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
# Conflicts:
#	src/main/java/vazkii/botania/client/integration/nei/recipe/RecipeHandlerManaPool.java
2026-05-28 12:18:55 -04:00
koolkrafter5 95ef44f43c 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-05-28 12:17:01 -04:00
koolkrafter5 aa7508a1d3 Clean up floating flower handler and let it work with the inventory crafting grid 2026-05-28 12:17:01 -04:00
koolkrafter5 992a319a3b Clean up elven trade handler and replace stream with loop 2026-05-28 12:17:01 -04:00
koolkrafter5 b0429f7b82 Clean up brewery handler and show usable brew containers as catalysts 2026-05-28 12:17:01 -04:00
koolkrafter5 e8f70bb391 Remove deprecated recipiesPerPage 2026-05-28 12:17:01 -04:00
koolkrafter5 f180c9530c Remove commented out pointless elven knowledge check 2026-05-28 12:17:01 -04:00
koolkrafter5 8615546dc4 Remove deprecated getCycledIngredients 2026-05-28 12:17:01 -04:00
16 changed files with 797 additions and 711 deletions

No files matched your search

+2 -2
View File
@@ -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<E>, Map<K, V> types.
@@ -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);
}
}
@@ -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);
}
}
@@ -23,118 +23,123 @@ import codechicken.nei.recipe.TemplateRecipeHandler;
public class RecipeHandlerBrewery extends TemplateRecipeHandler {
public class CachedBreweryRecipe extends CachedRecipe {
public static final String OVERLAY = "botania.brewery";
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public int mana;
public class CachedBreweryRecipe extends CachedRecipe {
public CachedBreweryRecipe(RecipeBrew recipe, ItemStack vial) {
if(recipe == null)
return;
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public int mana;
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));
public CachedBreweryRecipe(RecipeBrew recipe, ItemStack vial) {
if (recipe == null) return;
output = new PositionedStack(recipe.getOutput(toVial), 87, 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));
public CachedBreweryRecipe(RecipeBrew recipe) {
this(recipe, null);
}
output = new PositionedStack(recipe.getOutput(toVial), 87, 42);
}
public void setIngredients(List<Object> inputs) {
int left = 96 - inputs.size() * 18 / 2;
public CachedBreweryRecipe(RecipeBrew recipe) {
this(recipe, null);
}
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));
public void setIngredients(List<Object> inputs) {
int left = 96 - inputs.size() * 18 / 2;
i++;
}
}
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<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.brewery");
}
@Override
public String getRecipeName() {
return StatCollector.translateToLocal("botania.nei.brewery");
}
@Override
public String getGuiTexture() {
return LibResources.GUI_NEI_BREWERY;
}
@Override
public String getOverlayIdentifier() {
return OVERLAY;
}
@Override
public void loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(87, 25, 15, 14), "botania.brewery"));
}
@Override
public String getGuiTexture() {
return LibResources.GUI_NEI_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 loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(87, 25, 15, 14), getOverlayIdentifier()));
}
@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 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(ItemStack result) {
if(result.getItem() instanceof IBrewItem)
for(RecipeBrew recipe : BotaniaAPI.brewRecipes) {
if(recipe == null)
continue;
@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);
}
}
if(((IBrewItem) result.getItem()).getBrew(result) == recipe.getBrew())
arecipes.add(new CachedBreweryRecipe(recipe));
}
}
@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)
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);
}
}
@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);
}
}
}
}
}
@@ -4,8 +4,8 @@ import java.awt.Rectangle;
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 @@ import vazkii.botania.common.core.helper.ItemNBTHelper;
public class RecipeHandlerElvenTrade extends TemplateRecipeHandler {
public class CachedElvenTradeRecipe extends CachedRecipe {
public static final String OVERLAY = "botania.elvenTrade";
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public class CachedElvenTradeRecipe extends CachedRecipe {
public CachedElvenTradeRecipe(RecipeElvenTrade recipe) {
if(recipe == null)
return;
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
setIngredients(recipe.getInputs());
output = new PositionedStack(recipe.getOutput(), 107, 46);
}
public CachedElvenTradeRecipe(RecipeElvenTrade recipe) {
if (recipe == null) return;
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) {
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));
}
}
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.elvenTrade");
}
}
@Override
public String getOverlayIdentifier() {
return OVERLAY;
}
@Override
public String getRecipeName() {
return StatCollector.translateToLocal("botania.nei.elvenTrade");
}
@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(35, 30, 48, 48), getOverlayIdentifier()));
}
@Override
public void loadTransferRects() {
transferRects.add(new RecipeTransferRect(new Rectangle(35, 30, 48, 48), "botania.elvenTrade"));
}
@Override
public void drawBackground(int recipe) {
super.drawBackground(recipe);
GL11.glEnable(GL11.GL_BLEND);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.7F);
GuiDraw.changeTexture(LibResources.GUI_ELVEN_TRADE_OVERLAY);
GuiDraw.drawTexturedModalRect(30, 10, 17, 17, 100, 80);
GL11.glDisable(GL11.GL_BLEND);
GuiDraw.changeTexture(TextureMap.locationBlocksTexture);
RenderItem.getInstance().renderIcon(35, 29, BlockAlfPortal.portalTex, 48, 48);
}
@Override
public int recipiesPerPage() {
return 1;
}
@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 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(ItemStack result) {
for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) {
if (NEIServerUtils.areStacksSameTypeCrafting(recipe.getOutput(), result)) {
arecipes.add(new CachedElvenTradeRecipe(recipe));
}
}
}
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 loadUsageRecipes(ItemStack ingredient) {
for (RecipeElvenTrade recipe : filteredElvenTradeRecipes()) {
CachedElvenTradeRecipe crecipe = new CachedElvenTradeRecipe(recipe);
if (crecipe.contains(crecipe.inputs, ingredient)) {
arecipes.add(crecipe);
}
}
}
@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);
}
private Iterable<RecipeElvenTrade> filteredElvenTradeRecipes() {
return Iterables.filter(
BotaniaAPI.elvenTradeRecipes,
recipe -> recipe != null
&& (recipe.getInputs().size() != 1
|| !stackSame(recipe.getOutput(), recipe.getInputs().getFirst())));
}
@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<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());
}
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));
}
}
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)
);
}
}
}
@@ -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 LEXICA = 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(LEXICA, 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("&[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<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,138 @@ import vazkii.botania.common.core.helper.ItemNBTHelper;
public class RecipeHandlerManaPool extends TemplateRecipeHandler {
public class CachedManaPoolRecipe extends CachedRecipe {
private static final ItemStack POOL = 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));
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;
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));
Object o = recipe.getInput();
if (o instanceof String oreName) {
o = OreDictionary.getOres(oreName);
}
input = new PositionedStack(o, 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 = ALCHEMY;
} else if (recipe.isConjuration()) {
catalyst = CONJURATION;
}
@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.translateToLocalFormatted("botaniamisc.neiratio", size);
font.drawString(localized, 84 - font.getStringWidth(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.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();
}
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.positionedStackContainsWithNBT(crecipe.input, ingredient) ||
ItemNBTHelper.positionedStackContainsWithNBT(crecipe.catalyst, 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,137 @@ import codechicken.nei.recipe.TemplateRecipeHandler;
import vazkii.botania.common.core.helper.ItemNBTHelper;
public class RecipeHandlerPetalApothecary extends TemplateRecipeHandler {
private static final ItemStack APOTHECARY = new ItemStack(ModBlocks.altar);
public class CachedPetalApothecaryRecipe extends CachedRecipe {
public class CachedPetalApothecaryRecipe extends CachedRecipe {
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public List<PositionedStack> inputs = new ArrayList<>();
public PositionedStack output;
public CachedPetalApothecaryRecipe(RecipePetals recipe, PositionedStack centerItem) {
this(recipe);
inputs.add(centerItem);
}
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) {
setIngredients(recipe.getInputs());
output = new PositionedStack(recipe.getOutput(), 111, 21);
}
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 oreName) {
o = OreDictionary.getOres(oreName);
}
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 "botania.petalApothecary";
}
@Override
public String getRecipeName() {
return StatCollector.translateToLocal("botania.nei.petalApothecary");
}
// Used by the Alfheim addon, identical to getOverlayIdentifier()
@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
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 APOTHECARY;
}
@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) {
ItemStack seedStack = new ItemStack(Items.wheat_seeds);
seedStack.setStackDisplayName(StatCollector.translateToLocal("botania.nei.anySeed"));
return new CachedPetalApothecaryRecipe(recipe, new PositionedStack(seedStack, 73, 39));
}
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);
}
}
}
}
@@ -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 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 +22,102 @@ import codechicken.nei.recipe.TemplateRecipeHandler;
public class RecipeHandlerPureDaisy extends TemplateRecipeHandler {
public class CachedPureDaisyRecipe extends CachedRecipe {
private static final ItemStack DAISY = 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 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<PositionedStack> 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<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(DAISY, 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,48 @@ import codechicken.nei.PositionedStack;
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 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, LIVINGROCK);
}
@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 ALTAR;
}
}
@@ -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);
@@ -22,7 +22,6 @@ import net.minecraftforge.oredict.OreDictionary;
import javax.annotation.Nullable;
import java.util.Collection;
import java.util.Set;
public final class ItemNBTHelper {
@@ -221,6 +220,7 @@ public final class ItemNBTHelper {
* NBT-friendly version of {@link codechicken.nei.recipe.TemplateRecipeHandler.CachedRecipe#contains(Collection, ItemStack)}
*/
public static boolean cachedRecipeContainsWithNBT(Collection<PositionedStack> ingredients, ItemStack ingredient) {
if (ingredients == null) return false;
for (PositionedStack stack : ingredients)
if (positionedStackContainsWithNBT(stack, ingredient))
return true;
@@ -232,6 +232,7 @@ public final class ItemNBTHelper {
* 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;
@@ -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;
@@ -152,6 +153,10 @@ public class CommonProxy {
new StatementAPIPlugin();
LexiconData.init();
if (Botania.neiLoaded) {
IMCForNEI.IMCSender();
}
}
public void postInit(FMLPostInitializationEvent event) {
@@ -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 class ItemFlightTiara extends ItemBauble implements IManaUsingItem, IBaub
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
@@ -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!)