Package ic2.api.energy.prefab

Source Code of ic2.api.energy.prefab.BasicSource

package ic2.api.energy.prefab;

import cpw.mods.fml.common.FMLCommonHandler;
import ic2.api.energy.EnergyNet;
import ic2.api.energy.event.EnergyTileLoadEvent;
import ic2.api.energy.event.EnergyTileUnloadEvent;
import ic2.api.energy.tile.IEnergySource;
import ic2.api.info.Info;
import ic2.api.item.ElectricItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.ForgeDirection;

/**
* BasicSource is a simple adapter to provide an ic2 energy source.
* <p/>
* It's designed to be attached to a tile entity as a delegate. Functionally BasicSource acts as a
* one-time configurable output energy buffer, thus providing a common use case for generators.
* <p/>
* Sub-classing BasicSource instead of using it as a delegate works as well, but isn't recommended.
* The delegate can be extended with additional functionality through a sub class though.
* <p/>
* The constraints set by BasicSource like the strict tank-like energy buffering should provide a
* more easy to use and stable interface than using IEnergySource directly while aiming for
* optimal performance.
* <p/>
* Using BasicSource involves the following steps:
* - create a BasicSource instance in your TileEntity, typically in a field
* - forward invalidate, onChunkUnload, readFromNBT, writeToNBT and updateEntity to the BasicSource
* instance.
* If you have other means of determining when the tile entity is fully loaded, notify onLoaded
* that way instead of forwarding updateEntity.
* - call addEnergy whenever appropriate, using getFreeCapacity may determine if e.g. the generator
* should run
* - optionally use getEnergyStored to display the output buffer charge level
* - optionally use setEnergyStored to sync the stored energy to the client (e.g. in the Container)
* <p/>
* Example implementation code:
*
* @code{.java} public class SomeTileEntity extends TileEntity {
* // new basic energy source, 1000 EU buffer, tier 1 (32 EU/t, LV)
* private BasicSource ic2EnergySource = new BasicSource(this, 1000, 1);
* @Override public void invalidate() {
* ic2EnergySource.invalidate(); // notify the energy source
* ...
* super.invalidate(); // this is important for mc!
* }
* @Override public void onChunkUnload() {
* ic2EnergySource.onChunkUnload(); // notify the energy source
* ...
* }
* @Override public void readFromNBT(NBTTagCompound tag) {
* super.readFromNBT(tag);
* <p/>
* ic2EnergySource.readFromNBT(tag);
* ...
* }
* @Override public void writeToNBT(NBTTagCompound tag) {
* super.writeToNBT(tag);
* <p/>
* ic2EnergySource.writeToNBT(tag);
* ...
* }
* @Override public void updateEntity() {
* ic2EnergySource.updateEntity(); // notify the energy source
* ...
* ic2EnergySource.addEnergy(5); // add 5 eu to the source's buffer this tick
* ...
* }
* <p/>
* ...
* }
* @endcode
*/
public class BasicSource extends TileEntity implements IEnergySource {
    // **********************************
    // *** Methods for use by the mod ***
    // **********************************

    /**
     * Constructor for a new BasicSource delegate.
     *
     * @param parent1   Base TileEntity represented by this energy source.
     * @param capacity1 Maximum amount of eu to store.
     * @param tier1     IC2 tier, 1 = LV, 2 = MV, ...
     */
    public BasicSource(TileEntity parent1, double capacity1, int tier1) {
        double power = EnergyNet.instance.getPowerFromTier(tier1);

        this.parent = parent1;
        this.capacity = capacity1 < power ? power : capacity1;
        this.tier = tier1;
        this.power = power;
    }

    // in-world te forwards  >>

    /**
     * Forward for the base TileEntity's updateEntity(), used for creating the energy net link.
     * Either updateEntity or onLoaded have to be used.
     */
    @Override
    public void updateEntity() {
        if (!addedToEnet) onLoaded();
    }

    /**
     * Notification that the base TileEntity finished loading, for advanced uses.
     * Either updateEntity or onLoaded have to be used.
     */
    public void onLoaded() {
        if (!addedToEnet &&
                !FMLCommonHandler.instance().getEffectiveSide().isClient() &&
                Info.isIc2Available()) {
            worldObj = parent.getWorldObj();
            xCoord = parent.xCoord;
            yCoord = parent.yCoord;
            zCoord = parent.zCoord;

            MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent(this));

            addedToEnet = true;
        }
    }

    /**
     * Forward for the base TileEntity's invalidate(), used for destroying the energy net link.
     * Both invalidate and onChunkUnload have to be used.
     */
    @Override
    public void invalidate() {
        super.invalidate();

        onChunkUnload();
    }

    /**
     * Forward for the base TileEntity's onChunkUnload(), used for destroying the energy net link.
     * Both invalidate and onChunkUnload have to be used.
     */
    @Override
    public void onChunkUnload() {
        if (addedToEnet &&
                Info.isIc2Available()) {
            MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(this));

            addedToEnet = false;
        }
    }

    /**
     * Forward for the base TileEntity's readFromNBT(), used for loading the state.
     *
     * @param tag Compound tag as supplied by TileEntity.readFromNBT()
     */
    @Override
    public void readFromNBT(NBTTagCompound tag) {
        super.readFromNBT(tag);

        NBTTagCompound data = tag.getCompoundTag("IC2BasicSource");

        energyStored = data.getDouble("energy");
    }

    /**
     * Forward for the base TileEntity's writeToNBT(), used for saving the state.
     *
     * @param tag Compound tag as supplied by TileEntity.writeToNBT()
     */
    @Override
    public void writeToNBT(NBTTagCompound tag) {
        try {
            super.writeToNBT(tag);
        } catch (RuntimeException e) {
            // happens if this is a delegate, ignore
        }

        NBTTagCompound data = new NBTTagCompound();

        data.setDouble("energy", energyStored);

        tag.setTag("IC2BasicSource", data);
    }

    // << in-world te forwards
    // methods for using this adapter >>

    /**
     * Get the maximum amount of energy this source can hold in its buffer.
     *
     * @return Capacity in EU.
     */
    public double getCapacity() {
        return capacity;
    }

    /**
     * Set the maximum amount of energy this source can hold in its buffer.
     *
     * @param capacity1 Capacity in EU.
     */
    public void setCapacity(double capacity1) {
        if (capacity1 < power) capacity1 = power;

        this.capacity = capacity1;
    }

    /**
     * Get the IC2 energy tier for this source.
     *
     * @return IC2 Tier.
     */
    public int getTier() {
        return tier;
    }

    /**
     * Set the IC2 energy tier for this source.
     *
     * @param tier1 IC2 Tier.
     */
    public void setTier(int tier1) {
        double power = EnergyNet.instance.getPowerFromTier(tier1);

        if (capacity < power) capacity = power;

        this.tier = tier1;
        this.power = power;
    }


    /**
     * Determine the energy stored in the source's output buffer.
     *
     * @return amount in EU
     */
    public double getEnergyStored() {
        return energyStored;
    }

    /**
     * Set the stored energy to the specified amount.
     * <p/>
     * This is intended for server -> client synchronization, e.g. to display the stored energy in
     * a GUI through getEnergyStored().
     *
     * @param amount
     */
    public void setEnergyStored(double amount) {
        energyStored = amount;
    }

    /**
     * Determine the free capacity in the source's output buffer.
     *
     * @return amount in EU
     */
    public double getFreeCapacity() {
        return capacity - energyStored;
    }

    /**
     * Add some energy to the output buffer.
     *
     * @param amount maximum amount of energy to add
     * @return amount added/used, NOT remaining
     */
    public double addEnergy(double amount) {
        if (FMLCommonHandler.instance().getEffectiveSide().isClient()) return 0;
        if (amount > capacity - energyStored) amount = capacity - energyStored;

        energyStored += amount;

        return amount;
    }

    /**
     * Charge the supplied ItemStack from this source's energy buffer.
     *
     * @param stack ItemStack to charge (null is ignored)
     * @return true if energy was transferred
     */
    public boolean charge(ItemStack stack) {
        if (stack == null || !Info.isIc2Available()) return false;

        double amount = ElectricItem.manager.charge(stack, energyStored, tier, false, false);

        energyStored -= amount;

        return amount > 0;
    }

    // << methods for using this adapter

    // backwards compatibility (ignore these) >>

    @Deprecated
    public void onUpdateEntity() {
        updateEntity();
    }

    @Deprecated
    public void onInvalidate() {
        invalidate();
    }

    @Deprecated
    public void onOnChunkUnload() {
        onChunkUnload();
    }

    @Deprecated
    public void onReadFromNbt(NBTTagCompound tag) {
        readFromNBT(tag);
    }

    @Deprecated
    public void onWriteToNbt(NBTTagCompound tag) {
        writeToNBT(tag);
    }

    // << backwards compatibility

    // ******************************
    // *** Methods for use by ic2 ***
    // ******************************

    // energy net interface >>

    @Override
    public boolean emitsEnergyTo(TileEntity receiver, ForgeDirection direction) {
        return true;
    }

    @Override
    public double getOfferedEnergy() {
        return Math.min(energyStored, power);
    }

    @Override
    public void drawEnergy(double amount) {
        energyStored -= amount;
    }

    @Override
    public int getSourceTier() {
        return tier;
    }

    // << energy net interface


    public final TileEntity parent;

    protected double capacity;
    protected int tier;
    protected double power;
    protected double energyStored;
    protected boolean addedToEnet;
}
TOP

Related Classes of ic2.api.energy.prefab.BasicSource

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.