Redstone Logic for Buses, and Part Image Button goodness
This commit is contained in:
@@ -8,6 +8,7 @@ import appeng.api.config.Actionable;
|
||||
import appeng.api.config.FuzzyMode;
|
||||
import appeng.api.config.RedstoneMode;
|
||||
import appeng.api.config.Settings;
|
||||
import appeng.api.config.Upgrades;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import appeng.api.networking.energy.IEnergyGrid;
|
||||
import appeng.api.networking.ticking.IGridTickable;
|
||||
@@ -105,16 +106,30 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isSleeping()
|
||||
{
|
||||
// TODO Auto-generated method stub
|
||||
return getHandler() == null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall)
|
||||
TickRateModulation doBusWork()
|
||||
{
|
||||
int itemToSend = 1;
|
||||
|
||||
switch (getInstalledUpgrades( Upgrades.SPEED ))
|
||||
{
|
||||
default:
|
||||
case 0:
|
||||
itemToSend = 1;
|
||||
break;
|
||||
case 1:
|
||||
itemToSend = 8;
|
||||
break;
|
||||
case 2:
|
||||
itemToSend = 32;
|
||||
break;
|
||||
case 3:
|
||||
itemToSend = 64;
|
||||
break;
|
||||
case 4:
|
||||
itemToSend = 96;
|
||||
break;
|
||||
}
|
||||
|
||||
boolean didSomething = false;
|
||||
|
||||
try
|
||||
@@ -170,4 +185,20 @@ public class PartExportBus extends PartSharedItemBus implements IGridTickable
|
||||
return didSomething ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall)
|
||||
{
|
||||
return doBusWork();
|
||||
}
|
||||
|
||||
public RedstoneMode getRSMode()
|
||||
{
|
||||
return (RedstoneMode) settings.getSetting( Settings.REDSTONE_OUTPUT );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isSleeping()
|
||||
{
|
||||
return getHandler() == null || super.isSleeping();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import appeng.api.config.FuzzyMode;
|
||||
import appeng.api.config.PowerMultiplier;
|
||||
import appeng.api.config.RedstoneMode;
|
||||
import appeng.api.config.Settings;
|
||||
import appeng.api.config.Upgrades;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import appeng.api.networking.ticking.IGridTickable;
|
||||
import appeng.api.networking.ticking.TickRateModulation;
|
||||
@@ -31,7 +32,7 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I
|
||||
|
||||
public PartImportBus(ItemStack is) {
|
||||
super( PartImportBus.class, is );
|
||||
settings.registerSetting( Settings.REDSTONE_INPUT, RedstoneMode.IGNORE );
|
||||
settings.registerSetting( Settings.REDSTONE_OUTPUT, RedstoneMode.IGNORE );
|
||||
settings.registerSetting( Settings.FUZZY_MODE, FuzzyMode.IGNORE_ALL );
|
||||
}
|
||||
|
||||
@@ -130,32 +131,63 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I
|
||||
return new TickingRequest( 5, 40, getHandler() == null, false );
|
||||
}
|
||||
|
||||
@Override
|
||||
public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall)
|
||||
private int itemToSend; // used in tickingRequest
|
||||
private boolean worked; // used in tickingRequest
|
||||
|
||||
TickRateModulation doBusWork()
|
||||
{
|
||||
boolean worked = false;
|
||||
worked = false;
|
||||
|
||||
InventoryAdaptor myAdaptor = getHandler();
|
||||
if ( myAdaptor != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
int howMany = 1;
|
||||
howMany = Math.min( howMany, (int) (0.01 + proxy.getEnergy().extractAEPower( howMany, Actionable.SIMULATE, PowerMultiplier.CONFIG )) );
|
||||
|
||||
ItemStack newItems = myAdaptor.removeItems( howMany, null, configDest( proxy.getStorage().getItemInventory() ) );
|
||||
if ( newItems != null )
|
||||
switch (getInstalledUpgrades( Upgrades.SPEED ))
|
||||
{
|
||||
if ( lastItemChecked == null || !lastItemChecked.isSameType( newItems ) )
|
||||
lastItemChecked = AEApi.instance().storage().createItemStack( newItems );
|
||||
else
|
||||
lastItemChecked.setStackSize( newItems.stackSize );
|
||||
default:
|
||||
case 0:
|
||||
itemToSend = 1;
|
||||
break;
|
||||
case 1:
|
||||
itemToSend = 8;
|
||||
break;
|
||||
case 2:
|
||||
itemToSend = 32;
|
||||
break;
|
||||
case 3:
|
||||
itemToSend = 64;
|
||||
break;
|
||||
case 4:
|
||||
itemToSend = 96;
|
||||
break;
|
||||
}
|
||||
|
||||
IAEItemStack failed = destination.injectItems( lastItemChecked, Actionable.MODULATE );
|
||||
if ( failed != null )
|
||||
myAdaptor.addItems( failed.getItemStack() );
|
||||
else
|
||||
worked = true;
|
||||
itemToSend = Math.min( itemToSend, (int) (0.01 + proxy.getEnergy().extractAEPower( itemToSend, Actionable.SIMULATE, PowerMultiplier.CONFIG )) );
|
||||
IMEMonitor<IAEItemStack> inv = proxy.getStorage().getItemInventory();
|
||||
|
||||
boolean Configured = false;
|
||||
for (int x = 0; x < availableSlots(); x++)
|
||||
{
|
||||
IAEItemStack ais = config.getAEStackInSlot( x );
|
||||
if ( ais != null && itemToSend > 0 )
|
||||
{
|
||||
Configured = true;
|
||||
while (itemToSend > 0)
|
||||
{
|
||||
if ( importStuff( myAdaptor, ais, inv ) )
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !Configured )
|
||||
{
|
||||
while (itemToSend > 0)
|
||||
{
|
||||
if ( importStuff( myAdaptor, null, inv ) )
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (GridAccessException e)
|
||||
@@ -169,10 +201,51 @@ public class PartImportBus extends PartSharedItemBus implements IGridTickable, I
|
||||
return worked ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TickRateModulation tickingRequest(IGridNode node, int TicksSinceLastCall)
|
||||
{
|
||||
return doBusWork();
|
||||
}
|
||||
|
||||
private boolean importStuff(InventoryAdaptor myAdaptor, IAEItemStack whatToImport, IMEMonitor<IAEItemStack> inv)
|
||||
{
|
||||
if ( itemToSend > 64 )
|
||||
itemToSend = 64;
|
||||
|
||||
ItemStack newItems = myAdaptor.removeItems( itemToSend, whatToImport == null ? null : whatToImport.getItemStack(), configDest( inv ) );
|
||||
if ( newItems != null )
|
||||
{
|
||||
itemToSend -= newItems.stackSize;
|
||||
|
||||
if ( lastItemChecked == null || !lastItemChecked.isSameType( newItems ) )
|
||||
lastItemChecked = AEApi.instance().storage().createItemStack( newItems );
|
||||
else
|
||||
lastItemChecked.setStackSize( newItems.stackSize );
|
||||
|
||||
IAEItemStack failed = destination.injectItems( lastItemChecked, Actionable.MODULATE );
|
||||
if ( failed != null )
|
||||
{
|
||||
myAdaptor.addItems( failed.getItemStack() );
|
||||
return true;
|
||||
}
|
||||
else
|
||||
worked = true;
|
||||
}
|
||||
else
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public RedstoneMode getRSMode()
|
||||
{
|
||||
return (RedstoneMode) settings.getSetting( Settings.REDSTONE_OUTPUT );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isSleeping()
|
||||
{
|
||||
return getHandler() == null;
|
||||
return getHandler() == null || super.isSleeping();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,9 +3,11 @@ package appeng.parts.automation;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import appeng.api.config.RedstoneMode;
|
||||
import appeng.api.config.Upgrades;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import appeng.api.networking.ticking.IGridTickable;
|
||||
import appeng.api.networking.ticking.TickRateModulation;
|
||||
import appeng.api.networking.ticking.TickingRequest;
|
||||
import appeng.me.GridAccessException;
|
||||
import appeng.tile.inventory.AppEngInternalAEInventory;
|
||||
@@ -19,6 +21,12 @@ public abstract class PartSharedItemBus extends PartUpgradeable implements IGrid
|
||||
super( c, is );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void upgradesChanged()
|
||||
{
|
||||
updateState();
|
||||
}
|
||||
|
||||
protected int availableSlots()
|
||||
{
|
||||
return Math.min( 1 + getInstalledUpgrades( Upgrades.CAPACITY ) * 4, config.getSizeInventory() );
|
||||
@@ -61,23 +69,37 @@ public abstract class PartSharedItemBus extends PartUpgradeable implements IGrid
|
||||
cached = true;
|
||||
|
||||
return adaptor;
|
||||
|
||||
}
|
||||
|
||||
boolean lastRedstone = false;
|
||||
|
||||
abstract TickRateModulation doBusWork();
|
||||
|
||||
@Override
|
||||
public void onNeighborChanged()
|
||||
{
|
||||
cached = false;
|
||||
if ( !isSleeping() )
|
||||
updateState();
|
||||
if ( lastRedstone != host.hasRedstone( side ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
lastRedstone = !lastRedstone;
|
||||
if ( lastRedstone && getRSMode() == RedstoneMode.SIGNAL_PULSE )
|
||||
doBusWork();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateState()
|
||||
{
|
||||
cached = false;
|
||||
try
|
||||
{
|
||||
if ( !isSleeping() )
|
||||
proxy.getTick().wakeDevice( proxy.getNode() );
|
||||
}
|
||||
catch (GridAccessException e)
|
||||
{
|
||||
// :P
|
||||
}
|
||||
else
|
||||
proxy.getTick().sleepDevice( proxy.getNode() );
|
||||
}
|
||||
catch (GridAccessException e)
|
||||
{
|
||||
// :P
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,6 +118,4 @@ public abstract class PartSharedItemBus extends PartUpgradeable implements IGrid
|
||||
return new TickingRequest( 5, 60, isSleeping(), false );
|
||||
}
|
||||
|
||||
abstract protected boolean isSleeping();
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package appeng.parts.automation;
|
||||
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import appeng.api.config.RedstoneMode;
|
||||
import appeng.api.config.Upgrades;
|
||||
import appeng.api.implementations.ISegmentedInventory;
|
||||
import appeng.api.util.IConfigManager;
|
||||
@@ -45,7 +46,7 @@ public class PartUpgradeable extends PartBasicState implements ISegmentedInvento
|
||||
@Override
|
||||
public IConfigManager getConfigManager()
|
||||
{
|
||||
return null;
|
||||
return settings;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -63,10 +64,55 @@ public class PartUpgradeable extends PartBasicState implements ISegmentedInvento
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack)
|
||||
public void upgradesChanged()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangeInventory(IInventory inv, int slot, InvOperation mc, ItemStack removedStack, ItemStack newStack)
|
||||
{
|
||||
if ( inv == upgrades )
|
||||
{
|
||||
upgradesChanged();
|
||||
}
|
||||
}
|
||||
|
||||
public RedstoneMode getRSMode()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
protected boolean isSleeping()
|
||||
{
|
||||
if ( getInstalledUpgrades( Upgrades.REDSTONE ) > 0 )
|
||||
{
|
||||
switch (getRSMode())
|
||||
{
|
||||
case IGNORE:
|
||||
return false;
|
||||
|
||||
case HIGH_SIGNAL:
|
||||
if ( host.hasRedstone( side ) )
|
||||
return false;
|
||||
|
||||
break;
|
||||
|
||||
case LOW_SIGNAL:
|
||||
if ( !host.hasRedstone( side ) )
|
||||
return false;
|
||||
|
||||
break;
|
||||
|
||||
case SIGNAL_PULSE:
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user