package advancedsystemsmanager.flow.execution.commands; import advancedsystemsmanager.api.execution.IBuffer; import advancedsystemsmanager.api.execution.IBufferElement; import advancedsystemsmanager.api.tileentities.IInternalTank; import advancedsystemsmanager.flow.FlowComponent; import advancedsystemsmanager.flow.execution.buffers.Buffer; import advancedsystemsmanager.flow.execution.buffers.elements.FluidBufferElement; import advancedsystemsmanager.flow.menus.Menu; import advancedsystemsmanager.flow.menus.MenuContainer; import advancedsystemsmanager.flow.menus.MenuLiquid; import advancedsystemsmanager.flow.menus.MenuTargetTank; import advancedsystemsmanager.flow.setting.Setting; import advancedsystemsmanager.reference.Names; import advancedsystemsmanager.registry.SystemTypeRegistry; import advancedsystemsmanager.util.SystemCoord; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CommandFluidInput extends CommandInput<Fluid> { public CommandFluidInput() { super(FLUID_INPUT, Names.LIQUID_INPUT, IBuffer.FLUID); } @Override public void getMenus(FlowComponent component, List<Menu> menus) { menus.add(new MenuContainer(component, SystemTypeRegistry.TANK)); menus.add(new MenuTargetTank(component)); menus.add(new MenuLiquid(component)); } @Override protected IBuffer getNewBuffer() { return new Buffer<Fluid>(); } @Override protected List<IBufferElement<Fluid>> getBufferSubElements(int id, List<SystemCoord> blocks, List<Menu> menus) { MenuTargetTank target = (MenuTargetTank)menus.get(1); MenuLiquid settings = (MenuLiquid)menus.get(2); List<Setting<Fluid>> validSettings = getValidSettings(settings.getSettings()); List<IBufferElement<Fluid>> subElements = new ArrayList<IBufferElement<Fluid>>(); for (SystemCoord block : blocks) { TileEntity entity = block.getTileEntity(); if (entity instanceof IInternalTank) { subElements.addAll(((IInternalTank)entity).getSubElements(id, settings)); } else { IFluidHandler tank = (IFluidHandler)entity; Map<ForgeDirection, FluidTankInfo> tankInfoMap = new HashMap<ForgeDirection, FluidTankInfo>(); for (int i = 0; i < 6; i++) { if (target.activatedDirections[i]) { FluidTankInfo[] tankInfos = tank.getTankInfo(ForgeDirection.getOrientation(i)); if (tankInfos == null || tankInfos.length == 0 || tankInfos[0] == null || tankInfos[0].fluid == null || tankInfos[0].fluid.amount == 0) continue; boolean safeToAdd = true; for (FluidTankInfo tankInfo : tankInfoMap.values()) { if (tankInfo.capacity == tankInfos[0].capacity && tankInfo.fluid.isFluidStackIdentical(tankInfos[0].fluid)) { safeToAdd = false; break; } } if (safeToAdd) tankInfoMap.put(ForgeDirection.getOrientation(i), tankInfos[0]); } } for (Map.Entry<ForgeDirection, FluidTankInfo> entry : tankInfoMap.entrySet()) { Setting<Fluid> setting = isValid(validSettings, entry.getValue().fluid.getFluid()); boolean whitelist = settings.isFirstRadioButtonSelected(); if ((setting == null) != whitelist) subElements.add(new FluidBufferElement(id, tank, entry.getKey(), entry.getValue().fluid.amount, entry.getValue().fluid.getFluid(), setting, whitelist)); } } } return subElements; } }