package advancedsystemsmanager.flow.execution;
import advancedsystemsmanager.api.ISystemType;
import advancedsystemsmanager.flow.FlowComponent;
import advancedsystemsmanager.flow.execution.commands.CommandBase;
import advancedsystemsmanager.flow.menus.Menu;
import advancedsystemsmanager.flow.menus.MenuContainer;
import advancedsystemsmanager.flow.menus.MenuUpdateBlock;
import advancedsystemsmanager.registry.ConnectionOption;
import advancedsystemsmanager.registry.SystemTypeRegistry;
import advancedsystemsmanager.tileentities.TileEntityBUD;
import advancedsystemsmanager.tileentities.manager.TileEntityManager;
import advancedsystemsmanager.util.SystemCoord;
import java.util.EnumSet;
import java.util.List;
public class TriggerHelperBUD extends TriggerHelper
{
public static final int TRIGGER_BUD_BLOCK_ID = 5;
public TriggerHelperBUD()
{
super(false, 1, 3, SystemTypeRegistry.BUD);
}
@Override
public void onTrigger(FlowComponent item, EnumSet<ConnectionOption> valid)
{
List<SystemCoord> buds = getContainers(item.getManager(), (MenuContainer)item.getMenus().get(containerId));
if (buds != null)
{
for (SystemCoord bud : buds)
{
((TileEntityBUD)bud.getTileEntity()).updateData();
}
if (isSpecialPulseReceived(item, true))
{
valid.add(ConnectionOption.BUD_PULSE_HIGH);
valid.add(ConnectionOption.BUD_HIGH);
} else if (isTriggerPowered(item, true))
{
valid.add(ConnectionOption.BUD_HIGH);
}
if (isSpecialPulseReceived(item, false))
{
valid.add(ConnectionOption.BUD_PULSE_LOW);
valid.add(ConnectionOption.BUD_LOW);
} else if (isTriggerPowered(item, false))
{
valid.add(ConnectionOption.BUD_LOW);
}
for (SystemCoord bud : buds)
{
((TileEntityBUD)bud.getTileEntity()).makeOld();
}
}
}
@Override
public boolean isBlockPowered(FlowComponent component, int power)
{
int id = power >>> 4;
int meta = power & 15;
MenuUpdateBlock updateMenu = (MenuUpdateBlock)component.getMenus().get(TRIGGER_BUD_BLOCK_ID);
if (updateMenu.useId())
{
boolean idMatch = id == updateMenu.getBlockId();
if (updateMenu.isIdInverted() == idMatch)
{
return false;
}
}
for (MenuUpdateBlock.MetaSetting setting : updateMenu.getMetaSettings())
{
if (setting.inUse())
{
int count = 0;
int settingMeta = 0;
for (int i = 0; i < setting.bits.length; i++)
{
if (setting.bits[i])
{
settingMeta |= ((meta >> i) & 1) << count;
count++;
}
}
boolean metaMatch = setting.lowerTextBox.getNumber() <= settingMeta && settingMeta <= setting.higherTextBox.getNumber();
if (setting.inverted == metaMatch)
{
return false;
}
}
}
return true;
}
public void triggerBUD(FlowComponent item, TileEntityBUD tileEntityBUD)
{
MenuContainer componentMenuContainer = (MenuContainer)item.getMenus().get(containerId);
List<SystemCoord> receivers = CommandBase.getContainers(item.getManager(), componentMenuContainer);
if (receivers != null)
{
TileEntityBUD trigger = componentMenuContainer.getOption() == 0 ? tileEntityBUD : null;
EnumSet<ConnectionOption> valid = EnumSet.noneOf(ConnectionOption.class);
if (isTriggerPowered(item, true))
{
valid.add(ConnectionOption.BUD);
if (isPulseReceived(item, receivers, trigger, true))
{
valid.add(ConnectionOption.BUD_PULSE_HIGH);
}
} else if (isPulseReceived(item, receivers, trigger, false))
{
valid.add(ConnectionOption.BUD_PULSE_LOW);
}
if (!valid.isEmpty())
{
activateTrigger(item, valid);
}
}
}
}