Files
TinkersConstruct/src/main/java/tconstruct/blocks/logic/CastingTableLogic.java
T

454 lines
12 KiB
Java
Raw Normal View History

package tconstruct.blocks.logic;
2013-12-01 12:19:43 +00:00
import mantle.blocks.abstracts.InventoryLogic;
import net.minecraft.entity.player.InventoryPlayer;
2014-02-05 10:28:54 -05:00
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
2014-02-05 10:28:54 -05:00
import net.minecraft.network.NetworkManager;
import net.minecraft.network.Packet;
2014-02-01 17:28:41 +11:00
import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
import net.minecraft.world.World;
2013-12-31 20:24:06 -05:00
import net.minecraftforge.common.util.ForgeDirection;
2014-02-05 10:28:54 -05:00
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidEvent;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import net.minecraftforge.fluids.IFluidTank;
2014-02-14 23:05:41 -05:00
import tconstruct.TConstruct;
import tconstruct.library.crafting.CastingRecipe;
import tconstruct.library.util.IPattern;
public class CastingTableLogic extends InventoryLogic implements IFluidTank, IFluidHandler, ISidedInventory
{
public FluidStack liquid;
int castingDelay = 0;
int renderOffset = 0;
int capacity = 0;
boolean needsUpdate;
boolean init = true;
int tick;
public CastingTableLogic()
{
super(2);
}
@Override
public int getInventoryStackLimit ()
{
return 1;
}
@Override
public String getInvName () //Not a gui block
{
return null;
}
@Override
protected String getDefaultName () //Still not a gui block
{
return null;
}
@Override
public Container getGuiContainer (InventoryPlayer inventoryplayer, World world, int x, int y, int z) //Definitely not a gui block
{
return null;
}
/* Tank */
@Override
public int getCapacity ()
{
return this.capacity;
}
public int updateCapacity () //Only used to initialize
{
int ret = TConstruct.ingotLiquidValue;
ItemStack inv = inventory[0];
if (inv != null && inv.getItem() instanceof IPattern)
{
int cost = ((IPattern) inv.getItem()).getPatternCost(inv);
if (cost > 0)
ret *= ((IPattern) inv.getItem()).getPatternCost(inv) * 0.5;
else
ret = TConstruct.tableCasting.getCastingAmount(this.liquid, inv);
}
else
{
ret = TConstruct.tableCasting.getCastingAmount(this.liquid, inv);
}
TConstruct.logger.info("Ret: " + ret);
return ret;
}
public int updateCapacity (int capacity)
{
int ret = TConstruct.ingotLiquidValue;
ItemStack inv = inventory[0];
if (inv != null && inv.getItem() instanceof IPattern)
{
int cost = ((IPattern) inv.getItem()).getPatternCost(inv);
if (cost > 0)
ret *= ((IPattern) inv.getItem()).getPatternCost(inv) * 0.5;
else
ret = capacity;
}
else
ret = capacity;
return ret;
}
@Override
public int fill (FluidStack resource, boolean doFill)
{
if (resource == null)
return 0;
if (this.liquid == null)
{
CastingRecipe recipe = TConstruct.tableCasting.getCastingRecipe(resource, inventory[0]);
if (recipe == null)
return 0;
this.capacity = updateCapacity(recipe.castingMetal.amount);
if (inventory[1] == null)
{
FluidStack copyLiquid = resource.copy();
if (copyLiquid.amount > this.capacity)
{
copyLiquid.amount = this.capacity;
}
if (doFill)
{
if (copyLiquid.amount == this.capacity)
{
castingDelay = recipe.coolTime;
}
renderOffset = copyLiquid.amount;
2014-02-13 23:03:13 -05:00
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
this.liquid = copyLiquid;
needsUpdate = true;
}
return copyLiquid.amount;
}
else
{
return 0;
}
}
else if (resource.isFluidEqual(this.liquid))
{
if (resource.amount + this.liquid.amount >= this.capacity) //Start timer here
{
int roomInTank = this.capacity - liquid.amount;
if (doFill && roomInTank > 0)
{
renderOffset = roomInTank;
castingDelay = TConstruct.tableCasting.getCastingDelay(this.liquid, inventory[0]);
this.liquid.amount = this.capacity;
2014-02-13 23:03:13 -05:00
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
needsUpdate = true;
}
return roomInTank;
}
else
{
if (doFill)
{
this.liquid.amount += resource.amount;
2014-02-13 23:03:13 -05:00
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
needsUpdate = true;
}
return resource.amount;
}
}
else
{
return 0;
}
}
@Override
2014-02-05 10:22:35 -05:00
public void markDirty () //Isn't actually called?
{
2014-02-05 10:22:35 -05:00
super.markDirty();
2014-02-13 23:03:13 -05:00
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
needsUpdate = true;
}
public ItemStack decrStackSize (int slot, int quantity)
{
ItemStack stack = super.decrStackSize(slot, quantity);
2014-02-13 23:03:13 -05:00
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
return stack;
}
@Override
public FluidStack drain (int maxDrain, boolean doDrain)
{
if (liquid == null || liquid.fluidID <= 0 || castingDelay > 0)
return null;
if (liquid.amount <= 0)
return null;
int used = maxDrain;
if (liquid.amount < used)
used = liquid.amount;
if (doDrain)
{
liquid.amount -= used;
}
FluidStack drained = liquid.copy();//new FluidStack(liquid.itemID, used, liquid.itemMeta);
drained.amount = used;
// Reset liquid if emptied
if (liquid.amount <= 0)
liquid = null;
if (doDrain)
2014-02-13 23:03:13 -05:00
FluidEvent.fireEvent(new FluidEvent.FluidDrainingEvent(drained, this.worldObj, this.xCoord, this.yCoord, this.zCoord, this));
return drained;
}
/* Tank Container */
@Override
public int fill (ForgeDirection from, FluidStack resource, boolean doFill)
{
//if (from == ForgeDirection.UP)
return fill(resource, doFill);
//return 0;
}
@Override
public FluidStack drain (ForgeDirection from, int maxDrain, boolean doDrain)
{
return drain(maxDrain, doDrain);
2013-08-31 05:13:31 -07:00
}
@Override
public FluidStack drain (ForgeDirection from, FluidStack resource, boolean doDrain)
{
return null;
}
@Override
public boolean canFill (ForgeDirection from, Fluid fluid)
{
return false;
}
@Override
public boolean canDrain (ForgeDirection from, Fluid fluid)
{
2014-02-13 23:03:13 -05:00
// TODO Auto-generated method stub
return false;
}
@Override
public FluidTankInfo[] getTankInfo (ForgeDirection from)
{
2013-08-31 05:13:31 -07:00
return new FluidTankInfo[] { getInfo() };
}
@Override
public FluidStack getFluid ()
{
2013-08-02 02:12:48 -07:00
return liquid == null ? null : liquid.copy();
}
@Override
public int getFluidAmount ()
{
return liquid != null ? liquid.amount : 0;
}
@Override
public FluidTankInfo getInfo ()
{
FluidTankInfo info = new FluidTankInfo(this);
return info;
}
public int getLiquidAmount ()
{
return liquid.amount - renderOffset;
}
/* Updating */
@Override
2014-02-05 08:28:53 -05:00
public void updateEntity ()
{
if (castingDelay > 0)
{
//TConstruct.logger.info("Casting");
castingDelay--;
if (castingDelay == 0)
castLiquid();
}
if (renderOffset > 0)
{
renderOffset -= 6;
2014-02-13 23:03:13 -05:00
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
}
tick++;
if (tick % 20 == 0)
{
tick = 0;
if (needsUpdate)
2014-02-13 23:03:13 -05:00
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
}
public void castLiquid ()
{
CastingRecipe recipe = TConstruct.tableCasting.getCastingRecipe(liquid, inventory[0]);
if (recipe != null)
{
inventory[1] = recipe.getResult();
if (recipe.consumeCast)
inventory[0] = null;
liquid = null;
2014-02-13 23:03:13 -05:00
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
}
}
/* NBT */
@Override
2014-02-05 08:28:53 -05:00
public void readFromNBT (NBTTagCompound tags)
{
2014-02-05 08:28:53 -05:00
super.readFromNBT(tags);
readCustomNBT(tags);
}
public void readCustomNBT (NBTTagCompound tags)
{
if (tags.getBoolean("hasLiquid"))
{
this.liquid = FluidStack.loadFluidStackFromNBT(tags.getCompoundTag("Fluid"));
}
else
this.liquid = null;
if (tags.getBoolean("Initialized"))
this.capacity = tags.getInteger("Capacity");
else
this.capacity = updateCapacity();
2013-09-02 22:55:53 +10:00
this.castingDelay = tags.getInteger("castingDelay");
}
@Override
2014-02-05 08:28:53 -05:00
public void writeToNBT (NBTTagCompound tags)
{
2014-02-05 08:28:53 -05:00
super.writeToNBT(tags);
writeCustomNBT(tags);
}
public void writeCustomNBT (NBTTagCompound tags)
{
tags.setBoolean("hasLiquid", liquid != null);
if (liquid != null)
{
NBTTagCompound nbt = new NBTTagCompound();
2014-02-01 14:18:17 -05:00
liquid.writeToNBT(nbt);
2014-01-10 21:14:54 -05:00
tags.setTag("Fluid", nbt);
}
tags.setBoolean("Initialized", init);
tags.setInteger("Capacity", capacity);
2013-09-02 22:38:06 +10:00
tags.setInteger("castingDelay", castingDelay);
}
/* Packets */
@Override
2014-02-05 08:28:53 -05:00
public Packet getDescriptionPacket ()
{
NBTTagCompound tag = new NBTTagCompound();
2014-02-13 23:03:13 -05:00
writeToNBT(tag);
2014-02-05 08:28:53 -05:00
return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, tag);
}
@Override
2014-02-01 17:28:41 +11:00
public void onDataPacket (NetworkManager net, S35PacketUpdateTileEntity packet)
{
2014-02-05 08:28:53 -05:00
readFromNBT(packet.func_148857_g());
2014-02-13 23:03:13 -05:00
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
}
@Override
public int[] getAccessibleSlotsFromSide (int side)
{
return new int[] { 0, 1 };
}
@Override
public boolean canInsertItem (int slot, ItemStack itemstack, int side)
{
if (liquid != null)
return false;
if (slot == 0)
return true;
return false;
}
@Override
public boolean canExtractItem (int slot, ItemStack itemstack, int side)
{
if (slot == 1)
return true;
return false;
}
2014-02-01 16:06:02 -05:00
@Override
2014-02-05 08:28:53 -05:00
public String getInventoryName ()
2014-02-01 16:06:02 -05:00
{
return null;
}
@Override
2014-02-05 08:28:53 -05:00
public boolean hasCustomInventoryName ()
2014-02-01 16:06:02 -05:00
{
return false;
}
2014-02-05 08:59:16 -05:00
@Override
public void closeInventory ()
{
// TODO Auto-generated method stub
2014-02-05 09:11:06 -05:00
2014-02-05 08:59:16 -05:00
}
@Override
public void openInventory ()
{
// TODO Auto-generated method stub
2014-02-05 09:11:06 -05:00
2014-02-05 08:59:16 -05:00
}
2014-02-13 23:03:13 -05:00
}