2013-04-20 11:31:35 -07:00

242 lines
5.0 KiB
Java

package mods.tinker.tconstruct.logic;
import mods.tinker.common.IActiveLogic;
import mods.tinker.common.IFacingLogic;
import mods.tinker.tconstruct.TConstruct;
import net.minecraft.entity.EntityLiving;
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.util.MathHelper;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.liquids.ILiquidTank;
import net.minecraftforge.liquids.ITankContainer;
import net.minecraftforge.liquids.LiquidStack;
public class FaucetLogic extends TileEntity implements IFacingLogic, IActiveLogic, ITankContainer
{
byte direction;
boolean active;
public LiquidStack liquid;
public boolean activateFaucet ()
{
if (liquid == null && active)
{
int x = xCoord, z = zCoord;
switch (getRenderDirection())
{
case 2:
z++;
break;
case 3:
z--;
break;
case 4:
x++;
break;
case 5:
x--;
break;
}
TileEntity drainte = worldObj.getBlockTileEntity(x, yCoord, z);
TileEntity tankte = worldObj.getBlockTileEntity(xCoord, yCoord - 1, zCoord);
if (drainte != null && drainte instanceof ITankContainer && tankte != null && tankte instanceof ITankContainer)
{
liquid = ((ITankContainer) drainte).drain(getForgeDirection(), TConstruct.ingotLiquidValue, true);
if (liquid != null)
{
int drained = ((ITankContainer) tankte).fill(ForgeDirection.UP, liquid, true);
if (drained != liquid.amount)
{
liquid.amount -= drained;
((ITankContainer) drainte).fill(getForgeDirection(), liquid, true);
}
if (drained > 0)
{
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
return true;
}
else
{
liquid = null;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
return false;
}
}
else
{
((ITankContainer) drainte).fill(getForgeDirection(), liquid, true);
}
}
}
return false;
}
@Override
public void updateEntity ()
{
if (liquid != null)
{
liquid.amount -= TConstruct.liquidUpdateAmount;
if (liquid.amount <= 0)
{
liquid = null;
if (!activateFaucet())
{
active = false;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
}
}
}
@Override
public byte getRenderDirection ()
{
return direction;
}
@Override
public ForgeDirection getForgeDirection ()
{
return ForgeDirection.VALID_DIRECTIONS[direction];
}
@Override
public void setDirection (float yaw, float pitch, EntityLiving player)
{
int facing = MathHelper.floor_double((double) (yaw / 360) + 0.5D) & 3;
switch (facing)
{
case 0:
direction = 2;
break;
case 1:
direction = 5;
break;
case 2:
direction = 3;
break;
case 3:
direction = 4;
break;
}
}
@Override
public void readFromNBT (NBTTagCompound tags)
{
super.readFromNBT(tags);
readCustomNBT(tags);
}
public void readCustomNBT (NBTTagCompound tags)
{
direction = tags.getByte("Direction");
if (tags.getBoolean("hasLiquid"))
this.liquid = new LiquidStack(tags.getInteger("itemID"), tags.getInteger("amount"), tags.getInteger("itemMeta"));
else
this.liquid = null;
}
@Override
public void writeToNBT (NBTTagCompound tags)
{
super.writeToNBT(tags);
writeCustomNBT(tags);
}
public void writeCustomNBT (NBTTagCompound tags)
{
tags.setByte("Direction", direction);
tags.setBoolean("hasLiquid", liquid != null);
if (liquid != null)
{
tags.setInteger("itemID", liquid.itemID);
tags.setInteger("amount", liquid.amount);
tags.setInteger("itemMeta", liquid.itemMeta);
}
}
/* Packets */
@Override
public Packet getDescriptionPacket ()
{
NBTTagCompound tag = new NBTTagCompound();
writeCustomNBT(tag);
return new Packet132TileEntityData(xCoord, yCoord, zCoord, 1, tag);
}
@Override
public void onDataPacket (INetworkManager net, Packet132TileEntityData packet)
{
readCustomNBT(packet.customParam1);
worldObj.markBlockForRenderUpdate(xCoord, yCoord, zCoord);
}
@Override
public boolean getActive ()
{
return active;
}
@Override
public void setActive (boolean flag)
{
if (!active)
{
active = true;
activateFaucet();
}
else
{
active = false;
}
}
@Override
public int fill (ForgeDirection from, LiquidStack resource, boolean doFill)
{
return 0;
}
@Override
public int fill (int tankIndex, LiquidStack resource, boolean doFill)
{
return 0;
}
@Override
public LiquidStack drain (ForgeDirection from, int maxDrain, boolean doDrain)
{
return null;
}
@Override
public LiquidStack drain (int tankIndex, int maxDrain, boolean doDrain)
{
return null;
}
@Override
public ILiquidTank[] getTanks (ForgeDirection direction)
{
return null;
}
@Override
public ILiquidTank getTank (ForgeDirection direction, LiquidStack type)
{
return null;
}
}