Package forestry.core.gadgets

Source Code of forestry.core.gadgets.TilePowered

/*******************************************************************************
* Copyright (c) 2011-2014 SirSengir.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Various Contributors including, but not limited to:
* SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges
******************************************************************************/
package forestry.core.gadgets;

import buildcraft.api.tiles.IHasWork;
import cpw.mods.fml.common.Optional;
import forestry.core.fluids.tanks.StandardTank;
import forestry.core.interfaces.IPowerHandler;
import forestry.core.interfaces.IRenderableMachine;
import forestry.core.network.ClassMap;
import forestry.core.network.IndexInPayload;
import forestry.core.network.PacketPayload;
import forestry.core.proxy.Proxies;
import forestry.core.utils.EnumTankLevel;
import forestry.energy.EnergyManager;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidContainerRegistry.FluidContainerData;

@Optional.Interface(iface = "buildcraft.api.tiles.IHasWork", modid = "BuildCraft|Core")
public abstract class TilePowered extends TileBase implements IRenderableMachine, IPowerHandler, IHasWork {

  public static int WORK_CYCLES = 4;

  @Override
  public PacketPayload getPacketPayload() {
    if (!ClassMap.classMappers.containsKey(this.getClass()))
      ClassMap.classMappers.put(this.getClass(), new ClassMap(this.getClass()));

    ClassMap classmap = ClassMap.classMappers.get(this.getClass());
    PacketPayload payload = new PacketPayload(classmap.intSize, classmap.floatSize, classmap.stringSize);

    try {
      classmap.setData(this, payload.intPayload, payload.floatPayload, payload.stringPayload, new IndexInPayload(0, 0, 0));
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    return payload;
  }

  @Override
  public void fromPacketPayload(PacketPayload payload) {

    if (payload.isEmpty())
      return;

    if (!ClassMap.classMappers.containsKey(this.getClass()))
      ClassMap.classMappers.put(this.getClass(), new ClassMap(this.getClass()));

    ClassMap classmap = ClassMap.classMappers.get(this.getClass());

    try {
      classmap.fromData(this, payload.intPayload, payload.floatPayload, payload.stringPayload, new IndexInPayload(0, 0, 0));
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  protected final EnergyManager energyManager;

  public TilePowered(int maxTransfer, int energyPerWork, int capacity) {
    this.energyManager = new EnergyManager(maxTransfer, energyPerWork, capacity);
    this.energyManager.setReceiveOnly();
  }

  /* STATE INFORMATION */
  public abstract boolean isWorking();

  public boolean hasResourcesMin(float percentage) {
    return false;
  }

  public boolean hasFuelMin(float percentage) {
    return false;
  }

  public abstract boolean hasWork();

  private int workCounter;

  @Override
  public void updateEntity() {
    super.updateEntity();
    if (!Proxies.common.isSimulating(worldObj))
      return;

    if (workCounter < WORK_CYCLES && energyManager.consumeEnergyToDoWork()) {
      workCounter++;
    }

    if (workCounter >= WORK_CYCLES && worldObj.getTotalWorldTime() % 5 == 0) {
      if (workCycle())
        workCounter = 0;
    }
  }

  public abstract boolean workCycle();

  @Override
  public void writeToNBT(NBTTagCompound nbt) {
    super.writeToNBT(nbt);
    energyManager.writeToNBT(nbt);
  }

  @Override
  public void readFromNBT(NBTTagCompound nbt) {
    super.readFromNBT(nbt);
    energyManager.readFromNBT(nbt);
  }

  /* LIQUID CONTAINER HANDLING */
  /**
  @deprecated Use FluidHelper
  */
  @Deprecated
  protected ItemStack bottleIntoContainer(ItemStack canStack, ItemStack outputStack, FluidContainerData container, StandardTank tank) {
    if (tank.getFluidAmount() < container.fluid.amount)
      return outputStack;
    if (canStack.stackSize <= 0)
      return outputStack;
    if (outputStack != null && !outputStack.isItemEqual(container.filledContainer))
      return outputStack;
    if (outputStack != null && outputStack.stackSize >= outputStack.getMaxStackSize())
      return outputStack;

    tank.drain(container.fluid.amount, true);
    canStack.stackSize--;

    if (outputStack == null)
      outputStack = container.filledContainer.copy();
    else
      outputStack.stackSize++;

    return outputStack;
  }

  // / ADDITIONAL LIQUID HANDLING
  @Override
  public EnumTankLevel getPrimaryLevel() {
    return EnumTankLevel.EMPTY;
  }

  @Override
  public EnumTankLevel getSecondaryLevel() {
    return EnumTankLevel.EMPTY;
  }

  /* IPowerHandler */
  @Override
  public EnergyManager getEnergyManager() {
    return energyManager;
  }

  @Override
  public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) {
    return energyManager.receiveEnergy(from, maxReceive, simulate);
  }

  @Override
  public int extractEnergy(ForgeDirection from, int maxReceive, boolean simulate) {
    return energyManager.extractEnergy(from, maxReceive, simulate);
  }

  @Override
  public int getEnergyStored(ForgeDirection from) {
    return energyManager.getEnergyStored(from);
  }

  @Override
  public int getMaxEnergyStored(ForgeDirection from) {
    return energyManager.getMaxEnergyStored(from);
  }

  @Override
  public boolean canConnectEnergy(ForgeDirection from) {
    return energyManager.canConnectEnergy(from);
  }
}
TOP

Related Classes of forestry.core.gadgets.TilePowered

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.