Package extracells.tileentity

Source Code of extracells.tileentity.TileEntityMEBattery

package extracells.tileentity;

import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.INetworkManager;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.Packet132TileEntityData;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import appeng.api.WorldCoord;
import appeng.api.config.ItemFlow;
import appeng.api.events.GridTileLoadEvent;
import appeng.api.events.GridTileUnloadEvent;
import appeng.api.me.tiles.IGridTileEntity;
import appeng.api.me.tiles.IMEPowerStorage;
import appeng.api.me.util.IGridInterface;
import appeng.api.networkevents.MENetworkPowerStorage;
import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.common.network.Player;

public class TileEntityMEBattery extends TileEntity implements IGridTileEntity, IMEPowerStorage
{

  private double energy = 0;
  private final double maxEnergy = 2000000.0D;
  private boolean powerStatus = true, networkReady = true;
  private IGridInterface grid;
  private boolean redstoneCached = false;
  public boolean redstonePowered = false;

  public void updateEntity()
  {
    if (!redstoneCached)
    {
      redstoneCached = true;
      updateRedstone();
    }
  }

  public void updateRedstone()
  {
    boolean newRedstone = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) || worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord + 1, zCoord);
    if (newRedstone != redstonePowered && grid != null)
    {
      if (energy > 0.001D)
      {
        getGrid().postEvent(new MENetworkPowerStorage(this, MENetworkPowerStorage.PowerEventType.PROVIDE_POWER));
      } else if (energy < maxEnergy)
      {
        getGrid().postEvent(new MENetworkPowerStorage(this, MENetworkPowerStorage.PowerEventType.REQUEST_POWER));
      }
    }
    redstonePowered = newRedstone;
  }

  public void updateGuiTile(String playername)
  {
    Player player = (Player) worldObj.getPlayerEntityByName(playername);

    if (!worldObj.isRemote)
      PacketDispatcher.sendPacketToPlayer(getDescriptionPacket(), player);
  }

  @Override
  public Packet getDescriptionPacket()
  {
    NBTTagCompound nbtTag = new NBTTagCompound();
    this.writeToNBT(nbtTag);
    return new Packet132TileEntityData(this.xCoord, this.yCoord, this.zCoord, 1, nbtTag);
  }

  @Override
  public void onDataPacket(INetworkManager net, Packet132TileEntityData packet)
  {
    readFromNBT(packet.data);
  }

  @Override
  public void validate()
  {
    super.validate();
    MinecraftForge.EVENT_BUS.post(new GridTileLoadEvent(this, worldObj, getLocation()));
  }

  @Override
  public void invalidate()
  {
    super.invalidate();
    MinecraftForge.EVENT_BUS.post(new GridTileUnloadEvent(this, worldObj, getLocation()));
  }

  @Override
  public void readFromNBT(NBTTagCompound nbt)
  {
    super.readFromNBT(nbt);
    energy = nbt.getDouble("storedEnergy");
  }

  @Override
  public void writeToNBT(NBTTagCompound nbt)
  {
    super.writeToNBT(nbt);
    nbt.setDouble("storedEnergy", energy);
  }

  @Override
  public WorldCoord getLocation()
  {
    return new WorldCoord(this.xCoord, this.yCoord, this.zCoord);
  }

  @Override
  public boolean isValid()
  {
    return true;
  }

  @Override
  public void setPowerStatus(boolean hasPower)
  {
    powerStatus = hasPower;
  }

  @Override
  public boolean isPowered()
  {
    return powerStatus;
  }

  @Override
  public IGridInterface getGrid()
  {
    return grid;
  }

  @Override
  public void setGrid(IGridInterface gi)
  {
    grid = gi;
  }

  @Override
  public World getWorld()
  {
    return worldObj;
  }

  public void setNetworkReady(boolean isReady)
  {
    networkReady = isReady;
  }

  public boolean isMachineActive()
  {
    return powerStatus && networkReady;
  }

  @Override
  public boolean useMEEnergy(float use, String for_what)
  {
    if (energy > use)
    {
      energy -= use;
      onUpdatePower();
      return true;
    }
    energy = 0.0D;
    onUpdatePower();
    return false;
  }

  @Override
  public double addMEPower(double amt)
  {
    if (getGrid() == null || !canFill())
    {
      return amt;
    }
    boolean wasEmpty = energy < 0.001D;

    energy += amt;
    if (energy > getMEMaxPower())
    {
      double overheadPower = energy - getMEMaxPower();
      energy = getMEMaxPower();
      onUpdatePower();
      return overheadPower;
    }

    if (wasEmpty && energy > 0.001D)
    {
      getGrid().postEvent(new MENetworkPowerStorage(this, MENetworkPowerStorage.PowerEventType.PROVIDE_POWER));
    }

    onUpdatePower();
    return 0.0D;
  }

  @Override
  public double getMEMaxPower()
  {
    return maxEnergy;
  }

  @Override
  public double getMECurrentPower()
  {
    return energy;
  }

  @Override
  public boolean isPublicPowerStorage()
  {
    return true;
  }

  @Override
  public ItemFlow getPowerFlow()
  {
    return ItemFlow.READ_WRITE;
  }

  @Override
  public double drainMEPower(double amt)
  {
    if (getGrid() == null || !canDrain())
    {
      return 0.0D;
    }
    boolean wasFull = energy >= maxEnergy;

    energy -= amt;
    if (energy < 0.0D)
    {
      amt += energy;
      energy = 0.0D;
    }

    if (energy < maxEnergy && wasFull)
    {
      getGrid().postEvent(new MENetworkPowerStorage(this, MENetworkPowerStorage.PowerEventType.REQUEST_POWER));
    }
    onUpdatePower();
    return amt;
  }

  public boolean canDrain()
  {
    return redstonePowered;
  }

  public boolean canFill()
  {
    return redstonePowered;
  }

  void onUpdatePower()
  {
    PacketDispatcher.sendPacketToAllPlayers(getDescriptionPacket());
    if (worldObj != null)
      worldObj.updateAllLightTypes(xCoord, yCoord, zCoord);
  }
}
TOP

Related Classes of extracells.tileentity.TileEntityMEBattery

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.