diff --git a/api/cofh/api/CoFHAPIProps.java b/api/cofh/api/CoFHAPIProps.java index be48ec3d..22096377 100644 --- a/api/cofh/api/CoFHAPIProps.java +++ b/api/cofh/api/CoFHAPIProps.java @@ -6,6 +6,6 @@ public class CoFHAPIProps { } - public static final String VERSION = "1.7.10R1.0.0"; + public static final String VERSION = "1.7.10R1.0.1"; } diff --git a/api/cofh/api/energy/EnergyStorage.java b/api/cofh/api/energy/EnergyStorage.java index b3383aeb..1674c189 100644 --- a/api/cofh/api/energy/EnergyStorage.java +++ b/api/cofh/api/energy/EnergyStorage.java @@ -87,8 +87,8 @@ public class EnergyStorage implements IEnergyStorage { } /** - * This function is included to allow for server -> client sync. Do not call this externally to the containing Tile Entity, as not all IEnergyHandlers are - * guaranteed to have it. + * This function is included to allow for server -> client sync. Do not call this externally to the containing Tile Entity, as not all IEnergyHandlers + * are guaranteed to have it. * * @param energy */ diff --git a/api/cofh/api/energy/IEnergyConnection.java b/api/cofh/api/energy/IEnergyConnection.java index 63faffb9..79bdf77a 100644 --- a/api/cofh/api/energy/IEnergyConnection.java +++ b/api/cofh/api/energy/IEnergyConnection.java @@ -5,7 +5,7 @@ import net.minecraftforge.common.util.ForgeDirection; /** * Implement this interface on TileEntities which should connect to energy transportation blocks. This is intended for blocks which generate energy but do not * accept it; otherwise just use IEnergyHandler. - * + *

* Note that {@link IEnergyHandler} is an extension of this. * * @author King Lemming diff --git a/api/cofh/api/energy/IEnergyContainerItem.java b/api/cofh/api/energy/IEnergyContainerItem.java index 0bcfda60..c28455b1 100644 --- a/api/cofh/api/energy/IEnergyContainerItem.java +++ b/api/cofh/api/energy/IEnergyContainerItem.java @@ -4,7 +4,7 @@ import net.minecraft.item.ItemStack; /** * Implement this interface on Item classes that support external manipulation of their internal energy storages. - * + *

* A reference implementation is provided {@link ItemEnergyContainer}. * * @author King Lemming diff --git a/api/cofh/api/energy/IEnergyHandler.java b/api/cofh/api/energy/IEnergyHandler.java index 3df31234..22f2dbc6 100644 --- a/api/cofh/api/energy/IEnergyHandler.java +++ b/api/cofh/api/energy/IEnergyHandler.java @@ -4,17 +4,19 @@ import net.minecraftforge.common.util.ForgeDirection; /** * Implement this interface on Tile Entities which should handle energy, generally storing it in one or more internal {@link IEnergyStorage} objects. - * + *

* A reference implementation is provided {@link TileEnergyHandler}. - * + * * @author King Lemming - * + * */ -public interface IEnergyHandler extends IEnergyConnection { +public interface IEnergyHandler extends IEnergyProvider, IEnergyReceiver { + + // merely a convenience interface (remove these methods in 1.8; provided here for back-compat via compiler doing things) /** - * Add energy to an IEnergyHandler, internal distribution is left entirely to the IEnergyHandler. - * + * Add energy to an IEnergyReceiver, internal distribution is left entirely to the IEnergyReceiver. + * * @param from * Orientation the energy is received from. * @param maxReceive @@ -23,11 +25,12 @@ public interface IEnergyHandler extends IEnergyConnection { * If TRUE, the charge will only be simulated. * @return Amount of energy that was (or would have been, if simulated) received. */ + @Override int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate); /** - * Remove energy from an IEnergyHandler, internal distribution is left entirely to the IEnergyHandler. - * + * Remove energy from an IEnergyProvider, internal distribution is left entirely to the IEnergyProvider. + * * @param from * Orientation the energy is extracted from. * @param maxExtract @@ -36,16 +39,20 @@ public interface IEnergyHandler extends IEnergyConnection { * If TRUE, the extraction will only be simulated. * @return Amount of energy that was (or would have been, if simulated) extracted. */ + @Override int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate); + /** * Returns the amount of energy currently stored. */ + @Override int getEnergyStored(ForgeDirection from); /** * Returns the maximum amount of energy that can be stored. */ + @Override int getMaxEnergyStored(ForgeDirection from); } diff --git a/api/cofh/api/energy/IEnergyProvider.java b/api/cofh/api/energy/IEnergyProvider.java new file mode 100644 index 00000000..05287b35 --- /dev/null +++ b/api/cofh/api/energy/IEnergyProvider.java @@ -0,0 +1,38 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Implement this interface on Tile Entities which should provide energy, generally storing it in one or more internal {@link IEnergyStorage} objects. + *

+ * A reference implementation is provided {@link TileEnergyHandler}. + * + * @author King Lemming + * + */ +public interface IEnergyProvider extends IEnergyConnection { + + /** + * Remove energy from an IEnergyProvider, internal distribution is left entirely to the IEnergyProvider. + * + * @param from + * Orientation the energy is extracted from. + * @param maxExtract + * Maximum amount of energy to extract. + * @param simulate + * If TRUE, the extraction will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) extracted. + */ + int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate); + + /** + * Returns the amount of energy currently stored. + */ + int getEnergyStored(ForgeDirection from); + + /** + * Returns the maximum amount of energy that can be stored. + */ + int getMaxEnergyStored(ForgeDirection from); + +} diff --git a/api/cofh/api/energy/IEnergyReceiver.java b/api/cofh/api/energy/IEnergyReceiver.java new file mode 100644 index 00000000..c726e09e --- /dev/null +++ b/api/cofh/api/energy/IEnergyReceiver.java @@ -0,0 +1,38 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Implement this interface on Tile Entities which should receive energy, generally storing it in one or more internal {@link IEnergyStorage} objects. + *

+ * A reference implementation is provided {@link TileEnergyHandler}. + * + * @author King Lemming + * + */ +public interface IEnergyReceiver extends IEnergyConnection { + + /** + * Add energy to an IEnergyReceiver, internal distribution is left entirely to the IEnergyReceiver. + * + * @param from + * Orientation the energy is received from. + * @param maxReceive + * Maximum amount of energy to receive. + * @param simulate + * If TRUE, the charge will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) received. + */ + int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate); + + /** + * Returns the amount of energy currently stored. + */ + int getEnergyStored(ForgeDirection from); + + /** + * Returns the maximum amount of energy that can be stored. + */ + int getMaxEnergyStored(ForgeDirection from); + +} diff --git a/api/cofh/api/energy/IEnergyStorage.java b/api/cofh/api/energy/IEnergyStorage.java index 1e84bc22..bc206560 100644 --- a/api/cofh/api/energy/IEnergyStorage.java +++ b/api/cofh/api/energy/IEnergyStorage.java @@ -1,8 +1,9 @@ package cofh.api.energy; /** - * An energy storage is the unit of interaction with Energy inventories. - * + * An energy storage is the unit of interaction with Energy inventories.
+ * This is not to be implemented on TileEntities. This is for internal use only. + *

* A reference implementation can be found at {@link EnergyStorage}. * * @author King Lemming diff --git a/api/cofh/api/energy/TileEnergyHandler.java b/api/cofh/api/energy/TileEnergyHandler.java index a7fabeb7..7cc655e9 100644 --- a/api/cofh/api/energy/TileEnergyHandler.java +++ b/api/cofh/api/energy/TileEnergyHandler.java @@ -6,9 +6,9 @@ import net.minecraftforge.common.util.ForgeDirection; /** * Reference implementation of {@link IEnergyHandler}. Use/extend this or implement your own. - * + * * @author King Lemming - * + * */ public class TileEnergyHandler extends TileEntity implements IEnergyHandler { @@ -28,25 +28,28 @@ public class TileEnergyHandler extends TileEntity implements IEnergyHandler { storage.writeToNBT(nbt); } - /* IEnergyHandler */ + /* IEnergyConnection */ @Override public boolean canConnectEnergy(ForgeDirection from) { return true; } + /* IEnergyReceiver */ @Override public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { return storage.receiveEnergy(maxReceive, simulate); } + /* IEnergyProvider */ @Override public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { return storage.extractEnergy(maxExtract, simulate); } + /* IEnergyReceiver and IEnergyProvider */ @Override public int getEnergyStored(ForgeDirection from) { diff --git a/api/cofh/api/package-info.java b/api/cofh/api/package-info.java deleted file mode 100644 index 08ff5fcb..00000000 --- a/api/cofh/api/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * (C) 2014 Team CoFH / CoFH / Cult of the Full Hub - * http://www.teamcofh.com - */ -@API(apiVersion = CoFHAPIProps.VERSION, owner = "CoFHLib", provides = "CoFHAPI") -package cofh.api; - -import cpw.mods.fml.common.API; - diff --git a/common/buildcraft/core/TileBuildCraft.java b/common/buildcraft/core/TileBuildCraft.java index 4109a68f..3ff4d1c8 100644 --- a/common/buildcraft/core/TileBuildCraft.java +++ b/common/buildcraft/core/TileBuildCraft.java @@ -20,6 +20,7 @@ import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyHandler; +import cofh.api.energy.IEnergyReceiver; import buildcraft.BuildCraftCore; import buildcraft.api.core.ISerializable; import buildcraft.core.network.BuildCraftPacket; @@ -27,7 +28,7 @@ import buildcraft.core.network.ISynchronizedTile; import buildcraft.core.network.PacketTileUpdate; import buildcraft.core.utils.Utils; -public abstract class TileBuildCraft extends TileEntity implements IEnergyHandler, ISynchronizedTile, ISerializable { +public abstract class TileBuildCraft extends TileEntity implements IEnergyReceiver, ISynchronizedTile, ISerializable { protected TileBuffer[] cache; protected HashSet guiWatchers = new HashSet(); @@ -162,7 +163,9 @@ public abstract class TileBuildCraft extends TileEntity implements IEnergyHandle } } - @Override + /** + * If you want to use this, implement IEnergyProvider. + */ public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { if (battery != null && this.canConnectEnergy(from)) { diff --git a/common/buildcraft/energy/TileEngine.java b/common/buildcraft/energy/TileEngine.java index 3b334257..5d30749c 100644 --- a/common/buildcraft/energy/TileEngine.java +++ b/common/buildcraft/energy/TileEngine.java @@ -11,12 +11,12 @@ package buildcraft.energy; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ICrafting; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.util.ForgeDirection; -import cofh.api.energy.IEnergyHandler; +import cofh.api.energy.IEnergyProvider; +import cofh.api.energy.IEnergyReceiver; import buildcraft.BuildCraftEnergy; import buildcraft.api.power.IEngine; import buildcraft.api.tiles.IHeatable; @@ -29,7 +29,7 @@ import buildcraft.core.TileBuildCraft; import buildcraft.core.utils.MathUtils; import buildcraft.energy.gui.ContainerEngine; -public abstract class TileEngine extends TileBuildCraft implements IPipeConnection, IEnergyHandler, IEngine, IHeatable { +public abstract class TileEngine extends TileBuildCraft implements IPipeConnection, IEnergyProvider, IEngine, IHeatable { // Index corresponds to metadata public static final ResourceLocation[] BASE_TEXTURES = new ResourceLocation[]{ new ResourceLocation(DefaultProps.TEXTURE_PATH_BLOCKS + "/base_wood.png"), @@ -292,8 +292,8 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti orientation.getOpposite(), this.energy, true); return extractEnergy(maxEnergy, false); - } else if (tile instanceof IEnergyHandler) { - IEnergyHandler handler = (IEnergyHandler) tile; + } else if (tile instanceof IEnergyReceiver) { + IEnergyReceiver handler = (IEnergyReceiver) tile; int maxEnergy = handler.receiveEnergy( orientation.getOpposite(), @@ -322,8 +322,8 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti extracted, false); extractEnergy(neededRF, true); - } else if (tile instanceof IEnergyHandler) { - IEnergyHandler handler = (IEnergyHandler) tile; + } else if (tile instanceof IEnergyReceiver) { + IEnergyReceiver handler = (IEnergyReceiver) tile; int neededRF = handler.receiveEnergy( orientation.getOpposite(), extracted, false); @@ -512,8 +512,8 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti return false; } else if (tile instanceof IEngine) { return ((IEngine) tile).canReceiveFromEngine(side.getOpposite()); - } else if (tile instanceof IEnergyHandler) { - return ((IEnergyHandler) tile).canConnectEnergy(side.getOpposite()); + } else if (tile instanceof IEnergyReceiver) { + return ((IEnergyReceiver) tile).canConnectEnergy(side.getOpposite()); } else { return false; } @@ -556,12 +556,6 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti } // RF support - @Override - public int receiveEnergy(ForgeDirection from, int maxReceive, - boolean simulate) { - return 0; - } - @Override public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { diff --git a/common/buildcraft/factory/BlockTank.java b/common/buildcraft/factory/BlockTank.java index ac9c5d3b..f841d720 100644 --- a/common/buildcraft/factory/BlockTank.java +++ b/common/buildcraft/factory/BlockTank.java @@ -24,6 +24,7 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; import buildcraft.BuildCraftCore; import buildcraft.api.events.BlockInteractionEvent; @@ -98,50 +99,64 @@ public class BlockTank extends BlockBuildCraft { } if (current != null) { - FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(current); - TileEntity tile = world.getTileEntity(i, j, k); if (tile instanceof TileTank) { TileTank tank = (TileTank) tile; - // Handle filled containers - if (liquid != null) { - int qty = tank.fill(ForgeDirection.UNKNOWN, liquid, true); + // Handle FluidContainerRegistry + if (FluidContainerRegistry.isContainer(current)) { + FluidStack liquid = FluidContainerRegistry.getFluidForFilledItem(current); + // Handle filled containers + if (liquid != null) { + int qty = tank.fill(ForgeDirection.UNKNOWN, liquid, true); - if (qty != 0 && !BuildCraftCore.debugWorldgen && !entityplayer.capabilities.isCreativeMode) { - entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, InvUtils.consumeItem(current)); - } + if (qty != 0 && !BuildCraftCore.debugWorldgen && !entityplayer.capabilities.isCreativeMode) { + entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, InvUtils.consumeItem(current)); + entityplayer.inventory.addItemStackToInventory(FluidContainerRegistry.drainFluidContainer(current)); + } - return true; + return true; - // Handle empty containers - } else { - FluidStack available = tank.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid; + // Handle empty containers + } else { + FluidStack available = tank.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid; - if (available != null) { - ItemStack filled = FluidContainerRegistry.fillFluidContainer(available, current); + if (available != null) { + ItemStack filled = FluidContainerRegistry.fillFluidContainer(available, current); - liquid = FluidContainerRegistry.getFluidForFilledItem(filled); + liquid = FluidContainerRegistry.getFluidForFilledItem(filled); - if (liquid != null) { - if (!BuildCraftCore.debugWorldgen && !entityplayer.capabilities.isCreativeMode) { - if (current.stackSize > 1) { - if (!entityplayer.inventory.addItemStackToInventory(filled)) { - return false; + if (liquid != null) { + if (!BuildCraftCore.debugWorldgen && !entityplayer.capabilities.isCreativeMode) { + if (current.stackSize > 1) { + if (!entityplayer.inventory.addItemStackToInventory(filled)) { + return false; + } else { + entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, InvUtils.consumeItem(current)); + } } else { entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, InvUtils.consumeItem(current)); + entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, filled); } - } else { - entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, InvUtils.consumeItem(current)); - entityplayer.inventory.setInventorySlotContents(entityplayer.inventory.currentItem, filled); } + + tank.drain(ForgeDirection.UNKNOWN, liquid.amount, true); + + return true; } - - tank.drain(ForgeDirection.UNKNOWN, liquid.amount, true); - - return true; } } + } else if (current.getItem() instanceof IFluidContainerItem) { + IFluidContainerItem container = (IFluidContainerItem) current.getItem(); + FluidStack liquid = container.getFluid(current); + if (liquid != null && liquid.amount > 0) { + int qty = tank.fill(ForgeDirection.UNKNOWN, liquid, false); + tank.fill(ForgeDirection.UNKNOWN, container.drain(current, qty, true), true); + } else { + liquid = tank.drain(ForgeDirection.UNKNOWN, 1000, false); + int qtyToFill = container.fill(current, liquid, true); + tank.drain(ForgeDirection.UNKNOWN, qtyToFill, true); + } } } } diff --git a/common/buildcraft/transport/PipeTransportPower.java b/common/buildcraft/transport/PipeTransportPower.java index 02c79e99..ebc4b332 100644 --- a/common/buildcraft/transport/PipeTransportPower.java +++ b/common/buildcraft/transport/PipeTransportPower.java @@ -17,6 +17,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyConnection; import cofh.api.energy.IEnergyHandler; +import cofh.api.energy.IEnergyProvider; +import cofh.api.energy.IEnergyReceiver; import buildcraft.BuildCraftCore; import buildcraft.BuildCraftTransport; import buildcraft.api.core.SafeTimeTracker; @@ -90,10 +92,20 @@ public class PipeTransportPower extends PipeTransport { return true; } - if (tile instanceof IEnergyConnection) { - IEnergyConnection handler = (IEnergyConnection) tile; - if (handler != null && handler.canConnectEnergy(side.getOpposite())) { - return true; + if (container.pipe instanceof PipePowerWood) { + if (tile instanceof IEnergyConnection && ((IEnergyConnection) tile).canConnectEnergy(side.getOpposite())) { + // Disregard tiles which are consumers but NOT providers + return !(tile instanceof IEnergyReceiver && !(tile instanceof IEnergyProvider)); + } else { + // Disregard tiles which can't connect either, I guess. + return false; + } + } else { + if (tile instanceof IEnergyReceiver) { + IEnergyReceiver handler = (IEnergyReceiver) tile; + if (handler != null && handler.canConnectEnergy(side.getOpposite())) { + return true; + } } } @@ -192,8 +204,8 @@ public class PipeTransportPower extends PipeTransport { ForgeDirection.VALID_DIRECTIONS[out].getOpposite(), powerConsumed); tilePowered = true; - } else if (tiles[out] instanceof IEnergyHandler) { - IEnergyHandler handler = (IEnergyHandler) tiles[out]; + } else if (tiles[out] instanceof IEnergyReceiver) { + IEnergyReceiver handler = (IEnergyReceiver) tiles[out]; if (handler.canConnectEnergy(ForgeDirection.VALID_DIRECTIONS[out].getOpposite())) { // Transmit power to an RF energy handler @@ -260,8 +272,8 @@ public class PipeTransportPower extends PipeTransport { continue; } - if (tile instanceof IEnergyHandler) { - IEnergyHandler handler = (IEnergyHandler) tile; + if (tile instanceof IEnergyReceiver) { + IEnergyReceiver handler = (IEnergyReceiver) tile; if (handler.canConnectEnergy(dir.getOpposite())) { int request = handler.receiveEnergy(dir.getOpposite(), this.maxPower, true); diff --git a/common/buildcraft/transport/pipes/PipeLogicIron.java b/common/buildcraft/transport/pipes/PipeLogicIron.java index b30a6f44..6d817983 100644 --- a/common/buildcraft/transport/pipes/PipeLogicIron.java +++ b/common/buildcraft/transport/pipes/PipeLogicIron.java @@ -103,6 +103,10 @@ public abstract class PipeLogicIron { return false; } + public ForgeDirection getOutputDirection() { + return ForgeDirection.getOrientation(pipe.container.getBlockMetadata()); + } + public boolean outputOpen(ForgeDirection to) { return to.ordinal() == pipe.container.getBlockMetadata(); } diff --git a/common/buildcraft/transport/pipes/PipePowerWood.java b/common/buildcraft/transport/pipes/PipePowerWood.java index 4c26d854..5bde29dd 100644 --- a/common/buildcraft/transport/pipes/PipePowerWood.java +++ b/common/buildcraft/transport/pipes/PipePowerWood.java @@ -16,6 +16,8 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraftforge.common.util.ForgeDirection; import cofh.api.energy.IEnergyConnection; import cofh.api.energy.IEnergyHandler; +import cofh.api.energy.IEnergyProvider; +import cofh.api.energy.IEnergyReceiver; import buildcraft.BuildCraftTransport; import buildcraft.api.core.IIconProvider; import buildcraft.api.transport.IPipeTile; @@ -186,7 +188,13 @@ public class PipePowerWood extends Pipe implements IPipeTran if (!transport.inputOpen(from)) { return false; } else { - return tile instanceof IEnergyConnection && ((IEnergyConnection) tile).canConnectEnergy(from.getOpposite()); + if (tile instanceof IEnergyConnection && ((IEnergyConnection) tile).canConnectEnergy(from.getOpposite())) { + // Disregard tiles which are consumers but NOT providers + return !(tile instanceof IEnergyReceiver && !(tile instanceof IEnergyProvider)); + } else { + // Disregard tiles which can't connect either, I guess. + return false; + } } }