203 lines
4.9 KiB
Java
203 lines
4.9 KiB
Java
package resonantinduction.old.mechanics.furnace;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.item.crafting.FurnaceRecipes;
|
|
import net.minecraft.network.packet.Packet;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.tileentity.TileEntityFurnace;
|
|
import net.minecraftforge.common.ForgeDirection;
|
|
import resonantinduction.core.ResonantInduction;
|
|
import resonantinduction.core.Settings;
|
|
import universalelectricity.api.CompatibilityModule;
|
|
import universalelectricity.api.UniversalClass;
|
|
import universalelectricity.api.energy.EnergyStorageHandler;
|
|
import universalelectricity.api.energy.IEnergyContainer;
|
|
import universalelectricity.api.energy.IEnergyInterface;
|
|
import universalelectricity.api.vector.Vector3;
|
|
import calclavia.lib.network.IPacketReceiver;
|
|
import calclavia.lib.network.IPacketSender;
|
|
|
|
import com.google.common.io.ByteArrayDataInput;
|
|
|
|
/**
|
|
* Meant to replace the furnace class.
|
|
*
|
|
* @author Calclavia
|
|
*
|
|
*/
|
|
@UniversalClass
|
|
public class TileAdvancedFurnace extends TileEntityFurnace implements IEnergyInterface, IEnergyContainer, IPacketSender, IPacketReceiver
|
|
{
|
|
private static final float WATTAGE = 5;
|
|
|
|
private EnergyStorageHandler energy = new EnergyStorageHandler(Settings.FURNACE_WATTAGE * 5);
|
|
|
|
@Override
|
|
public void updateEntity()
|
|
{
|
|
/**
|
|
* Producing energy from coal.
|
|
*/
|
|
if (TileEntityFurnace.getItemBurnTime(this.getStackInSlot(1)) > 0)
|
|
{
|
|
boolean doBlockStateUpdate = this.furnaceBurnTime > 0;
|
|
|
|
if (!this.energy.isFull() && this.furnaceBurnTime == 0)
|
|
{
|
|
int burnTime = TileEntityFurnace.getItemBurnTime(this.getStackInSlot(1));
|
|
this.decrStackSize(1, 1);
|
|
this.furnaceBurnTime = burnTime;
|
|
}
|
|
|
|
if (this.furnaceBurnTime > 0)
|
|
{
|
|
this.energy.receiveEnergy(Settings.FURNACE_WATTAGE / 20, true);
|
|
this.furnaceBurnTime--;
|
|
}
|
|
|
|
if (doBlockStateUpdate != this.furnaceBurnTime > 0)
|
|
{
|
|
this.worldObj.markBlockForUpdate(this.xCoord, this.yCoord, this.zCoord);
|
|
}
|
|
|
|
this.produce();
|
|
}
|
|
|
|
/**
|
|
* Consuming energy for smelting
|
|
*/
|
|
if (this.canSmelt())
|
|
{
|
|
if (this.energy.checkExtract(Settings.FURNACE_WATTAGE / 20))
|
|
{
|
|
this.furnaceCookTime++;
|
|
|
|
if (this.furnaceCookTime == 200)
|
|
{
|
|
this.furnaceCookTime = 0;
|
|
this.smeltItem();
|
|
}
|
|
|
|
this.energy.extractEnergy(Settings.FURNACE_WATTAGE / 20, true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.furnaceCookTime = 0;
|
|
}
|
|
}
|
|
|
|
private void produce()
|
|
{
|
|
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS)
|
|
{
|
|
if (this.energy.getEnergy() > 0)
|
|
{
|
|
TileEntity tileEntity = new Vector3(this).modifyPositionFromSide(direction).getTileEntity(this.worldObj);
|
|
|
|
if (tileEntity != null)
|
|
{
|
|
long used = CompatibilityModule.receiveEnergy(tileEntity, direction.getOpposite(), this.energy.extractEnergy(this.energy.getEnergy(), false), true);
|
|
this.energy.extractEnergy(used, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean canConnect(ForgeDirection direction)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
private boolean canSmelt()
|
|
{
|
|
if (this.getStackInSlot(0) == null)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
ItemStack itemstack = FurnaceRecipes.smelting().getSmeltingResult(this.getStackInSlot(0));
|
|
if (itemstack == null)
|
|
return false;
|
|
if (this.getStackInSlot(2) == null)
|
|
return true;
|
|
if (!this.getStackInSlot(2).isItemEqual(itemstack))
|
|
return false;
|
|
int result = getStackInSlot(2).stackSize + itemstack.stackSize;
|
|
return (result <= getInventoryStackLimit() && result <= itemstack.getMaxStackSize());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive)
|
|
{
|
|
if (this.canSmelt() && this.getStackInSlot(1) == null && this.furnaceBurnTime == 0)
|
|
{
|
|
return this.energy.receiveEnergy(receive, doReceive);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public long onExtractEnergy(ForgeDirection from, long request, boolean doProvide)
|
|
{
|
|
return this.energy.extractEnergy(request, doProvide);
|
|
}
|
|
|
|
@Override
|
|
public void setEnergy(ForgeDirection from, long energy)
|
|
{
|
|
this.energy.setEnergy(energy);
|
|
}
|
|
|
|
@Override
|
|
public long getEnergy(ForgeDirection from)
|
|
{
|
|
return this.energy.getEnergy();
|
|
}
|
|
|
|
@Override
|
|
public long getEnergyCapacity(ForgeDirection from)
|
|
{
|
|
return this.energy.getEnergyCapacity();
|
|
}
|
|
|
|
@Override
|
|
public Packet getDescriptionPacket()
|
|
{
|
|
return ResonantInduction.PACKET_TILE.getPacket(this, this.getPacketData(0).toArray());
|
|
}
|
|
|
|
/**
|
|
* 1 - Description Packet
|
|
* 2 - Energy Update
|
|
* 3 - Tesla Beam
|
|
*/
|
|
@Override
|
|
public ArrayList getPacketData(int type)
|
|
{
|
|
ArrayList data = new ArrayList();
|
|
data.add(this.furnaceBurnTime);
|
|
return data;
|
|
}
|
|
|
|
@Override
|
|
public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra)
|
|
{
|
|
try
|
|
{
|
|
this.furnaceBurnTime = data.readInt();
|
|
this.worldObj.markBlockForRenderUpdate(this.xCoord, this.yCoord, this.zCoord);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|