docs: public static List<ItemStack> getIngredients(IRecipe recipe)
      {
          // IRecipe helpfully has no method for inspecting the raw ingredients, so we need to do different things depending on the subclass.
          List<ItemStack> ingredients = new ArrayList<ItemStack>();
          if (recipe instanceof ShapelessRecipes)
          {
              List<?> items = (List<?>)((ShapelessRecipes)recipe).recipeItems;
              for (Object obj : items)
              {
                  if (obj instanceof ItemStack)
                      ingredients.add((ItemStack)obj);
              }
          }
          else if (recipe instanceof ShapelessOreRecipe)
          {
              NonNullList<Object> objs = ((ShapelessOreRecipe)recipe).getInput();
              for (Object o : objs)
              {
                  if (o != null)
                  {
                      if (o instanceof ItemStack)
                          ingredients.add((ItemStack)o);
                      else if (o instanceof List)
                      {
                          List<?> stacks = (List<?>)o;
                          for (Object stack : stacks)
                          {
                              if (stack instanceof ItemStack)
                                  ingredients.add((ItemStack)stack);
                          }
                      }
                  }
              }
          }
          else if (recipe instanceof ShapedRecipes)
          {
              ItemStack[] stack = ((ShapedRecipes)recipe).recipeItems;
              for (int i = 0; i < stack.length; i++)
              {
                  if (stack[i] != null)
                      ingredients.add(stack[i]);
              }
          }
          else if (recipe instanceof ShapedOreRecipe)
          {
              Object[] items = ((ShapedOreRecipe)recipe).getInput();
              for (int i = 0; i < items.length; i++)
              {
                  Object obj = items[i];
                  if (obj != null)
                  {
                      if (obj instanceof ItemStack)
                          ingredients.add((ItemStack)obj);
                      else if (obj instanceof List)
                      {
                          List<?> stacks = (List<?>)items[i];
                          for (Object stack : stacks)
                          {
                              if (stack instanceof ItemStack)
                                  ingredients.add((ItemStack)stack);
                          }
                      }
                  }
              }
          }
          else
          {
              return null;
          }
          return consolidateItemStacks(ingredients);
      }