Compare commits

...

31 Commits

Author SHA1 Message Date
PrototypeTrousers e3b3c8cc10 2 2022-03-03 14:31:51 -03:00
PrototypeTrousers eea5bc7c6b 1 2022-03-03 14:31:46 -03:00
PrototypeTrousers d414c458ae undo partially pattern cache rebuild optimization 2022-03-01 13:02:56 -03:00
PrototypeTrousers 71ffcfb839 JEI transfer handler OutOfBounds fix 2022-03-01 13:02:09 -03:00
PrototypeTrousers 73f76a6654 clean up 2022-02-28 23:30:52 -03:00
PrototypeTrousers 645de1d868 Merge branch 'craftingtree-tweaks' into AE2-Omnifactory 2022-02-28 23:17:21 -03:00
PrototypeTrousers 8f40478695 version 2022-02-28 23:16:53 -03:00
PrototypeTrousers 056fcc3818 switch to extractable instead of cached item list 2022-02-28 23:16:53 -03:00
PrototypeTrousers 0ed0eb9d5f better logging 2022-02-28 23:16:49 -03:00
PrototypeTrousers 3ddc846648 Merge branch 'craftingtree-tweaks' into AE2-Omnifactory 2022-02-28 23:06:11 -03:00
PrototypeTrousers f98f6ef852 misc cleaning 2022-02-28 22:57:35 -03:00
PrototypeTrousers 4192d721a0 only fire simulation if a player requested it 2022-02-28 21:25:33 -03:00
PrototypeTrousers a0f3ef9d86 cut crafting tree earlier if ingredients are available 2022-02-28 21:25:13 -03:00
PrototypeTrousers 6b29288de6 remove crafting penalties 2022-02-28 00:13:07 -03:00
PrototypeTrousers 285fc6314c small optimization to crafting tree 2022-02-27 23:04:29 -03:00
PrototypeTrousers 50fd83e96b adjust default blocking mode settings 2022-02-25 00:09:33 -03:00
PrototypeTrousers cc51138a6a blocking mode changes again
misc cleaning
2022-02-24 23:54:50 -03:00
PrototypeTrousers 918df0bf7f clean up 2022-02-22 23:55:52 -03:00
PrototypeTrousers c852199901 bump version 2022-02-22 22:55:44 -03:00
PrototypeTrousers fd95d3de47 fixed typo gtceu -> gteu 2022-02-22 22:37:28 -03:00
PrototypeTrousers c3dd6dabe1 fix blocking mode again... 2022-02-22 22:11:57 -03:00
PrototypeTrousers b0e81ac2d1 fix blocking mode somehow voiding items 2022-02-22 19:40:15 -03:00
PrototypeTrousers 30f4cdf545 attempt at pattern rebuild optimization 2022-02-22 00:02:17 -03:00
PrototypeTrousers ee9441474e tweak cache reset on interface config 2022-02-21 18:25:58 -03:00
PrototypeTrousers 8846202270 More itemstacks caching
Micro optimization on molecular assemblers
2022-02-21 15:11:16 -03:00
PrototypeTrousers 17a900ae9a actually return if a crafting job is running 2022-02-19 23:03:33 -03:00
PrototypeTrousers 66bc243b41 cache more itemstacks 2022-02-19 23:02:40 -03:00
PrototypeTrousers a2bda8f449 tile fluid textures on fluid interfaces properly 2022-02-17 20:15:29 -03:00
PrototypeTrousers a2c2a4df0f oops, add integrated circuit to default non blocking items 2022-02-15 19:33:56 -03:00
PrototypeTrousers b4e237244a fix interfaces with crafting cards attached to storage bus not working
add missing buttons to oredict storagebus
2022-02-14 17:15:51 -03:00
PrototypeTrousers b541ad8d18 misc cleaning
add lenses to non blocking list
2022-02-10 20:15:58 -03:00
50 changed files with 2231 additions and 2018 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ aebuild=7
aegroup=appeng aegroup=appeng
aebasename=appliedenergistics2 aebasename=appliedenergistics2
extended=extended_life extended=extended_life
extendedversion=v49ac extendedversion=v50g
######################################################### #########################################################
# Versions # # Versions #
######################################################### #########################################################
@@ -29,7 +29,7 @@ public enum PowerUnits
AE( "gui.appliedenergistics2.units.appliedenergstics" ), // Native Units - AE Energy AE( "gui.appliedenergistics2.units.appliedenergstics" ), // Native Units - AE Energy
EU( "gui.appliedenergistics2.units.ic2" ), // IndustrialCraft 2 - Energy Units EU( "gui.appliedenergistics2.units.ic2" ), // IndustrialCraft 2 - Energy Units
RF( "gui.appliedenergistics2.units.rf" ), // RF - Redstone Flux RF( "gui.appliedenergistics2.units.rf" ), // RF - Redstone Flux
GTCEU( "gui.appliedenergistics2.units.gtceu" ); // RF - Redstone Flux GTEU( "gui.appliedenergistics2.units.gteu" ); // RF - Redstone Flux
/** /**
* unlocalized name for the power unit. * unlocalized name for the power unit.
@@ -47,14 +47,13 @@ public enum PowerUnits
/** /**
* do power conversion using AE's conversion rates. * do power conversion using AE's conversion rates.
* * <p>
* Example: PowerUnits.EU.convertTo( PowerUnits.AE, 32 ); * Example: PowerUnits.EU.convertTo( PowerUnits.AE, 32 );
* * <p>
* will normally returns 64, as it will convert the EU, to AE with AE's power settings. * will normally returns 64, as it will convert the EU, to AE with AE's power settings.
* *
* @param target target power unit * @param target target power unit
* @param value value * @param value value
*
* @return value converted to target units, from this units. * @return value converted to target units, from this units.
*/ */
public double convertTo( final PowerUnits target, final double value ) public double convertTo( final PowerUnits target, final double value )
@@ -29,7 +29,7 @@ public enum TunnelType
ME, // Network Tunnel ME, // Network Tunnel
IC2_POWER, // EU Tunnel IC2_POWER, // EU Tunnel
FE_POWER, // Forge Energy tunnel FE_POWER, // Forge Energy tunnel
GTCEU_POWER, // Forge Energy tunnel GTEU_POWER, // Forge Energy tunnel
REDSTONE, // Redstone Tunnel REDSTONE, // Redstone Tunnel
FLUID, // Fluid Tunnel FLUID, // Fluid Tunnel
ITEM, // Item Tunnel ITEM, // Item Tunnel
@@ -88,7 +88,7 @@ public interface IParts
IItemDefinition p2PTunnelFE(); IItemDefinition p2PTunnelFE();
IItemDefinition p2PTunnelGTCEU(); IItemDefinition p2PTunnelGTEU();
IItemDefinition p2PTunnelLight(); IItemDefinition p2PTunnelLight();
@@ -108,4 +108,14 @@ public class BlockMolecularAssembler extends AEBaseTileBlock
return super.onBlockActivated( w, pos, state, p, hand, side, hitX, hitY, hitZ ); return super.onBlockActivated( w, pos, state, p, hand, side, hitX, hitY, hitZ );
} }
@Override
public void onNeighborChange( IBlockAccess world, BlockPos pos, BlockPos neighbor )
{
final TileMolecularAssembler tg = this.getTileEntity( world, pos );
if( tg != null )
{
tg.updateNeighbors( world, pos, neighbor );
}
}
} }
@@ -1,38 +1,46 @@
package appeng.client.gui.implementations; package appeng.client.gui.implementations;
import appeng.api.config.AccessRestriction;
import appeng.api.config.ActionItems; import appeng.api.config.ActionItems;
import appeng.api.config.Settings; import appeng.api.config.Settings;
import appeng.api.config.StorageFilter;
import appeng.client.gui.AEBaseGui; import appeng.client.gui.AEBaseGui;
import appeng.client.gui.widgets.GuiImgButton; import appeng.client.gui.widgets.GuiImgButton;
import appeng.client.gui.widgets.GuiTabButton; import appeng.client.gui.widgets.GuiTabButton;
import appeng.client.gui.widgets.MEGuiTextField; import appeng.client.gui.widgets.MEGuiTextField;
import appeng.container.implementations.ContainerPartOreDictStorageBus; import appeng.container.implementations.ContainerOreDictStorageBus;
import appeng.core.AELog;
import appeng.core.localization.GuiText; import appeng.core.localization.GuiText;
import appeng.core.sync.GuiBridge; import appeng.core.sync.GuiBridge;
import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketConfigButton;
import appeng.core.sync.packets.PacketSwitchGuis; import appeng.core.sync.packets.PacketSwitchGuis;
import appeng.core.sync.packets.PacketValueConfig; import appeng.core.sync.packets.PacketValueConfig;
import appeng.parts.misc.PartOreDicStorageBus; import appeng.parts.misc.PartOreDicStorageBus;
import appeng.util.item.OreDictFilterMatcher; import appeng.util.item.OreDictFilterMatcher;
import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiButton;
import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.entity.player.InventoryPlayer;
import org.lwjgl.input.Mouse;
import java.io.IOException; import java.io.IOException;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class GuiPartOreDictStorageBus extends AEBaseGui public class GuiOreDictStorageBus extends AEBaseGui
{ {
private final ContainerOreDictStorageBus container;
PartOreDicStorageBus part; PartOreDicStorageBus part;
private GuiTabButton priority; private GuiTabButton priority;
private GuiImgButton partition; private GuiImgButton partition;
private GuiImgButton storageFilter;
private GuiImgButton rwMode;
private static final Pattern ORE_DICTIONARY_FILTER = Pattern.compile( "[(!]* *[0-9a-zA-Z*]* *\\)*( *[&|^]? *[(!]* *[0-9a-zA-Z*]* *\\)*)*" ); private static final Pattern ORE_DICTIONARY_FILTER = Pattern.compile( "[(!]* *[0-9a-zA-Z*]* *\\)*( *[&|^]? *[(!]* *[0-9a-zA-Z*]* *\\)*)*" );
private MEGuiTextField searchFieldInputs; private MEGuiTextField searchFieldInputs;
public GuiPartOreDictStorageBus( final InventoryPlayer inventoryPlayer, final PartOreDicStorageBus te ) public GuiOreDictStorageBus( final InventoryPlayer inventoryPlayer, final PartOreDicStorageBus te )
{ {
super( new ContainerPartOreDictStorageBus( inventoryPlayer, te ) ); super( new ContainerOreDictStorageBus( inventoryPlayer, te ) );
this.container = (ContainerOreDictStorageBus) super.inventorySlots;
part = te; part = te;
this.ySize = 84; this.ySize = 84;
} }
@@ -52,6 +60,8 @@ public class GuiPartOreDictStorageBus extends AEBaseGui
this.buttonList.add( this.priority = new GuiTabButton( this.guiLeft + 154, this.guiTop, 2 + 4 * 16, GuiText.Priority.getLocal(), this.itemRender ) ); this.buttonList.add( this.priority = new GuiTabButton( this.guiLeft + 154, this.guiTop, 2 + 4 * 16, GuiText.Priority.getLocal(), this.itemRender ) );
this.buttonList.add( this.partition = new GuiImgButton( this.guiLeft - 18, this.guiTop + 28, Settings.ACTIONS, ActionItems.WRENCH ) ); this.buttonList.add( this.partition = new GuiImgButton( this.guiLeft - 18, this.guiTop + 28, Settings.ACTIONS, ActionItems.WRENCH ) );
this.buttonList.add( this.rwMode = new GuiImgButton( this.guiLeft - 18, this.guiTop + 48, Settings.ACCESS, AccessRestriction.READ_WRITE ) );
this.buttonList.add( this.storageFilter = new GuiImgButton( this.guiLeft - 18, this.guiTop + 68, Settings.STORAGE_FILTER, StorageFilter.EXTRACTABLE_ONLY ) );
try try
{ {
@@ -73,21 +83,31 @@ public class GuiPartOreDictStorageBus extends AEBaseGui
protected void actionPerformed( final GuiButton btn ) throws IOException protected void actionPerformed( final GuiButton btn ) throws IOException
{ {
super.actionPerformed( btn ); super.actionPerformed( btn );
final boolean backwards = Mouse.isButtonDown( 1 );
try
{
if( btn == this.priority ) if( btn == this.priority )
{ {
NetworkHandler.instance().sendToServer( new PacketSwitchGuis( GuiBridge.GUI_PRIORITY ) ); NetworkHandler.instance().sendToServer( new PacketSwitchGuis( GuiBridge.GUI_PRIORITY ) );
} }
if( btn == this.partition ) else if( btn == this.partition )
{ {
NetworkHandler.instance().sendToServer( new PacketValueConfig( "StorageBus.Action", "Partition" ) ); NetworkHandler.instance().sendToServer( new PacketValueConfig( "StorageBus.Action", "Partition" ) );
try
{
NetworkHandler.instance().sendToServer( new PacketValueConfig( "OreDictStorageBus.getRegex", "1" ) );
} }
catch( IOException e ) else if( btn == this.rwMode )
{ {
e.printStackTrace(); NetworkHandler.instance().sendToServer( new PacketConfigButton( this.rwMode.getSetting(), backwards ) );
} }
else if( btn == this.storageFilter )
{
NetworkHandler.instance().sendToServer( new PacketConfigButton( this.storageFilter.getSetting(), backwards ) );
}
}
catch( final IOException e )
{
AELog.debug( e );
} }
} }
@@ -132,6 +152,16 @@ public class GuiPartOreDictStorageBus extends AEBaseGui
this.fontRenderer.drawString( "^ = XOR " + "! = NOT", 8, 48, 4210752 ); this.fontRenderer.drawString( "^ = XOR " + "! = NOT", 8, 48, 4210752 );
this.fontRenderer.drawString( "() for priority " + "* for wildcard", 8, 60, 4210752 ); this.fontRenderer.drawString( "() for priority " + "* for wildcard", 8, 60, 4210752 );
this.fontRenderer.drawString( "Ex.: *Redstone*&!dustRedstone", 8, 72, 4210752 ); this.fontRenderer.drawString( "Ex.: *Redstone*&!dustRedstone", 8, 72, 4210752 );
if( this.storageFilter != null )
{
this.storageFilter.set( container.getStorageFilter() );
}
if( this.rwMode != null )
{
this.rwMode.set( container.getReadWriteMode() );
}
} }
@Override @Override
@@ -87,7 +87,7 @@ public class GuiImgButton extends GuiButton implements ITooltip
this.registerApp( 16 * 10, Settings.POWER_UNITS, PowerUnits.AE, ButtonToolTips.PowerUnits, PowerUnits.AE.unlocalizedName ); this.registerApp( 16 * 10, Settings.POWER_UNITS, PowerUnits.AE, ButtonToolTips.PowerUnits, PowerUnits.AE.unlocalizedName );
this.registerApp( 16 * 10 + 1, Settings.POWER_UNITS, PowerUnits.EU, ButtonToolTips.PowerUnits, PowerUnits.EU.unlocalizedName ); this.registerApp( 16 * 10 + 1, Settings.POWER_UNITS, PowerUnits.EU, ButtonToolTips.PowerUnits, PowerUnits.EU.unlocalizedName );
this.registerApp( 16 * 10 + 4, Settings.POWER_UNITS, PowerUnits.RF, ButtonToolTips.PowerUnits, PowerUnits.RF.unlocalizedName ); this.registerApp( 16 * 10 + 4, Settings.POWER_UNITS, PowerUnits.RF, ButtonToolTips.PowerUnits, PowerUnits.RF.unlocalizedName );
this.registerApp( 16 * 10 + 1, Settings.POWER_UNITS, PowerUnits.GTCEU, ButtonToolTips.PowerUnits, PowerUnits.EU.unlocalizedName ); this.registerApp( 16 * 10 + 1, Settings.POWER_UNITS, PowerUnits.GTEU, ButtonToolTips.PowerUnits, PowerUnits.EU.unlocalizedName );
this.registerApp( 3, Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE, ButtonToolTips.RedstoneMode, ButtonToolTips.AlwaysActive ); this.registerApp( 3, Settings.REDSTONE_CONTROLLED, RedstoneMode.IGNORE, ButtonToolTips.RedstoneMode, ButtonToolTips.AlwaysActive );
this.registerApp( 0, Settings.REDSTONE_CONTROLLED, RedstoneMode.LOW_SIGNAL, ButtonToolTips.RedstoneMode, ButtonToolTips.ActiveWithoutSignal ); this.registerApp( 0, Settings.REDSTONE_CONTROLLED, RedstoneMode.LOW_SIGNAL, ButtonToolTips.RedstoneMode, ButtonToolTips.ActiveWithoutSignal );
@@ -109,15 +109,11 @@ public class GuiImgButton extends GuiButton implements ITooltip
this.registerApp( 16 * 2 + 3, Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_Auto ); this.registerApp( 16 * 2 + 3, Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_Auto );
this.registerApp( 16 * 2 + 4, Settings.SEARCH_MODE, SearchBoxMode.MANUAL_SEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_Standard ); this.registerApp( 16 * 2 + 4, Settings.SEARCH_MODE, SearchBoxMode.MANUAL_SEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_Standard );
this.registerApp( 16 * 2 + 5, Settings.SEARCH_MODE, SearchBoxMode.JEI_AUTOSEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIAuto ); this.registerApp( 16 * 2 + 5, Settings.SEARCH_MODE, SearchBoxMode.JEI_AUTOSEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIAuto );
this.registerApp( 16 * 2 + 6, Settings.SEARCH_MODE, SearchBoxMode.JEI_MANUAL_SEARCH, ButtonToolTips.SearchMode, this.registerApp( 16 * 2 + 6, Settings.SEARCH_MODE, SearchBoxMode.JEI_MANUAL_SEARCH, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIStandard );
ButtonToolTips.SearchMode_JEIStandard );
this.registerApp( 16 * 2 + 7, Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_AutoKeep ); this.registerApp( 16 * 2 + 7, Settings.SEARCH_MODE, SearchBoxMode.AUTOSEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_AutoKeep );
this.registerApp( 16 * 2 + 8, Settings.SEARCH_MODE, SearchBoxMode.MANUAL_SEARCH_KEEP, ButtonToolTips.SearchMode, this.registerApp( 16 * 2 + 8, Settings.SEARCH_MODE, SearchBoxMode.MANUAL_SEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_StandardKeep );
ButtonToolTips.SearchMode_StandardKeep ); this.registerApp( 16 * 2 + 9, Settings.SEARCH_MODE, SearchBoxMode.JEI_AUTOSEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIAutoKeep );
this.registerApp( 16 * 2 + 9, Settings.SEARCH_MODE, SearchBoxMode.JEI_AUTOSEARCH_KEEP, ButtonToolTips.SearchMode, this.registerApp( 16 * 2 + 10, Settings.SEARCH_MODE, SearchBoxMode.JEI_MANUAL_SEARCH_KEEP, ButtonToolTips.SearchMode, ButtonToolTips.SearchMode_JEIStandardKeep );
ButtonToolTips.SearchMode_JEIAutoKeep );
this.registerApp( 16 * 2 + 10, Settings.SEARCH_MODE, SearchBoxMode.JEI_MANUAL_SEARCH_KEEP, ButtonToolTips.SearchMode,
ButtonToolTips.SearchMode_JEIStandardKeep );
this.registerApp( 16 * 5 + 3, Settings.LEVEL_TYPE, LevelType.ENERGY_LEVEL, ButtonToolTips.LevelType, ButtonToolTips.LevelType_Energy ); this.registerApp( 16 * 5 + 3, Settings.LEVEL_TYPE, LevelType.ENERGY_LEVEL, ButtonToolTips.LevelType, ButtonToolTips.LevelType_Energy );
this.registerApp( 16 * 4 + 3, Settings.LEVEL_TYPE, LevelType.ITEM_LEVEL, ButtonToolTips.LevelType, ButtonToolTips.LevelType_Item ); this.registerApp( 16 * 4 + 3, Settings.LEVEL_TYPE, LevelType.ITEM_LEVEL, ButtonToolTips.LevelType, ButtonToolTips.LevelType_Item );
@@ -175,19 +171,15 @@ public class GuiImgButton extends GuiButton implements ITooltip
this.registerApp( 16 * 11 + 2, Settings.CRAFT_VIA_REDSTONE, YesNo.YES, ButtonToolTips.EmitterMode, ButtonToolTips.CraftViaRedstone ); this.registerApp( 16 * 11 + 2, Settings.CRAFT_VIA_REDSTONE, YesNo.YES, ButtonToolTips.EmitterMode, ButtonToolTips.CraftViaRedstone );
this.registerApp( 16 * 11 + 1, Settings.CRAFT_VIA_REDSTONE, YesNo.NO, ButtonToolTips.EmitterMode, ButtonToolTips.EmitWhenCrafting ); this.registerApp( 16 * 11 + 1, Settings.CRAFT_VIA_REDSTONE, YesNo.NO, ButtonToolTips.EmitterMode, ButtonToolTips.EmitWhenCrafting );
this.registerApp( 16 * 3 + 5, Settings.STORAGE_FILTER, StorageFilter.EXTRACTABLE_ONLY, ButtonToolTips.ReportInaccessibleItems, this.registerApp( 16 * 3 + 5, Settings.STORAGE_FILTER, StorageFilter.EXTRACTABLE_ONLY, ButtonToolTips.ReportInaccessibleItems, ButtonToolTips.ReportInaccessibleItemsNo );
ButtonToolTips.ReportInaccessibleItemsNo ); this.registerApp( 16 * 3 + 6, Settings.STORAGE_FILTER, StorageFilter.NONE, ButtonToolTips.ReportInaccessibleItems, ButtonToolTips.ReportInaccessibleItemsYes );
this.registerApp( 16 * 3 + 6, Settings.STORAGE_FILTER, StorageFilter.NONE, ButtonToolTips.ReportInaccessibleItems,
ButtonToolTips.ReportInaccessibleItemsYes );
this.registerApp( 16 * 14, Settings.PLACE_BLOCK, YesNo.YES, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementYes ); this.registerApp( 16 * 14, Settings.PLACE_BLOCK, YesNo.YES, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementYes );
this.registerApp( 16 * 14 + 1, Settings.PLACE_BLOCK, YesNo.NO, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementNo ); this.registerApp( 16 * 14 + 1, Settings.PLACE_BLOCK, YesNo.NO, ButtonToolTips.BlockPlacement, ButtonToolTips.BlockPlacementNo );
this.registerApp( 16 * 15, Settings.SCHEDULING_MODE, SchedulingMode.DEFAULT, ButtonToolTips.SchedulingMode, ButtonToolTips.SchedulingModeDefault ); this.registerApp( 16 * 15, Settings.SCHEDULING_MODE, SchedulingMode.DEFAULT, ButtonToolTips.SchedulingMode, ButtonToolTips.SchedulingModeDefault );
this.registerApp( 16 * 15 + 1, Settings.SCHEDULING_MODE, SchedulingMode.ROUNDROBIN, ButtonToolTips.SchedulingMode, this.registerApp( 16 * 15 + 1, Settings.SCHEDULING_MODE, SchedulingMode.ROUNDROBIN, ButtonToolTips.SchedulingMode, ButtonToolTips.SchedulingModeRoundRobin );
ButtonToolTips.SchedulingModeRoundRobin ); this.registerApp( 16 * 15 + 2, Settings.SCHEDULING_MODE, SchedulingMode.RANDOM, ButtonToolTips.SchedulingMode, ButtonToolTips.SchedulingModeRandom );
this.registerApp( 16 * 15 + 2, Settings.SCHEDULING_MODE, SchedulingMode.RANDOM, ButtonToolTips.SchedulingMode,
ButtonToolTips.SchedulingModeRandom );
} }
} }
@@ -150,6 +150,7 @@ public class ContainerCraftConfirm extends AEBaseContainer
if( ccr.getCpu() == c ) if( ccr.getCpu() == c )
{ {
found = true; found = true;
break;
} }
} }
@@ -1,10 +1,12 @@
package appeng.container.implementations; package appeng.container.implementations;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.api.config.*;
import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEInventory;
import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEItemStack;
import appeng.container.AEBaseContainer; import appeng.container.AEBaseContainer;
import appeng.container.guisync.GuiSync;
import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.network.NetworkHandler;
import appeng.core.sync.packets.PacketValueConfig; import appeng.core.sync.packets.PacketValueConfig;
import appeng.parts.misc.PartOreDicStorageBus; import appeng.parts.misc.PartOreDicStorageBus;
@@ -21,11 +23,17 @@ import java.util.Iterator;
import java.util.Set; import java.util.Set;
public class ContainerPartOreDictStorageBus extends AEBaseContainer public class ContainerOreDictStorageBus extends AEBaseContainer
{ {
private final PartOreDicStorageBus part; private final PartOreDicStorageBus part;
public ContainerPartOreDictStorageBus( final InventoryPlayer ip, final PartOreDicStorageBus anchor ) @GuiSync( 3 )
public AccessRestriction rwMode = AccessRestriction.READ_WRITE;
@GuiSync( 4 )
public StorageFilter storageFilter = StorageFilter.EXTRACTABLE_ONLY;
public ContainerOreDictStorageBus( final InventoryPlayer ip, final PartOreDicStorageBus anchor )
{ {
super( ip, anchor ); super( ip, anchor );
this.part = anchor; this.part = anchor;
@@ -36,9 +44,12 @@ public class ContainerPartOreDictStorageBus extends AEBaseContainer
@Override @Override
public void detectAndSendChanges() public void detectAndSendChanges()
{ {
if( Platform.isClient() ) this.verifyPermissions( SecurityPermissions.BUILD, false );
if( Platform.isServer() )
{ {
return; this.setReadWriteMode( (AccessRestriction) part.getConfigManager().getSetting( Settings.ACCESS ) );
this.setStorageFilter( (StorageFilter) part.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
} }
super.detectAndSendChanges(); super.detectAndSendChanges();
@@ -106,4 +117,24 @@ public class ContainerPartOreDictStorageBus extends AEBaseContainer
e.printStackTrace(); e.printStackTrace();
} }
} }
public AccessRestriction getReadWriteMode()
{
return this.rwMode;
}
private void setReadWriteMode( final AccessRestriction rwMode )
{
this.rwMode = rwMode;
}
public StorageFilter getStorageFilter()
{
return this.storageFilter;
}
private void setStorageFilter( final StorageFilter storageFilter )
{
this.storageFilter = storageFilter;
}
} }
+31 -14
View File
@@ -74,18 +74,20 @@ public final class AEConfig extends Configuration implements IConfigurableObject
}; };
private String[] nonBlockingItems = { private String[] nonBlockingItems = {
"[gregtech]", "gregtech:shape.mold.plate", "[gregtech|actuallyadditions]", "gregtech:circuit.integrated",
"gregtech:shape.mold.gear", "gregtech:shape.mold.credit", "gregtech:shape.mold.plate", "gregtech:shape.mold.gear",
"gregtech:shape.mold.bottle", "gregtech:shape.mold.ingot", "gregtech:shape.mold.credit", "gregtech:shape.mold.bottle",
"gregtech:shape.mold.ball", "gregtech:shape.mold.block", "gregtech:shape.mold.ingot", "gregtech:shape.mold.ball",
"gregtech:shape.mold.nugget", "gregtech:shape.mold.cylinder", "gregtech:shape.mold.block", "gregtech:shape.mold.nugget",
"gregtech:shape.mold.anvil", "gregtech:shape.mold.name", "gregtech:shape.mold.cylinder", "gregtech:shape.mold.anvil",
"gregtech:shape.mold.gear.small", "gregtech:shape.mold.rotor", "gregtech:shape.mold.name", "gregtech:shape.mold.gear.small",
"gregtech:shape.extruder.plate", "gregtech:shape.extruder.rod", "gregtech:shape.mold.rotor", "gregtech:shape.extruder.plate",
"gregtech:shape.extruder.bolt", "gregtech:shape.extruder.ring", "gregtech:shape.extruder.rod", "gregtech:shape.extruder.bolt",
"gregtech:shape.extruder.cell", "gregtech:shape.extruder.ingot", "gregtech:shape.extruder.ring", "gregtech:shape.extruder.cell",
"gregtech:shape.extruder.wire", "gregtech:shape.extruder.pipe.tiny", "gregtech:shape.extruder.ingot", "gregtech:shape.extruder.wire",
"gregtech:shape.extruder.pipe.tiny",
"gregtech:shape.extruder.pipe.small", "gregtech:shape.extruder.pipe.small",
"gregtech:shape.extruder.pipe.medium",
"gregtech:shape.extruder.pipe.normal", "gregtech:shape.extruder.pipe.normal",
"gregtech:shape.extruder.pipe.large", "gregtech:shape.extruder.pipe.large",
"gregtech:shape.extruder.pipe.huge", "gregtech:shape.extruder.pipe.huge",
@@ -97,13 +99,28 @@ public final class AEConfig extends Configuration implements IConfigurableObject
"gregtech:shape.extruder.bottle", "gregtech:shape.extruder.foil", "gregtech:shape.extruder.bottle", "gregtech:shape.extruder.foil",
"gregtech:shape.extruder.gear_small", "gregtech:shape.extruder.gear_small",
"gregtech:shape.extruder.rod_long", "gregtech:shape.extruder.rotor", "gregtech:shape.extruder.rod_long", "gregtech:shape.extruder.rotor",
"gregtech:glass_lens.white", "gregtech:glass_lens.orange",
"gregtech:glass_lens.magenta", "gregtech:glass_lens.light_blue",
"gregtech:glass_lens.yellow", "gregtech:glass_lens.lime",
"gregtech:glass_lens.pink", "gregtech:glass_lens.gray",
"gregtech:glass_lens.light_gray", "gregtech:glass_lens.cyan",
"gregtech:glass_lens.purple", "gregtech:glass_lens.blue",
"gregtech:glass_lens.brown", "gregtech:glass_lens.green",
"gregtech:glass_lens.red", "gregtech:glass_lens.black",
"contenttweaker:smallgearextrudershape", "contenttweaker:smallgearextrudershape",
"contenttweaker:creativeportabletankmold" "contenttweaker:creativeportabletankmold", "ore:lensAlmandine",
"ore:lensBlueTopaz", "ore:lensDiamond", "ore:lensEmerald",
"ore:lensGreenSapphire", "ore:lensRutile", "ore:lensRuby",
"ore:lensSapphire", "ore:lensTopaz", "ore:lensJasper",
"ore:lensGlass", "ore:lensOlivine", "ore:lensOpal",
"ore:lensAmethyst", "ore:lensLapis", "ore:lensEnderPearl",
"ore:lensEnderEye", "ore:lensGarnetRed", "ore:lensGarnetYellow",
"ore:lensVinteum", "ore:lensNetherStar",
}; };
// Default Energy Conversion Rates // Default Energy Conversion Rates
private static final double DEFAULT_IC2_EXCHANGE = 2.0; private static final double DEFAULT_IC2_EXCHANGE = 2.0;
private static final double DEFAULT_GTCEU_EXCHANGE = 2.0; private static final double DEFAULT_GTEU_EXCHANGE = 2.0;
private static final double DEFAULT_RF_EXCHANGE = 0.5; private static final double DEFAULT_RF_EXCHANGE = 0.5;
private final IConfigManager settings = new ConfigManager( this ); private final IConfigManager settings = new ConfigManager( this );
@@ -181,7 +198,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject
PowerUnits.EU.conversionRatio = this.get( "PowerRatios", "IC2", DEFAULT_IC2_EXCHANGE ).getDouble( DEFAULT_IC2_EXCHANGE ); PowerUnits.EU.conversionRatio = this.get( "PowerRatios", "IC2", DEFAULT_IC2_EXCHANGE ).getDouble( DEFAULT_IC2_EXCHANGE );
PowerUnits.RF.conversionRatio = this.get( "PowerRatios", "ForgeEnergy", DEFAULT_RF_EXCHANGE ).getDouble( DEFAULT_RF_EXCHANGE ); PowerUnits.RF.conversionRatio = this.get( "PowerRatios", "ForgeEnergy", DEFAULT_RF_EXCHANGE ).getDouble( DEFAULT_RF_EXCHANGE );
PowerUnits.GTCEU.conversionRatio = this.get( "PowerRatios", "GTCEU", DEFAULT_GTCEU_EXCHANGE ).getDouble( DEFAULT_GTCEU_EXCHANGE ); PowerUnits.GTEU.conversionRatio = this.get( "PowerRatios", "GTEU", DEFAULT_GTEU_EXCHANGE ).getDouble( DEFAULT_GTEU_EXCHANGE );
final double usageEffective = this.get( "PowerRatios", "UsageMultiplier", 1.0 ).getDouble( 1.0 ); final double usageEffective = this.get( "PowerRatios", "UsageMultiplier", 1.0 ).getDouble( 1.0 );
PowerMultiplier.CONFIG.multiplier = Math.max( 0.01, usageEffective ); PowerMultiplier.CONFIG.multiplier = Math.max( 0.01, usageEffective );
@@ -70,7 +70,7 @@ public final class ApiParts implements IParts
private final IItemDefinition p2PTunnelFluids; private final IItemDefinition p2PTunnelFluids;
private final IItemDefinition p2PTunnelEU; private final IItemDefinition p2PTunnelEU;
private final IItemDefinition p2PTunnelFE; private final IItemDefinition p2PTunnelFE;
private final IItemDefinition p2PTunnelGTCEU; private final IItemDefinition p2PTunnelGTEU;
private final IItemDefinition p2PTunnelLight; private final IItemDefinition p2PTunnelLight;
// private final IItemDefinition p2PTunnelOpenComputers; // private final IItemDefinition p2PTunnelOpenComputers;
private final IItemDefinition cableAnchor; private final IItemDefinition cableAnchor;
@@ -92,9 +92,7 @@ public final class ApiParts implements IParts
public ApiParts( FeatureFactory registry, PartModels partModels ) public ApiParts( FeatureFactory registry, PartModels partModels )
{ {
final ItemPart itemPart = new ItemPart(); final ItemPart itemPart = new ItemPart();
registry.item( "part", () -> itemPart ) registry.item( "part", () -> itemPart ).rendering( new ItemPartRendering( partModels, itemPart ) ).build();
.rendering( new ItemPartRendering( partModels, itemPart ) )
.build();
// Register all part models // Register all part models
for( PartType partType : PartType.values() ) for( PartType partType : PartType.values() )
@@ -123,8 +121,7 @@ public final class ApiParts implements IParts
this.levelEmitter = new DamagedItemDefinition( "part.level_emitter", itemPart.createPart( PartType.LEVEL_EMITTER ) ); this.levelEmitter = new DamagedItemDefinition( "part.level_emitter", itemPart.createPart( PartType.LEVEL_EMITTER ) );
this.fluidLevelEmitter = new DamagedItemDefinition( "part.fluid_level_emitter", itemPart.createPart( PartType.FLUID_LEVEL_EMITTER ) ); this.fluidLevelEmitter = new DamagedItemDefinition( "part.fluid_level_emitter", itemPart.createPart( PartType.FLUID_LEVEL_EMITTER ) );
this.annihilationPlane = new DamagedItemDefinition( "part.plane.annihilation", itemPart.createPart( PartType.ANNIHILATION_PLANE ) ); this.annihilationPlane = new DamagedItemDefinition( "part.plane.annihilation", itemPart.createPart( PartType.ANNIHILATION_PLANE ) );
this.identityAnnihilationPlane = new DamagedItemDefinition( "part.plane.annihiliation.identity", itemPart this.identityAnnihilationPlane = new DamagedItemDefinition( "part.plane.annihiliation.identity", itemPart.createPart( PartType.IDENTITY_ANNIHILATION_PLANE ) );
.createPart( PartType.IDENTITY_ANNIHILATION_PLANE ) );
this.fluidAnnihilationPlane = new DamagedItemDefinition( "part.plane.fluid_annihilation", itemPart.createPart( PartType.FLUID_ANNIHILATION_PLANE ) ); this.fluidAnnihilationPlane = new DamagedItemDefinition( "part.plane.fluid_annihilation", itemPart.createPart( PartType.FLUID_ANNIHILATION_PLANE ) );
this.formationPlane = new DamagedItemDefinition( "part.plane.formation", itemPart.createPart( PartType.FORMATION_PLANE ) ); this.formationPlane = new DamagedItemDefinition( "part.plane.formation", itemPart.createPart( PartType.FORMATION_PLANE ) );
this.fluidFormationPlane = new DamagedItemDefinition( "part.plane.fluid_formation", itemPart.createPart( PartType.FLUID_FORMATION_PLANE ) ); this.fluidFormationPlane = new DamagedItemDefinition( "part.plane.fluid_formation", itemPart.createPart( PartType.FLUID_FORMATION_PLANE ) );
@@ -134,7 +131,7 @@ public final class ApiParts implements IParts
this.p2PTunnelFluids = new DamagedItemDefinition( "part.tunnel.fluid", itemPart.createPart( PartType.P2P_TUNNEL_FLUIDS ) ); this.p2PTunnelFluids = new DamagedItemDefinition( "part.tunnel.fluid", itemPart.createPart( PartType.P2P_TUNNEL_FLUIDS ) );
this.p2PTunnelEU = new DamagedItemDefinition( "part.tunnel.eu", itemPart.createPart( PartType.P2P_TUNNEL_IC2 ) ); this.p2PTunnelEU = new DamagedItemDefinition( "part.tunnel.eu", itemPart.createPart( PartType.P2P_TUNNEL_IC2 ) );
this.p2PTunnelFE = new DamagedItemDefinition( "part.tunnel.fe", itemPart.createPart( PartType.P2P_TUNNEL_FE ) ); this.p2PTunnelFE = new DamagedItemDefinition( "part.tunnel.fe", itemPart.createPart( PartType.P2P_TUNNEL_FE ) );
this.p2PTunnelGTCEU = new DamagedItemDefinition( "part.tunnel.gtceu", itemPart.createPart( PartType.P2P_TUNNEL_GTCEU ) ); this.p2PTunnelGTEU = new DamagedItemDefinition( "part.tunnel.gteu", itemPart.createPart( PartType.P2P_TUNNEL_GTEU ) );
this.p2PTunnelLight = new DamagedItemDefinition( "part.tunnel.light", itemPart.createPart( PartType.P2P_TUNNEL_LIGHT ) ); this.p2PTunnelLight = new DamagedItemDefinition( "part.tunnel.light", itemPart.createPart( PartType.P2P_TUNNEL_LIGHT ) );
// this.p2PTunnelOpenComputers = new DamagedItemDefinition( itemMultiPart.createPart( // this.p2PTunnelOpenComputers = new DamagedItemDefinition( itemMultiPart.createPart(
// PartType.P2PTunnelOpenComputers ) ); // PartType.P2PTunnelOpenComputers ) );
@@ -341,9 +338,9 @@ public final class ApiParts implements IParts
return this.p2PTunnelFE; return this.p2PTunnelFE;
} }
public IItemDefinition p2PTunnelGTCEU() public IItemDefinition p2PTunnelGTEU()
{ {
return this.p2PTunnelGTCEU; return this.p2PTunnelGTEU;
} }
@Override @Override
@@ -126,7 +126,7 @@ public enum AEFeature
P2P_TUNNEL_REDSTONE( "P2PTunnelRedstone", Constants.CATEGORY_P2P_TUNNELS ), P2P_TUNNEL_REDSTONE( "P2PTunnelRedstone", Constants.CATEGORY_P2P_TUNNELS ),
P2P_TUNNEL_EU( "P2PTunnelEU", Constants.CATEGORY_P2P_TUNNELS ), P2P_TUNNEL_EU( "P2PTunnelEU", Constants.CATEGORY_P2P_TUNNELS ),
P2P_TUNNEL_FE( "P2PTunnelFE", Constants.CATEGORY_P2P_TUNNELS ), P2P_TUNNEL_FE( "P2PTunnelFE", Constants.CATEGORY_P2P_TUNNELS ),
P2P_TUNNEL_GTCEU( "P2PTunnelGTCEU", Constants.CATEGORY_P2P_TUNNELS ), P2P_TUNNEL_GTEU( "P2PTunnelGTEU", Constants.CATEGORY_P2P_TUNNELS ),
P2P_TUNNEL_FLUIDS( "P2PTunnelFluids", Constants.CATEGORY_P2P_TUNNELS ), P2P_TUNNEL_FLUIDS( "P2PTunnelFluids", Constants.CATEGORY_P2P_TUNNELS ),
P2P_TUNNEL_LIGHT( "P2PTunnelLight", Constants.CATEGORY_P2P_TUNNELS ), P2P_TUNNEL_LIGHT( "P2PTunnelLight", Constants.CATEGORY_P2P_TUNNELS ),
P2P_TUNNEL_OPEN_COMPUTERS( "P2PTunnelOpenComputers", Constants.CATEGORY_P2P_TUNNELS ), P2P_TUNNEL_OPEN_COMPUTERS( "P2PTunnelOpenComputers", Constants.CATEGORY_P2P_TUNNELS ),
@@ -55,7 +55,8 @@ public final class P2PTunnelRegistry implements IP2PTunnelRegistry
private final Map<String, TunnelType> modIdTunnels = new HashMap<>( INITIAL_CAPACITY ); private final Map<String, TunnelType> modIdTunnels = new HashMap<>( INITIAL_CAPACITY );
private final Map<Capability<?>, TunnelType> capTunnels = new HashMap<>( INITIAL_CAPACITY ); private final Map<Capability<?>, TunnelType> capTunnels = new HashMap<>( INITIAL_CAPACITY );
public void configure() { public void configure()
{
final IDefinitions definitions = AEApi.instance().definitions(); final IDefinitions definitions = AEApi.instance().definitions();
final IBlocks blocks = definitions.blocks(); final IBlocks blocks = definitions.blocks();
@@ -79,9 +80,10 @@ public final class P2PTunnelRegistry implements IP2PTunnelRegistry
gtceOreDict.add( "cableGtDouble" ); gtceOreDict.add( "cableGtDouble" );
gtceOreDict.add( "cableGtSingle" ); gtceOreDict.add( "cableGtSingle" );
for(String oreDict : gtceOreDict) { for( String oreDict : gtceOreDict )
{
Arrays.stream( OreDictionary.getOreNames() ).filter( oreName -> oreName.startsWith( oreDict ) ).forEach( oreName -> { Arrays.stream( OreDictionary.getOreNames() ).filter( oreName -> oreName.startsWith( oreDict ) ).forEach( oreName -> {
OreHelper.INSTANCE.getCachedOres( oreName ).forEach( stack -> this.addNewAttunement( stack, TunnelType.GTCEU_POWER ) ); OreHelper.INSTANCE.getCachedOres( oreName ).forEach( stack -> this.addNewAttunement( stack, TunnelType.GTEU_POWER ) );
} ); } );
} }
@@ -99,7 +99,7 @@ public enum GuiText
OCTunnel, OCTunnel,
LightTunnel, LightTunnel,
FETunnel, FETunnel,
GTCEUTunnel, GTEUTunnel,
PressureTunnel, PressureTunnel,
// spatial // spatial
@@ -141,7 +141,7 @@ public enum GuiBridge implements IGuiHandler
GUI_STORAGEBUS( ContainerStorageBus.class, PartStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ), GUI_STORAGEBUS( ContainerStorageBus.class, PartStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
GUI_OREDICTSTORAGEBUS( ContainerPartOreDictStorageBus.class, PartOreDicStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ), GUI_OREDICTSTORAGEBUS( ContainerOreDictStorageBus.class, PartOreDicStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
GUI_STORAGEBUS_FLUID( ContainerFluidStorageBus.class, PartFluidStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ), GUI_STORAGEBUS_FLUID( ContainerFluidStorageBus.class, PartFluidStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
@@ -298,19 +298,17 @@ public class PacketJEIRecipe extends AppEngPacket
con.onCraftMatrixChanged( new WrapperInvItemHandler( craftMatrix ) ); con.onCraftMatrixChanged( new WrapperInvItemHandler( craftMatrix ) );
if( this.output != null && ( ( con instanceof ContainerPatternTerm && !( (ContainerPatternTerm) con ).isCraftingMode() ) || con instanceof ContainerExpandedProcessingPatternTerm ) ) if( this.output != null && ( ( con instanceof ContainerPatternTerm && !( (ContainerPatternTerm) con ).isCraftingMode() ) || con instanceof ContainerExpandedProcessingPatternTerm ) ) {
{
IItemHandler outputSlots = cct.getInventoryByName("output"); IItemHandler outputSlots = cct.getInventoryByName("output");
for (int i = 0; i < outputSlots.getSlots(); ++i) {
for( int i = 0; i < this.output.size(); ++i ) ItemHandlerUtil.setStackInSlot(outputSlots, i, ItemStack.EMPTY);
{ }
if( this.output.get( i ) == null ) for (int i = 0; i < this.output.size() && i < outputSlots.getSlots(); ++i) {
{ if (this.output.get(i) == null || this.output.get(i) == ItemStack.EMPTY) {
continue; continue;
} }
ItemHandlerUtil.setStackInSlot(outputSlots, i, this.output.get(i)); ItemHandlerUtil.setStackInSlot(outputSlots, i, this.output.get(i));
} }
} }
} }
} }
@@ -24,7 +24,7 @@ import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import appeng.client.gui.implementations.GuiPartOreDictStorageBus; import appeng.client.gui.implementations.GuiOreDictStorageBus;
import appeng.container.implementations.*; import appeng.container.implementations.*;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
@@ -276,9 +276,10 @@ public class PacketValueConfig extends AppEngPacket
{ {
( (ContainerFluidStorageBus) c ).partition(); ( (ContainerFluidStorageBus) c ).partition();
} }
else if( c instanceof ContainerPartOreDictStorageBus ) else if( c instanceof ContainerOreDictStorageBus )
{ {
( (ContainerPartOreDictStorageBus) c ).partition(); ( (ContainerOreDictStorageBus) c ).partition();
( (ContainerOreDictStorageBus) c ).sendRegex();
} }
} }
else if( this.Value.equals( "Clear" ) ) else if( this.Value.equals( "Clear" ) )
@@ -296,15 +297,15 @@ public class PacketValueConfig extends AppEngPacket
} }
else if( this.Name.startsWith( "OreDictStorageBus" ) ) else if( this.Name.startsWith( "OreDictStorageBus" ) )
{ {
if( c instanceof ContainerPartOreDictStorageBus ) if( c instanceof ContainerOreDictStorageBus )
{ {
if( this.Name.equals( "OreDictStorageBus.save" ) ) if( this.Name.equals( "OreDictStorageBus.save" ) )
{ {
( (ContainerPartOreDictStorageBus) c ).saveOreMatch( this.Value ); ( (ContainerOreDictStorageBus) c ).saveOreMatch( this.Value );
} }
if( this.Name.equals( "OreDictStorageBus.getRegex" ) ) if( this.Name.equals( "OreDictStorageBus.getRegex" ) )
{ {
( (ContainerPartOreDictStorageBus) c ).sendRegex(); ( (ContainerOreDictStorageBus) c ).sendRegex();
} }
} }
} }
@@ -387,9 +388,9 @@ public class PacketValueConfig extends AppEngPacket
else if( this.Name.equals( "OreDictStorageBus.sendRegex" ) ) else if( this.Name.equals( "OreDictStorageBus.sendRegex" ) )
{ {
final GuiScreen gs = Minecraft.getMinecraft().currentScreen; final GuiScreen gs = Minecraft.getMinecraft().currentScreen;
if( gs instanceof GuiPartOreDictStorageBus ) if( gs instanceof GuiOreDictStorageBus )
{ {
( (GuiPartOreDictStorageBus) gs ).fillRegex( this.Value ); ( (GuiOreDictStorageBus) gs ).fillRegex( this.Value );
} }
} }
else if( c instanceof IConfigurableObject ) else if( c instanceof IConfigurableObject )
+39 -16
View File
@@ -50,16 +50,20 @@ import appeng.hooks.TickHandler;
public class CraftingJob implements Runnable, ICraftingJob public class CraftingJob implements Runnable, ICraftingJob
{ {
private static final String LOG_CRAFTING_JOB = "CraftingJob (%s) issued by %s requesting [%s] using %s bytes took %s ms"; private static final String LOG_CRAFTING_JOB = "CraftingJob (%s) issued by %s requesting [%s] using %s bytes took %s us";
private static final String LOG_MACHINE_SOURCE_DETAILS = "Machine[object=%s, %s]"; private static final String LOG_MACHINE_SOURCE_DETAILS = "Machine[object=%s, %s]";
private final MECraftingInventory original; private final MECraftingInventory original;
private final World world; private final World world;
private final IItemList<IAEItemStack> crafting = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList(); private final IItemList<IAEItemStack> crafting = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
private final IItemList<IAEItemStack> missing = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList(); private final IItemList<IAEItemStack> missing = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
private final IItemList<IAEItemStack> usedWhileBuilding = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
private final IItemList<IAEItemStack> uniques = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
private final HashMap<String, TwoIntegers> opsAndMultiplier = new HashMap<>(); private final HashMap<String, TwoIntegers> opsAndMultiplier = new HashMap<>();
private final Object monitor = new Object(); private final Object monitor = new Object();
private final Stopwatch watch = Stopwatch.createUnstarted(); private final Stopwatch tickSpreadingWatch = Stopwatch.createUnstarted();
private final Stopwatch craftingTreeWatch = Stopwatch.createUnstarted();
private CraftingTreeNode tree; private CraftingTreeNode tree;
private final IAEItemStack output; private final IAEItemStack output;
private boolean simulate = false; private boolean simulate = false;
@@ -86,8 +90,7 @@ public class CraftingJob implements Runnable, ICraftingJob
this.callback = callback; this.callback = callback;
final ICraftingGrid cc = grid.getCache( ICraftingGrid.class ); final ICraftingGrid cc = grid.getCache( ICraftingGrid.class );
final IStorageGrid sg = grid.getCache( IStorageGrid.class ); final IStorageGrid sg = grid.getCache( IStorageGrid.class );
this.original = new MECraftingInventory( sg this.original = new MECraftingInventory( sg.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), actionSrc, false, false, false );
.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), actionSrc, false, false, false );
this.setTree( this.getCraftingTree( cc, what ) ); this.setTree( this.getCraftingTree( cc, what ) );
this.availableCheck = null; this.availableCheck = null;
@@ -103,6 +106,16 @@ public class CraftingJob implements Runnable, ICraftingJob
this.availableCheck.injectItems( o, Actionable.MODULATE, this.actionSrc ); this.availableCheck.injectItems( o, Actionable.MODULATE, this.actionSrc );
} }
public IItemList<IAEItemStack> getUsedWhileBuilding()
{
return usedWhileBuilding;
}
public IItemList<IAEItemStack> getUniques()
{
return uniques;
}
IAEItemStack checkUse( final IAEItemStack available ) IAEItemStack checkUse( final IAEItemStack available )
{ {
return this.availableCheck.extractItems( available, Actionable.MODULATE, this.actionSrc ); return this.availableCheck.extractItems( available, Actionable.MODULATE, this.actionSrc );
@@ -139,7 +152,7 @@ public class CraftingJob implements Runnable, ICraftingJob
TickHandler.INSTANCE.registerCraftingSimulation( this.world, this ); TickHandler.INSTANCE.registerCraftingSimulation( this.world, this );
this.handlePausing(); this.handlePausing();
final Stopwatch timer = Stopwatch.createStarted(); craftingTreeWatch.start();
final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true ); final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true );
craftingInventory.ignore( this.output ); craftingInventory.ignore( this.output );
@@ -154,9 +167,8 @@ public class CraftingJob implements Runnable, ICraftingJob
AELog.crafting( s + " * " + ti.times + " = " + ( ti.perOp * ti.times ) ); AELog.crafting( s + " * " + ti.times + " = " + ( ti.perOp * ti.times ) );
} }
this.logCraftingJob( "real", timer ); craftingTreeWatch.stop();
// if ( mode == Actionable.MODULATE ) this.logCraftingJob( "real, success", craftingTreeWatch );
// craftingInventory.moveItemsToStorage( storage );
} }
catch( final CraftBranchFailure e ) catch( final CraftBranchFailure e )
{ {
@@ -164,7 +176,9 @@ public class CraftingJob implements Runnable, ICraftingJob
try try
{ {
final Stopwatch timer = Stopwatch.createStarted(); if( actionSrc.player().isPresent() )
{
craftingTreeWatch.reset().start();
final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true ); final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true );
craftingInventory.ignore( this.output ); craftingInventory.ignore( this.output );
@@ -180,7 +194,14 @@ public class CraftingJob implements Runnable, ICraftingJob
AELog.crafting( s + " * " + ti.times + " = " + ( ti.perOp * ti.times ) ); AELog.crafting( s + " * " + ti.times + " = " + ( ti.perOp * ti.times ) );
} }
this.logCraftingJob( "simulate", timer ); craftingTreeWatch.stop();
this.logCraftingJob( "simulate", craftingTreeWatch );
}
else
{
craftingTreeWatch.stop();
this.logCraftingJob( "real, failed", craftingTreeWatch );
}
} }
catch( final CraftBranchFailure e1 ) catch( final CraftBranchFailure e1 )
{ {
@@ -226,10 +247,11 @@ public class CraftingJob implements Runnable, ICraftingJob
this.incTime = 0; this.incTime = 0;
synchronized ( this.monitor ) synchronized ( this.monitor )
{ {
if( this.watch.elapsed( TimeUnit.MICROSECONDS ) > this.time ) if( this.tickSpreadingWatch.elapsed( TimeUnit.MICROSECONDS ) > this.time )
{ {
this.running = false; this.running = false;
this.watch.stop(); this.craftingTreeWatch.stop();
this.tickSpreadingWatch.stop();
this.monitor.notify(); this.monitor.notify();
} }
@@ -245,12 +267,13 @@ public class CraftingJob implements Runnable, ICraftingJob
AELog.craftingDebug( "crafting job now active" ); AELog.craftingDebug( "crafting job now active" );
} }
} }
}
if( Thread.interrupted() ) if( Thread.interrupted() )
{ {
throw new InterruptedException(); throw new InterruptedException();
} }
}
this.incTime++; this.incTime++;
} }
@@ -323,8 +346,8 @@ public class CraftingJob implements Runnable, ICraftingJob
} }
if( !this.actionSrc.player().isPresent() ) if( !this.actionSrc.player().isPresent() )
{ {
this.watch.reset(); this.tickSpreadingWatch.reset();
this.watch.start(); this.tickSpreadingWatch.start();
this.monitor.notify(); this.monitor.notify();
} }
this.running = true; this.running = true;
@@ -353,7 +376,7 @@ public class CraftingJob implements Runnable, ICraftingJob
if( AELog.isCraftingLogEnabled() ) if( AELog.isCraftingLogEnabled() )
{ {
final String itemToOutput = this.output.toString(); final String itemToOutput = this.output.toString();
final long elapsedTime = timer.elapsed( TimeUnit.MILLISECONDS ); final long elapsedTime = timer.elapsed( TimeUnit.MICROSECONDS );
final String actionSource; final String actionSource;
if( this.actionSrc.player().isPresent() ) if( this.actionSrc.player().isPresent() )
@@ -81,13 +81,42 @@ public class CraftingTreeNode
for( final ICraftingPatternDetails details : cc.getCraftingFor( this.what, this.parent == null ? null : this.parent.details, slot, this.world ) )// in for( final ICraftingPatternDetails details : cc.getCraftingFor( this.what, this.parent == null ? null : this.parent.details, slot, this.world ) )// in
// order. // order.
{ {
if( this.parent == null || this.parent.notRecursive( details ) ) if( this.parent == null || this.parent.notRecursive() )
{ {
this.nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1 ) ); this.nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1 ) );
} }
} }
} }
public CraftingTreeNode( final ICraftingGrid cc, final CraftingJob job, final IAEItemStack wat, final CraftingTreeProcess par, final int slot, final int depth, boolean available )
{
this.what = wat;
this.parent = par;
this.slot = slot;
this.world = job.getWorld();
this.job = job;
this.sim = false;
this.canEmit = cc.canEmitFor( this.what );
if( this.canEmit )
{
return; // if you can emit for something, you can't make it with patterns.
}
if( !available )
{
for( final ICraftingPatternDetails details : cc.getCraftingFor( this.what, this.parent == null ? null : this.parent.details, slot, this.world ) )// in
// order.
{
if( this.parent == null || this.parent.notRecursive() )
{
this.nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1 ) );
}
}
}
}
boolean notRecursive( final ICraftingPatternDetails details ) boolean notRecursive( final ICraftingPatternDetails details )
{ {
IAEItemStack[] o = details.getCondensedOutputs(); IAEItemStack[] o = details.getCondensedOutputs();
@@ -115,7 +144,7 @@ public class CraftingTreeNode
return true; return true;
} }
return this.parent.notRecursive( details ); return this.parent.notRecursive();
} }
IAEItemStack request( final MECraftingInventory inv, long l, final IActionSource src ) throws CraftBranchFailure, InterruptedException IAEItemStack request( final MECraftingInventory inv, long l, final IActionSource src ) throws CraftBranchFailure, InterruptedException
@@ -124,31 +153,8 @@ public class CraftingTreeNode
final List<IAEItemStack> thingsUsed = new ArrayList<>(); final List<IAEItemStack> thingsUsed = new ArrayList<>();
this.what.setStackSize( l ); this.what.setStackSize( l );
IAEItemStack available = inv.extractItems( this.what, Actionable.MODULATE, src );
if( available != null ) if( this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable() )
{
if( !this.exhausted )
{
final IAEItemStack is = this.job.checkUse( available );
if( is != null )
{
thingsUsed.add( is.copy() );
this.used.add( is );
}
}
this.bytes += available.getStackSize();
l -= available.getStackSize();
if( l == 0 )
{
return available;
}
}
else if( this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable() )
{ {
final Collection<IAEItemStack> itemList; final Collection<IAEItemStack> itemList;
final IItemList<IAEItemStack> inventoryList = inv.getItemList(); final IItemList<IAEItemStack> inventoryList = inv.getItemList();
@@ -177,12 +183,12 @@ public class CraftingTreeNode
for( IAEItemStack fuzz : itemList ) for( IAEItemStack fuzz : itemList )
{ {
if( this.parent.details.isValidItemForSlot( this.getSlot(), fuzz.copy().setStackSize( 1 ).createItemStack(), this.world ) ) if( this.parent.details.isValidItemForSlot( this.getSlot(), fuzz.copy().getCachedItemStack( 1 ), this.world ) )
{ {
fuzz = fuzz.copy(); fuzz = fuzz.copy();
fuzz.setStackSize( l ); fuzz.setStackSize( l );
available = inv.extractItems( fuzz, Actionable.MODULATE, src ); final IAEItemStack available = inv.extractItems( fuzz, Actionable.MODULATE, src );
if( available != null ) if( available != null )
{ {
@@ -208,6 +214,32 @@ public class CraftingTreeNode
} }
} }
} }
else
{
final IAEItemStack available = inv.extractItems( this.what, Actionable.MODULATE, src );
if( available != null )
{
if( !this.exhausted )
{
final IAEItemStack is = this.job.checkUse( available );
if( is != null )
{
thingsUsed.add( is.copy() );
this.used.add( is );
}
}
this.bytes += available.getStackSize();
l -= available.getStackSize();
if( l == 0 )
{
return available;
}
}
}
if( this.canEmit ) if( this.canEmit )
{ {
@@ -234,7 +266,7 @@ public class CraftingTreeNode
madeWhat.setStackSize( l ); madeWhat.setStackSize( l );
available = inv.extractItems( madeWhat, Actionable.MODULATE, src ); final IAEItemStack available = inv.extractItems( madeWhat, Actionable.MODULATE, src );
if( available != null ) if( available != null )
{ {
@@ -264,7 +296,7 @@ public class CraftingTreeNode
pro.request( subInv, 1, src ); pro.request( subInv, 1, src );
this.what.setStackSize( l ); this.what.setStackSize( l );
available = subInv.extractItems( this.what, Actionable.MODULATE, src ); final IAEItemStack available = subInv.extractItems( this.what, Actionable.MODULATE, src );
if( available != null ) if( available != null )
{ {
@@ -313,6 +345,11 @@ public class CraftingTreeNode
throw new CraftBranchFailure( this.what, l ); throw new CraftBranchFailure( this.what, l );
} }
boolean notRecursive()
{
return job.getUniques().findPrecise( this.what ) == null || this.parent == null;
}
void dive( final CraftingJob job ) void dive( final CraftingJob job )
{ {
if( this.missing > 0 ) if( this.missing > 0 )
@@ -19,15 +19,13 @@
package appeng.crafting; package appeng.crafting;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import net.minecraft.inventory.InventoryCrafting; import appeng.api.config.FuzzyMode;
import appeng.util.item.AEItemStack;
import it.unimi.dsi.fastutil.objects.Object2LongArrayMap;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.fml.common.FMLCommonHandler;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.api.config.Actionable; import appeng.api.config.Actionable;
@@ -37,25 +35,21 @@ import appeng.api.networking.security.IActionSource;
import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList; import appeng.api.storage.data.IItemList;
import appeng.container.ContainerNull;
import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.me.cluster.implementations.CraftingCPUCluster;
import appeng.util.Platform; import appeng.util.Platform;
public class CraftingTreeProcess public class CraftingTreeProcess
{ {
private final CraftingTreeNode parent; private final CraftingTreeNode parent;
final ICraftingPatternDetails details; final ICraftingPatternDetails details;
private final CraftingJob job; private final CraftingJob job;
private final Map<CraftingTreeNode, Long> nodes = new HashMap<>(); private final Object2LongArrayMap<CraftingTreeNode> nodes = new Object2LongArrayMap<>();
private final int depth; private final int depth;
boolean possible = true; boolean possible = true;
private World world;
private long crafts = 0; private long crafts = 0;
private boolean containerItems; private IItemList<IAEItemStack> containerItems;
private boolean limitQty; private boolean limitQty;
private boolean fullSimulation;
private long bytes = 0; private long bytes = 0;
public CraftingTreeProcess( final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth ) public CraftingTreeProcess( final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth )
@@ -66,163 +60,84 @@ public class CraftingTreeProcess
this.depth = depth; this.depth = depth;
final World world = job.getWorld(); final World world = job.getWorld();
if( details.isCraftable() )
{
final IAEItemStack[] list = details.getInputs(); final IAEItemStack[] list = details.getInputs();
final InventoryCrafting ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
final IAEItemStack[] is = details.getInputs();
for( int x = 0; x < ic.getSizeInventory(); x++ )
{
ic.setInventorySlotContents( x, is[x] == null ? ItemStack.EMPTY : is[x].createItemStack() );
}
for( int x = 0; x < ic.getSizeInventory(); x++ )
{
final ItemStack g = ic.getStackInSlot( x );
if( !g.isEmpty() && g.getCount() > 1 )
{
this.fullSimulation = true;
}
}
for( final IAEItemStack part : details.getCondensedInputs() ) for( final IAEItemStack part : details.getCondensedInputs() )
{ {
final ItemStack g = part.createItemStack(); if( part.getItem().hasContainerItem( part.getDefinition() ) )
boolean isAnInput = false;
for( final IAEItemStack a : details.getCondensedOutputs() )
{ {
if( !g.isEmpty() && a != null && a.equals( g ) ) if( containerItems == null )
{ {
isAnInput = true; containerItems = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
} }
} containerItems.add( part );
if( isAnInput )
{
this.limitQty = true; this.limitQty = true;
} }
if( g.getItem().hasContainerItem( g ) )
{
this.limitQty = this.containerItems = true;
} }
}
final boolean complicated = false;
if( this.containerItems || complicated )
{
for( int x = 0; x < list.length; x++ )
{
final IAEItemStack part = list[x];
if( part != null )
{
this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, x, depth + 1 ), part.getStackSize() );
}
}
}
else
{
// this is minor different then below, this slot uses the pattern, but kinda fudges it. // this is minor different then below, this slot uses the pattern, but kinda fudges it.
for( final IAEItemStack part : details.getCondensedInputs() ) for( IAEItemStack part : details.getCondensedInputs() ) {
{ if (part == null) {
for( int x = 0; x < list.length; x++ ) continue;
{ }
for (int x = 0; x < list.length; x++) {
final IAEItemStack comparePart = list[x]; final IAEItemStack comparePart = list[x];
if( part != null && part.equals( comparePart ) ) if (part.equals(comparePart)) {
{ if (isContainerItem(part)) {
// use the first slot... part = list[x];
}
this.nodes.put(new CraftingTreeNode(cc, job, part.copy(), this, x, depth + 1), part.getStackSize()); this.nodes.put(new CraftingTreeNode(cc, job, part.copy(), this, x, depth + 1), part.getStackSize());
if (details.canSubstitute()) {
for ()
}
break;
}
}
}
if(!this.limitQty) {
for (final IAEItemStack part : details.getCondensedOutputs()) {
for (final IAEItemStack o : details.getCondensedInputs()) {
if (part.equals(o)) {
this.limitQty = true;
break; break;
} }
} }
} }
} }
} }
else
{
for( final IAEItemStack part : details.getCondensedInputs() )
{
final ItemStack g = part.createItemStack();
boolean isAnInput = false; boolean isContainerItem(IAEItemStack iaeItemStack) {
for( final IAEItemStack a : details.getCondensedOutputs() ) return (containerItems != null && !containerItems.findFuzzy(iaeItemStack, FuzzyMode.IGNORE_ALL).isEmpty());
{
if( !g.isEmpty() && a != null && a.equals( g ) )
{
isAnInput = true;
}
} }
if( isAnInput ) boolean notRecursive()
{ {
this.limitQty = true; return this.parent == null || this.parent.notRecursive();
}
}
for( final IAEItemStack part : details.getCondensedInputs() )
{
this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), this, -1, depth + 1 ), part.getStackSize() );
}
}
}
boolean notRecursive( final ICraftingPatternDetails details )
{
return this.parent == null || this.parent.notRecursive( details );
} }
long getTimes( final long remaining, final long stackSize ) long getTimes( final long remaining, final long stackSize )
{ {
if( this.limitQty || this.fullSimulation ) if( this.limitQty )
{ {
return 1; return 1;
} }
return ( remaining / stackSize ) + ( remaining % stackSize != 0 ? 1 : 0 ); return ( remaining / stackSize ) + ( remaining % stackSize != 0 ? 1 : 0 );
} }
void request( final MECraftingInventory inv, final long i, final IActionSource src ) throws CraftBranchFailure, InterruptedException void request( final MECraftingInventory inv, final long amountOfTimes, final IActionSource src ) throws CraftBranchFailure, InterruptedException
{ {
this.job.handlePausing(); this.job.handlePausing();
if( this.fullSimulation )
{
final InventoryCrafting ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.entrySet() )
{
final IAEItemStack item = entry.getKey().getStack( entry.getValue() );
final IAEItemStack stack = entry.getKey().request( inv, item.getStackSize(), src );
ic.setInventorySlotContents( entry.getKey().getSlot(), stack.createItemStack() );
}
for( int x = 0; x < ic.getSizeInventory(); x++ )
{
ItemStack is = ic.getStackInSlot( x );
is = Platform.getContainerItem( is );
final IAEItemStack o = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( is );
if( o != null )
{
this.bytes++;
inv.injectItems( o, Actionable.MODULATE, src );
}
}
}
else
{
// request and remove inputs... // request and remove inputs...
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.entrySet() ) for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
{ {
final IAEItemStack item = entry.getKey().getStack( entry.getValue() ); final IAEItemStack craftableStack = entry.getKey().getStack( entry.getValue() );
final IAEItemStack stack = entry.getKey().request( inv, item.getStackSize() * i, src ); final IAEItemStack stack = entry.getKey().request( inv, craftableStack.getStackSize() * amountOfTimes, src );
if( this.containerItems ) if( containerItems != null && !this.containerItems.findFuzzy( stack, FuzzyMode.IGNORE_ALL ).isEmpty() )
{ {
final ItemStack is = Platform.getContainerItem( stack.createItemStack() ); final ItemStack is = Platform.getContainerItem( stack.createItemStack() );
final IAEItemStack o = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( is ); final IAEItemStack o = AEItemStack.fromItemStack( is );
if( o != null ) if( o != null )
{ {
this.bytes++; this.bytes++;
@@ -230,7 +145,6 @@ public class CraftingTreeProcess
} }
} }
} }
}
// assume its possible. // assume its possible.
@@ -238,18 +152,18 @@ public class CraftingTreeProcess
for( final IAEItemStack out : this.details.getCondensedOutputs() ) for( final IAEItemStack out : this.details.getCondensedOutputs() )
{ {
final IAEItemStack o = out.copy(); final IAEItemStack o = out.copy();
o.setStackSize( o.getStackSize() * i ); o.setStackSize( o.getStackSize() * amountOfTimes );
inv.injectItems( o, Actionable.MODULATE, src ); inv.injectItems( o, Actionable.MODULATE, src );
} }
this.crafts += i; this.crafts += amountOfTimes;
} }
void dive( final CraftingJob job ) void dive( final CraftingJob job )
{ {
job.addTask( this.getAmountCrafted( this.parent.getStack( 1 ) ), this.crafts, this.details, this.depth ); job.addTask( this.getAmountCrafted( this.parent.getStack( 1 ) ), this.crafts, this.details, this.depth );
for( final CraftingTreeNode pro : this.nodes.keySet() ) for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
{ {
pro.dive( job ); entry.getKey().dive( job );
} }
job.addBytes( this.crafts * 8 + this.bytes ); job.addBytes( this.crafts * 8 + this.bytes );
@@ -286,9 +200,9 @@ public class CraftingTreeProcess
this.crafts = 0; this.crafts = 0;
this.bytes = 0; this.bytes = 0;
for( final CraftingTreeNode pro : this.nodes.keySet() ) for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
{ {
pro.setSimulate(); entry.getKey().setSimulate();
} }
} }
@@ -296,9 +210,9 @@ public class CraftingTreeProcess
{ {
craftingCPUCluster.addCrafting( this.details, this.crafts ); craftingCPUCluster.addCrafting( this.details, this.crafts );
for( final CraftingTreeNode pro : this.nodes.keySet() ) for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
{ {
pro.setJob( storage, craftingCPUCluster, src ); entry.getKey().setJob( storage, craftingCPUCluster, src );
} }
} }
@@ -311,9 +225,9 @@ public class CraftingTreeProcess
plan.addRequestable( i ); plan.addRequestable( i );
} }
for( final CraftingTreeNode pro : this.nodes.keySet() ) for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
{ {
pro.getPlan( plan ); entry.getKey().getPlan( plan );
} }
} }
} }
@@ -97,8 +97,7 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
this.injectedCache = null; this.injectedCache = null;
} }
this.localCache = this.target this.localCache = this.target.getAvailableItems( new ItemListIgnoreCrafting<>( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() ) );
.getAvailableItems( new ItemListIgnoreCrafting<>( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() ) );
this.par = parent; this.par = parent;
} }
@@ -321,7 +320,6 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
} }
} }
failed = true; failed = true;
if( !src.player().isPresent() ) break;
} }
} }
} }
@@ -68,7 +68,7 @@ public class GuiFluidInterface extends GuiUpgradeable implements IConfigManagerH
for( int i = 0; i < DualityFluidInterface.NUMBER_OF_TANKS; ++i ) for( int i = 0; i < DualityFluidInterface.NUMBER_OF_TANKS; ++i )
{ {
this.guiSlots.add( new GuiFluidTank( fluidTank, i, DualityFluidInterface.NUMBER_OF_TANKS + i, 36 + 18 * i, 53, 16, 68 ) ); this.guiSlots.add( new GuiFluidTank( fluidTank, i, DualityFluidInterface.NUMBER_OF_TANKS + i, 36 + 18 * i, 57, 16, 64 ) );
this.guiSlots.add( new GuiFluidSlot( configFluids, i, i, 35 + 18 * i, 35 ) ); this.guiSlots.add( new GuiFluidSlot( configFluids, i, i, 35 + 18 * i, 35 ) );
} }
@@ -77,14 +77,14 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip
TextureAtlasSprite sprite = mc.getTextureMapBlocks().getAtlasSprite( fluid.getFluid().getStill().toString() ); TextureAtlasSprite sprite = mc.getTextureMapBlocks().getAtlasSprite( fluid.getFluid().getStill().toString() );
final int scaledHeight = (int) ( this.height * ( (float) fluid.getStackSize() / this.tank.getTankProperties()[this.slot].getCapacity() ) ); final int scaledHeight = (int) ( this.height * ( (float) fluid.getStackSize() / this.tank.getTankProperties()[this.slot].getCapacity() ) );
int iconHeightRemainder = scaledHeight % this.getHeight(); int iconHeightRemainder = scaledHeight % 16;
if( iconHeightRemainder > 0 ) if( iconHeightRemainder > 0 )
{ {
this.drawTexturedModalRect( this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder, sprite, this.getWidth(), iconHeightRemainder ); this.drawTexturedModalRect( this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder, sprite, 16, iconHeightRemainder );
} }
for( int i = 0; i < scaledHeight / this.getHeight(); i++ ) for( int i = 0; i < scaledHeight / 16; i++ )
{ {
this.drawTexturedModalRect( this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder - ( i + 1 ) * 16, sprite, this.getWidth(), this.getHeight() ); this.drawTexturedModalRect( this.xPos(), this.yPos() + this.getHeight() - iconHeightRemainder - ( i + 1 ) * 16, sprite, 16, 16 );
} }
} }
} }
@@ -113,7 +113,7 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip
@Override @Override
public int yPos() public int yPos()
{ {
return this.y - 1; return this.y - 4;
} }
@Override @Override
@@ -125,7 +125,7 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip
@Override @Override
public int getHeight() public int getHeight()
{ {
return this.height + 1; return this.height + 4;
} }
@Override @Override
@@ -108,8 +108,6 @@ import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
{ {
private int[] failedCraftTriesSlot = {0, 0, 0, 0, 0, 0, 0, 0, 0};
public static final int NUMBER_OF_STORAGE_SLOTS = 9; public static final int NUMBER_OF_STORAGE_SLOTS = 9;
public static final int NUMBER_OF_CONFIG_SLOTS = 9; public static final int NUMBER_OF_CONFIG_SLOTS = 9;
public static final int NUMBER_OF_PATTERN_SLOTS = 36; public static final int NUMBER_OF_PATTERN_SLOTS = 36;
@@ -139,7 +137,6 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
private final Accessor accessor = new Accessor(); private final Accessor accessor = new Accessor();
private EnumSet<EnumFacing> visitedFaces = EnumSet.noneOf( EnumFacing.class ); private EnumSet<EnumFacing> visitedFaces = EnumSet.noneOf( EnumFacing.class );
private EnumMap<EnumFacing, List<ItemStack>> waitingToSendFacing = new EnumMap<>( EnumFacing.class ); private EnumMap<EnumFacing, List<ItemStack>> waitingToSendFacing = new EnumMap<>( EnumFacing.class );
private BlockingInventoryAdaptor blockingInventoryAdaptor;
private boolean resetConfigCache = true; private boolean resetConfigCache = true;
private IMEMonitor<IAEItemStack> configCachedHandler; private IMEMonitor<IAEItemStack> configCachedHandler;
@@ -415,6 +412,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
// :P // :P
} }
} }
this.notifyNeighbors();
} }
private void updateCraftingList() private void updateCraftingList()
@@ -427,6 +425,8 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
return; return;
} }
boolean removed = false;
if( this.craftingList != null ) if( this.craftingList != null )
{ {
final Iterator<ICraftingPatternDetails> i = this.craftingList.iterator(); final Iterator<ICraftingPatternDetails> i = this.craftingList.iterator();
@@ -446,26 +446,29 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
if( !found ) if( !found )
{ {
removed = true;
i.remove(); i.remove();
} }
} }
} }
boolean newPattern = false;
for( int x = 0; x < accountedFor.length; x++ ) for( int x = 0; x < accountedFor.length; x++ )
{ {
if( !accountedFor[x] ) if( !accountedFor[x] )
{ {
newPattern = true;
this.addToCraftingList( this.patterns.getStackInSlot( x ) ); this.addToCraftingList( this.patterns.getStackInSlot( x ) );
} }
} }
try try
{ {
this.gridProxy.getGrid().postEvent( new MENetworkCraftingPatternChange( this, this.gridProxy.getNode() ) ); this.gridProxy.getGrid().postEvent( new MENetworkCraftingPatternChange( this, this.gridProxy.getNode() ) );
} }
catch( final GridAccessException e ) catch( GridAccessException e )
{ {
// :P e.printStackTrace();
} }
} }
@@ -797,17 +800,18 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
return; return;
} }
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
final Iterator<ItemStack> i = this.waitingToSendFacing.get( s ).iterator(); final Iterator<ItemStack> i = this.waitingToSendFacing.get( s ).iterator();
while ( i.hasNext() ) while ( i.hasNext() )
{ {
ItemStack whatToSend = i.next(); ItemStack whatToSend = i.next();
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
if( ad != null ) if( ad != null )
{ {
final ItemStack result = ad.addItems( whatToSend ); final ItemStack result = ad.addItems( whatToSend );
if( !result.isEmpty() ) if( !result.isEmpty() )
{ {
whatToSend.setCount( whatToSend.getCount() - ( whatToSend.getCount() - result.getCount() ) ); whatToSend.setCount( result.getCount() );
} }
else else
{ {
@@ -894,17 +898,24 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
else if( itemStack.getStackSize() > 0 ) else if( itemStack.getStackSize() > 0 )
{ {
// make sure strange things didn't happen... // make sure strange things didn't happen...
ItemStack inputStack = itemStack.createItemStack();
if( !adaptor.simulateAdd( inputStack ).isEmpty() ) ItemStack inputStack = itemStack.getCachedItemStack( itemStack.getStackSize() );
ItemStack remaining = adaptor.simulateAdd( inputStack );
if( !remaining.isEmpty() )
{ {
itemStack.setCachedItemStack( remaining );
changed = true; changed = true;
throw new GridAccessException(); throw new GridAccessException();
} }
else
{
itemStack.setCachedItemStack( inputStack );
}
IAEItemStack storedStack = this.gridProxy.getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().findPrecise( itemStack ); IAEItemStack storedStack = this.gridProxy.getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().findPrecise( itemStack );
if( storedStack != null ) if( storedStack != null )
{
if( storedStack.getStackSize() > 0 )
{ {
final IAEItemStack acquired = Platform.poweredExtraction( src, this.destination, itemStack, this.interfaceRequestSource ); final IAEItemStack acquired = Platform.poweredExtraction( src, this.destination, itemStack, this.interfaceRequestSource );
if( acquired != null ) if( acquired != null )
@@ -917,7 +928,6 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
throw new IllegalStateException( "bad attempt at managing inventory. ( addItems )" ); throw new IllegalStateException( "bad attempt at managing inventory. ( addItems )" );
} }
} }
}
else if( storedStack.isCraftable() ) else if( storedStack.isCraftable() )
{ {
changed = this.handleCrafting( x, adaptor, itemStack ) || changed; changed = this.handleCrafting( x, adaptor, itemStack ) || changed;
@@ -951,20 +961,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
{ {
if( this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0 && itemStack != null ) if( this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0 && itemStack != null )
{ {
if( this.failedCraftTriesSlot[x] <= 0 ) return this.craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, this.iHost.getTileEntity().getWorld(), this.gridProxy.getGrid(), this.gridProxy.getCrafting(), this.mySource );
{
boolean crafted = this.craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, this.iHost.getTileEntity().getWorld(), this.gridProxy.getGrid(), this.gridProxy.getCrafting(), this.mySource );
if( crafted )
{
this.failedCraftTriesSlot[x] = 0;
}
else
{
this.failedCraftTriesSlot[x] += 2;
}
}
this.failedCraftTriesSlot[x] -= 1;
} }
} }
catch( final GridAccessException e ) catch( final GridAccessException e )
@@ -1285,7 +1282,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
boolean isCustomInvBlocking( TileEntity te, EnumFacing s ) boolean isCustomInvBlocking( TileEntity te, EnumFacing s )
{ {
blockingInventoryAdaptor = BlockingInventoryAdaptor.getAdaptor( te, s.getOpposite() ); BlockingInventoryAdaptor blockingInventoryAdaptor = BlockingInventoryAdaptor.getAdaptor( te, s.getOpposite() );
return invIsCustomBlocking( blockingInventoryAdaptor ); return invIsCustomBlocking( blockingInventoryAdaptor );
} }
@@ -1309,7 +1306,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
continue; continue;
} }
if( !ad.simulateAdd( is.copy() ).isEmpty() ) if( !ad.simulateAdd( is ).isEmpty() )
{ {
return false; return false;
} }
@@ -24,6 +24,7 @@ import java.util.concurrent.Future;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World; import net.minecraft.world.World;
@@ -83,8 +84,16 @@ public class MultiCraftingTracker
public boolean handleCrafting( final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d, final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc ) public boolean handleCrafting( final int x, final long itemToCraft, final IAEItemStack ais, final InventoryAdaptor d, final World w, final IGrid g, final ICraftingGrid cg, final IActionSource mySrc )
{ {
if( ais != null && d.simulateAdd( ais.createItemStack() ).isEmpty() ) if( ais != null )
{ {
ItemStack inputStack = ais.getCachedItemStack( ais.getStackSize() );
ItemStack remaining = d.simulateAdd( inputStack );
if( remaining.isEmpty() )
{
ais.setCachedItemStack( inputStack );
final Future<ICraftingJob> craftingJob = this.getJob( x ); final Future<ICraftingJob> craftingJob = this.getJob( x );
if( this.getLink( x ) != null ) if( this.getLink( x ) != null )
@@ -136,6 +145,11 @@ public class MultiCraftingTracker
} }
} }
} }
else
{
ais.setCachedItemStack( remaining );
}
}
return false; return false;
} }
@@ -1,44 +1,47 @@
package appeng.helpers; package appeng.helpers;
import appeng.api.AEApi;
import appeng.api.storage.channels.IItemStorageChannel;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.core.AEConfig; import appeng.core.AEConfig;
import appeng.core.AELog; import appeng.core.AELog;
import appeng.util.item.AEItemStack;
import gregtech.api.items.metaitem.MetaItem; import gregtech.api.items.metaitem.MetaItem;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
import it.unimi.dsi.fastutil.objects.*;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.registry.GameRegistry; import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.oredict.OreDictionary;
import java.util.*; import java.util.*;
public class NonBlockingItems public class NonBlockingItems
{ {
public static Map<String, IItemList<IAEItemStack>> NON_BLOCKING_MAP = new HashMap<>(); public static Map<String, Object2ObjectOpenHashMap<Item, IntSet>> NON_BLOCKING_MAP = new HashMap<>();
public static NonBlockingItems INSTANCE = new NonBlockingItems(); public static NonBlockingItems INSTANCE = new NonBlockingItems();
private NonBlockingItems() private NonBlockingItems()
{ {
String[] strings = AEConfig.instance().getNonBlockingItems(); String[] strings = AEConfig.instance().getNonBlockingItems();
String modid = ""; String[] modids = new String[0];
if( strings.length > 0 ) if( strings.length > 0 )
{ {
for( String s : strings ) for( String s : strings )
{ {
if( s.startsWith( "[" ) && s.endsWith( "]" ) ) if( s.startsWith( "[" ) && s.endsWith( "]" ) )
{ {
modid = s.substring( 1, s.length() - 1 ); modids = s.substring( 1, s.length() - 1 ).split( "\\|" );
} }
else else
{
for( String modid : modids )
{ {
if( !Loader.isModLoaded( modid ) ) if( !Loader.isModLoaded( modid ) )
{ {
continue; continue;
} }
NON_BLOCKING_MAP.putIfAbsent( modid, AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() ); NON_BLOCKING_MAP.putIfAbsent( modid, new Object2ObjectOpenHashMap<>() );
String[] ModItemMeta = s.split( ":" ); String[] ModItemMeta = s.split( ":" );
if( ModItemMeta.length < 2 || ModItemMeta.length > 3 ) if( ModItemMeta.length < 2 || ModItemMeta.length > 3 )
@@ -54,17 +57,52 @@ public class NonBlockingItems
MetaItem<?>.MetaValueItem metaItem2 = metaItem.getItem( ModItemMeta[1] ); MetaItem<?>.MetaValueItem metaItem2 = metaItem.getItem( ModItemMeta[1] );
if( metaItem.getItem( ModItemMeta[1] ) != null ) if( metaItem.getItem( ModItemMeta[1] ) != null )
{ {
NON_BLOCKING_MAP.get( modid ).add( AEItemStack.fromItemStack( metaItem2.getStackForm() ) ); ItemStack itemStack = metaItem2.getStackForm();
break; NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() );
} NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) -> {
} intSet.add( itemStack.getItemDamage() );
return intSet;
} );
} }
else else
{ {
ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null ); ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null );
if( !itemStack.isEmpty() ) if( !itemStack.isEmpty() )
{ {
NON_BLOCKING_MAP.get( modid ).add( AEItemStack.fromItemStack( itemStack ) ); NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() );
NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) -> {
intSet.add( itemStack.getItemDamage() );
return intSet;
} );
}
else
{
AELog.error( "Item not found on nonBlocking config: " + s );
}
}
break;
}
}
else if( ModItemMeta[0].equals( "ore" ) )
{
OreDictionary.getOres( ModItemMeta[1] ).forEach( itemStack -> {
NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() );
NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) -> {
intSet.add( itemStack.getItemDamage() );
return intSet;
} );
} );
}
else
{
ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null );
if( !itemStack.isEmpty() )
{
NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() );
NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) -> {
intSet.add( itemStack.getItemDamage() );
return intSet;
} );
} }
else else
{ {
@@ -75,8 +113,9 @@ public class NonBlockingItems
} }
} }
} }
}
public Map<String, IItemList<IAEItemStack>> getMap() public Map<String, Object2ObjectOpenHashMap<Item, IntSet>> getMap()
{ {
return NON_BLOCKING_MAP; return NON_BLOCKING_MAP;
} }
+2 -5
View File
@@ -190,7 +190,8 @@ public class TickHandler
synchronized ( this.craftingJobs ) synchronized ( this.craftingJobs )
{ {
final Collection<CraftingJob> jobSet = this.craftingJobs.get( wte.world ); final Collection<CraftingJob> jobSet = this.craftingJobs.get( wte.world );
if (!jobSet.isEmpty()) { if( !jobSet.isEmpty() )
{
final int jobSize = jobSet.size(); final int jobSize = jobSet.size();
final int microSecondsPerTick = AEConfig.instance().getCraftingCalculationTimePerTick() * 1000; final int microSecondsPerTick = AEConfig.instance().getCraftingCalculationTimePerTick() * 1000;
final int simTime = Math.max( 1, microSecondsPerTick / jobSize ); final int simTime = Math.max( 1, microSecondsPerTick / jobSize );
@@ -275,10 +276,6 @@ public class TickHandler
AELog.debug( e ); AELog.debug( e );
} }
} }
// long time = sw.elapsed( TimeUnit.MILLISECONDS );
// if ( time > 0 )
// AELog.info( "processQueue Time: " + time + "ms" );
} }
public void registerCraftingSimulation( final World world, final CraftingJob craftingJob ) public void registerCraftingSimulation( final World world, final CraftingJob craftingJob )
+9 -22
View File
@@ -85,9 +85,7 @@ public enum PartType
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
protected List<ModelResourceLocation> createItemModels( String baseName ) protected List<ModelResourceLocation> createItemModels( String baseName )
{ {
return Arrays.stream( AEColor.values() ) return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
.collect( Collectors.toList() );
} }
}, },
@@ -103,9 +101,7 @@ public enum PartType
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
protected List<ModelResourceLocation> createItemModels( String baseName ) protected List<ModelResourceLocation> createItemModels( String baseName )
{ {
return Arrays.stream( AEColor.values() ) return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
.collect( Collectors.toList() );
} }
}, },
@@ -121,14 +117,11 @@ public enum PartType
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
protected List<ModelResourceLocation> createItemModels( String baseName ) protected List<ModelResourceLocation> createItemModels( String baseName )
{ {
return Arrays.stream( AEColor.values() ) return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
.collect( Collectors.toList() );
} }
}, },
CABLE_DENSE_SMART( 60, "cable_dense_smart", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet CABLE_DENSE_SMART( 60, "cable_dense_smart", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartDenseCableSmart.class )
.noneOf( IntegrationType.class ), PartDenseCableSmart.class )
{ {
@Override @Override
public boolean isCable() public boolean isCable()
@@ -140,14 +133,11 @@ public enum PartType
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
protected List<ModelResourceLocation> createItemModels( String baseName ) protected List<ModelResourceLocation> createItemModels( String baseName )
{ {
return Arrays.stream( AEColor.values() ) return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
.collect( Collectors.toList() );
} }
}, },
CABLE_DENSE_COVERED( 500, "cable_dense_covered", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet CABLE_DENSE_COVERED( 500, "cable_dense_covered", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartDenseCableCovered.class )
.noneOf( IntegrationType.class ), PartDenseCableCovered.class )
{ {
@Override @Override
public boolean isCable() public boolean isCable()
@@ -159,9 +149,7 @@ public enum PartType
@SideOnly( Side.CLIENT ) @SideOnly( Side.CLIENT )
protected List<ModelResourceLocation> createItemModels( String baseName ) protected List<ModelResourceLocation> createItemModels( String baseName )
{ {
return Arrays.stream( AEColor.values() ) return Arrays.stream( AEColor.values() ).map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) ).collect( Collectors.toList() );
.map( color -> modelFromBaseName( baseName + "_" + color.name().toLowerCase() ) )
.collect( Collectors.toList() );
} }
}, },
@@ -282,7 +270,7 @@ public enum PartType
} }
}, },
P2P_TUNNEL_GTCEU( 470, "p2p_tunnel_gtceu", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_GTCEU ), EnumSet.of( IntegrationType.GTCE ), PartP2PGTCEPower.class, GuiText.GTCEUTunnel ) P2P_TUNNEL_GTEU( 470, "p2p_tunnel_gteu", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_GTEU ), EnumSet.of( IntegrationType.GTCE ), PartP2PGTCEPower.class, GuiText.GTEUTunnel )
{ {
@Override @Override
String getUnlocalizedName() String getUnlocalizedName()
@@ -335,8 +323,7 @@ public enum PartType
this.oreName = oreDict; this.oreName = oreDict;
// The part is enabled if all features + integrations it needs are enabled // The part is enabled if all features + integrations it needs are enabled
this.enabled = features.stream().allMatch( AEConfig.instance()::isFeatureEnabled ) && integrations.stream() this.enabled = features.stream().allMatch( AEConfig.instance()::isFeatureEnabled ) && integrations.stream().allMatch( IntegrationRegistry.INSTANCE::isEnabled );
.allMatch( IntegrationRegistry.INSTANCE::isEnabled );
if( this.enabled ) if( this.enabled )
{ {
+1 -7
View File
@@ -19,12 +19,8 @@
package appeng.me; package appeng.me;
import java.util.Collection; import java.util.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import appeng.api.AEApi; import appeng.api.AEApi;
import appeng.api.networking.IGrid; import appeng.api.networking.IGrid;
@@ -220,9 +216,7 @@ public class Grid implements IGrid
@Override @Override
public MENetworkEvent postEvent( final MENetworkEvent ev ) public MENetworkEvent postEvent( final MENetworkEvent ev )
{ {
CraftingGridCache.pauseRebuilds();
final MENetworkEvent ret = this.eventBus.postEvent( this, ev ); final MENetworkEvent ret = this.eventBus.postEvent( this, ev );
CraftingGridCache.unpauseRebuilds();
return ret; return ret;
} }
-3
View File
@@ -166,8 +166,6 @@ public class GridNode implements IGridNode, IPathItem
{ {
final Object tracker = new Object(); final Object tracker = new Object();
CraftingGridCache.pauseRebuilds();
Deque<GridNode> nextRun = new ArrayDeque<>(); Deque<GridNode> nextRun = new ArrayDeque<>();
nextRun.add( this ); nextRun.add( this );
@@ -207,7 +205,6 @@ public class GridNode implements IGridNode, IPathItem
} }
} }
} }
CraftingGridCache.unpauseRebuilds();
} }
@Override @Override
+28 -57
View File
@@ -113,9 +113,9 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
private final GenericInterestManager<CraftingWatcher> interestManager = new GenericInterestManager<>( this.interests ); private final GenericInterestManager<CraftingWatcher> interestManager = new GenericInterestManager<>( this.interests );
private IStorageGrid storageGrid; private IStorageGrid storageGrid;
private IEnergyGrid energyGrid; private IEnergyGrid energyGrid;
int i;
private boolean updateList = false; private boolean updateList = false;
private static int pauseRebuilds = 0; private boolean updatePatterns = false;
private static Set<CraftingGridCache> rebuildNeeded = new HashSet<>();
public CraftingGridCache( final IGrid grid ) public CraftingGridCache( final IGrid grid )
{ {
@@ -140,6 +140,12 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
this.updateCPUClusters(); this.updateCPUClusters();
} }
if( updatePatterns )
{
this.recalculateCraftingPatterns();
this.updatePatterns = false;
}
final Iterator<CraftingLinkNexus> craftingLinkIterator = this.craftingLinks.values().iterator(); final Iterator<CraftingLinkNexus> craftingLinkIterator = this.craftingLinks.values().iterator();
while ( craftingLinkIterator.hasNext() ) while ( craftingLinkIterator.hasNext() )
{ {
@@ -187,7 +193,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
if( machine instanceof ICraftingProvider ) if( machine instanceof ICraftingProvider )
{ {
this.craftingProviders.remove( machine ); this.craftingProviders.remove( machine );
this.updatePatterns(); this.updatePatterns = true;
} }
} }
@@ -221,7 +227,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
if( machine instanceof ICraftingProvider ) if( machine instanceof ICraftingProvider )
{ {
this.craftingProviders.add( (ICraftingProvider) machine ); this.craftingProviders.add( (ICraftingProvider) machine );
this.updatePatterns(); this.updatePatterns = true;
} }
} }
@@ -242,34 +248,13 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
// nothing! // nothing!
} }
public static void pauseRebuilds()
{
pauseRebuilds++;
}
public static void unpauseRebuilds()
{
pauseRebuilds--;
if (pauseRebuilds == 0 && rebuildNeeded.size() > 0)
{
ImmutableSet<CraftingGridCache> needed = ImmutableSet.copyOf(rebuildNeeded);
rebuildNeeded.clear();
for ( CraftingGridCache cache: needed )
{
cache.updatePatterns();
}
}
}
private void updatePatterns() private void updatePatterns()
{ {
// coalesce change events during a grid traversal to a single rebuild this.updatePatterns = true;
if (pauseRebuilds != 0)
{
rebuildNeeded.add(this);
return;
} }
private void recalculateCraftingPatterns()
{
final Object2ObjectMap<IAEItemStack, ImmutableList<ICraftingPatternDetails>> oldItems = new Object2ObjectOpenHashMap<>( this.craftableItems ); final Object2ObjectMap<IAEItemStack, ImmutableList<ICraftingPatternDetails>> oldItems = new Object2ObjectOpenHashMap<>( this.craftableItems );
final Set<IAEItemStack> oldEmitableItems = new HashSet<>( this.emitableItems ); final Set<IAEItemStack> oldEmitableItems = new HashSet<>( this.emitableItems );
@@ -312,25 +297,29 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
this.craftableItems.put( e.getKey(), ImmutableList.copyOf( e.getValue() ) ); this.craftableItems.put( e.getKey(), ImmutableList.copyOf( e.getValue() ) );
} }
Object2ObjectMap<IAEItemStack, ImmutableList<ICraftingPatternDetails>> craftablesChanged = new Object2ObjectArrayMap<>(); List<IAEItemStack> craftablesChanged = new ArrayList<>();
ObjectSet<Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>>> i = oldItems.entrySet(); ObjectSet<Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>>> i = oldItems.entrySet();
for ( Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>> ais : i) { for( Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>> ais : i )
if (!this.craftableItems.containsKey( ais.getKey() )) { {
if( !this.craftableItems.containsKey( ais.getKey() ) )
{
IAEItemStack changedStack = ais.getKey().copy(); IAEItemStack changedStack = ais.getKey().copy();
changedStack.reset(); changedStack.reset();
changedStack.setCraftable( false ); changedStack.setCraftable( false );
craftablesChanged.put( changedStack, ais.getValue() ); craftablesChanged.add( changedStack );
} }
} }
ObjectSet<Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>>> j = this.craftableItems.entrySet(); ObjectSet<Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>>> j = this.craftableItems.entrySet();
for ( Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>> ais : j) { for( Entry<IAEItemStack, ImmutableList<ICraftingPatternDetails>> ais : j )
if (!oldItems.containsKey( ais )){ {
if( !oldItems.containsKey( ais ) )
{
IAEItemStack changedStack = ais.getKey().copy(); IAEItemStack changedStack = ais.getKey().copy();
changedStack.reset(); changedStack.reset();
changedStack.setCraftable( true ); changedStack.setCraftable( true );
craftablesChanged.put( changedStack, ais.getValue() ); craftablesChanged.add( changedStack );
} }
} }
@@ -341,7 +330,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
IAEItemStack changedStack = st.copy(); IAEItemStack changedStack = st.copy();
changedStack.reset(); changedStack.reset();
changedStack.setCraftable( false ); changedStack.setCraftable( false );
craftablesChanged.put( changedStack, null ); craftablesChanged.add( changedStack );
} }
} }
@@ -352,12 +341,11 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
IAEItemStack changedStack = st.copy(); IAEItemStack changedStack = st.copy();
changedStack.reset(); changedStack.reset();
changedStack.setCraftable( true ); changedStack.setCraftable( true );
craftablesChanged.put( changedStack, null ); craftablesChanged.add( changedStack );
} }
} }
this.storageGrid.postCraftablesChanges( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), craftablesChanged.keySet(), this.storageGrid.postCraftablesChanges( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ), craftablesChanged, new BaseActionSource() );
new BaseActionSource() );
} }
private void updateCPUClusters() private void updateCPUClusters()
@@ -535,22 +523,6 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
if( res == null ) if( res == null )
{ {
if( details != null && details.isCraftable() )
{
for( final IAEItemStack ais : this.craftableItems.keySet() )
{
if( ais.getItem() == whatToCraft.getItem() && ( !ais.getItem().getHasSubtypes() || ais.getItemDamage() == whatToCraft.getItemDamage() ) )
{
// TODO: check if OK
// TODO: this is slightly hacky, but fine as long as we only deal with itemstacks
if( details.isValidItemForSlot( slotIndex, ais.asItemStackRepresentation(), world ) )
{
return this.craftableItems.get( ais );
}
}
}
}
return ImmutableSet.of(); return ImmutableSet.of();
} }
@@ -596,8 +568,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
} }
} }
Collections.sort( validCpusClusters, ( firstCluster, nextCluster ) -> Collections.sort( validCpusClusters, ( firstCluster, nextCluster ) -> {
{
if( prioritizePower ) if( prioritizePower )
{ {
final int comparison1 = Long.compare( nextCluster.getCoProcessors(), firstCluster.getCoProcessors() ); final int comparison1 = Long.compare( nextCluster.getCoProcessors(), firstCluster.getCoProcessors() );
@@ -19,7 +19,6 @@
package appeng.parts.automation; package appeng.parts.automation;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
@@ -72,8 +71,6 @@ import appeng.util.item.AEItemStack;
public class PartExportBus extends PartSharedItemBus implements ICraftingRequester public class PartExportBus extends PartSharedItemBus implements ICraftingRequester
{ {
private final int[] failedCraftTriesSlot = {0, 0, 0, 0, 0, 0, 0, 0, 0};
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/export_bus_base" ); public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/export_bus_base" );
@PartModels @PartModels
@@ -156,22 +153,8 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
if( this.craftOnly() ) if( this.craftOnly() )
{ {
if( this.failedCraftTriesSlot[x] <= 0 )
{
this.didSomething = this.craftingTracker.handleCrafting( slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(), this.getProxy().getGrid(), cg, this.mySrc ) || this.didSomething; this.didSomething = this.craftingTracker.handleCrafting( slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(), this.getProxy().getGrid(), cg, this.mySrc ) || this.didSomething;
if( this.didSomething )
{
this.failedCraftTriesSlot[x] = 0;
}
else
{
this.failedCraftTriesSlot[x] += 2;
}
}
this.failedCraftTriesSlot[x] -= 1;
continue;
} }
final long before = this.itemToSend; final long before = this.itemToSend;
@@ -197,21 +180,7 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
if( this.itemToSend == before && this.isCraftingEnabled() ) if( this.itemToSend == before && this.isCraftingEnabled() )
{ {
if( this.failedCraftTriesSlot[x] <= 0 )
{
this.didSomething = this.craftingTracker.handleCrafting( slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(), this.getProxy().getGrid(), cg, this.mySrc ) || this.didSomething; this.didSomething = this.craftingTracker.handleCrafting( slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(), this.getProxy().getGrid(), cg, this.mySrc ) || this.didSomething;
if( this.didSomething )
{
this.failedCraftTriesSlot[x] = 0;
}
else
{
this.failedCraftTriesSlot[x] += 2;
}
}
this.failedCraftTriesSlot[x] -= 1;
} }
} }
@@ -297,15 +266,18 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
ItemStack remaining; ItemStack remaining;
remaining = mode == Actionable.SIMULATE ? d.simulateAdd( inputStack ) : d.addItems( inputStack ); if( mode == Actionable.SIMULATE )
{
remaining = d.simulateAdd( inputStack );
items.setCachedItemStack( inputStack );
}
else
{
remaining = d.addItems( inputStack );
if( !remaining.isEmpty() ) if( !remaining.isEmpty() )
{ {
items.setCachedItemStack( remaining ); items.setCachedItemStack( remaining );
} }
else
{
items.setCachedItemStack( inputStack );
} }
if( remaining == inputStack ) if( remaining == inputStack )
@@ -357,10 +329,10 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
if( !remaining.isEmpty() ) if( !remaining.isEmpty() )
{ {
ais.setCachedItemStack( remaining ); ais.setCachedItemStack( remaining );
} if( remaining == inputStack )
else
{ {
ais.setCachedItemStack( inputStack ); return;
}
} }
final long canFit = remaining.isEmpty() ? this.itemToSend : this.itemToSend - remaining.getCount(); final long canFit = remaining.isEmpty() ? this.itemToSend : this.itemToSend - remaining.getCount();
@@ -91,13 +91,16 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
} }
// Store the stack in the cache for next time. // Store the stack in the cache for next time.
if( type == Actionable.SIMULATE )
{
iox.setCachedItemStack( inputStack );
}
else
{
if( !remaining.isEmpty() ) if( !remaining.isEmpty() )
{ {
iox.setCachedItemStack( remaining ); iox.setCachedItemStack( remaining );
} }
else
{
iox.setCachedItemStack( inputStack );
} }
// At this point, we still have some items left... // At this point, we still have some items left...
@@ -159,8 +162,7 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
{ {
// Something broke. It should never return more than we requested... // Something broke. It should never return more than we requested...
// We're going to silently eat the remainder // We're going to silently eat the remainder
AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.", AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.", this.itemHandler.getClass().getName(), extracted.toString(), remainingCurrentSlot );
this.itemHandler.getClass().getName(), extracted.toString(), remainingCurrentSlot );
extracted.setCount( remainingCurrentSlot ); extracted.setCount( remainingCurrentSlot );
} }
@@ -66,13 +66,16 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
remaining = this.itemRepository.insertItem( inputStack, type == Actionable.SIMULATE ); remaining = this.itemRepository.insertItem( inputStack, type == Actionable.SIMULATE );
// Store the stack in the cache for next time. // Store the stack in the cache for next time.
if( type == Actionable.SIMULATE )
{
iox.setCachedItemStack( inputStack );
}
else
{
if( !remaining.isEmpty() ) if( !remaining.isEmpty() )
{ {
iox.setCachedItemStack( remaining ); iox.setCachedItemStack( remaining );
} }
else
{
iox.setCachedItemStack( inputStack );
} }
// At this point, we still have some items left... // At this point, we still have some items left...
@@ -114,8 +117,7 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
{ {
// Something broke. It should never return more than we requested... // Something broke. It should never return more than we requested...
// We're going to silently eat the remainder // We're going to silently eat the remainder
AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.", AELog.warn( "Mod that provided item handler %s is broken. Returned %s items while only requesting %d.", this.itemRepository.getClass().getName(), extracted.toString(), remainingSize );
this.itemRepository.getClass().getName(), extracted.toString(), remainingSize );
extracted.setCount( remainingSize ); extracted.setCount( remainingSize );
} }
@@ -304,17 +304,33 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
if( te instanceof TileCableBus ) if( te instanceof TileCableBus )
{ {
IPart iPart = ( (TileCableBus) te ).getPart( this.getSide().getOpposite() ); IPart iPart = ( (TileCableBus) te ).getPart( this.getSide().getOpposite() );
if( iPart == null || iPart instanceof PartInterface ) if( iPart == null )
{
this.resetCache( true );
this.resetCache();
}
else if( iPart instanceof PartInterface )
{
if( createHandlerHash( te ) != handlerHash )
{ {
this.resetCache( true ); this.resetCache( true );
this.resetCache(); this.resetCache();
} }
} }
else if( te == null || te instanceof TileInterface ) }
else if( te == null )
{ {
this.resetCache( true ); this.resetCache( true );
this.resetCache(); this.resetCache();
} }
else if( te instanceof TileInterface )
{
if( createHandlerHash( te ) != handlerHash )
{
this.resetCache( true );
this.resetCache();
}
}
else else
{ {
this.resetCache( false ); this.resetCache( false );
@@ -463,6 +479,15 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
if( target.hasCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) ) if( target.hasCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) )
{ {
IStorageMonitorableAccessor accessor = target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide );
if( accessor != null )
{
IStorageMonitorable inventory = accessor.getInventory( this.mySrc );
if( inventory != null )
{
return Objects.hash( target, inventory.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ) );
}
}
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) ); return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
} }
@@ -20,7 +20,7 @@ import java.util.Queue;
public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower> public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower>
{ {
private static final P2PModels MODELS = new P2PModels( "part/p2p/p2p_tunnel_gtceu" ); private static final P2PModels MODELS = new P2PModels( "part/p2p/p2p_tunnel_gteu" );
private static final IEnergyContainer NULL_ENERGY_STORAGE = new NullEnergyStorage(); private static final IEnergyContainer NULL_ENERGY_STORAGE = new NullEnergyStorage();
private final IEnergyContainer inputHandler = new InputEnergyStorage(); private final IEnergyContainer inputHandler = new InputEnergyStorage();
private final IEnergyContainer outputHandler = new OutputEnergyStorage(); private final IEnergyContainer outputHandler = new OutputEnergyStorage();
@@ -208,7 +208,8 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
boolean pasteAsOutput = true; boolean pasteAsOutput = true;
ItemStack is = player.getHeldItem( hand ); ItemStack is = player.getHeldItem( hand );
if (is.isEmpty()) { if( is.isEmpty() )
{
pasteAsOutput = false; pasteAsOutput = false;
is = player.getHeldItemOffhand(); is = player.getHeldItemOffhand();
} }
@@ -292,8 +293,8 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
newType = parts.p2PTunnelFE().maybeStack( 1 ).orElse( ItemStack.EMPTY ); newType = parts.p2PTunnelFE().maybeStack( 1 ).orElse( ItemStack.EMPTY );
break; break;
case GTCEU_POWER: case GTEU_POWER:
newType = parts.p2PTunnelGTCEU().maybeStack( 1 ).orElse( ItemStack.EMPTY ); newType = parts.p2PTunnelGTEU().maybeStack( 1 ).orElse( ItemStack.EMPTY );
break; break;
case FLUID: case FLUID:
@@ -455,8 +456,10 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
final AEColor[] colors = Platform.p2p().toColors( this.getFrequency() ); final AEColor[] colors = Platform.p2p().toColors( this.getFrequency() );
final int[] colorCode = new int[]{ final int[] colorCode = new int[]{
colors[0].ordinal(), colors[0].ordinal(), colors[1].ordinal(), colors[1].ordinal(), colors[0].ordinal(), colors[0].ordinal(),
colors[2].ordinal(), colors[2].ordinal(), colors[3].ordinal(), colors[3].ordinal(), colors[1].ordinal(), colors[1].ordinal(),
colors[2].ordinal(), colors[2].ordinal(),
colors[3].ordinal(), colors[3].ordinal(),
}; };
data.setIntArray( "colorCode", colorCode ); data.setIntArray( "colorCode", colorCode );
@@ -20,7 +20,9 @@ package appeng.tile.crafting;
import java.io.IOException; import java.io.IOException;
import java.util.EnumMap;
import java.util.List; import java.util.List;
import java.util.Map;
import appeng.api.networking.security.IActionSource; import appeng.api.networking.security.IActionSource;
import appeng.api.storage.IMEMonitor; import appeng.api.storage.IMEMonitor;
@@ -28,6 +30,7 @@ import appeng.api.storage.IStorageMonitorable;
import appeng.api.storage.IStorageMonitorableAccessor; import appeng.api.storage.IStorageMonitorableAccessor;
import appeng.api.storage.channels.IItemStorageChannel; import appeng.api.storage.channels.IItemStorageChannel;
import appeng.capabilities.Capabilities; import appeng.capabilities.Capabilities;
import appeng.helpers.PatternHelper;
import appeng.me.helpers.MachineSource; import appeng.me.helpers.MachineSource;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
@@ -37,6 +40,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldServer; import net.minecraft.world.WorldServer;
import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLCommonHandler;
@@ -93,6 +97,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
private final AppEngInternalInventory patternInv = new AppEngInternalInventory( this, 1, 1 ); private final AppEngInternalInventory patternInv = new AppEngInternalInventory( this, 1, 1 );
private final IItemHandler gridInvExt = new WrapperFilteredItemHandler( this.gridInv, new CraftingGridFilter() ); private final IItemHandler gridInvExt = new WrapperFilteredItemHandler( this.gridInv, new CraftingGridFilter() );
private final IItemHandler internalInv = new WrapperChainedItemHandler( this.gridInv, this.patternInv ); private final IItemHandler internalInv = new WrapperChainedItemHandler( this.gridInv, this.patternInv );
private final EnumMap<EnumFacing, Object> neighbors = new EnumMap<>( EnumFacing.class );
private final IConfigManager settings; private final IConfigManager settings;
private final UpgradeInventory upgrades; private final UpgradeInventory upgrades;
private boolean isPowered = false; private boolean isPowered = false;
@@ -122,6 +127,126 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
return 5; return 5;
} }
public void updateNeighbors()
{
for( EnumFacing f : EnumFacing.VALUES )
{
TileEntity te = world.getTileEntity( pos.offset( f ) );
Object capability = null;
if( te != null )
{
// Prioritize a handler to directly link to another ME network
IStorageMonitorableAccessor accessor = te.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, f.getOpposite() );
if( accessor != null )
{
IStorageMonitorable inventory = accessor.getInventory( this.mySrc );
if( inventory != null )
{
capability = inventory;
}
}
if( capability == null )
{
capability = InventoryAdaptor.getAdaptor( te, f.getOpposite() );
}
}
if( capability != null )
{
neighbors.put( f, capability );
}
else
{
neighbors.remove( f );
}
}
}
@Override
public void onReady()
{
super.onReady();
updateNeighbors();
}
public void updateNeighbors( IBlockAccess w, BlockPos pos, BlockPos neighbor )
{
EnumFacing updateFromFacing;
if( pos.getX() != neighbor.getX() )
{
if( pos.getX() > neighbor.getX() )
{
updateFromFacing = EnumFacing.WEST;
}
else
{
updateFromFacing = EnumFacing.EAST;
}
}
else if( pos.getY() != neighbor.getY() )
{
if( pos.getY() > neighbor.getY() )
{
updateFromFacing = EnumFacing.DOWN;
}
else
{
updateFromFacing = EnumFacing.UP;
}
}
else if( pos.getZ() != neighbor.getZ() )
{
if( pos.getZ() > neighbor.getZ() )
{
updateFromFacing = EnumFacing.NORTH;
}
else
{
updateFromFacing = EnumFacing.SOUTH;
}
}
else
{
return;
}
if( pos.offset( updateFromFacing ).equals( neighbor ) )
{
TileEntity te = w.getTileEntity( neighbor );
Object capability = null;
if( te != null )
{
// Prioritize a handler to directly link to another ME network
IStorageMonitorableAccessor accessor = te.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, updateFromFacing.getOpposite() );
if( accessor != null )
{
IStorageMonitorable inventory = accessor.getInventory( this.mySrc );
if( inventory != null )
{
capability = inventory;
}
}
if( capability == null )
{
capability = InventoryAdaptor.getAdaptor( te, updateFromFacing.getOpposite() );
}
}
if( capability != null )
{
neighbors.put( updateFromFacing, capability );
}
else
{
neighbors.remove( updateFromFacing );
}
}
}
@Override @Override
public boolean pushPattern( final ICraftingPatternDetails patternDetails, final InventoryCrafting table, final EnumFacing where ) public boolean pushPattern( final ICraftingPatternDetails patternDetails, final InventoryCrafting table, final EnumFacing where )
{ {
@@ -151,7 +276,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
private void updateSleepiness() private void updateSleepiness()
{ {
final boolean wasEnabled = this.isAwake; final boolean wasEnabled = this.isAwake;
this.isAwake = this.myPlan != null && this.hasMats() || this.canPush(); this.isAwake = this.canPush() || this.myPlan != null && this.hasMats();
if( wasEnabled != this.isAwake ) if( wasEnabled != this.isAwake )
{ {
try try
@@ -187,9 +312,13 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
for( int x = 0; x < this.craftingInv.getSizeInventory(); x++ ) for( int x = 0; x < this.craftingInv.getSizeInventory(); x++ )
{ {
this.craftingInv.setInventorySlotContents( x, this.gridInv.getStackInSlot( x ) ); this.craftingInv.setInventorySlotContents( x, this.gridInv.getStackInSlot( x ) );
if( !myPlan.isValidItemForSlot( x, craftingInv.getStackInSlot( x ), world ) )
{
return false;
}
} }
return !this.myPlan.getOutput( this.craftingInv, this.getWorld() ).isEmpty(); return this.myPlan.getOutputs().length > 0;
} }
@Override @Override
@@ -527,10 +656,7 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
{ {
try try
{ {
return (int) ( this.getProxy() return (int) ( this.getProxy().getEnergy().extractAEPower( ticksPassed * bonusValue * acceleratorTax, Actionable.MODULATE, PowerMultiplier.CONFIG ) / acceleratorTax );
.getEnergy()
.extractAEPower( ticksPassed * bonusValue * acceleratorTax, Actionable.MODULATE,
PowerMultiplier.CONFIG ) / acceleratorTax );
} }
catch( final GridAccessException e ) catch( final GridAccessException e )
{ {
@@ -542,9 +668,13 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
{ {
if( this.pushDirection == AEPartLocation.INTERNAL ) if( this.pushDirection == AEPartLocation.INTERNAL )
{ {
for( final EnumFacing d : EnumFacing.VALUES ) for( final Map.Entry<EnumFacing, Object> d : neighbors.entrySet() )
{ {
output = this.pushTo( output, d ); output = this.pushTo( output, d.getKey() );
if( output.isEmpty() )
{
break;
}
} }
} }
else else
@@ -568,21 +698,11 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
return output; return output;
} }
final TileEntity te = this.getWorld().getTileEntity( this.pos.offset( d ) ); Object capability = neighbors.get( d );
if( capability instanceof IStorageMonitorable )
if( te == null )
{ {
return output;
}
// Prioritize a handler to directly link to another ME network // Prioritize a handler to directly link to another ME network
IStorageMonitorableAccessor accessor = te.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, d.getOpposite() ); IStorageMonitorable inventory = (IStorageMonitorable) capability;
if( accessor != null )
{
IStorageMonitorable inventory = accessor.getInventory( this.mySrc );
if( inventory != null )
{
IAEItemStack toInsert = AEItemStack.fromItemStack( output ); IAEItemStack toInsert = AEItemStack.fromItemStack( output );
IMEMonitor<IAEItemStack> inv = inventory.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ); IMEMonitor<IAEItemStack> inv = inventory.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
IAEItemStack remainder = inv.injectItems( toInsert, Actionable.SIMULATE, this.mySrc ); IAEItemStack remainder = inv.injectItems( toInsert, Actionable.SIMULATE, this.mySrc );
@@ -595,29 +715,26 @@ public class TileMolecularAssembler extends AENetworkInvTile implements IUpgrade
{ {
if( remainder.getStackSize() == toInsert.getStackSize() ) if( remainder.getStackSize() == toInsert.getStackSize() )
{ {
return output.copy(); return output;
} }
inv.injectItems( toInsert.setStackSize( toInsert.getStackSize() - remainder.getStackSize() ), Actionable.MODULATE, this.mySrc ); inv.injectItems( toInsert.setStackSize( toInsert.getStackSize() - remainder.getStackSize() ), Actionable.MODULATE, this.mySrc );
this.saveChanges();
return remainder.createItemStack(); return remainder.createItemStack();
} }
} }
} else if( capability instanceof InventoryAdaptor )
final InventoryAdaptor adaptor = InventoryAdaptor.getAdaptor( te, d.getOpposite() );
if( adaptor == null )
{ {
return output; InventoryAdaptor adaptor = (InventoryAdaptor) capability;
}
final int size = output.getCount(); final int size = output.getCount();
output = adaptor.addItems( output.copy() ); output = adaptor.addItems( output );
final int newSize = output.isEmpty() ? 0 : output.getCount(); final int newSize = output.isEmpty() ? 0 : output.getCount();
if( size != newSize ) if( size != newSize )
{ {
this.saveChanges(); this.saveChanges();
} }
}
return output; return output;
} }
@@ -77,6 +77,10 @@ public class AppEngInternalInventory extends ItemStackHandler implements Iterabl
@Override @Override
public void setStackInSlot( int slot, @Nonnull ItemStack stack ) public void setStackInSlot( int slot, @Nonnull ItemStack stack )
{ {
if( stack == this.getStackInSlot( slot ) )
{
return;
}
this.previousStack = this.getStackInSlot( slot ).copy(); this.previousStack = this.getStackInSlot( slot ).copy();
super.setStackInSlot( slot, stack ); super.setStackInSlot( slot, stack );
} }
@@ -23,7 +23,7 @@ public class GTCEEnergyAdapter implements IEnergyContainer
final double power = voltage * amperage; final double power = voltage * amperage;
final double oldBuffer = EUBuffer; final double oldBuffer = EUBuffer;
EUBuffer = this.sink.injectExternalPower( PowerUnits.GTCEU, power + EUBuffer, Actionable.MODULATE ); EUBuffer = this.sink.injectExternalPower( PowerUnits.GTEU, power + EUBuffer, Actionable.MODULATE );
// if the overflow went down, all inputs were consumed // if the overflow went down, all inputs were consumed
if( EUBuffer <= oldBuffer ) if( EUBuffer <= oldBuffer )
@@ -60,13 +60,13 @@ public class GTCEEnergyAdapter implements IEnergyContainer
@Override @Override
public long getEnergyStored() public long getEnergyStored()
{ {
return (long) Math.floor( PowerUnits.AE.convertTo( PowerUnits.GTCEU, this.sink.getAECurrentPower() ) ); return (long) Math.floor( PowerUnits.AE.convertTo( PowerUnits.GTEU, this.sink.getAECurrentPower() ) );
} }
@Override @Override
public long getEnergyCapacity() public long getEnergyCapacity()
{ {
return (long) Math.floor( PowerUnits.AE.convertTo( PowerUnits.GTCEU, this.sink.getAEMaxPower() ) ); return (long) Math.floor( PowerUnits.AE.convertTo( PowerUnits.GTEU, this.sink.getAEMaxPower() ) );
} }
@Override @Override
@@ -223,26 +223,28 @@ public class AdaptorItemHandler extends InventoryAdaptor
return this.addItems( toBeSimulated, true ); return this.addItems( toBeSimulated, true );
} }
protected ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate ) protected ItemStack addItems( ItemStack itemsToAdd, final boolean simulate )
{ {
if( itemsToAdd.isEmpty() ) if( itemsToAdd.isEmpty() )
{ {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
ItemStack left = itemsToAdd.copy();
for( int slot = 0; slot < this.itemHandler.getSlots(); slot++ ) for( int slot = 0; slot < this.itemHandler.getSlots(); slot++ )
{ {
left = this.itemHandler.insertItem( slot, left, simulate ); if( !simulate )
{
itemsToAdd = itemsToAdd.copy();
}
itemsToAdd = this.itemHandler.insertItem( slot, itemsToAdd, simulate );
if( left.isEmpty() ) if( itemsToAdd.isEmpty() )
{ {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
} }
return left; return itemsToAdd;
} }
@Override @Override
@@ -163,23 +163,26 @@ public class AdaptorItemRepository extends InventoryAdaptor
return this.addItems( toBeAdded, false ); return this.addItems( toBeAdded, false );
} }
protected ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate ) protected ItemStack addItems( ItemStack itemsToAdd, final boolean simulate )
{ {
if( itemsToAdd.isEmpty() ) if( itemsToAdd.isEmpty() )
{ {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
ItemStack left = itemsToAdd.copy(); if( !simulate )
{
itemsToAdd = itemsToAdd.copy();
}
left = this.itemRepository.insertItem( left, simulate ); itemsToAdd = this.itemRepository.insertItem( itemsToAdd, simulate );
if( left.isEmpty() ) if( itemsToAdd.isEmpty() )
{ {
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
return left; return itemsToAdd;
} }
@Override @Override
@@ -4,14 +4,16 @@ import appeng.api.config.FuzzyMode;
import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList; import appeng.api.storage.data.IItemList;
import appeng.helpers.NonBlockingItems; import appeng.helpers.NonBlockingItems;
import appeng.util.Platform;
import appeng.util.item.AEItemStack; import appeng.util.item.AEItemStack;
import appeng.util.item.ItemList; import gregtech.common.items.MetaTool;
import it.unimi.dsi.fastutil.ints.IntSet;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
@@ -29,9 +31,12 @@ public class BlockingItemHandler extends BlockingInventoryAdaptor
boolean isBlockableItem( ItemStack stack ) boolean isBlockableItem( ItemStack stack )
{ {
IItemList<IAEItemStack> itemList = NonBlockingItems.INSTANCE.getMap().get( domain ); Object2ObjectOpenHashMap<Item, IntSet> map = NonBlockingItems.INSTANCE.getMap().get( domain );
Collection<IAEItemStack> item = itemList.findFuzzy( AEItemStack.fromItemStack( stack ), FuzzyMode.IGNORE_ALL ); if( map.get( stack.getItem() ) != null )
return item.isEmpty(); {
return !map.get( stack.getItem() ).contains( stack.getItemDamage() );
}
return true;
} }
@Override @Override
@@ -41,12 +46,11 @@ public class BlockingItemHandler extends BlockingInventoryAdaptor
for( int slot = 0; slot < slots; slot++ ) for( int slot = 0; slot < slots; slot++ )
{ {
ItemStack is = this.itemHandler.getStackInSlot( slot ); ItemStack is = this.itemHandler.getStackInSlot( slot );
if( is.isEmpty() || !isBlockableItem( is ) ) if( !is.isEmpty() && isBlockableItem( is ) )
{ {
continue;
}
return true; return true;
} }
}
return false; return false;
} }
+66 -33
View File
@@ -18,6 +18,7 @@
package appeng.util.item; package appeng.util.item;
import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@@ -42,7 +43,9 @@ import appeng.api.storage.data.IAEItemStack;
import appeng.core.Api; import appeng.core.Api;
import appeng.util.Platform; import appeng.util.Platform;
public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemStack {
public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemStack
{
private static final String NBT_STACKSIZE = "Cnt"; private static final String NBT_STACKSIZE = "Cnt";
private static final String NBT_REQUESTABLE = "Req"; private static final String NBT_REQUESTABLE = "Req";
private static final String NBT_CRAFTABLE = "Craft"; private static final String NBT_CRAFTABLE = "Craft";
@@ -56,15 +59,18 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
private List<String> tooltip; private List<String> tooltip;
private ItemStack cachedItemStack; private ItemStack cachedItemStack;
private AEItemStack(final AEItemStack is) { private AEItemStack( final AEItemStack is )
{
this.setStackSize( is.getStackSize() ); this.setStackSize( is.getStackSize() );
this.setCraftable( is.isCraftable() ); this.setCraftable( is.isCraftable() );
this.setCountRequestable( is.getCountRequestable() ); this.setCountRequestable( is.getCountRequestable() );
this.sharedStack = is.sharedStack; this.sharedStack = is.sharedStack;
this.oreReference = is.oreReference; this.oreReference = is.oreReference;
this.cachedItemStack = is.cachedItemStack;
} }
private AEItemStack(final AESharedItemStack is, long size) { private AEItemStack( final AESharedItemStack is, long size )
{
this.sharedStack = is; this.sharedStack = is;
this.setStackSize( size ); this.setStackSize( size );
this.setCraftable( false ); this.setCraftable( false );
@@ -73,8 +79,10 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Nullable @Nullable
public static AEItemStack fromItemStack(@Nonnull final ItemStack stack) { public static AEItemStack fromItemStack( @Nonnull final ItemStack stack )
if (stack.isEmpty()) { {
if( stack.isEmpty() )
{
return null; return null;
} }
@@ -103,7 +111,8 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public void writeToNBT(final NBTTagCompound i) { public void writeToNBT( final NBTTagCompound i )
{
this.getDefinition().writeToNBT( i ); this.getDefinition().writeToNBT( i );
i.setLong( NBT_STACKSIZE, this.getStackSize() ); i.setLong( NBT_STACKSIZE, this.getStackSize() );
@@ -136,8 +145,7 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
@Override @Override
public void writeToPacket( final ByteBuf i ) public void writeToPacket( final ByteBuf i )
{ {
final byte mask = (byte) ( ( this.getType( this.getStackSize() ) << 2 ) | ( this final byte mask = (byte) ( ( this.getType( this.getStackSize() ) << 2 ) | ( this.getType( this.getCountRequestable() ) << 4 ) | ( (byte) ( this.isCraftable() ? 1 : 0 ) << 6 ) | ( this.hasTagCompound() ? 1 : 0 ) << 7 );
.getType( this.getCountRequestable() ) << 4 ) | ( (byte) ( this.isCraftable() ? 1 : 0 ) << 6 ) | ( this.hasTagCompound() ? 1 : 0 ) << 7 );
i.writeByte( mask ); i.writeByte( mask );
ByteBufUtils.writeTag( i, this.getDefinition().serializeNBT() ); ByteBufUtils.writeTag( i, this.getDefinition().serializeNBT() );
@@ -146,8 +154,10 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public void add(final IAEItemStack option) { public void add( final IAEItemStack option )
if (option == null) { {
if( option == null )
{
return; return;
} }
@@ -157,7 +167,8 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public boolean fuzzyComparison(final IAEItemStack other, final FuzzyMode mode) { public boolean fuzzyComparison( final IAEItemStack other, final FuzzyMode mode )
{
final ItemStack itemStack = this.getDefinition(); final ItemStack itemStack = this.getDefinition();
final ItemStack otherStack = other.getDefinition(); final ItemStack otherStack = other.getDefinition();
@@ -165,7 +176,8 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public IAEItemStack copy() { public IAEItemStack copy()
{
return new AEItemStack( this ); return new AEItemStack( this );
} }
@@ -182,23 +194,26 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public IStorageChannel<IAEItemStack> getChannel() { public IStorageChannel<IAEItemStack> getChannel()
{
return Api.INSTANCE.storage().getStorageChannel( IItemStorageChannel.class ); return Api.INSTANCE.storage().getStorageChannel( IItemStorageChannel.class );
} }
@Override @Override
public ItemStack createItemStack() { public ItemStack createItemStack()
return ItemHandlerHelper.copyStackWithSize(this.getDefinition(), {
(int) Math.min(Integer.MAX_VALUE, this.getStackSize())); return ItemHandlerHelper.copyStackWithSize( this.getDefinition(), (int) Math.min( Integer.MAX_VALUE, this.getStackSize() ) );
} }
@Override @Override
public Item getItem() { public Item getItem()
{
return this.getDefinition().getItem(); return this.getDefinition().getItem();
} }
@Override @Override
public int getItemDamage() { public int getItemDamage()
{
return this.sharedStack.getItemDamage(); return this.sharedStack.getItemDamage();
} }
@@ -209,8 +224,10 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public boolean isSameType(final IAEItemStack otherStack) { public boolean isSameType( final IAEItemStack otherStack )
if (otherStack == null) { {
if( otherStack == null )
{
return false; return false;
} }
@@ -218,8 +235,10 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public boolean isSameType(final ItemStack otherStack) { public boolean isSameType( final ItemStack otherStack )
if (otherStack.isEmpty()) { {
if( otherStack.isEmpty() )
{
return false; return false;
} }
int oldSize = otherStack.getCount(); int oldSize = otherStack.getCount();
@@ -232,7 +251,8 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public int hashCode() { public int hashCode()
{
return this.sharedStack.hashCode(); return this.sharedStack.hashCode();
} }
@@ -260,8 +280,11 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
@Override @Override
public ItemStack getCachedItemStack( long stackSize ) public ItemStack getCachedItemStack( long stackSize )
{ {
@Nullable ItemStack currentCached = this.cachedItemStack; ItemStack currentCached = null;
cachedItemStack = ItemStack.EMPTY; if( this.cachedItemStack != null )
{
currentCached = this.cachedItemStack;
}
ItemStack itemStack; ItemStack itemStack;
@@ -329,26 +352,36 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
} }
@Override @Override
public ItemStack asItemStackRepresentation() { public ItemStack asItemStackRepresentation()
{
return this.getDefinition().copy(); return this.getDefinition().copy();
} }
@Override @Override
public ItemStack getDefinition() { public ItemStack getDefinition()
{
return this.sharedStack.getDefinition(); return this.sharedStack.getDefinition();
} }
AESharedItemStack getSharedStack() { AESharedItemStack getSharedStack()
{
return this.sharedStack; return this.sharedStack;
} }
private boolean fuzzyItemStackComparison(ItemStack a, ItemStack b, FuzzyMode mode) { private boolean fuzzyItemStackComparison( ItemStack a, ItemStack b, FuzzyMode mode )
if (a.getItem() == b.getItem() && a.getItem().isDamageable()) { {
if (mode == FuzzyMode.IGNORE_ALL) { if( a.getItem() == b.getItem() && a.getItem().isDamageable() )
{
if( mode == FuzzyMode.IGNORE_ALL )
{
return true; return true;
} else if (mode == FuzzyMode.PERCENT_99) { }
else if( mode == FuzzyMode.PERCENT_99 )
{
return a.getItemDamage() > 1 == b.getItemDamage() > 1; return a.getItemDamage() > 1 == b.getItemDamage() > 1;
} else { }
else
{
final float percentDamageOfA = (float) a.getItemDamage() / a.getMaxDamage(); final float percentDamageOfA = (float) a.getItemDamage() / a.getMaxDamage();
final float percentDamageOfB = (float) b.getItemDamage() / b.getMaxDamage(); final float percentDamageOfB = (float) b.getItemDamage() / b.getMaxDamage();
@@ -102,7 +102,7 @@ gui.appliedenergistics2.FluidTunnel=Fluid
gui.appliedenergistics2.RedstoneTunnel=Redstone gui.appliedenergistics2.RedstoneTunnel=Redstone
gui.appliedenergistics2.EUTunnel=EU gui.appliedenergistics2.EUTunnel=EU
gui.appliedenergistics2.FETunnel=FE gui.appliedenergistics2.FETunnel=FE
gui.appliedenergistics2.GTCEUTunnel=GTCEU gui.appliedenergistics2.GTEUTunnel=GTEU
gui.appliedenergistics2.LightTunnel=Light gui.appliedenergistics2.LightTunnel=Light
gui.appliedenergistics2.OCTunnel=OpenComputers gui.appliedenergistics2.OCTunnel=OpenComputers
gui.appliedenergistics2.PressureTunnel=Pressure gui.appliedenergistics2.PressureTunnel=Pressure
@@ -376,7 +376,7 @@ gui.tooltips.appliedenergistics2.HighlightInterface=Highlight interface
gui.appliedenergistics2.units.appliedenergstics=AE gui.appliedenergistics2.units.appliedenergstics=AE
gui.appliedenergistics2.units.ic2=Energy Units gui.appliedenergistics2.units.ic2=Energy Units
gui.appliedenergistics2.units.rf=Redstone Flux gui.appliedenergistics2.units.rf=Redstone Flux
gui.appliedenergistics2.units.gtceu=GTCEU gui.appliedenergistics2.units.gteu=GTEU
// Colors // Colors
gui.appliedenergistics2.White=White gui.appliedenergistics2.White=White
@@ -1,6 +0,0 @@
{
"parent": "appliedenergistics2:item/part/p2p_tunnel",
"textures": {
"type": "appliedenergistics2:parts/p2p/power_gtceu"
}
}
@@ -0,0 +1,6 @@
{
"parent": "appliedenergistics2:item/part/p2p_tunnel",
"textures": {
"type": "appliedenergistics2:parts/p2p/power_gteu"
}
}
@@ -1,6 +0,0 @@
{
"parent": "appliedenergistics2:part/p2p/p2p_tunnel_base",
"textures": {
"type": "appliedenergistics2:parts/p2p/power_gtceu"
}
}
@@ -0,0 +1,6 @@
{
"parent": "appliedenergistics2:part/p2p/p2p_tunnel_base",
"textures": {
"type": "appliedenergistics2:parts/p2p/power_gteu"
}
}