public ArrayList<ItemStack> getItemStacks() {
    if (this.isMachine()) return ReikaJavaLibrary.makeListFrom(machine.getCraftedProduct());
    if (this == STORAGE) {
      ArrayList<ItemStack> li = new ArrayList();
      for (int i = 0; i < ChromaItems.STORAGE.getNumberMetadatas(); i++) {
        li.add(ChromaItems.STORAGE.getStackOfMetadata(i));
      }
      return li;
    }
    if (this == GLOW) {
      ArrayList<ItemStack> li = new ArrayList();
      for (int i = 0; i < 48; i++) {
        li.add(ChromaBlocks.GLOW.getStackOfMetadata(i));
      }
      return li;
    }
    if (this == RELAY) {
      ArrayList<ItemStack> li = new ArrayList();
      li.add(ChromaTiles.RELAYSOURCE.getCraftedProduct());
      for (int i = 0; i < 16; i++) {
        li.add(ChromaBlocks.RELAY.getStackOfMetadata(i));
      }
      li.add(ChromaBlocks.RELAY.getStackOfMetadata(16));
      return li;
    }
    if (this == PENDANT) {
      ArrayList<ItemStack> li = new ArrayList();
      for (int i = 0; i < 16; i++) {
        li.add(ChromaItems.PENDANT.getStackOfMetadata(i));
        li.add(ChromaItems.PENDANT3.getStackOfMetadata(i));
      }
      return li;
    }
    if (this == ENDERCRYS) {
      ArrayList<ItemStack> li = new ArrayList();
      li.add(ChromaItems.ENDERCRYSTAL.getStackOfMetadata(0));
      li.add(ChromaItems.ENDERCRYSTAL.getStackOfMetadata(1));
      return li;
    }
    if (this == AUGMENT) {
      ArrayList<ItemStack> li = new ArrayList();
      li.add(ChromaStacks.speedUpgrade);
      li.add(ChromaStacks.efficiencyUpgrade);
      li.add(ChromaStacks.silkUpgrade);
      return li;
    }
    if (item != null) {
      if (item.getItemInstance() instanceof ItemCrystalBasic) {
        ArrayList<ItemStack> li = new ArrayList();
        for (int i = 0; i < 16; i++) {
          li.add(item.getStackOfMetadata(i));
        }
        return li;
      }
      return ReikaJavaLibrary.makeListFrom(item.getStackOf());
    }
    if (iconItem != null && iconItem.getItem() instanceof ItemCrystalBasic) {
      ArrayList<ItemStack> li = new ArrayList();
      for (int i = 0; i < 16; i++) {
        li.add(new ItemStack(iconItem.getItem(), 1, i));
      }
      return li;
    }
    if (this == GROUPS) {
      ArrayList<ItemStack> li = new ArrayList();
      for (int i = 0; i < 13; i++) {
        li.add(ChromaItems.CLUSTER.getStackOfMetadata(i));
      }
      return li;
    }
    if (this == ALLOYS) {
      return new ArrayList(PoolRecipes.instance.getAllOutputItems());
    }
    if (this == ORES) {
      ArrayList<ItemStack> li = new ArrayList();
      li.add(ChromaStacks.chromaDust);
      for (int i = 0; i < 16; i++) li.add(ChromaItems.ELEMENTAL.getStackOfMetadata(i));
      li.add(ChromaStacks.focusDust);
      li.add(ChromaStacks.bindingCrystal);
      li.add(ChromaStacks.enderDust);
      li.add(ChromaStacks.waterDust);
      li.add(ChromaStacks.firaxite);
      li.add(ChromaStacks.spaceDust);
      li.add(ChromaStacks.resocrystal);
      return li;
    }
    if (this == DUSTS) {
      ArrayList<ItemStack> li = new ArrayList();
      li.add(ChromaStacks.auraDust);
      li.add(ChromaStacks.purityDust);
      li.add(ChromaStacks.elementDust);
      li.add(ChromaStacks.beaconDust);
      li.add(ChromaStacks.resonanceDust);
      return li;
    }
    if (this == IRID) {
      ArrayList<ItemStack> li = new ArrayList();
      li.add(ChromaStacks.rawCrystal);
      li.add(ChromaStacks.iridCrystal);
      li.add(ChromaStacks.iridChunk);
      return li;
    }
    if (this == CORES) {
      ArrayList<ItemStack> li = new ArrayList();
      li.add(ChromaStacks.crystalFocus);
      li.add(ChromaStacks.energyCore);
      li.add(ChromaStacks.transformCore);
      li.add(ChromaStacks.voidCore);
      li.add(ChromaStacks.elementUnit);
      li.add(ChromaStacks.crystalLens);
      return li;
    }
    if (this == PATH) {
      ArrayList<ItemStack> li = new ArrayList();
      for (int i = 0; i < ChromaBlocks.PATH.getNumberMetadatas(); i++) {
        li.add(new ItemStack(ChromaBlocks.PATH.getBlockInstance(), 1, i));
      }
      return li;
    }
    if (this == CRYSTALSTONE) {
      ArrayList<ItemStack> li = new ArrayList();
      for (int i = 0; i < ChromaBlocks.PYLONSTRUCT.getNumberMetadatas(); i++) {
        li.add(new ItemStack(ChromaBlocks.PYLONSTRUCT.getBlockInstance(), 1, i));
      }
      return li;
    }
    if (this == BEES) {
      ArrayList<ItemStack> li = new ArrayList();
      World world = ReikaWorldHelper.getBasicReferenceWorld();

      li.add(CrystalBees.getCrystalBee().getBeeItem(world, EnumBeeType.DRONE));
      li.add(CrystalBees.getCrystalBee().getBeeItem(world, EnumBeeType.PRINCESS));
      li.add(CrystalBees.getCrystalBee().getBeeItem(world, EnumBeeType.QUEEN));

      li.add(CrystalBees.getPureBee().getBeeItem(world, EnumBeeType.DRONE));
      li.add(CrystalBees.getPureBee().getBeeItem(world, EnumBeeType.PRINCESS));
      li.add(CrystalBees.getPureBee().getBeeItem(world, EnumBeeType.QUEEN));

      for (int i = 0; i < 16; i++) {
        CrystalElement e = CrystalElement.elements[i];
        li.add(CrystalBees.getElementalBee(e).getBeeItem(world, EnumBeeType.DRONE));
        li.add(CrystalBees.getElementalBee(e).getBeeItem(world, EnumBeeType.PRINCESS));
        li.add(CrystalBees.getElementalBee(e).getBeeItem(world, EnumBeeType.QUEEN));
      }

      return li;
    }
    if (block != null) {
      Item item = Item.getItemFromBlock(block.getBlockInstance());
      ArrayList<ItemStack> li = new ArrayList();
      if (item instanceof ItemBlockDyeTypes
          || item instanceof ItemBlockCrystalColors
          || item instanceof ItemBlockCrystal) {
        for (int i = 0; i < 16; i++) {
          li.add(block.getStackOfMetadata(i));
        }
      } else {
        li.add(block.getStackOf());
      }
      return li;
    }
    if (this == FENCEAUX || this == TNT || this == TANKAUX)
      return ReikaJavaLibrary.makeListFrom(iconItem);
    return null;
  }
 private ChromaResearch(ChromaBlocks r, int meta, ResearchLevel rl, ProgressStage... p) {
   this(r.getBasicName(), r.getStackOfMetadata(meta), rl, p);
   block = r;
 }