@Override
  public void updateEntity() {
    // TODO: drain energy
    if (!this.worldObj.isRemote) {
      tickSinceLastOperation++;
    }

    if (hasPowerForOperation()
        && isReadyForOperation()
        && laserSat.isAlive()
        && !laserSat.getJammed()) {
      laserSat.performOperation();

      storage.setEnergyStored(storage.getEnergyStored() - POWER_PER_OPERATION);
      tickSinceLastOperation = 0;
    }

    if (laserSat.isFinished()) {
      this.isRunning = false;
      laserSat.deactivateLaser();

      if (!laserSat.getJammed()) {
        if (mode == MODE.SINGLE) finished = true;

        if (this.worldObj.getBlockPowerInput(this.xCoord, this.yCoord, this.zCoord) != 0) {
          if (mode == MODE.LINE_X) {
            this.laserX += 3;
          } else if (mode == MODE.LINE_Z) {
            this.laserZ += 3;
          } else if (mode == MODE.SPIRAL) {
            numSteps++;
            if (radius < numSteps) {
              numSteps = 0;
              if (prevDir == ForgeDirection.NORTH) prevDir = ForgeDirection.EAST;
              else if (prevDir == ForgeDirection.EAST) {
                prevDir = ForgeDirection.SOUTH;
                radius++;
              } else if (prevDir == ForgeDirection.SOUTH) prevDir = ForgeDirection.WEST;
              else {
                prevDir = ForgeDirection.NORTH;
                radius++;
              }
            }

            this.laserX += 3 * prevDir.offsetX;
            this.laserZ += 3 * prevDir.offsetZ;
          }
        }
        // TODO: unneeded?
        checkCanRun();
      }
    }
  }
  @Override
  public void updateEntity() {
    super.updateEntity();
    int stored = storage.getEnergyStored();
    if (!worldObj.isRemote) {
      Light =
          worldObj.isDaytime()
              && ((!worldObj.isRaining() && !worldObj.isThundering()))
              && !worldObj.provider.hasNoSky
              && worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord);
      if (canWork()) {
        storage.setEnergyStored(
            stored += this.getSolarLight(this.worldObj, this.xCoord, this.yCoord, this.zCoord));
      }
    }

    //		if (!this.worldObj.provider.hasNoSky) {
    //
    //			// MinestellarLog.info("Solar Light: " + this.getSolarLight(this.worldObj, this.xCoord,
    // this.yCoord, this.zCoord));
    //			storage.setEnergyStored(stored += this.getSolarLight(this.worldObj, this.xCoord,
    // this.yCoord, this.zCoord));
    //		}
  }
  @Override
  public void readFromNBT(NBTTagCompound data) {
    super.readFromNBT(data);

    if (data.hasKey("shareRS")) {
      isRSShared = data.getBoolean("shareRS");
    }

    for (int i = 0; i < 3; i++) {
      if (data.hasKey("tankCap" + i)) {
        tanks[i] = new FluidTank(data.getInteger("tankCap" + i));
      }

      if (data.hasKey("Fluid" + i)) {
        tanks[i].setFluid(FluidStack.loadFluidStackFromNBT(data.getCompoundTag("Fluid" + i)));
      }

      if (data.hasKey("rsControl" + i)) rsControl[i] = data.getBoolean("rsControl" + i);
      if (data.hasKey("rsLatch" + i)) rsLatch[i] = data.getBoolean("rsLatch" + i);
    }

    NBTTagList itemList = data.getTagList("items");

    for (int i = 0; i < itemList.tagCount(); i++) {
      NBTTagCompound itemCompound = (NBTTagCompound) itemList.tagAt(i);
      int slot = itemCompound.getInteger("slot");
      inventory.setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(itemCompound));
    }

    for (int i = 0; i < 6; i++) {
      if (data.hasKey("side" + i)) {
        sides[i] = data.getInteger("side" + i);
      }
      if (data.hasKey("config" + i)) {
        configs[i] = new SideConfig();
        configs[i].readFromNBT(data.getCompoundTag("config" + i));
      }
      if (data.hasKey("rs" + i)) {
        sideRS[i] = data.getBoolean("rs" + i);
      }
      if (data.hasKey("lock" + i)) {
        sideLocked[i] = data.getBoolean("lock" + i);
      }
      if (data.hasKey("facID" + i)) {
        facID[i] = data.getInteger("facID" + i);
      }
      if (data.hasKey("facMeta" + i)) {
        facMeta[i] = data.getInteger("facMeta" + i);
      }
    }

    itemList = data.getTagList("sideItems");

    for (int i = 0; i < itemList.tagCount(); i++) {
      NBTTagCompound itemCompound = (NBTTagCompound) itemList.tagAt(i);
      int slot = itemCompound.getInteger("slot");
      sideInventory.setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(itemCompound));
    }

    capacitor.readFromNBT(data);
    int power = capacitor.getEnergyStored();
    if (data.hasKey("powerCap2")) this.setMaxEnergyStored((int) data.getInteger("powerCap2"));
    if (data.hasKey("realPower")) power = data.getInteger("realPower");
    capacitor.setEnergyStored(power);
  }
 /**
  * DO NOT USE UNLESS YOU HAVE NO OTHER OPTION!!!
  *
  * @param amt amount to set energy to
  */
 public void setEnergy(int amt) {
   storage.setEnergyStored(amt);
 }