Program: 34685
Project: 34685
Buggy source:
@SuppressWarnings("String_Node_Str") @Override public void onUpdate(){
  prevPosX=posX;
  prevPosY=posY;
  prevPosZ=posZ;
  if (++field_145812_b == 1 && !worldObj.isRemote) {
    BlockPosM tmpPos=BlockPosM.tmp(this);
    if (tmpPos.getBlock(worldObj) != func_145805_f()) {
      setDead();
      return;
    }
    tmpPos.setAir(worldObj);
    for (int origX=tmpPos.x, origZ=tmpPos.z, x=origX + 2; x < origX + 5; x++) {
      for (int z=origZ - 1; z <= origZ + 1; z++) {
        if (tmpPos.set(x,tmpPos.y - 1,z).getBlock(worldObj) == BlockList.temple_end_portal)         tmpPos.setMetadata(worldObj,1,2);
      }
    }
  }
  moveEntity(motionX,motionY,motionZ);
  for (int y=5; y >= 0; y--) {
    for (int a=0; a < Math.min(10,field_145812_b / 4F); a++) {
      worldObj.spawnParticle("String_Node_Str",posX + rand.nextDouble() - 0.5D,posY + y + rand.nextDouble() - 0.3D,posZ + rand.nextDouble() - 0.5D,0D,0D,0D);
    }
  }
  if (field_145812_b >= 24) {
    motionY=0.01D;
    double deltaY=posY - ItemTempleCaller.templeY - 2;
    if (!worldObj.isRemote) {
      if (deltaY > 4D && rand.nextInt(6 - (deltaY > 6D ? 2 : 0)) == 0) {
        double xx=-5D, zz=-5D;
switch (rand.nextInt(4)) {
case 0:
          zz=ItemTempleCaller.templeZ;
case 1:
        xx=ItemTempleCaller.templeX + rand.nextFloat() * 18D;
      if (zz == -5D)       zz=ItemTempleCaller.templeZ + 13D;
    break;
case 2:
  xx=ItemTempleCaller.templeX;
case 3:
zz=ItemTempleCaller.templeZ + rand.nextFloat() * 13D;
if (xx == -5D) xx=ItemTempleCaller.templeX + 18D;
break;
}
worldObj.createExplosion(this,xx,ItemTempleCaller.templeY + rand.nextFloat() * 8D,zz,1.5F + (float)((deltaY - 4F) * 0.5F),true);
}
if (deltaY > 6D) {
for (EntityPlayerMP player : new ArrayList<EntityPlayerMP>(worldObj.playerEntities)) {
if (player.ridingEntity != null) player.mountEntity(null);
DragonUtil.teleportToOverworld(player);
}
TempleEvents.destroyWorld();
}
}
}
}

Fixed version (ground truth):
@SuppressWarnings("String_Node_Str") @Override public void onUpdate(){
  prevPosX=posX;
  prevPosY=posY;
  prevPosZ=posZ;
  if (++field_145812_b == 1 && !worldObj.isRemote) {
    BlockPosM tmpPos=BlockPosM.tmp(this);
    if (tmpPos.getBlock(worldObj) != func_145805_f()) {
      setDead();
      return;
    }
    tmpPos.setAir(worldObj);
    tmpPos.moveDown();
    for (int origX=tmpPos.x, origZ=tmpPos.z, x=origX + 2; x < origX + 5; x++) {
      for (int z=origZ - 1; z <= origZ + 1; z++) {
        if (tmpPos.set(x,tmpPos.y,z).getBlock(worldObj) == BlockList.temple_end_portal)         tmpPos.setMetadata(worldObj,1,2);
      }
    }
  }
  moveEntity(motionX,motionY,motionZ);
  for (int y=5; y >= 0; y--) {
    for (int a=0; a < Math.min(10,field_145812_b / 4F); a++) {
      worldObj.spawnParticle("String_Node_Str",posX + rand.nextDouble() - 0.5D,posY + y + rand.nextDouble() - 0.3D,posZ + rand.nextDouble() - 0.5D,0D,0D,0D);
    }
  }
  if (field_145812_b >= 24) {
    motionY=0.01D;
    double deltaY=posY - ItemTempleCaller.templeY - 2;
    if (!worldObj.isRemote) {
      if (deltaY > 4D && rand.nextInt(6 - (deltaY > 6D ? 2 : 0)) == 0) {
        double xx=-5D, zz=-5D;
switch (rand.nextInt(4)) {
case 0:
          zz=ItemTempleCaller.templeZ;
case 1:
        xx=ItemTempleCaller.templeX + rand.nextFloat() * 18D;
      if (zz == -5D)       zz=ItemTempleCaller.templeZ + 13D;
    break;
case 2:
  xx=ItemTempleCaller.templeX;
case 3:
zz=ItemTempleCaller.templeZ + rand.nextFloat() * 13D;
if (xx == -5D) xx=ItemTempleCaller.templeX + 18D;
break;
}
worldObj.createExplosion(this,xx,ItemTempleCaller.templeY + rand.nextFloat() * 8D,zz,1.5F + (float)((deltaY - 4F) * 0.5F),true);
}
if (deltaY > 6D) {
for (EntityPlayerMP player : new ArrayList<EntityPlayerMP>(worldObj.playerEntities)) {
if (player.ridingEntity != null) player.mountEntity(null);
DragonUtil.teleportToOverworld(player);
}
TempleEvents.destroyWorld();
}
}
}
}