package advancedsystemsmanager.compatibility.rf.commands; import advancedsystemsmanager.api.execution.IBuffer; import advancedsystemsmanager.api.execution.IBufferElement; import advancedsystemsmanager.api.execution.Key; import advancedsystemsmanager.compatibility.rf.RFCompat; import advancedsystemsmanager.compatibility.rf.menus.MenuRFAmount; import advancedsystemsmanager.compatibility.rf.menus.MenuRFTarget; import advancedsystemsmanager.flow.FlowComponent; import advancedsystemsmanager.flow.execution.buffers.Buffer; import advancedsystemsmanager.flow.execution.commands.CommandOutput; import advancedsystemsmanager.flow.menus.Menu; import advancedsystemsmanager.flow.menus.MenuContainer; import advancedsystemsmanager.reference.Names; import advancedsystemsmanager.util.SystemCoord; import cofh.api.energy.IEnergyReceiver; import net.minecraftforge.common.util.ForgeDirection; import java.util.Iterator; import java.util.List; import java.util.Map; public class CommandRFOutput extends CommandOutput<Integer> { public CommandRFOutput() { super(RF_OUTPUT, Names.RF_OUTPUT, Buffer.RF); } @Override protected void outputFromBuffer(FlowComponent component, IBuffer<Integer> buffer) { MenuRFTarget target = (MenuRFTarget) component.getMenus().get(1); int maxAmount = ((MenuRFAmount) component.getMenus().get(2)).getAmount(); maxAmount = maxAmount == 0 ? Integer.MAX_VALUE : maxAmount; for (SystemCoord block : getContainers(component.getManager(), (MenuContainer)component.getMenus().get(0))) { int max = maxAmount; IEnergyReceiver receiver = (IEnergyReceiver)block.getTileEntity(); for (int side = 0; side < 6; side++) { if (target.isActive(side) && receiver.canConnectEnergy(ForgeDirection.VALID_DIRECTIONS[side])) { Iterator<Map.Entry<Key<Integer>, IBufferElement<Integer>>> itr = buffer.getOrderedIterator(); while (itr.hasNext() && max > 0) { IBufferElement<Integer> rfBufferElement = itr.next().getValue(); int amount = rfBufferElement.getSizeLeft(); amount = Math.min(max, amount); amount = receiver.receiveEnergy(ForgeDirection.VALID_DIRECTIONS[side], amount, false); rfBufferElement.reduceBufferAmount(amount); max -= amount; if (rfBufferElement.getSizeLeft() == 0) rfBufferElement.remove(); } } } } } @Override public void getMenus(FlowComponent component, List<Menu> menus) { menus.add(new MenuContainer(component, RFCompat.RF_RECEIVER)); menus.add(new MenuRFTarget(component)); menus.add(new MenuRFAmount(component)); } }