package codechicken.nei.recipe; import codechicken.lib.gui.GuiDraw; import codechicken.nei.InventoryCraftingDummy; import codechicken.nei.NEIClientUtils; import codechicken.nei.PositionedStack; import codechicken.nei.guihook.GuiContainerManager; import net.minecraft.init.Items; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.RecipeFireworks; import java.awt.*; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class FireworkRecipeHandler extends ShapelessRecipeHandler { public class CachedFireworkRecipe extends CachedShapelessRecipe { LinkedList<Object> itemList = new LinkedList<Object>(); public Object[] baseIngredients; public Object extraIngred; public int recipeType; public CachedFireworkRecipe(Object[] base, Object extra, int type) { super(new ItemStack(Items.fireworks)); this.baseIngredients = base; this.extraIngred = extra; this.recipeType = type; cycle(); } public void cycle() { itemList.clear(); for (Object obj : baseIngredients) { itemList.add(obj); } int extras = (cycleticks / 40) % (10 - itemList.size()); for (int i = 0; i < extras; i++) { itemList.add(extraIngred); } setIngredients(itemList); List<PositionedStack> ingreds = getIngredients(); for (int i = 0; i < 9; i++) { inventoryCrafting.setInventorySlotContents(i, i < ingreds.size() ? ingreds.get(i).item : null); } if (!recipeFireworks.matches(inventoryCrafting, null)) { throw new RuntimeException("Invalid Recipe?"); } setResult(recipeFireworks.getCraftingResult(null)); } } private InventoryCrafting inventoryCrafting = new InventoryCraftingDummy(); private RecipeFireworks recipeFireworks = new RecipeFireworks(); public ArrayList<CachedFireworkRecipe> mfireworks = new ArrayList<CachedFireworkRecipe>(); public FireworkRecipeHandler() { super(); stackorder = new int[][] { { 0, 0 }, { 1, 0 }, { 2, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 1, 2 }, { 2, 2 } }; loadAllFireworks(); } private void loadAllFireworks() { //charges Item[] shapes = new Item[] { null, Items.fire_charge, Items.gold_nugget, Items.feather, Items.skull }; Item[] effects = new Item[] { null, Items.diamond, Items.glowstone_dust }; for (Item shape : shapes) { for (Item effect : effects) { genRecipe(Items.gunpowder, shape, effect, Items.dye, Items.dye, 0); } } //fireworks genRecipe(Items.gunpowder, Items.paper, Items.firework_charge, 2); genRecipe(Items.gunpowder, Items.gunpowder, Items.paper, Items.firework_charge, 2); genRecipe(Items.gunpowder, Items.gunpowder, Items.gunpowder, Items.paper, Items.firework_charge, 2); //setup a valid charge to use for the recolour recipe for (int i = 0; i < 9; i++) { inventoryCrafting.setInventorySlotContents(i, null); } inventoryCrafting.setInventorySlotContents(0, new ItemStack(Items.gunpowder)); inventoryCrafting.setInventorySlotContents(1, new ItemStack(Items.dye)); recipeFireworks.matches(inventoryCrafting, null); ItemStack charge = recipeFireworks.getCraftingResult(null); genRecipe(charge, Items.dye, Items.dye, 1); } private void genRecipe(Object... params) { int numIngreds = 0; for (int i = 0; i < params.length - 2; i++) { if (params[i] != null) { numIngreds++; } } for (int i = 0; i < params.length - 1; i++) { if (params[i] instanceof Item) { params[i] = new ItemStack((Item) params[i], 1, Short.MAX_VALUE); } } Object[] ingreds = new Object[numIngreds]; for (int i = 0, j = 0; i < params.length - 2; i++) { if (params[i] != null) { ingreds[j++] = params[i]; } } mfireworks.add(new CachedFireworkRecipe(ingreds, params[params.length - 2], (Integer) params[params.length - 1])); } @Override public void loadCraftingRecipes(ItemStack result) { for (CachedFireworkRecipe recipe : mfireworks) { if (recipe.result.item.getItem() == result.getItem()) { recipe.cycle(); arecipes.add(recipe); } } //show random recolouring recipes as well } @Override public void loadCraftingRecipes(String outputId, Object... results) { if (outputId.equals("crafting") && getClass() == FireworkRecipeHandler.class) { arecipes.addAll(mfireworks); } else { super.loadCraftingRecipes(outputId, results); } } @Override public void loadUsageRecipes(ItemStack ingredient) { for (CachedFireworkRecipe recipe : mfireworks) { if (recipe.contains(recipe.ingredients, ingredient)) { recipe.cycle(); arecipes.add(recipe); } } } @Override public void onUpdate() { if (!NEIClientUtils.shiftKey()) { cycleticks++; if (cycleticks % 20 == 0) { for (CachedRecipe crecipe : arecipes) { ((CachedFireworkRecipe) crecipe).cycle(); } } } } @Override public String getRecipeName() { return NEIClientUtils.translate("recipe.firework"); } @Override public List<String> handleTooltip(GuiRecipe gui, List<String> currenttip, int recipe) { currenttip = super.handleTooltip(gui, currenttip, recipe); Point mousepos = GuiDraw.getMousePosition(); Point relMouse = new Point(mousepos.x - gui.guiLeft, mousepos.y - gui.guiTop); Point recipepos = gui.getRecipePosition(recipe); if (currenttip.isEmpty() && GuiContainerManager.getStackMouseOver(gui) == null && new Rectangle(recipepos.x, recipepos.y, 166, 55).contains(relMouse)) { currenttip.add(NEIClientUtils.translate("recipe.firework.tooltip" + ((CachedFireworkRecipe) arecipes.get(recipe)).recipeType)); } return currenttip; } }