public void onUpdate() {
    if (this.rumble > 0) {
      this.rumble--;
    }

    if (this.rumble < 0) {
      this.rumble++;
    }

    if (this.timeSinceEntityEntry > 0) {
      this.timeSinceEntityEntry--;
    }

    if (this.reversed) {
      this.dataWatcher.updateObject(21, Integer.valueOf(1));
    }

    if (this.reversed) {
      if (this.worldObj.getBlockMaterial((int) this.posX, (int) this.posY - 5, (int) this.posZ)
              != Material.air
          || this.motionY == 0) {
        if (this.riddenByEntity != null) {
          this.riddenByEntity.mountEntity(this);
        }

        GCUtil.createNewExplosion(worldObj, this, this.posX, this.posY, this.posZ, 6, false);

        if (this.riddenByEntity != null
            && this.riddenByEntity instanceof EntityPlayer
            && !((EntityPlayer) this.riddenByEntity).capabilities.isCreativeMode) {
          EntityItem var14 =
              new EntityItem(
                  this.worldObj,
                  MathHelper.floor_double(this.riddenByEntity.posX + 0.5D),
                  MathHelper.floor_double(this.riddenByEntity.posY + 1D),
                  MathHelper.floor_double(this.riddenByEntity.posZ + 0.5D),
                  new ItemStack(GCItems.spaceship));

          float var15 = 0.05F;
          var14.motionX = (double) ((float) this.rand.nextGaussian() * var15);
          var14.motionY = (double) ((float) this.rand.nextGaussian() * var15 + 0.2F);
          var14.motionZ = (double) ((float) this.rand.nextGaussian() * var15);
          this.worldObj.spawnEntityInWorld(var14);
        } else if (this.riddenByEntity == null) {
          EntityItem var14 =
              new EntityItem(
                  this.worldObj,
                  MathHelper.floor_double(this.posX + 0.5D),
                  MathHelper.floor_double(this.posY + 1D),
                  MathHelper.floor_double(this.posZ + 0.5D),
                  new ItemStack(GCItems.spaceship));

          float var15 = 0.05F;
          var14.motionX = (double) ((float) this.rand.nextGaussian() * var15);
          var14.motionY = (double) ((float) this.rand.nextGaussian() * var15 + 0.2F);
          var14.motionZ = (double) ((float) this.rand.nextGaussian() * var15);
          this.worldObj.spawnEntityInWorld(var14);
        }

        this.setDead();
      }
    }

    if (this.riddenByEntity != null) {
      if (this.failedLaunch && this.timeSinceLaunch >= 100) {
        this.riddenByEntity.posX += (this.rumble) / 20F;
        this.riddenByEntity.posZ += (this.rumble) / 20F;
      } else {
        this.riddenByEntity.posX += (this.rumble) / 30F;
        this.riddenByEntity.posZ += (this.rumble) / 30F;
      }

      if (FMLClientHandler.instance().getClient().gameSettings.keyBindLeft.pressed) {
        this.rotationYaw -= 0.5F;
      }

      if (FMLClientHandler.instance().getClient().gameSettings.keyBindRight.pressed) {
        this.rotationYaw += 0.5F;
      }
    }

    if (this.posY > 450D && !this.reversed) {
      this.teleport();
    }

    if (this.func_70496_j() > 0) {
      this.func_70497_h(this.func_70496_j() - 1);
    }

    if (this.getDamage() > 0) {
      this.setDamage(this.getDamage() - 1);
    }

    if (this.posY < -64.0D || this.posY > 500D && this.dataWatcher.getWatchableObjectInt(21) == 0) {
      this.kill();
    }

    if (this.ignite == 0) {
      this.timeUntilLaunch = 400;
    }

    if (this.launched) {
      this.timeSinceLaunch++;
    } else {
      this.timeSinceLaunch = 0;
    }

    if (this.timeUntilLaunch > 0 && ignite == 1) {
      this.timeUntilLaunch--;
    }

    if (this.timeUntilLaunch == 0 && ignite == 1) {
      this.launched = true;
      this.ignite = 0;
    }

    this.moveEntity(this.motionX, this.motionY, this.motionZ);

    int i;

    if (this.timeUntilLaunch >= 100) {
      i = Math.abs((int) this.timeUntilLaunch / 100);
    } else {
      i = 1;
    }

    if ((this.ignite == 1 || launched)) {
      this.performHurtAnimation();

      this.rumble = (float) (rand.nextInt(3)) - 3;
    }

    if ((this.launched || this.rand.nextInt(i) == 0)
        && this.dataWatcher.getWatchableObjectInt(21) == 0) {
      this.spawnParticles(this.launched);
    }

    if (this.worldObj.isRemote) {
      this.rotationPitch -= Float.valueOf(this.getFailedLaunch()) / 2;

      this.rotationYaw += Float.valueOf(this.getFailedLaunch()) * 2.0F;

      this.setPosition(this.posX, this.posY, this.posZ);
      this.setRotation(this.rotationYaw, this.rotationPitch);
    } else {
      this.prevPosX = this.posX;
      this.prevPosY = this.posY;
      this.prevPosZ = this.posZ;

      if (this.launched && !reversed) {
        this.motionY += 0.005D;
      }

      if (this.failedLaunch) {
        if (this.timeSinceLaunch > 100) {
          this.setFailedLaunch(1);
          this.motionX += 0.005D;
          this.motionZ += 0.005D;
        }

        if (this.timeSinceLaunch > 200) {
          this.worldObj.createExplosion(this, this.posX, this.posY, this.posZ, 20);

          this.spawnParticlesExplosion();

          this.setDead();
        }
      }

      int var1 = MathHelper.floor_double(this.posX);
      int var2 = MathHelper.floor_double(this.posY);
      int var3 = MathHelper.floor_double(this.posZ);

      if (BlockRail.isRailBlockAt(this.worldObj, var1, var2 - 1, var3)) {
        --var2;
      }

      double var4 = 0.4D;
      double var6 = 0.0078125D;
      int var8 = this.worldObj.getBlockId(var1, var2, var3);
    }

    this.setRotation(this.rotationYaw, this.rotationPitch);
  }
 protected void updateFailChance(EntityPlayer player) {
   if (this.rand.nextInt(100) < GCUtil.getSpaceshipFailChance(player)) {
     this.failedLaunch = true;
   } else {
     this.failedLaunch = false;
   }
 }
  protected void placeTreasureAtCurrentPosition(
      World var1, Random var2, int var3, int var4, int var5, StructureBoundingBox var7) {
    int var8 = this.getXWithOffset(var3, var5);
    int var9 = this.getYWithOffset(var4);
    int var10 = this.getZWithOffset(var3, var5);

    if (var7.isVecInside(var8, var9, var10)
        && var1.getBlockId(var8, var9, var10) != Block.chest.blockID) {
      GCUtil.generateChestContents(var1, var2, var8, var9, var10);
    }
  }