public void maxPlayerResearch(EntityPlayer ep, boolean notify) {
   this.setPlayerResearchLevel(
       ep, ResearchLevel.levelList[ResearchLevel.levelList.length - 1], notify);
   for (ChromaResearch r : ChromaResearch.getAllObtainableFragments()) {
     this.givePlayerFragment(ep, r, notify);
   }
   for (CastingRecipe r : RecipesCastingTable.instance.getAllRecipes()) {
     this.givePlayerRecipe(ep, r);
   }
   if (ep instanceof EntityPlayerMP) ReikaPlayerAPI.syncCustomData((EntityPlayerMP) ep);
 }
 private ArrayList<ChromaResearch> getNextResearchesFor(EntityPlayer ep, boolean debug) {
   ChromaResearch pri = this.getPriorityResearchFor(ep);
   if (pri != null) {
     ArrayList li = new ArrayList();
     li.add(pri);
     return li;
   }
   this.checkForUpgrade(ep);
   ArrayList<ChromaResearch> li = new ArrayList();
   for (ChromaResearch r : ChromaResearch.getAllObtainableFragments()) {
     if (!this.playerHasFragment(ep, r)) {
       if (r.level == null || this.getPlayerResearchLevel(ep).isAtLeast(r.level)) {
         boolean missingdep = false;
         if (!r.playerHasProgress(ep)) {
           missingdep = true;
           if (debug)
             ChromatiCraft.logger.log(
                 "Fragment "
                     + r
                     + " rejected; insufficient progress "
                     + Arrays.toString(r.getRequiredProgress())
                     + ".");
         } else {
           if (!this.playerHasDependencies(r, ep)) {
             if (debug)
               ChromatiCraft.logger.log(
                   "Fragment " + r + " rejected; missing dependency."); // "+p+".");
             missingdep = true;
           }
         }
         if (!missingdep) li.add(r);
       } else if (debug) {
         ChromatiCraft.logger.log("Fragment " + r + " rejected; insufficient research level.");
       }
     }
   }
   return li;
 }