public void checkForUpgrade(EntityPlayer ep) {
   ResearchLevel rl = this.getPlayerResearchLevel(ep);
   Collection<ChromaResearch> li = this.getResearchForLevel(rl);
   if (this.playerHasAllFragmentsThatMatter(ep, li)
       && rl.ordinal() < ResearchLevel.levelList.length - 1) {
     ResearchLevel next = ResearchLevel.levelList[rl.ordinal() + 1];
     if (next.canProgressTo(ep)) {
       this.stepPlayerResearchLevel(ep, next);
     }
   }
 }
 public boolean setPlayerResearchLevel(EntityPlayer ep, ResearchLevel r, boolean notify) {
   if (r.movePlayerTo(ep)) {
     if (ep instanceof EntityPlayerMP) ReikaPlayerAPI.syncCustomData((EntityPlayerMP) ep);
     if (notify) this.notifyPlayerOfProgression(ep, r);
     ProgressionCacher.instance.updateProgressCache(ep);
     return true;
   }
   return false;
 }
 public Collection<ChromaResearch> getResearchForLevelAndBelow(ResearchLevel rl) {
   Collection<ChromaResearch> c = new ArrayList();
   while (true) {
     c.addAll(ChromaResearch.levelMap.get(rl));
     if (rl == rl.pre()) break;
     else rl = rl.pre();
   }
   return c;
 }
 public boolean isAtLeast(ResearchLevel rl) {
   return rl.ordinal() <= this.ordinal();
 }
 public boolean stepPlayerResearchLevel(EntityPlayer ep, ResearchLevel r) {
   return (this.getPlayerResearchLevel(ep).ordinal() == r.ordinal() - 1)
       && this.setPlayerResearchLevel(ep, r, true);
 }