public static void initResearches() {
    registerResearchPage();
    // Init siblings
    ResearchItem enterOtherResearch =
        ResearchCategories.getResearchList("ELDRITCH").research.get("ENTEROUTER");
    String[] enterOtherSiblings = enterOtherResearch.siblings;
    if (enterOtherSiblings != null) {
      String[] newSiblings = new String[enterOtherSiblings.length + 1];
      System.arraycopy(enterOtherSiblings, 0, newSiblings, 0, enterOtherSiblings.length);
      newSiblings[enterOtherSiblings.length] = LibResearch.RESEARCH_TELEPORTPOWER;
      enterOtherResearch.setSiblings(newSiblings);
    } else {
      enterOtherResearch.setSiblings(LibResearch.RESEARCH_TELEPORTPOWER);
    }

    // Init researches

    new ResearchItem(
            LibResearch.RESEARCH_TELEPORTPOWER,
            LibResearch.CATEGORY_THAUMICTELEPORS,
            new AspectList(),
            0,
            0,
            0,
            new ItemStack(Items.ender_pearl))
        .setParentsHidden("ENTEROUTER")
        .setRound()
        .setPages(new ResearchPage("ttel.rec.teleportpower.page.0"))
        .registerResearchItem();

    new ResearchItem(
            LibResearch.RESEARCH_TELEPORTPEARL,
            LibResearch.CATEGORY_THAUMICTELEPORS,
            new AspectList()
                .add(Aspect.ELDRITCH, 2)
                .add(Aspect.TRAVEL, 5)
                .add(Aspect.CRYSTAL, 3)
                .add(Aspect.AURA, 5)
                .add(Aspect.CRAFT, 5)
                .add(Aspect.MAGIC, 10),
            0,
            2,
            3,
            new ItemStack(TeleportItems.teleportPearl))
        .setParents(LibResearch.RESEARCH_TELEPORTPOWER)
        .setConcealed()
        .setPages(
            new ResearchPage("ttel.rec.teleportpearl.page.0"),
            new ResearchPage(infusionRecipes.get("TeleportPearl")))
        .registerResearchItem();

    new ResearchItem(
            LibResearch.RESEARCH_TELEPORTATIONSTONE,
            LibResearch.CATEGORY_THAUMICTELEPORS,
            new AspectList()
                .add(Aspect.EARTH, 10)
                .add(Aspect.TRAVEL, 5)
                .add(Aspect.ELDRITCH, 5)
                .add(Aspect.SENSES, 5)
                .add(Aspect.MIND, 5),
            -2,
            2,
            3,
            new ItemStack(TeleportItems.teleportationStone))
        .setParents(LibResearch.RESEARCH_TELEPORTPEARL)
        .setConcealed()
        .setPages(
            new ResearchPage("ttel.rec.teleportstone.page.0"),
            new ResearchPage(infusionRecipes.get("DiamondPearl")),
            new ResearchPage("ttel.rec.teleportstone.page.1"),
            new ResearchPage(infusionRecipes.get("TeleportationStone")))
        .registerResearchItem();
  }
  public static ResearchItem copy(ResearchItem res, String newKey, String newCat, int dC, int dR) {
    ResearchItem rItem;

    if (res.icon_resource != null)
      rItem =
          new ResearchItem(
              newKey,
              newCat,
              res.tags,
              dC,
              dR,
              res.getComplexity(),
              Object[].class.cast(res.icon_resource));
    else
      rItem =
          new ResearchItem(
              newKey,
              newCat,
              res.tags,
              dC,
              dR,
              res.getComplexity(),
              Object[].class.cast(res.icon_item));

    rItem.parents = res.parents;
    rItem.parentsHidden = res.parentsHidden;
    rItem.siblings = res.siblings;
    rItem.setPages(res.getPages());

    rItem.setHidden();

    if (res.isAutoUnlock()) rItem.setAutoUnlock();

    if (res.isFlipped()) rItem.setFlipped();

    if (res.isHidden()) rItem.setHidden();

    if (res.isRound()) rItem.setRound();

    if (res.isSecondary()) rItem.setSecondary();

    if (res.isSpecial()) rItem.setSpecial();

    if (res.isStub()) rItem.setStub();

    if (res.siblings != null && res.siblings.length > 0) {
      String[] sibStr = new String[res.siblings.length + 1];
      for (int i = 0; i < res.siblings.length; ++i) sibStr[i] = res.siblings[i];

      sibStr[sibStr.length - 1] = newKey;

      res.setSiblings(sibStr);
    } else {
      res.setSiblings(newKey);
    }

    if (rItem.siblings != null && rItem.siblings.length > 0) {
      String[] sibStr = new String[rItem.siblings.length + 1];
      for (int i = 0; i < rItem.siblings.length; ++i) sibStr[i] = rItem.siblings[i];

      sibStr[sibStr.length - 1] = res.key;

      rItem.setSiblings(sibStr);
    } else {
      rItem.setSiblings(res.key);
    }

    return rItem;
  }