Package appeng.parts.layers

Source Code of appeng.parts.layers.LayerIEnergySink

package appeng.parts.layers;

import ic2.api.energy.tile.IEnergySink;
import ic2.api.energy.tile.IEnergyTile;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.parts.IPart;
import appeng.api.parts.IPartHost;
import appeng.api.parts.LayerBase;
import appeng.api.parts.LayerFlags;
import appeng.util.Platform;

public class LayerIEnergySink extends LayerBase implements IEnergySink
{

  private boolean isInIC2()
  {
    return getLayerFlags().contains( LayerFlags.IC2_ENET );
  }

  private TileEntity getEnergySinkTile()
  {
    IPartHost host = (IPartHost) this;
    return host.getTile();
  }

  private World getEnergySinkWorld()
  {
    if ( getEnergySinkTile() == null )
      return null;

    return getEnergySinkTile().getWorldObj();
  }

  private boolean isTileValid()
  {
    TileEntity te = getEnergySinkTile();

    if ( te == null )
      return false;

    return !te.isInvalid() && te.getWorldObj().blockExists( te.xCoord, te.yCoord, te.zCoord );
  }

  private void addToENet()
  {
    if ( getEnergySinkWorld() == null )
      return;

    // re-add
    removeFromENet();

    if ( !isInIC2() && Platform.isServer() && isTileValid() )
    {
      getLayerFlags().add( LayerFlags.IC2_ENET );
      MinecraftForge.EVENT_BUS.post( new ic2.api.energy.event.EnergyTileLoadEvent( (IEnergySink) getEnergySinkTile() ) );
    }
  }

  private void removeFromENet()
  {
    if ( getEnergySinkWorld() == null )
      return;

    if ( isInIC2() && Platform.isServer() )
    {
      getLayerFlags().remove( LayerFlags.IC2_ENET );
      MinecraftForge.EVENT_BUS.post( new ic2.api.energy.event.EnergyTileUnloadEvent( (IEnergySink) getEnergySinkTile() ) );
    }
  }

  private boolean interestedInIC2()
  {
    if ( !((IPartHost) this).isInWorld() )
      return false;

    int interested = 0;
    for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
    {
      IPart part = getPart( dir );
      if ( part instanceof IEnergyTile )
      {
        interested++;
      }
    }
    return interested == 1;// if more then one tile is interested we need to abandon...
  }

  @Override
  public void partChanged()
  {
    super.partChanged();

    if ( interestedInIC2() )
      addToENet();
    else
      removeFromENet();
  }

  @Override
  public boolean acceptsEnergyFrom(TileEntity emitter, ForgeDirection direction)
  {
    if ( !isInIC2() )
      return false;

    IPart part = getPart( direction );
    if ( part instanceof IEnergySink )
      return ((IEnergySink) part).acceptsEnergyFrom( emitter, direction );
    return false;
  }

  @Override
  public double getDemandedEnergy()
  {
    if ( !isInIC2() )
      return 0;

    // this is a flawed implementation, that requires a change to the IC2 API.

    for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
    {
      IPart part = getPart( dir );
      if ( part instanceof IEnergySink )
      {
        // use lower number cause ic2 deletes power it sends that isn't received.
        return ((IEnergySink) part).getDemandedEnergy();
      }
    }

    return 0;
  }

  @Override
  public double injectEnergy(ForgeDirection directionFrom, double amount, double voltage)
  {
    if ( !isInIC2() )
      return amount;

    for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
    {
      IPart part = getPart( dir );
      if ( part instanceof IEnergySink )
      {
        return ((IEnergySink) part).injectEnergy( directionFrom, amount, voltage );
      }
    }

    return amount;
  }

  @Override
  public int getSinkTier()
  {
    return Integer.MAX_VALUE; // no real options here...
  }

}
TOP

Related Classes of appeng.parts.layers.LayerIEnergySink

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.