package openmods.liquids;
import com.google.common.collect.Sets;
import cpw.mods.fml.common.eventhandler.Event.Result;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import java.util.Set;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.MovingObjectPosition.MovingObjectType;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.event.entity.player.FillBucketEvent;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
public class BucketFillHandler {
public static final BucketFillHandler instance = new BucketFillHandler();
private BucketFillHandler() {}
private final Set<Class<? extends IFluidHandler>> whitelist = Sets.newHashSet();
@SuppressWarnings("unchecked")
public void addToWhitelist(Class<? extends TileEntity> cls) {
whitelist.add((Class<? extends IFluidHandler>)cls);
}
private boolean shouldFill(Object target) {
return (target instanceof IFluidHandler) && whitelist.contains(target.getClass());
}
private static ItemStack fillTank(IFluidHandler handler, ForgeDirection dir, ItemStack container) {
FluidTankInfo tanks[] = handler.getTankInfo(dir);
for (FluidTankInfo tank : tanks) {
FluidStack available = tank.fluid;
if (available == null || available.amount <= 0) continue;
ItemStack filledStack = FluidContainerRegistry.fillFluidContainer(available, container);
FluidStack filled = FluidContainerRegistry.getFluidForFilledItem(filledStack);
if (filled != null && filled.isFluidEqual(available) && filled.amount <= available.amount) {
FluidStack drained = handler.drain(dir, filled.amount, false);
if (drained.isFluidStackIdentical(filled)) {
handler.drain(dir, filled.amount, true);
return filledStack;
}
}
}
return null;
}
@SubscribeEvent
public void onBucketFill(FillBucketEvent evt) {
if (evt.getResult() != Result.DEFAULT) return;
final MovingObjectPosition target = evt.target;
if (target.typeOfHit != MovingObjectType.BLOCK) return;
TileEntity te = evt.world.getTileEntity(target.blockX, target.blockY, target.blockZ);
if (shouldFill(te)) {
ItemStack result = fillTank((IFluidHandler)te, ForgeDirection.getOrientation(target.sideHit), evt.current);
if (result != null) {
evt.result = result;
evt.setResult(Result.ALLOW);
}
}
}
}