ExtraHoppers-forge/src/main/java/net/shadowfacts/funnels/TileEntityFunnel.java

114 lines
3.8 KiB
Java
Raw Normal View History

2016-06-14 23:19:20 +00:00
package net.shadowfacts.funnels;
import net.minecraft.block.Block;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fml.common.network.NetworkRegistry;
import net.shadowfacts.shadowmc.ShadowMC;
2016-06-17 16:30:15 +00:00
import net.shadowfacts.shadowmc.capability.CapHolder;
import net.shadowfacts.shadowmc.fluid.FluidTank;
import net.shadowfacts.shadowmc.nbt.AutoSerializeNBT;
2016-06-14 23:19:20 +00:00
import net.shadowfacts.shadowmc.network.PacketUpdateTE;
import net.shadowfacts.shadowmc.tileentity.BaseTileEntity;
/**
* @author shadowfacts
*/
public class TileEntityFunnel extends BaseTileEntity implements ITickable {
2016-06-17 16:30:15 +00:00
@AutoSerializeNBT
@CapHolder(capabilities = IFluidHandler.class)
2016-06-14 23:19:20 +00:00
FluidTank tank = new FluidTank(FunnelsConfig.size);
private int tick;
2016-06-17 16:30:15 +00:00
void save() {
2016-06-14 23:19:20 +00:00
markDirty();
ShadowMC.network.sendToAllAround(new PacketUpdateTE(this), new NetworkRegistry.TargetPoint(worldObj.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 64));
}
@Override
public void update() {
if (!worldObj.isRemote) {
2016-06-15 13:57:50 +00:00
handlers:
{
// up handler -> tank
if (tank.getFluidAmount() < tank.getCapacity()) {
BlockPos handlerPos = pos.up();
TileEntity te = worldObj.getTileEntity(handlerPos);
if (te != null && te.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN)) {
IFluidHandler handler = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.DOWN);
tank.fill(handler.drain(tank.getCapacity() - tank.getFluidAmount(), true), true);
save();
break handlers;
}
}
// tank -> front handler
if (tank.getFluidAmount() > 0) {
EnumFacing facing = worldObj.getBlockState(pos).getValue(BlockFunnel.FACING);
BlockPos handlerPos = pos.offset(facing);
TileEntity te = worldObj.getTileEntity(handlerPos);
if (te != null && te.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, facing.getOpposite())) {
IFluidHandler handler = te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, facing.getOpposite());
tank.drain(handler.fill(tank.drain(20, false), true), true);
save();
}
2016-06-14 23:19:20 +00:00
}
}
2016-06-15 13:57:50 +00:00
world:
{
tick++;
if (tick % 40 == 0) {
// pickup from world
if (FunnelsConfig.pickupWorldFluids && tank.getFluidAmount() <= tank.getCapacity() - Fluid.BUCKET_VOLUME) {
tick = 0;
if (FluidUtils.isFluidBlock(worldObj, pos.up())) {
FluidStack toDrain = FluidUtils.drainFluidBlock(worldObj, pos.up(), false);
if (toDrain.amount <= tank.getCapacity() - tank.getFluidAmount()) {
tank.fill(FluidUtils.drainFluidBlock(worldObj, pos.up(), true), true);
save();
break world;
}
2016-06-14 23:19:20 +00:00
}
}
2016-06-15 13:57:50 +00:00
// place in world
if (FunnelsConfig.placeFluidsInWorld && tank.getFluidAmount() >= Fluid.BUCKET_VOLUME) {
FluidStack fluid = tank.getFluid();
if (fluid.getFluid().canBePlacedInWorld()) {
Block fluidBlock = fluid.getFluid().getBlock();
BlockPos newPos = pos.offset(worldObj.getBlockState(pos).getValue(BlockFunnel.FACING));
if (fluidBlock.canPlaceBlockAt(worldObj, newPos)) {
tank.drain(Fluid.BUCKET_VOLUME, true);
save();
worldObj.setBlockState(newPos, fluidBlock.getDefaultState());
}
2016-06-14 23:19:20 +00:00
}
}
}
}
}
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
tank.readFromNBT(tag);
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
super.writeToNBT(tag);
tank.writeToNBT(tag);
return tag;
}
}