package advancedsystemsmanager.flow.execution; import advancedsystemsmanager.api.tileentities.ITriggerNode; import advancedsystemsmanager.flow.FlowComponent; import advancedsystemsmanager.flow.execution.commands.CommandBase; import advancedsystemsmanager.flow.menus.MenuContainer; import advancedsystemsmanager.flow.menus.MenuRedstoneStrength; import advancedsystemsmanager.registry.ConnectionOption; import advancedsystemsmanager.registry.SystemTypeRegistry; import advancedsystemsmanager.util.SystemCoord; import net.minecraftforge.common.util.ForgeDirection; import java.util.EnumSet; import java.util.List; public class TriggerHelperRedstone extends TriggerHelper { public int strengthId; public TriggerHelperRedstone(int sidesId, int strengthId) { super(true, 0, sidesId, SystemTypeRegistry.RECEIVER); this.strengthId = strengthId; } @Override public void onTrigger(FlowComponent item, EnumSet<ConnectionOption> valid) { if (isTriggerPowered(item, true)) { valid.add(ConnectionOption.REDSTONE_HIGH); } if (isTriggerPowered(item, false)) { valid.add(ConnectionOption.REDSTONE_LOW); } } @Override public boolean isBlockPowered(FlowComponent component, int power) { MenuRedstoneStrength menuStrength = (MenuRedstoneStrength)(component.menus.size() > strengthId ? component.getMenu(strengthId) : component.getMenu(2)); boolean inRange = menuStrength.getLow() <= power && power <= menuStrength.getHigh(); return inRange != menuStrength.isInverted(); } public void onRedstoneTrigger(FlowComponent item, ITriggerNode inputTrigger) { MenuContainer componentMenuContainer = (MenuContainer)item.getMenus().get(containerId); List<SystemCoord> receivers = CommandBase.getContainers(item.getManager(), componentMenuContainer); if (receivers != null) { int[] newPower = new int[ForgeDirection.VALID_DIRECTIONS.length]; int[] oldPower = new int[ForgeDirection.VALID_DIRECTIONS.length]; if (canUseMergedDetection && componentMenuContainer.getOption() == 0) { for (SystemCoord receiver : receivers) { ITriggerNode input = (ITriggerNode)receiver.getTileEntity(); for (int i = 0; i < newPower.length; i++) { newPower[i] = Math.min(15, newPower[i] + input.getData()[i]); oldPower[i] = Math.min(15, oldPower[i] + input.getOldData()[i]); } } if (isPulseReceived(item, newPower, oldPower, true)) { activateTrigger(item, EnumSet.of(ConnectionOption.REDSTONE_PULSE_HIGH)); } if (isPulseReceived(item, newPower, oldPower, false)) { activateTrigger(item, EnumSet.of(ConnectionOption.REDSTONE_PULSE_LOW)); } } else { ITriggerNode trigger = (componentMenuContainer.getOption() == 0 || (componentMenuContainer.getOption() == 1 && canUseMergedDetection)) ? inputTrigger : null; if (isPulseReceived(item, receivers, trigger, true)) { activateTrigger(item, EnumSet.of(ConnectionOption.REDSTONE_PULSE_HIGH)); } if (isPulseReceived(item, receivers, trigger, false)) { activateTrigger(item, EnumSet.of(ConnectionOption.REDSTONE_PULSE_LOW)); } } } } }