Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9fc96295a8 | |||
| fd3349614d | |||
| 903f211044 | |||
| 78e1e26a11 | |||
| 2a6de11597 | |||
| cd2b53af85 | |||
| 1c5565491a | |||
| 311cc5c6f6 | |||
| 41796449ed | |||
| 9eef9d3840 | |||
| 13afa6908a | |||
| 103438f805 | |||
| eaa01f7648 | |||
| e81fb09599 | |||
| 94d73aec7c | |||
| b51af43dba | |||
| 85dc8ae7c1 | |||
| c34176f392 | |||
| 76fe2175a0 | |||
| c5d33ed892 | |||
| b423d99879 | |||
| 81156b411d | |||
| 6be1660d41 |
+1
-1
@@ -57,7 +57,7 @@ tasks.withType(JavaCompile) {
|
|||||||
options.encoding = 'UTF-8'
|
options.encoding = 'UTF-8'
|
||||||
}
|
}
|
||||||
|
|
||||||
version = aeversion + "-" + aechannel + "-" + aebuild + " " + trousers
|
version = trousers + "-" + aeversion + "-" + aechannel + "-" + aebuild + "-" + trousersversion
|
||||||
group = aegroup
|
group = aegroup
|
||||||
archivesBaseName = aebasename
|
archivesBaseName = aebasename
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -3,8 +3,8 @@ aechannel=stable
|
|||||||
aebuild=7
|
aebuild=7
|
||||||
aegroup=appeng
|
aegroup=appeng
|
||||||
aebasename=appliedenergistics2
|
aebasename=appliedenergistics2
|
||||||
trousers=omni-fixes-v49b
|
trousers=trousers_edition
|
||||||
|
trousersversion=v49t
|
||||||
#########################################################
|
#########################################################
|
||||||
# Versions #
|
# Versions #
|
||||||
#########################################################
|
#########################################################
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ repositories {
|
|||||||
|
|
||||||
maven {
|
maven {
|
||||||
name = "Tesla repo"
|
name = "Tesla repo"
|
||||||
url "http://maven.mcmoddev.com"
|
url "https://maven.mcmoddev.com"
|
||||||
}
|
}
|
||||||
|
|
||||||
maven {
|
maven {
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ public interface IParts
|
|||||||
|
|
||||||
IItemDefinition storageBus();
|
IItemDefinition storageBus();
|
||||||
|
|
||||||
|
IItemDefinition oreDictStorageBus();
|
||||||
|
|
||||||
IItemDefinition importBus();
|
IItemDefinition importBus();
|
||||||
|
|
||||||
IItemDefinition exportBus();
|
IItemDefinition exportBus();
|
||||||
@@ -102,6 +104,8 @@ public interface IParts
|
|||||||
|
|
||||||
IItemDefinition patternTerminal();
|
IItemDefinition patternTerminal();
|
||||||
|
|
||||||
|
IItemDefinition expandedProcessingPatternTerminal();
|
||||||
|
|
||||||
IItemDefinition craftingTerminal();
|
IItemDefinition craftingTerminal();
|
||||||
|
|
||||||
IItemDefinition terminal();
|
IItemDefinition terminal();
|
||||||
|
|||||||
@@ -121,4 +121,8 @@ public interface IAEItemStack extends IAEStack<IAEItemStack>
|
|||||||
*/
|
*/
|
||||||
boolean equals(ItemStack is);
|
boolean equals(ItemStack is);
|
||||||
|
|
||||||
|
ItemStack getCachedItemStack();
|
||||||
|
|
||||||
|
void setCachedItemStack(ItemStack is);
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -104,7 +104,7 @@ public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>, IGhostIngre
|
|||||||
}
|
}
|
||||||
if( doStart && GuiScreen.isShiftKeyDown() && Mouse.isButtonDown( 0 ) )
|
if( doStart && GuiScreen.isShiftKeyDown() && Mouse.isButtonDown( 0 ) )
|
||||||
{
|
{
|
||||||
if( gui instanceof GuiUpgradeable || gui instanceof GuiPatternTerm )
|
if( gui instanceof GuiUpgradeable || gui instanceof GuiPatternTerm || gui instanceof GuiExpandedProcessingPatternTerm )
|
||||||
{
|
{
|
||||||
IJEIGhostIngredients ghostGui = ( (IJEIGhostIngredients) gui );
|
IJEIGhostIngredients ghostGui = ( (IJEIGhostIngredients) gui );
|
||||||
for( Target<I> target : targets )
|
for( Target<I> target : targets )
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ package appeng.client.gui.implementations;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
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 net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -123,6 +124,12 @@ public class GuiCraftAmount extends AEBaseGui
|
|||||||
this.originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
this.originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( target instanceof PartExpandedProcessingPatternTerminal )
|
||||||
|
{
|
||||||
|
myIcon = parts.expandedProcessingPatternTerminal().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||||
|
this.originalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
|
|
||||||
if( this.originalGui != null && !myIcon.isEmpty() )
|
if( this.originalGui != null && !myIcon.isEmpty() )
|
||||||
{
|
{
|
||||||
this.buttonList.add( this.originalGuiBtn = new GuiTabButton( this.guiLeft + 154, this.guiTop, myIcon, myIcon.getDisplayName(), this.itemRender ) );
|
this.buttonList.add( this.originalGuiBtn = new GuiTabButton( this.guiLeft + 154, this.guiTop, myIcon, myIcon.getDisplayName(), this.itemRender ) );
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
|
|
||||||
import org.lwjgl.input.Mouse;
|
import org.lwjgl.input.Mouse;
|
||||||
@@ -104,6 +105,11 @@ public class GuiCraftConfirm extends AEBaseGui
|
|||||||
{
|
{
|
||||||
this.OriginalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
this.OriginalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( te instanceof PartExpandedProcessingPatternTerminal )
|
||||||
|
{
|
||||||
|
this.OriginalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isAutoStart()
|
boolean isAutoStart()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ package appeng.client.gui.implementations;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import org.lwjgl.input.Mouse;
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
import net.minecraft.client.gui.GuiButton;
|
import net.minecraft.client.gui.GuiButton;
|
||||||
@@ -95,6 +96,12 @@ public class GuiCraftingStatus extends GuiCraftingCPU
|
|||||||
|
|
||||||
this.originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
this.originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( target instanceof PartExpandedProcessingPatternTerminal )
|
||||||
|
{
|
||||||
|
myIcon = parts.expandedProcessingPatternTerminal().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||||
|
this.originalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+277
@@ -0,0 +1,277 @@
|
|||||||
|
package appeng.client.gui.implementations;
|
||||||
|
|
||||||
|
import appeng.api.config.ActionItems;
|
||||||
|
import appeng.api.config.ItemSubstitution;
|
||||||
|
import appeng.api.config.Settings;
|
||||||
|
import appeng.api.storage.ITerminalHost;
|
||||||
|
import appeng.client.gui.widgets.GuiImgButton;
|
||||||
|
import appeng.client.gui.widgets.GuiTabButton;
|
||||||
|
import appeng.container.implementations.ContainerExpandedProcessingPatternTerm;
|
||||||
|
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||||
|
import appeng.container.slot.AppEngSlot;
|
||||||
|
import appeng.container.slot.SlotFake;
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import appeng.core.localization.GuiText;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketInventoryAction;
|
||||||
|
import appeng.core.sync.packets.PacketValueConfig;
|
||||||
|
import appeng.helpers.InventoryAction;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||||
|
import net.minecraft.client.gui.GuiButton;
|
||||||
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.inventory.Slot;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class GuiExpandedProcessingPatternTerm extends GuiMEMonitorable implements IJEIGhostIngredients
|
||||||
|
{
|
||||||
|
private static final String BACKGROUND_EXPANDED_PROCESSING_MODE = "guis/pattern_processing_expanded.png";
|
||||||
|
|
||||||
|
private static final String SUBSITUTION_DISABLE = "0";
|
||||||
|
private static final String SUBSITUTION_ENABLE = "1";
|
||||||
|
|
||||||
|
private static final String CRAFTMODE_CRFTING = "1";
|
||||||
|
private static final String CRAFTMODE_PROCESSING = "0";
|
||||||
|
|
||||||
|
private GuiTabButton tabCraftButton;
|
||||||
|
private GuiTabButton tabProcessButton;
|
||||||
|
private GuiImgButton substitutionsEnabledBtn;
|
||||||
|
private GuiImgButton substitutionsDisabledBtn;
|
||||||
|
private GuiImgButton encodeBtn;
|
||||||
|
private GuiImgButton clearBtn;
|
||||||
|
private GuiImgButton x2Btn;
|
||||||
|
private GuiImgButton x3Btn;
|
||||||
|
private GuiImgButton plusOneBtn;
|
||||||
|
private GuiImgButton divTwoBtn;
|
||||||
|
private GuiImgButton divThreeBtn;
|
||||||
|
private GuiImgButton minusOneBtn;
|
||||||
|
private GuiImgButton maxCountBtn;
|
||||||
|
public Map<IGhostIngredientHandler.Target<?>, Object> mapTargetSlot = new HashMap<>();
|
||||||
|
|
||||||
|
public GuiExpandedProcessingPatternTerm( final InventoryPlayer inventoryPlayer, final ITerminalHost te )
|
||||||
|
{
|
||||||
|
super( inventoryPlayer, te, new ContainerExpandedProcessingPatternTerm( inventoryPlayer, te ) );
|
||||||
|
this.setReservedSpace( 81 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void actionPerformed( final GuiButton btn )
|
||||||
|
{
|
||||||
|
super.actionPerformed( btn );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
if( this.tabCraftButton == btn || this.tabProcessButton == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.CraftMode", this.tabProcessButton == btn ? CRAFTMODE_CRFTING : CRAFTMODE_PROCESSING ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.encodeBtn == btn )
|
||||||
|
{
|
||||||
|
if( isShiftKeyDown() )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Encode", "2" ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Encode", "1" ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.clearBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Clear", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.x2Btn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MultiplyByTwo", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.x3Btn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MultiplyByThree", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.divTwoBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DivideByTwo", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.divThreeBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DivideByThree", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.plusOneBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.IncreaseByOne", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.minusOneBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.DecreaseByOne", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.maxCountBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.MaximizeCount", "1" ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.substitutionsEnabledBtn == btn || this.substitutionsDisabledBtn == btn )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "PatternTerminal.Substitute", this.substitutionsEnabledBtn == btn ? SUBSITUTION_DISABLE : SUBSITUTION_ENABLE ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( final IOException e )
|
||||||
|
{
|
||||||
|
AELog.error( e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initGui()
|
||||||
|
{
|
||||||
|
super.initGui();
|
||||||
|
|
||||||
|
this.tabCraftButton = new GuiTabButton( this.guiLeft + 173, this.guiTop + this.ySize - 177, new ItemStack( Blocks.CRAFTING_TABLE ), GuiText.CraftingPattern.getLocal(), this.itemRender );
|
||||||
|
this.buttonList.add( this.tabCraftButton );
|
||||||
|
|
||||||
|
this.tabProcessButton = new GuiTabButton( this.guiLeft + 173, this.guiTop + this.ySize - 177, new ItemStack( Blocks.FURNACE ), GuiText.ProcessingPattern.getLocal(), this.itemRender );
|
||||||
|
this.buttonList.add( this.tabProcessButton );
|
||||||
|
|
||||||
|
this.substitutionsEnabledBtn = new GuiImgButton( this.guiLeft + 84, this.guiTop + this.ySize - 163, Settings.ACTIONS, ItemSubstitution.ENABLED );
|
||||||
|
this.substitutionsEnabledBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.substitutionsEnabledBtn );
|
||||||
|
|
||||||
|
this.substitutionsDisabledBtn = new GuiImgButton( this.guiLeft + 84, this.guiTop + this.ySize - 163, Settings.ACTIONS, ItemSubstitution.DISABLED );
|
||||||
|
this.substitutionsDisabledBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.substitutionsDisabledBtn );
|
||||||
|
|
||||||
|
this.clearBtn = new GuiImgButton( this.guiLeft + 74, this.guiTop + this.ySize - 163, Settings.ACTIONS, ActionItems.CLOSE );
|
||||||
|
this.clearBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.clearBtn );
|
||||||
|
|
||||||
|
this.x3Btn = new GuiImgButton( this.guiLeft + 131, this.guiTop + this.ySize - 158, Settings.ACTIONS, ActionItems.MULTIPLY_BY_THREE );
|
||||||
|
this.x3Btn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.x3Btn );
|
||||||
|
|
||||||
|
this.x2Btn = new GuiImgButton( this.guiLeft + 131, this.guiTop + this.ySize - 148, Settings.ACTIONS, ActionItems.MULTIPLY_BY_TWO );
|
||||||
|
this.x2Btn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.x2Btn );
|
||||||
|
|
||||||
|
this.plusOneBtn = new GuiImgButton( this.guiLeft + 131, this.guiTop + this.ySize - 110, Settings.ACTIONS, ActionItems.INCREASE_BY_ONE );
|
||||||
|
this.plusOneBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.plusOneBtn );
|
||||||
|
|
||||||
|
this.divThreeBtn = new GuiImgButton( this.guiLeft + 87, this.guiTop + this.ySize - 158, Settings.ACTIONS, ActionItems.DIVIDE_BY_THREE );
|
||||||
|
this.divThreeBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.divThreeBtn );
|
||||||
|
|
||||||
|
this.divTwoBtn = new GuiImgButton( this.guiLeft + 87, this.guiTop + this.ySize - 148, Settings.ACTIONS, ActionItems.DIVIDE_BY_TWO );
|
||||||
|
this.divTwoBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.divTwoBtn );
|
||||||
|
|
||||||
|
this.minusOneBtn = new GuiImgButton( this.guiLeft + 87, this.guiTop + this.ySize - 110, Settings.ACTIONS, ActionItems.DECREASE_BY_ONE );
|
||||||
|
this.minusOneBtn.setHalfSize( true );
|
||||||
|
this.buttonList.add( this.minusOneBtn );
|
||||||
|
|
||||||
|
//this.maxCountBtn = new GuiImgButton( this.guiLeft + 128, this.guiTop + this.ySize - 108, Settings.ACTIONS, ActionItems.MAX_COUNT );
|
||||||
|
//this.maxCountBtn.setHalfSize( true );
|
||||||
|
//this.buttonList.add( this.maxCountBtn );
|
||||||
|
|
||||||
|
this.encodeBtn = new GuiImgButton( this.guiLeft + 147, this.guiTop + this.ySize - 142, Settings.ACTIONS, ActionItems.ENCODE );
|
||||||
|
this.buttonList.add( this.encodeBtn );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawFG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
||||||
|
{
|
||||||
|
this.tabCraftButton.visible = false;
|
||||||
|
this.tabProcessButton.visible = true;
|
||||||
|
this.substitutionsEnabledBtn.visible = false;
|
||||||
|
this.substitutionsDisabledBtn.visible = false;
|
||||||
|
this.x2Btn.visible = true;
|
||||||
|
this.x3Btn.visible = true;
|
||||||
|
this.divTwoBtn.visible = true;
|
||||||
|
this.divThreeBtn.visible = true;
|
||||||
|
this.plusOneBtn.visible = true;
|
||||||
|
this.minusOneBtn.visible = true;
|
||||||
|
//this.maxCountBtn.visible = true;
|
||||||
|
|
||||||
|
super.drawFG( offsetX, offsetY, mouseX, mouseY );
|
||||||
|
this.fontRenderer.drawString( GuiText.PatternTerminal.getLocal(), 8, this.ySize - 96 + 2 - this.getReservedSpace(), 4210752 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String getBackground()
|
||||||
|
{
|
||||||
|
return BACKGROUND_EXPANDED_PROCESSING_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void repositionSlot( final AppEngSlot s )
|
||||||
|
{
|
||||||
|
final int offsetPlayerSide = s.isPlayerSide() ? 5 : 3;
|
||||||
|
|
||||||
|
s.yPos = s.getY() + this.ySize - 78 - offsetPlayerSide;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<IGhostIngredientHandler.Target<?>> getPhantomTargets( Object ingredient )
|
||||||
|
{
|
||||||
|
if( !( ingredient instanceof ItemStack ) )
|
||||||
|
{
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
List<IGhostIngredientHandler.Target<?>> targets = new ArrayList<>();
|
||||||
|
for( Slot slot : this.inventorySlots.inventorySlots )
|
||||||
|
{
|
||||||
|
if( slot instanceof SlotFake )
|
||||||
|
{
|
||||||
|
ItemStack itemStack = (ItemStack) ingredient;
|
||||||
|
IGhostIngredientHandler.Target<Object> target = new IGhostIngredientHandler.Target<Object>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Rectangle getArea()
|
||||||
|
{
|
||||||
|
return new Rectangle( getGuiLeft() + slot.xPos, getGuiTop() + slot.yPos, 16, 16 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept( Object ingredient )
|
||||||
|
{
|
||||||
|
final PacketInventoryAction p;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (SlotFake) slot, AEItemStack.fromItemStack( itemStack ) );
|
||||||
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
targets.add( target );
|
||||||
|
mapTargetSlot.putIfAbsent( target, slot );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return targets;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<IGhostIngredientHandler.Target<?>, Object> getFakeSlotTargetMap()
|
||||||
|
{
|
||||||
|
return mapTargetSlot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
package appeng.client.gui.implementations;
|
||||||
|
|
||||||
|
import appeng.api.config.ActionItems;
|
||||||
|
import appeng.api.config.Settings;
|
||||||
|
import appeng.client.gui.AEBaseGui;
|
||||||
|
import appeng.client.gui.widgets.GuiImgButton;
|
||||||
|
import appeng.client.gui.widgets.GuiTabButton;
|
||||||
|
import appeng.client.gui.widgets.MEGuiTextField;
|
||||||
|
import appeng.container.implementations.ContainerPartOreDictStorageBus;
|
||||||
|
import appeng.core.localization.GuiText;
|
||||||
|
import appeng.core.sync.GuiBridge;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketSwitchGuis;
|
||||||
|
import appeng.core.sync.packets.PacketValueConfig;
|
||||||
|
import appeng.parts.misc.PartOreDicStorageBus;
|
||||||
|
import net.minecraft.client.gui.GuiButton;
|
||||||
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
|
||||||
|
public class GuiPartOreDictStorageBus extends AEBaseGui
|
||||||
|
{
|
||||||
|
PartOreDicStorageBus part;
|
||||||
|
private GuiTabButton priority;
|
||||||
|
private GuiImgButton partition;
|
||||||
|
|
||||||
|
private static final Pattern ORE_DICTIONARY_FILTER = Pattern.compile( "\\*?[a-zA-Z0-9_|\\\\+(){,}?!=\\-\\[:\\]&^$]*\\*?" );
|
||||||
|
private MEGuiTextField searchFieldInputs;
|
||||||
|
|
||||||
|
public GuiPartOreDictStorageBus( final InventoryPlayer inventoryPlayer, final PartOreDicStorageBus te )
|
||||||
|
{
|
||||||
|
super( new ContainerPartOreDictStorageBus( inventoryPlayer, te ) );
|
||||||
|
part = te;
|
||||||
|
this.ySize = 84;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initGui()
|
||||||
|
{
|
||||||
|
super.initGui();
|
||||||
|
|
||||||
|
this.searchFieldInputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + 3, this.guiTop + 22, 170, 12 );
|
||||||
|
this.searchFieldInputs.setEnableBackgroundDrawing( false );
|
||||||
|
this.searchFieldInputs.setMaxStringLength( 512 );
|
||||||
|
this.searchFieldInputs.setTextColor( 0xFFFFFF );
|
||||||
|
this.searchFieldInputs.setVisible( true );
|
||||||
|
this.searchFieldInputs.setFocused( false );
|
||||||
|
this.searchFieldInputs.setValidator( str -> ORE_DICTIONARY_FILTER.matcher( str ).matches() );
|
||||||
|
|
||||||
|
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 ) );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "OreDictStorageBus.getRegex", "1" ) );
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void fillRegex( String regex )
|
||||||
|
{
|
||||||
|
this.searchFieldInputs.setText( regex );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void actionPerformed( final GuiButton btn ) throws IOException
|
||||||
|
{
|
||||||
|
super.actionPerformed( btn );
|
||||||
|
if( btn == this.priority )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketSwitchGuis( GuiBridge.GUI_PRIORITY ) );
|
||||||
|
}
|
||||||
|
if( btn == this.partition )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "StorageBus.Action", "Partition" ) );
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "OreDictStorageBus.getRegex", "1" ) );
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void mouseClicked( final int xCoord, final int yCoord, final int btn ) throws IOException
|
||||||
|
{
|
||||||
|
boolean wasFocused = this.searchFieldInputs.isFocused();
|
||||||
|
this.searchFieldInputs.mouseClicked( xCoord, yCoord, btn );
|
||||||
|
|
||||||
|
if( btn == 1 && this.searchFieldInputs.isMouseIn( xCoord, yCoord ) )
|
||||||
|
{
|
||||||
|
this.searchFieldInputs.setText( "" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !searchFieldInputs.isFocused() && wasFocused )
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketValueConfig( "OreDictStorageBus.save", searchFieldInputs.getText() ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
super.mouseClicked( xCoord, yCoord, btn );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void keyTyped( final char character, final int key ) throws IOException
|
||||||
|
{
|
||||||
|
if( !this.checkHotbarKeys( key ) )
|
||||||
|
{
|
||||||
|
if( !this.searchFieldInputs.textboxKeyTyped( character, key ) )
|
||||||
|
{
|
||||||
|
super.keyTyped( character, key );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawFG( int offsetX, int offsetY, int mouseX, int mouseY )
|
||||||
|
{
|
||||||
|
this.fontRenderer.drawString( this.getGuiDisplayName( GuiText.OreDictStorageBus.getLocal() ), 8, 6, 4210752 );
|
||||||
|
this.fontRenderer.drawString( this.searchFieldInputs.getText().length() + " / " + this.searchFieldInputs.getMaxStringLength(), 8, 36, 4210752 );
|
||||||
|
this.fontRenderer.drawSplitString( "Supports regex. Or use * as a wildcard", 6, 48, 174, 4210752 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawBG( int offsetX, int offsetY, int mouseX, int mouseY )
|
||||||
|
{
|
||||||
|
this.bindTexture( "guis/oredictstoragebus.png" );
|
||||||
|
this.drawTexturedModalRect( offsetX, offsetY, 0, 0, 175, 85 );
|
||||||
|
|
||||||
|
if( this.searchFieldInputs != null )
|
||||||
|
{
|
||||||
|
this.searchFieldInputs.drawTextBox();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,14 +19,9 @@
|
|||||||
package appeng.client.render.model;
|
package appeng.client.render.model;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import appeng.block.storage.BlockDrive;
|
||||||
import java.util.List;
|
import appeng.block.storage.DriveSlotState;
|
||||||
import java.util.Map;
|
import appeng.block.storage.DriveSlotsState;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
import javax.vecmath.Matrix4f;
|
|
||||||
import javax.vecmath.Vector3f;
|
|
||||||
|
|
||||||
import net.minecraft.block.state.IBlockState;
|
import net.minecraft.block.state.IBlockState;
|
||||||
import net.minecraft.client.renderer.block.model.BakedQuad;
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||||
import net.minecraft.client.renderer.block.model.IBakedModel;
|
import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||||
@@ -37,9 +32,12 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
|
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
|
||||||
import net.minecraftforge.common.property.IExtendedBlockState;
|
import net.minecraftforge.common.property.IExtendedBlockState;
|
||||||
|
|
||||||
import appeng.block.storage.BlockDrive;
|
import javax.annotation.Nullable;
|
||||||
import appeng.block.storage.DriveSlotState;
|
import javax.vecmath.Matrix4f;
|
||||||
import appeng.block.storage.DriveSlotsState;
|
import javax.vecmath.Vector3f;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
public class DriveBakedModel implements IBakedModel
|
public class DriveBakedModel implements IBakedModel
|
||||||
@@ -57,13 +55,17 @@ public class DriveBakedModel implements IBakedModel
|
|||||||
public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
|
public List<BakedQuad> getQuads( @Nullable IBlockState state, @Nullable EnumFacing side, long rand )
|
||||||
{
|
{
|
||||||
|
|
||||||
List<BakedQuad> result = new ArrayList<>();
|
List<BakedQuad> result = new ArrayList<>( this.bakedBase.getQuads( state, side, rand ) );
|
||||||
|
|
||||||
result.addAll( this.bakedBase.getQuads( state, side, rand ) );
|
|
||||||
|
|
||||||
if( side == null && state instanceof IExtendedBlockState )
|
if( side == null && state instanceof IExtendedBlockState )
|
||||||
{
|
{
|
||||||
IExtendedBlockState extState = (IExtendedBlockState) state;
|
IExtendedBlockState extState = (IExtendedBlockState) state;
|
||||||
|
|
||||||
|
if (!extState.getUnlistedNames().contains( BlockDrive.SLOTS_STATE ))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
DriveSlotsState slotsState = extState.getValue( BlockDrive.SLOTS_STATE );
|
DriveSlotsState slotsState = extState.getValue( BlockDrive.SLOTS_STATE );
|
||||||
|
|
||||||
for( int row = 0; row < 5; row++ )
|
for( int row = 0; row < 5; row++ )
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import java.util.concurrent.Future;
|
|||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -345,11 +346,15 @@ public class ContainerCraftConfirm extends AEBaseContainer
|
|||||||
originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
originalGui = GuiBridge.GUI_PATTERN_TERMINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( ah instanceof PartExpandedProcessingPatternTerminal )
|
||||||
|
{
|
||||||
|
originalGui = GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
|
|
||||||
if( this.result != null && !this.isSimulation() )
|
if( this.result != null && !this.isSimulation() )
|
||||||
{
|
{
|
||||||
final ICraftingGrid cc = this.getGrid().getCache( ICraftingGrid.class );
|
final ICraftingGrid cc = this.getGrid().getCache( ICraftingGrid.class );
|
||||||
final ICraftingLink g = cc.submitJob( this.result, null, this.getSelectedCpu() == -1 ? null : this.cpus.get( this.getSelectedCpu() ).getCpu(), true,
|
final ICraftingLink g = cc.submitJob( this.result, null, this.getSelectedCpu() == -1 ? null : this.cpus.get( this.getSelectedCpu() ).getCpu(), true, this.getActionSrc() );
|
||||||
this.getActionSrc() );
|
|
||||||
this.setAutoStart( false );
|
this.setAutoStart( false );
|
||||||
if( g != null && originalGui != null && this.getOpenContext() != null )
|
if( g != null && originalGui != null && this.getOpenContext() != null )
|
||||||
{
|
{
|
||||||
|
|||||||
+528
@@ -0,0 +1,528 @@
|
|||||||
|
package appeng.container.implementations;
|
||||||
|
|
||||||
|
import appeng.api.AEApi;
|
||||||
|
import appeng.api.definitions.IDefinitions;
|
||||||
|
import appeng.api.storage.ITerminalHost;
|
||||||
|
import appeng.container.slot.*;
|
||||||
|
import appeng.helpers.IContainerCraftingPacket;
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.inv.IAEAppEngInventory;
|
||||||
|
import appeng.util.inv.InvOperation;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
|
import net.minecraft.inventory.Slot;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTBase;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
import net.minecraftforge.items.wrapper.PlayerInvWrapper;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static appeng.helpers.PatternHelper.PROCESSING_INPUT_LIMIT;
|
||||||
|
import static appeng.helpers.PatternHelper.PROCESSING_OUTPUT_LIMIT;
|
||||||
|
|
||||||
|
|
||||||
|
public class ContainerExpandedProcessingPatternTerm extends ContainerMEMonitorable implements IAEAppEngInventory, IOptionalSlotHost, IContainerCraftingPacket
|
||||||
|
{
|
||||||
|
private final IItemHandler crafting;
|
||||||
|
private final SlotFakeCraftingMatrix[] gridSlots = new SlotFakeCraftingMatrix[PROCESSING_INPUT_LIMIT];
|
||||||
|
private final OptionalSlotFake[] outputSlots = new OptionalSlotFake[PROCESSING_OUTPUT_LIMIT];
|
||||||
|
private final SlotRestrictedInput patternSlotIN;
|
||||||
|
private final SlotRestrictedInput patternSlotOUT;
|
||||||
|
private final PartExpandedProcessingPatternTerminal expandedProcessingPatternTerminal;
|
||||||
|
|
||||||
|
public ContainerExpandedProcessingPatternTerm( InventoryPlayer ip, ITerminalHost monitorable )
|
||||||
|
{
|
||||||
|
super( ip, monitorable, false );
|
||||||
|
|
||||||
|
this.expandedProcessingPatternTerminal = (PartExpandedProcessingPatternTerminal) monitorable;
|
||||||
|
|
||||||
|
final IItemHandler patternInv = this.getExpandedPatternTerminal().getInventoryByName( "pattern" );
|
||||||
|
final IItemHandler output = this.getExpandedPatternTerminal().getInventoryByName( "output" );
|
||||||
|
|
||||||
|
this.crafting = this.getExpandedPatternTerminal().getInventoryByName( "crafting" );
|
||||||
|
|
||||||
|
for( int y = 0; y < 4; y++ )
|
||||||
|
{
|
||||||
|
for( int x = 0; x < 4; x++ )
|
||||||
|
{
|
||||||
|
this.addSlotToContainer( this.gridSlots[x + y * 4] = new SlotFakeCraftingMatrix( this.crafting, x + y * 4, 4 + x * 18, -85 + y * 18 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int y = 0; y < 3; y++ )
|
||||||
|
{
|
||||||
|
for( int x = 0; x < 2; x++ )
|
||||||
|
{
|
||||||
|
this.addSlotToContainer( this.outputSlots[x + y * 2] = new SlotPatternOutputs( output, this, x + y * 2, 96 + x * 18, -76 + y * 18, 0, 0, 1 ) );
|
||||||
|
this.outputSlots[x + y * 2].setRenderDisabled( false );
|
||||||
|
this.outputSlots[x + y * 2].setIIcon( -1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.addSlotToContainer( this.patternSlotIN = new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.BLANK_PATTERN, patternInv, 0, 147, -72 - 9, this.getInventoryPlayer() ) );
|
||||||
|
this.addSlotToContainer( this.patternSlotOUT = new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.ENCODED_PATTERN, patternInv, 1, 147, -72 + 34, this.getInventoryPlayer() ) );
|
||||||
|
|
||||||
|
this.patternSlotOUT.setStackLimit( 1 );
|
||||||
|
|
||||||
|
this.bindPlayerInventory( ip, 0, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack transferStackInSlot( final EntityPlayer p, final int idx )
|
||||||
|
{
|
||||||
|
if( Platform.isClient() )
|
||||||
|
{
|
||||||
|
return ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
if( this.inventorySlots.get( idx ) instanceof SlotPlayerInv || this.inventorySlots.get( idx ) instanceof SlotPlayerHotBar )
|
||||||
|
{
|
||||||
|
final AppEngSlot clickSlot = (AppEngSlot) this.inventorySlots.get( idx ); // require AE SLots!
|
||||||
|
ItemStack itemStack = clickSlot.getStack();
|
||||||
|
if( AEApi.instance().definitions().materials().blankPattern().isSameAs( itemStack ) )
|
||||||
|
{
|
||||||
|
IItemHandler patternInv = this.getExpandedPatternTerminal().getInventoryByName( "pattern" );
|
||||||
|
ItemStack remainder = patternInv.insertItem( 0, itemStack, false );
|
||||||
|
clickSlot.putStack( remainder );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.transferStackInSlot( p, idx );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveChanges()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack )
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void encodeAndMoveToInventory()
|
||||||
|
{
|
||||||
|
encode();
|
||||||
|
ItemStack output = this.patternSlotOUT.getStack();
|
||||||
|
if( !output.isEmpty() )
|
||||||
|
{
|
||||||
|
if( !getPlayerInv().addItemStackToInventory( output ) )
|
||||||
|
{
|
||||||
|
getPlayerInv().player.dropItem( output, false );
|
||||||
|
}
|
||||||
|
this.patternSlotOUT.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void encode()
|
||||||
|
{
|
||||||
|
ItemStack output = this.patternSlotOUT.getStack();
|
||||||
|
|
||||||
|
final ItemStack[] in = this.getInputs();
|
||||||
|
final ItemStack[] out = this.getOutputs();
|
||||||
|
|
||||||
|
// if there is no input, this would be silly.
|
||||||
|
if( in == null || out == null )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// first check the output slots, should either be null, or a pattern
|
||||||
|
if( !output.isEmpty() && !this.isPattern( output ) )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
} // if nothing is there we should snag a new pattern.
|
||||||
|
else if( output.isEmpty() )
|
||||||
|
{
|
||||||
|
output = this.patternSlotIN.getStack();
|
||||||
|
if( output.isEmpty() || !this.isPattern( output ) )
|
||||||
|
{
|
||||||
|
return; // no blanks.
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove one, and clear the input slot.
|
||||||
|
output.setCount( output.getCount() - 1 );
|
||||||
|
if( output.getCount() == 0 )
|
||||||
|
{
|
||||||
|
this.patternSlotIN.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
|
||||||
|
// add a new encoded pattern.
|
||||||
|
Optional<ItemStack> maybePattern = AEApi.instance().definitions().items().encodedPattern().maybeStack( 1 );
|
||||||
|
if( maybePattern.isPresent() )
|
||||||
|
{
|
||||||
|
output = maybePattern.get();
|
||||||
|
this.patternSlotOUT.putStack( output );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// encode the slot.
|
||||||
|
final NBTTagCompound encodedValue = new NBTTagCompound();
|
||||||
|
|
||||||
|
final NBTTagList tagIn = new NBTTagList();
|
||||||
|
final NBTTagList tagOut = new NBTTagList();
|
||||||
|
|
||||||
|
for( final ItemStack i : in )
|
||||||
|
{
|
||||||
|
tagIn.appendTag( this.createItemTag( i ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( final ItemStack i : out )
|
||||||
|
{
|
||||||
|
tagOut.appendTag( this.createItemTag( i ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
encodedValue.setTag( "in", tagIn );
|
||||||
|
encodedValue.setTag( "out", tagOut );
|
||||||
|
encodedValue.setBoolean( "crafting", false );
|
||||||
|
encodedValue.setBoolean( "substitute", false );
|
||||||
|
|
||||||
|
output.setTagCompound( encodedValue );
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isPattern( final ItemStack output )
|
||||||
|
{
|
||||||
|
if( output.isEmpty() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
final IDefinitions definitions = AEApi.instance().definitions();
|
||||||
|
|
||||||
|
boolean isPattern = definitions.items().encodedPattern().isSameAs( output );
|
||||||
|
isPattern |= definitions.materials().blankPattern().isSameAs( output );
|
||||||
|
|
||||||
|
return isPattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
NBTBase createItemTag( final ItemStack i )
|
||||||
|
{
|
||||||
|
final NBTTagCompound c = new NBTTagCompound();
|
||||||
|
|
||||||
|
if( !i.isEmpty() )
|
||||||
|
{
|
||||||
|
i.writeToNBT( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSlotEnabled( final int idx )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ItemStack[] getInputs()
|
||||||
|
{
|
||||||
|
final ItemStack[] input = new ItemStack[16];
|
||||||
|
boolean hasValue = false;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() )
|
||||||
|
{
|
||||||
|
hasValue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( hasValue )
|
||||||
|
{
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ItemStack[] getOutputs()
|
||||||
|
{
|
||||||
|
final List<ItemStack> list = new ArrayList<>( 3 );
|
||||||
|
boolean hasValue = false;
|
||||||
|
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
|
||||||
|
if( !out.isEmpty() && out.getCount() > 0 )
|
||||||
|
{
|
||||||
|
list.add( out );
|
||||||
|
hasValue = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( hasValue )
|
||||||
|
{
|
||||||
|
return list.toArray( new ItemStack[0] );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
for( final Slot s : this.gridSlots )
|
||||||
|
{
|
||||||
|
s.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( final Slot s : this.outputSlots )
|
||||||
|
{
|
||||||
|
s.putStack( ItemStack.EMPTY );
|
||||||
|
}
|
||||||
|
|
||||||
|
this.detectAndSendChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemHandler getInventoryByName( final String name )
|
||||||
|
{
|
||||||
|
if( name.equals( "player" ) )
|
||||||
|
{
|
||||||
|
return new PlayerInvWrapper( this.getInventoryPlayer() );
|
||||||
|
}
|
||||||
|
return this.getExpandedPatternTerminal().getInventoryByName( name );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean useRealItems()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PartExpandedProcessingPatternTerminal getExpandedPatternTerminal()
|
||||||
|
{
|
||||||
|
return this.expandedProcessingPatternTerminal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void multiply( int multiple )
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canMultiplyInputs = true;
|
||||||
|
boolean canMultiplyOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() * multiple > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canMultiplyInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() * multiple > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canMultiplyOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canMultiplyInputs && canMultiplyOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() * multiple );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() * multiple );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void divide( int divide )
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canDivideInputs = true;
|
||||||
|
boolean canDivideOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() % divide != 0 )
|
||||||
|
{
|
||||||
|
canDivideInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() % divide != 0 )
|
||||||
|
{
|
||||||
|
canDivideOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canDivideInputs && canDivideOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() / divide );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() / divide );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void increase( int increase )
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canIncreaseInputs = true;
|
||||||
|
boolean canIncreaseOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() + increase > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canIncreaseInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() + increase > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canIncreaseOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canIncreaseInputs && canIncreaseOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() + increase );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() + increase );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decrease( int decrease )
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canDecreaseInputs = true;
|
||||||
|
boolean canDecreaseOutputs = true;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() - decrease < 1 )
|
||||||
|
{
|
||||||
|
canDecreaseInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
if( !out.isEmpty() && out.getCount() - decrease < 1 )
|
||||||
|
{
|
||||||
|
canDecreaseOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canDecreaseInputs && canDecreaseOutputs )
|
||||||
|
{
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() - decrease );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() - decrease );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void maximizeCount()
|
||||||
|
{
|
||||||
|
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||||
|
boolean canGrowInputs = true;
|
||||||
|
boolean canGrowOutputs = true;
|
||||||
|
int maxInputStackGrowth = 0;
|
||||||
|
int maxOutputStackGrowth = 0;
|
||||||
|
|
||||||
|
for( int x = 0; x < this.gridSlots.length; x++ )
|
||||||
|
{
|
||||||
|
input[x] = this.gridSlots[x].getStack();
|
||||||
|
if( !input[x].isEmpty() && input[x].getMaxStackSize() - input[x].getCount() > maxInputStackGrowth )
|
||||||
|
{
|
||||||
|
maxInputStackGrowth = input[x].getMaxStackSize() - input[x].getCount();
|
||||||
|
}
|
||||||
|
if( !input[x].isEmpty() && input[x].getCount() + maxInputStackGrowth > input[x].getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canGrowInputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
final ItemStack out = outputSlot.getStack();
|
||||||
|
{
|
||||||
|
maxOutputStackGrowth = out.getMaxStackSize() - out.getCount();
|
||||||
|
}
|
||||||
|
if( !out.isEmpty() && out.getCount() + maxOutputStackGrowth > out.getMaxStackSize() )
|
||||||
|
{
|
||||||
|
canGrowOutputs = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( canGrowInputs && canGrowOutputs )
|
||||||
|
{
|
||||||
|
int maxStackGrowth = Math.min( maxInputStackGrowth, maxOutputStackGrowth );
|
||||||
|
for( SlotFakeCraftingMatrix craftingSlot : this.gridSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = craftingSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
craftingSlot.getStack().setCount( stack.getCount() + maxStackGrowth );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for( OptionalSlotFake outputSlot : this.outputSlots )
|
||||||
|
{
|
||||||
|
ItemStack stack = outputSlot.getStack();
|
||||||
|
if( !stack.isEmpty() )
|
||||||
|
{
|
||||||
|
outputSlot.getStack().setCount( stack.getCount() + maxStackGrowth );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
package appeng.container.implementations;
|
||||||
|
|
||||||
|
import appeng.api.AEApi;
|
||||||
|
import appeng.api.config.AccessRestriction;
|
||||||
|
import appeng.api.config.FuzzyMode;
|
||||||
|
import appeng.api.config.Settings;
|
||||||
|
import appeng.api.config.StorageFilter;
|
||||||
|
import appeng.api.storage.IMEInventory;
|
||||||
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.api.storage.data.IItemList;
|
||||||
|
import appeng.container.AEBaseContainer;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.core.sync.packets.PacketValueConfig;
|
||||||
|
import appeng.parts.misc.PartOreDicStorageBus;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.helpers.ItemHandlerUtil;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import appeng.util.item.OreReference;
|
||||||
|
import appeng.util.iterators.NullIterator;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
import net.minecraftforge.oredict.OreDictionary;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
public class ContainerPartOreDictStorageBus extends AEBaseContainer
|
||||||
|
{
|
||||||
|
private final PartOreDicStorageBus part;
|
||||||
|
|
||||||
|
public ContainerPartOreDictStorageBus( final InventoryPlayer ip, final PartOreDicStorageBus anchor )
|
||||||
|
{
|
||||||
|
super( ip, anchor );
|
||||||
|
this.part = anchor;
|
||||||
|
|
||||||
|
this.bindPlayerInventory( ip, 14, 256 - /* height of player inventory */82 );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void detectAndSendChanges()
|
||||||
|
{
|
||||||
|
if( Platform.isClient() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
super.detectAndSendChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void partition()
|
||||||
|
{
|
||||||
|
final IMEInventory<IAEItemStack> cellInv = this.part.getInternalHandler();
|
||||||
|
|
||||||
|
Set<Integer> oreIDs = new HashSet<>();
|
||||||
|
|
||||||
|
for( IAEItemStack itemStack : cellInv.getAvailableItems( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() ) )
|
||||||
|
{
|
||||||
|
OreReference ref = ( (AEItemStack) itemStack ).getOre().orElse( null );
|
||||||
|
if( ref != null )
|
||||||
|
{
|
||||||
|
oreIDs.addAll( ref.getOres() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String oreMatch = "(";
|
||||||
|
String append = "";
|
||||||
|
|
||||||
|
for( Iterator<Integer> it = oreIDs.iterator(); it.hasNext(); )
|
||||||
|
{
|
||||||
|
int oreID = it.next();
|
||||||
|
if( it.hasNext() )
|
||||||
|
{
|
||||||
|
append = ")|(";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
append = ")";
|
||||||
|
}
|
||||||
|
oreMatch = oreMatch.concat( OreDictionary.getOreName( oreID ) + append );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( oreMatch.equals( "(" ) )
|
||||||
|
{
|
||||||
|
oreMatch = "";
|
||||||
|
}
|
||||||
|
part.saveOreMatch( oreMatch );
|
||||||
|
|
||||||
|
this.detectAndSendChanges();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveOreMatch( String value )
|
||||||
|
{
|
||||||
|
part.saveOreMatch( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendRegex()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendTo( new PacketValueConfig( "OreDictStorageBus.sendRegex", part.getOreMatch() ), (EntityPlayerMP) getInventoryPlayer().player );
|
||||||
|
}
|
||||||
|
catch( IOException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -178,7 +178,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
this.getAndUpdateOutput();
|
this.getAndUpdateOutput();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack getAndUpdateOutput()
|
protected ItemStack getAndUpdateOutput()
|
||||||
{
|
{
|
||||||
final World world = this.getPlayerInv().player.world;
|
final World world = this.getPlayerInv().player.world;
|
||||||
final InventoryCrafting ic = new InventoryCrafting( this, 3, 3 );
|
final InventoryCrafting ic = new InventoryCrafting( this, 3, 3 );
|
||||||
@@ -505,7 +505,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack[] getInputs()
|
protected ItemStack[] getInputs()
|
||||||
{
|
{
|
||||||
final ItemStack[] input = new ItemStack[9];
|
final ItemStack[] input = new ItemStack[9];
|
||||||
boolean hasValue = false;
|
boolean hasValue = false;
|
||||||
@@ -527,7 +527,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack[] getOutputs()
|
protected ItemStack[] getOutputs()
|
||||||
{
|
{
|
||||||
if( this.isCraftingMode() )
|
if( this.isCraftingMode() )
|
||||||
{
|
{
|
||||||
@@ -535,7 +535,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
|
|
||||||
if( !out.isEmpty() && out.getCount() > 0 )
|
if( !out.isEmpty() && out.getCount() > 0 )
|
||||||
{
|
{
|
||||||
return new ItemStack[] { out };
|
return new ItemStack[]{out};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -563,7 +563,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isPattern( final ItemStack output )
|
boolean isPattern( final ItemStack output )
|
||||||
{
|
{
|
||||||
if( output.isEmpty() )
|
if( output.isEmpty() )
|
||||||
{
|
{
|
||||||
@@ -578,7 +578,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
return isPattern;
|
return isPattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
private NBTBase createItemTag( final ItemStack i )
|
NBTBase createItemTag( final ItemStack i )
|
||||||
{
|
{
|
||||||
final NBTTagCompound c = new NBTTagCompound();
|
final NBTTagCompound c = new NBTTagCompound();
|
||||||
|
|
||||||
@@ -824,7 +824,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
|
|||||||
return this.patternTerminal;
|
return this.patternTerminal;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isSubstitute()
|
boolean isSubstitute()
|
||||||
{
|
{
|
||||||
return this.substitute;
|
return this.substitute;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ public final class ApiParts implements IParts
|
|||||||
private final IItemDefinition toggleBus;
|
private final IItemDefinition toggleBus;
|
||||||
private final IItemDefinition invertedToggleBus;
|
private final IItemDefinition invertedToggleBus;
|
||||||
private final IItemDefinition storageBus;
|
private final IItemDefinition storageBus;
|
||||||
|
private final IItemDefinition oreDictStorageBus;
|
||||||
private final IItemDefinition importBus;
|
private final IItemDefinition importBus;
|
||||||
private final IItemDefinition exportBus;
|
private final IItemDefinition exportBus;
|
||||||
private final IItemDefinition iface;
|
private final IItemDefinition iface;
|
||||||
@@ -77,6 +78,7 @@ public final class ApiParts implements IParts
|
|||||||
private final IItemDefinition darkMonitor;
|
private final IItemDefinition darkMonitor;
|
||||||
private final IItemDefinition interfaceTerminal;
|
private final IItemDefinition interfaceTerminal;
|
||||||
private final IItemDefinition patternTerminal;
|
private final IItemDefinition patternTerminal;
|
||||||
|
private final IItemDefinition expandedProcessingPatternTerminal;
|
||||||
private final IItemDefinition craftingTerminal;
|
private final IItemDefinition craftingTerminal;
|
||||||
private final IItemDefinition terminal;
|
private final IItemDefinition terminal;
|
||||||
private final IItemDefinition storageMonitor;
|
private final IItemDefinition storageMonitor;
|
||||||
@@ -112,6 +114,7 @@ public final class ApiParts implements IParts
|
|||||||
this.toggleBus = new DamagedItemDefinition( "part.toggle_bus", itemPart.createPart( PartType.TOGGLE_BUS ) );
|
this.toggleBus = new DamagedItemDefinition( "part.toggle_bus", itemPart.createPart( PartType.TOGGLE_BUS ) );
|
||||||
this.invertedToggleBus = new DamagedItemDefinition( "part.toggle_bus.inverted", itemPart.createPart( PartType.INVERTED_TOGGLE_BUS ) );
|
this.invertedToggleBus = new DamagedItemDefinition( "part.toggle_bus.inverted", itemPart.createPart( PartType.INVERTED_TOGGLE_BUS ) );
|
||||||
this.storageBus = new DamagedItemDefinition( "part.bus.storage", itemPart.createPart( PartType.STORAGE_BUS ) );
|
this.storageBus = new DamagedItemDefinition( "part.bus.storage", itemPart.createPart( PartType.STORAGE_BUS ) );
|
||||||
|
this.oreDictStorageBus = new DamagedItemDefinition( "part.bus.oredict_storage", itemPart.createPart( PartType.OREDICT_STORAGE_BUS ) );
|
||||||
this.importBus = new DamagedItemDefinition( "part.bus.import", itemPart.createPart( PartType.IMPORT_BUS ) );
|
this.importBus = new DamagedItemDefinition( "part.bus.import", itemPart.createPart( PartType.IMPORT_BUS ) );
|
||||||
this.exportBus = new DamagedItemDefinition( "part.bus.export", itemPart.createPart( PartType.EXPORT_BUS ) );
|
this.exportBus = new DamagedItemDefinition( "part.bus.export", itemPart.createPart( PartType.EXPORT_BUS ) );
|
||||||
this.iface = new DamagedItemDefinition( "part.interface", itemPart.createPart( PartType.INTERFACE ) );
|
this.iface = new DamagedItemDefinition( "part.interface", itemPart.createPart( PartType.INTERFACE ) );
|
||||||
@@ -139,6 +142,7 @@ public final class ApiParts implements IParts
|
|||||||
this.darkMonitor = new DamagedItemDefinition( "part.monitor.dark", itemPart.createPart( PartType.DARK_MONITOR ) );
|
this.darkMonitor = new DamagedItemDefinition( "part.monitor.dark", itemPart.createPart( PartType.DARK_MONITOR ) );
|
||||||
this.interfaceTerminal = new DamagedItemDefinition( "part.terminal.interface", itemPart.createPart( PartType.INTERFACE_TERMINAL ) );
|
this.interfaceTerminal = new DamagedItemDefinition( "part.terminal.interface", itemPart.createPart( PartType.INTERFACE_TERMINAL ) );
|
||||||
this.patternTerminal = new DamagedItemDefinition( "part.terminal.pattern", itemPart.createPart( PartType.PATTERN_TERMINAL ) );
|
this.patternTerminal = new DamagedItemDefinition( "part.terminal.pattern", itemPart.createPart( PartType.PATTERN_TERMINAL ) );
|
||||||
|
this.expandedProcessingPatternTerminal = new DamagedItemDefinition( "part.terminal.expanded_processing_pattern", itemPart.createPart( PartType.EXPANDED_PROCESSING_PATTERN_TERMINAL ) );
|
||||||
this.craftingTerminal = new DamagedItemDefinition( "part.terminal.crafting", itemPart.createPart( PartType.CRAFTING_TERMINAL ) );
|
this.craftingTerminal = new DamagedItemDefinition( "part.terminal.crafting", itemPart.createPart( PartType.CRAFTING_TERMINAL ) );
|
||||||
this.terminal = new DamagedItemDefinition( "part.terminal", itemPart.createPart( PartType.TERMINAL ) );
|
this.terminal = new DamagedItemDefinition( "part.terminal", itemPart.createPart( PartType.TERMINAL ) );
|
||||||
this.storageMonitor = new DamagedItemDefinition( "part.monitor.storage", itemPart.createPart( PartType.STORAGE_MONITOR ) );
|
this.storageMonitor = new DamagedItemDefinition( "part.monitor.storage", itemPart.createPart( PartType.STORAGE_MONITOR ) );
|
||||||
@@ -245,6 +249,12 @@ public final class ApiParts implements IParts
|
|||||||
return this.storageBus;
|
return this.storageBus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemDefinition oreDictStorageBus()
|
||||||
|
{
|
||||||
|
return this.oreDictStorageBus;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IItemDefinition importBus()
|
public IItemDefinition importBus()
|
||||||
{
|
{
|
||||||
@@ -379,6 +389,12 @@ public final class ApiParts implements IParts
|
|||||||
return this.patternTerminal;
|
return this.patternTerminal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemDefinition expandedProcessingPatternTerminal()
|
||||||
|
{
|
||||||
|
return this.expandedProcessingPatternTerminal;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IItemDefinition craftingTerminal()
|
public IItemDefinition craftingTerminal()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ public enum GuiText
|
|||||||
EnergyDrain,
|
EnergyDrain,
|
||||||
|
|
||||||
StorageBus,
|
StorageBus,
|
||||||
|
OreDictStorageBus,
|
||||||
StorageBusFluids,
|
StorageBusFluids,
|
||||||
Priority,
|
Priority,
|
||||||
Security,
|
Security,
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ package appeng.core.sync;
|
|||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
|
|
||||||
|
import appeng.container.implementations.*;
|
||||||
|
import appeng.parts.misc.PartOreDicStorageBus;
|
||||||
|
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -53,39 +56,6 @@ import appeng.client.gui.GuiNull;
|
|||||||
import appeng.container.AEBaseContainer;
|
import appeng.container.AEBaseContainer;
|
||||||
import appeng.container.ContainerNull;
|
import appeng.container.ContainerNull;
|
||||||
import appeng.container.ContainerOpenContext;
|
import appeng.container.ContainerOpenContext;
|
||||||
import appeng.container.implementations.ContainerCellWorkbench;
|
|
||||||
import appeng.container.implementations.ContainerChest;
|
|
||||||
import appeng.container.implementations.ContainerCondenser;
|
|
||||||
import appeng.container.implementations.ContainerCraftAmount;
|
|
||||||
import appeng.container.implementations.ContainerCraftConfirm;
|
|
||||||
import appeng.container.implementations.ContainerCraftingCPU;
|
|
||||||
import appeng.container.implementations.ContainerCraftingStatus;
|
|
||||||
import appeng.container.implementations.ContainerCraftingTerm;
|
|
||||||
import appeng.container.implementations.ContainerDrive;
|
|
||||||
import appeng.container.implementations.ContainerFormationPlane;
|
|
||||||
import appeng.container.implementations.ContainerGrinder;
|
|
||||||
import appeng.container.implementations.ContainerIOPort;
|
|
||||||
import appeng.container.implementations.ContainerInscriber;
|
|
||||||
import appeng.container.implementations.ContainerInterface;
|
|
||||||
import appeng.container.implementations.ContainerInterfaceTerminal;
|
|
||||||
import appeng.container.implementations.ContainerLevelEmitter;
|
|
||||||
import appeng.container.implementations.ContainerMAC;
|
|
||||||
import appeng.container.implementations.ContainerMEMonitorable;
|
|
||||||
import appeng.container.implementations.ContainerMEPortableCell;
|
|
||||||
import appeng.container.implementations.ContainerNetworkStatus;
|
|
||||||
import appeng.container.implementations.ContainerNetworkTool;
|
|
||||||
import appeng.container.implementations.ContainerPatternTerm;
|
|
||||||
import appeng.container.implementations.ContainerPriority;
|
|
||||||
import appeng.container.implementations.ContainerQNB;
|
|
||||||
import appeng.container.implementations.ContainerQuartzKnife;
|
|
||||||
import appeng.container.implementations.ContainerSecurityStation;
|
|
||||||
import appeng.container.implementations.ContainerSkyChest;
|
|
||||||
import appeng.container.implementations.ContainerSpatialIOPort;
|
|
||||||
import appeng.container.implementations.ContainerStorageBus;
|
|
||||||
import appeng.container.implementations.ContainerUpgradeable;
|
|
||||||
import appeng.container.implementations.ContainerVibrationChamber;
|
|
||||||
import appeng.container.implementations.ContainerWireless;
|
|
||||||
import appeng.container.implementations.ContainerWirelessTerm;
|
|
||||||
import appeng.fluids.container.ContainerFluidFormationPlane;
|
import appeng.fluids.container.ContainerFluidFormationPlane;
|
||||||
import appeng.fluids.container.ContainerFluidIO;
|
import appeng.fluids.container.ContainerFluidIO;
|
||||||
import appeng.fluids.container.ContainerFluidInterface;
|
import appeng.fluids.container.ContainerFluidInterface;
|
||||||
@@ -171,6 +141,8 @@ 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_STORAGEBUS_FLUID( ContainerFluidStorageBus.class, PartFluidStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
GUI_STORAGEBUS_FLUID( ContainerFluidStorageBus.class, PartFluidStorageBus.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||||
|
|
||||||
GUI_FORMATION_PLANE( ContainerFormationPlane.class, PartFormationPlane.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
GUI_FORMATION_PLANE( ContainerFormationPlane.class, PartFormationPlane.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||||
@@ -185,6 +157,8 @@ public enum GuiBridge implements IGuiHandler
|
|||||||
|
|
||||||
GUI_PATTERN_TERMINAL( ContainerPatternTerm.class, PartPatternTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
|
GUI_PATTERN_TERMINAL( ContainerPatternTerm.class, PartPatternTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
|
||||||
|
|
||||||
|
GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL( ContainerExpandedProcessingPatternTerm.class, PartExpandedProcessingPatternTerminal.class, GuiHostType.WORLD, SecurityPermissions.CRAFT ),
|
||||||
|
|
||||||
GUI_FLUID_TERMINAL( ContainerFluidTerminal.class, ITerminalHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
GUI_FLUID_TERMINAL( ContainerFluidTerminal.class, ITerminalHost.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||||
|
|
||||||
// extends (Container/Gui) + Bus
|
// extends (Container/Gui) + Bus
|
||||||
|
|||||||
@@ -192,7 +192,20 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
}
|
}
|
||||||
else if( this.action == InventoryAction.PLACE_JEI_GHOST_ITEM )
|
else if( this.action == InventoryAction.PLACE_JEI_GHOST_ITEM )
|
||||||
{
|
{
|
||||||
if( sender.openContainer.inventorySlots.get( this.slot ) instanceof SlotFake )
|
if( sender.openContainer instanceof ContainerFluidConfigurable )
|
||||||
|
{
|
||||||
|
if( this.slotItem != null )
|
||||||
|
{
|
||||||
|
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||||
|
if( aefs != null )
|
||||||
|
{
|
||||||
|
aefs.setStackSize( 1000 );
|
||||||
|
( (ContainerFluidConfigurable) sender.openContainer ).getFluidConfigInventory().setFluidInSlot( this.slot, aefs );
|
||||||
|
NetworkHandler.instance().sendToServer( new PacketFluidSlot( Collections.singletonMap( this.slot, aefs ) ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( this.slot < sender.openContainer.inventorySlots.size() && sender.openContainer.inventorySlots.get( this.slot ) instanceof SlotFake )
|
||||||
{
|
{
|
||||||
if( this.slotItem != null )
|
if( this.slotItem != null )
|
||||||
{
|
{
|
||||||
@@ -217,20 +230,6 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
AELog.debug( e );
|
AELog.debug( e );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( sender.openContainer instanceof ContainerFluidConfigurable )
|
|
||||||
{
|
|
||||||
if( this.slotItem != null )
|
|
||||||
{
|
|
||||||
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
|
||||||
if( aefs != null )
|
|
||||||
{
|
|
||||||
aefs.setStackSize( 1000 );
|
|
||||||
( (ContainerFluidConfigurable) sender.openContainer ).getFluidConfigInventory().setFluidInSlot( this.slot, aefs );
|
|
||||||
NetworkHandler.instance().sendToServer( new PacketFluidSlot( Collections.singletonMap( this.slot, aefs ) ) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,11 +23,12 @@ import java.io.ByteArrayInputStream;
|
|||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Iterator;
|
import java.util.List;
|
||||||
|
|
||||||
import appeng.api.config.FuzzyMode;
|
import appeng.api.config.FuzzyMode;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.container.implementations.ContainerExpandedProcessingPatternTerm;
|
||||||
import appeng.container.implementations.ContainerPatternTerm;
|
import appeng.container.implementations.ContainerPatternTerm;
|
||||||
import gregtech.common.items.MetaTool;
|
import gregtech.common.items.MetaTool;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -69,8 +70,9 @@ import appeng.util.prioritylist.IPartitionList;
|
|||||||
public class PacketJEIRecipe extends AppEngPacket
|
public class PacketJEIRecipe extends AppEngPacket
|
||||||
{
|
{
|
||||||
|
|
||||||
private ItemStack[][] recipe;
|
private List<ItemStack[]> recipe;
|
||||||
private ItemStack[] output;
|
private List<ItemStack> output;
|
||||||
|
static ItemStack[] emptyArray = {ItemStack.EMPTY};
|
||||||
|
|
||||||
|
|
||||||
// automatic.
|
// automatic.
|
||||||
@@ -81,28 +83,35 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
final NBTTagCompound comp = CompressedStreamTools.readCompressed( bytes );
|
final NBTTagCompound comp = CompressedStreamTools.readCompressed( bytes );
|
||||||
if( comp != null )
|
if( comp != null )
|
||||||
{
|
{
|
||||||
this.recipe = new ItemStack[9][];
|
this.recipe = new ArrayList<>();
|
||||||
for( int x = 0; x < this.recipe.length; x++ )
|
|
||||||
|
for( int x = 0; x < comp.getKeySet().size(); x++ )
|
||||||
{
|
{
|
||||||
final NBTTagList list = comp.getTagList( "#" + x, 10 );
|
if( comp.hasKey( "#" + x ) )
|
||||||
if( list.tagCount() > 0 )
|
|
||||||
{
|
{
|
||||||
this.recipe[x] = new ItemStack[list.tagCount()];
|
final NBTTagList list = comp.getTagList( "#" + x, 10 );
|
||||||
for( int y = 0; y < list.tagCount(); y++ )
|
if( list.tagCount() > 0 )
|
||||||
{
|
{
|
||||||
this.recipe[x][y] = new ItemStack( list.getCompoundTagAt( y ) );
|
this.recipe.add( new ItemStack[list.tagCount()] );
|
||||||
|
for( int y = 0; y < list.tagCount(); y++ )
|
||||||
|
{
|
||||||
|
this.recipe.get( x )[y] = new ItemStack( list.getCompoundTagAt( y ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.recipe.add( emptyArray );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ( comp.hasKey("outputs") ) {
|
|
||||||
final NBTTagList outputList = comp.getTagList("outputs", 10);
|
if( comp.hasKey( "outputs" ) )
|
||||||
this.output = new ItemStack[3];
|
{
|
||||||
for( int x = 0; x < this.output.length; x++ )
|
final NBTTagList outputList = comp.getTagList( "outputs", 10 );
|
||||||
|
this.output = new ArrayList<>();
|
||||||
|
for( int z = 0; z < outputList.tagCount(); z++ )
|
||||||
{
|
{
|
||||||
if( outputList.tagCount() > 0 )
|
this.output.add( new ItemStack( outputList.getCompoundTagAt( z ) ) );
|
||||||
{
|
|
||||||
this.output[x] = new ItemStack(outputList.getCompoundTagAt( x ));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,15 +175,22 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
{
|
{
|
||||||
ItemStack currentItem = craftMatrix.getStackInSlot( x );
|
ItemStack currentItem = craftMatrix.getStackInSlot( x );
|
||||||
|
|
||||||
|
if (x >= this.recipe.size()) {
|
||||||
|
currentItem = ItemStack.EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
// prepare slots
|
// prepare slots
|
||||||
if( !currentItem.isEmpty() )
|
if( !currentItem.isEmpty() )
|
||||||
{
|
{
|
||||||
// already the correct item?
|
// already the correct item?
|
||||||
ItemStack newItem = this.canUseInSlot( x, currentItem );
|
ItemStack newItem = this.canUseInSlot( x, currentItem );
|
||||||
|
|
||||||
if ( !cct.useRealItems() && this.recipe[x] != null ) {
|
if( !cct.useRealItems() && this.recipe.get( x ) != null )
|
||||||
if (this.recipe[x].length > 0 )
|
{
|
||||||
currentItem.setCount( recipe[x][0].getCount() );
|
if( this.recipe.get( x ).length > 0 )
|
||||||
|
{
|
||||||
|
currentItem.setCount( recipe.get( x )[0].getCount() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// put away old item
|
// put away old item
|
||||||
@@ -193,12 +209,12 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( currentItem.isEmpty() && this.recipe[x] != null )
|
if( currentItem.isEmpty() && recipe.size() > x && recipe.get( x ) != null )
|
||||||
{
|
{
|
||||||
// for each variant
|
// for each variant
|
||||||
for( int y = 0; y < this.recipe[x].length && currentItem.isEmpty(); y++ )
|
for( int y = 0; y < this.recipe.get( x ).length && currentItem.isEmpty(); y++ )
|
||||||
{
|
{
|
||||||
final IAEItemStack request = AEItemStack.fromItemStack( this.recipe[x][y] );
|
final IAEItemStack request = AEItemStack.fromItemStack( this.recipe.get( x )[y] );
|
||||||
if( request != null )
|
if( request != null )
|
||||||
{
|
{
|
||||||
// try ae
|
// try ae
|
||||||
@@ -247,7 +263,7 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
{
|
{
|
||||||
if (!cct.useRealItems())
|
if (!cct.useRealItems())
|
||||||
{
|
{
|
||||||
out.setStackSize( recipe[x][y].getCount() );
|
out.setStackSize( recipe.get( x )[y].getCount() );
|
||||||
}
|
}
|
||||||
currentItem = out.createItemStack();
|
currentItem = out.createItemStack();
|
||||||
}
|
}
|
||||||
@@ -260,20 +276,20 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
|
|
||||||
if( cct.useRealItems() )
|
if( cct.useRealItems() )
|
||||||
{
|
{
|
||||||
currentItem = ad.removeSimilarItems(1, this.recipe[x][y],FuzzyMode.IGNORE_ALL, null );
|
currentItem = ad.removeSimilarItems( 1, this.recipe.get( x )[y], FuzzyMode.IGNORE_ALL, null );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
currentItem = ad.simulateSimilarRemove(recipe[x][y].getCount(), this.recipe[x][y],FuzzyMode.IGNORE_ALL, null );
|
currentItem = ad.simulateSimilarRemove( recipe.get( x )[y].getCount(), this.recipe.get( x )[y], FuzzyMode.IGNORE_ALL, null );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!cct.useRealItems())
|
if (!cct.useRealItems())
|
||||||
{
|
{
|
||||||
if( currentItem.isEmpty() && this.recipe[x] != null )
|
if( currentItem.isEmpty() && recipe.size() > x && this.recipe.get( x ) != null )
|
||||||
{
|
{
|
||||||
currentItem = this.recipe[x][0].copy();
|
currentItem = this.recipe.get( x )[0].copy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -282,14 +298,19 @@ 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() )
|
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 < this.output.length; ++i )
|
|
||||||
|
for( int i = 0; i < this.output.size(); ++i )
|
||||||
{
|
{
|
||||||
if( this.output[i] == null ) continue;
|
if( this.output.get( i ) == null )
|
||||||
ItemHandlerUtil.setStackInSlot( outputSlots, i, this.output[i] );
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ItemHandlerUtil.setStackInSlot( outputSlots, i, this.output.get( i ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -302,9 +323,9 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
*/
|
*/
|
||||||
private ItemStack canUseInSlot( int slot, ItemStack is )
|
private ItemStack canUseInSlot( int slot, ItemStack is )
|
||||||
{
|
{
|
||||||
if( this.recipe[slot] != null )
|
if( this.recipe.get( slot ) != null )
|
||||||
{
|
{
|
||||||
for( ItemStack option : this.recipe[slot] )
|
for( ItemStack option : this.recipe.get( slot ) )
|
||||||
{
|
{
|
||||||
if( ItemStack.areItemStacksEqual( is, option ) )
|
if( ItemStack.areItemStacksEqual( is, option ) )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ 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.container.implementations.*;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
@@ -40,17 +42,6 @@ import appeng.api.util.IConfigManager;
|
|||||||
import appeng.api.util.IConfigurableObject;
|
import appeng.api.util.IConfigurableObject;
|
||||||
import appeng.client.gui.implementations.GuiCraftingCPU;
|
import appeng.client.gui.implementations.GuiCraftingCPU;
|
||||||
import appeng.container.AEBaseContainer;
|
import appeng.container.AEBaseContainer;
|
||||||
import appeng.container.implementations.ContainerCellWorkbench;
|
|
||||||
import appeng.container.implementations.ContainerCraftConfirm;
|
|
||||||
import appeng.container.implementations.ContainerCraftingCPU;
|
|
||||||
import appeng.container.implementations.ContainerCraftingStatus;
|
|
||||||
import appeng.container.implementations.ContainerLevelEmitter;
|
|
||||||
import appeng.container.implementations.ContainerNetworkTool;
|
|
||||||
import appeng.container.implementations.ContainerPatternTerm;
|
|
||||||
import appeng.container.implementations.ContainerPriority;
|
|
||||||
import appeng.container.implementations.ContainerQuartzKnife;
|
|
||||||
import appeng.container.implementations.ContainerSecurityStation;
|
|
||||||
import appeng.container.implementations.ContainerStorageBus;
|
|
||||||
import appeng.core.sync.AppEngPacket;
|
import appeng.core.sync.AppEngPacket;
|
||||||
import appeng.core.sync.network.INetworkInfo;
|
import appeng.core.sync.network.INetworkInfo;
|
||||||
import appeng.fluids.container.ContainerFluidLevelEmitter;
|
import appeng.fluids.container.ContainerFluidLevelEmitter;
|
||||||
@@ -166,58 +157,109 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
final ContainerFluidLevelEmitter lvc = (ContainerFluidLevelEmitter) c;
|
final ContainerFluidLevelEmitter lvc = (ContainerFluidLevelEmitter) c;
|
||||||
lvc.setLevel( Long.parseLong( this.Value ), player );
|
lvc.setLevel( Long.parseLong( this.Value ), player );
|
||||||
}
|
}
|
||||||
else if( this.Name.startsWith( "PatternTerminal." ) && c instanceof ContainerPatternTerm )
|
else if( this.Name.startsWith( "PatternTerminal." ) )
|
||||||
{
|
{
|
||||||
final ContainerPatternTerm cpt = (ContainerPatternTerm) c;
|
if( c instanceof ContainerPatternTerm )
|
||||||
if( this.Name.equals( "PatternTerminal.CraftMode" ) )
|
|
||||||
{
|
{
|
||||||
cpt.getPatternTerminal().setCraftingRecipe( this.Value.equals( "1" ) );
|
final ContainerPatternTerm cpt = (ContainerPatternTerm) c;
|
||||||
}
|
if( this.Name.equals( "PatternTerminal.CraftMode" ) )
|
||||||
else if( this.Name.equals( "PatternTerminal.Encode" ) )
|
|
||||||
{
|
|
||||||
if (this.Value.equals( "2" )) {
|
|
||||||
cpt.encodeAndMoveToInventory();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
cpt.encode();
|
cpt.getPatternTerminal().setCraftingRecipe( this.Value.equals( "1" ) );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.Encode" ) )
|
||||||
|
{
|
||||||
|
if( this.Value.equals( "2" ) )
|
||||||
|
{
|
||||||
|
cpt.encodeAndMoveToInventory();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cpt.encode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.Clear" ) )
|
||||||
|
{
|
||||||
|
cpt.clear();
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MultiplyByTwo" ) )
|
||||||
|
{
|
||||||
|
cpt.multiply( 2 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MultiplyByThree" ) )
|
||||||
|
{
|
||||||
|
cpt.multiply( 3 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DivideByTwo" ) )
|
||||||
|
{
|
||||||
|
cpt.divide( 2 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DivideByThree" ) )
|
||||||
|
{
|
||||||
|
cpt.divide( 3 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.IncreaseByOne" ) )
|
||||||
|
{
|
||||||
|
cpt.increase( 1 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DecreaseByOne" ) )
|
||||||
|
{
|
||||||
|
cpt.decrease( 1 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MaximizeCount" ) )
|
||||||
|
{
|
||||||
|
cpt.maximizeCount();
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.Substitute" ) )
|
||||||
|
{
|
||||||
|
cpt.getPatternTerminal().setSubstitution( this.Value.equals( "1" ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( this.Name.equals( "PatternTerminal.Clear" ) )
|
else if( c instanceof ContainerExpandedProcessingPatternTerm )
|
||||||
{
|
{
|
||||||
cpt.clear();
|
final ContainerExpandedProcessingPatternTerm cept = (ContainerExpandedProcessingPatternTerm) c;
|
||||||
}
|
if( this.Name.equals( "PatternTerminal.Encode" ) )
|
||||||
else if( this.Name.equals( "PatternTerminal.MultiplyByTwo" ) )
|
{
|
||||||
{
|
if( this.Value.equals( "2" ) )
|
||||||
cpt.multiply(2);
|
{
|
||||||
}
|
cept.encodeAndMoveToInventory();
|
||||||
else if( this.Name.equals( "PatternTerminal.MultiplyByThree" ) )
|
}
|
||||||
{
|
else
|
||||||
cpt.multiply(3);
|
{
|
||||||
}
|
cept.encode();
|
||||||
else if( this.Name.equals( "PatternTerminal.DivideByTwo" ) )
|
}
|
||||||
{
|
}
|
||||||
cpt.divide(2);
|
else if( this.Name.equals( "PatternTerminal.Clear" ) )
|
||||||
}
|
{
|
||||||
else if( this.Name.equals( "PatternTerminal.DivideByThree" ) )
|
cept.clear();
|
||||||
{
|
}
|
||||||
cpt.divide(3);
|
else if( this.Name.equals( "PatternTerminal.MultiplyByTwo" ) )
|
||||||
}
|
{
|
||||||
else if( this.Name.equals( "PatternTerminal.IncreaseByOne" ) )
|
cept.multiply( 2 );
|
||||||
{
|
}
|
||||||
cpt.increase(1);
|
else if( this.Name.equals( "PatternTerminal.MultiplyByThree" ) )
|
||||||
}
|
{
|
||||||
else if( this.Name.equals( "PatternTerminal.DecreaseByOne" ) )
|
cept.multiply( 3 );
|
||||||
{
|
}
|
||||||
cpt.decrease(1);
|
else if( this.Name.equals( "PatternTerminal.DivideByTwo" ) )
|
||||||
}
|
{
|
||||||
else if( this.Name.equals( "PatternTerminal.MaximizeCount" ) )
|
cept.divide( 2 );
|
||||||
{
|
}
|
||||||
cpt.maximizeCount();
|
else if( this.Name.equals( "PatternTerminal.DivideByThree" ) )
|
||||||
}
|
{
|
||||||
else if( this.Name.equals( "PatternTerminal.Substitute" ) )
|
cept.divide( 3 );
|
||||||
{
|
}
|
||||||
cpt.getPatternTerminal().setSubstitution( this.Value.equals( "1" ) );
|
else if( this.Name.equals( "PatternTerminal.IncreaseByOne" ) )
|
||||||
|
{
|
||||||
|
cept.increase( 1 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.DecreaseByOne" ) )
|
||||||
|
{
|
||||||
|
cept.decrease( 1 );
|
||||||
|
}
|
||||||
|
else if( this.Name.equals( "PatternTerminal.MaximizeCount" ) )
|
||||||
|
{
|
||||||
|
cept.maximizeCount();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( this.Name.startsWith( "StorageBus." ) )
|
else if( this.Name.startsWith( "StorageBus." ) )
|
||||||
@@ -234,6 +276,10 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
{
|
{
|
||||||
( (ContainerFluidStorageBus) c ).partition();
|
( (ContainerFluidStorageBus) c ).partition();
|
||||||
}
|
}
|
||||||
|
else if( c instanceof ContainerPartOreDictStorageBus )
|
||||||
|
{
|
||||||
|
( (ContainerPartOreDictStorageBus) c ).partition();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if( this.Value.equals( "Clear" ) )
|
else if( this.Value.equals( "Clear" ) )
|
||||||
{
|
{
|
||||||
@@ -248,6 +294,20 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( this.Name.startsWith( "OreDictStorageBus" ) )
|
||||||
|
{
|
||||||
|
if( c instanceof ContainerPartOreDictStorageBus )
|
||||||
|
{
|
||||||
|
if( this.Name.equals( "OreDictStorageBus.save" ) )
|
||||||
|
{
|
||||||
|
( (ContainerPartOreDictStorageBus) c ).saveOreMatch( this.Value );
|
||||||
|
}
|
||||||
|
if( this.Name.equals( "OreDictStorageBus.getRegex" ) )
|
||||||
|
{
|
||||||
|
( (ContainerPartOreDictStorageBus) c ).sendRegex();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else if( this.Name.startsWith( "CellWorkbench." ) && c instanceof ContainerCellWorkbench )
|
else if( this.Name.startsWith( "CellWorkbench." ) && c instanceof ContainerCellWorkbench )
|
||||||
{
|
{
|
||||||
final ContainerCellWorkbench ccw = (ContainerCellWorkbench) c;
|
final ContainerCellWorkbench ccw = (ContainerCellWorkbench) c;
|
||||||
@@ -324,6 +384,14 @@ public class PacketValueConfig extends AppEngPacket
|
|||||||
( (GuiCraftingCPU) gs ).clearItems();
|
( (GuiCraftingCPU) gs ).clearItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if( this.Name.equals( "OreDictStorageBus.sendRegex" ) )
|
||||||
|
{
|
||||||
|
final GuiScreen gs = Minecraft.getMinecraft().currentScreen;
|
||||||
|
if( gs instanceof GuiPartOreDictStorageBus )
|
||||||
|
{
|
||||||
|
( (GuiPartOreDictStorageBus) gs ).fillRegex( this.Value );
|
||||||
|
}
|
||||||
|
}
|
||||||
else if( c instanceof IConfigurableObject )
|
else if( c instanceof IConfigurableObject )
|
||||||
{
|
{
|
||||||
final IConfigManager cm = ( (IConfigurableObject) c ).getConfigManager();
|
final IConfigManager cm = ( (IConfigurableObject) c ).getConfigManager();
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ public class CraftingTreeProcess
|
|||||||
pro.dive( job );
|
pro.dive( job );
|
||||||
}
|
}
|
||||||
|
|
||||||
job.addBytes( this.crafts * 8 + this.bytes );
|
job.addBytes( this.crafts + 8 + this.bytes );
|
||||||
}
|
}
|
||||||
|
|
||||||
IAEItemStack getAmountCrafted( IAEItemStack what2 )
|
IAEItemStack getAmountCrafted( IAEItemStack what2 )
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
|
|||||||
|
|
||||||
private final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<>( new NullInventory<IAEItemStack>(), AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
private final MEMonitorPassThrough<IAEItemStack> items = new MEMonitorPassThrough<>( new NullInventory<IAEItemStack>(), AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
private final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<>( new NullInventory<IAEFluidStack>(), AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
private final MEMonitorPassThrough<IAEFluidStack> fluids = new MEMonitorPassThrough<>( new NullInventory<IAEFluidStack>(), AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||||
private boolean resetConfigCache;
|
private boolean resetConfigCache = true;
|
||||||
private IMEMonitor<IAEFluidStack> configCachedHandler;
|
private IMEMonitor<IAEFluidStack> configCachedHandler;
|
||||||
|
|
||||||
public DualityFluidInterface( final AENetworkProxy networkProxy, final IFluidInterfaceHost ih )
|
public DualityFluidInterface( final AENetworkProxy networkProxy, final IFluidInterfaceHost ih )
|
||||||
@@ -117,15 +117,7 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
|
|||||||
|
|
||||||
public IUpgradeableHost getHost()
|
public IUpgradeableHost getHost()
|
||||||
{
|
{
|
||||||
if( this.iHost instanceof IUpgradeableHost )
|
return this.iHost;
|
||||||
{
|
|
||||||
return this.iHost;
|
|
||||||
}
|
|
||||||
if( this.iHost instanceof IUpgradeableHost )
|
|
||||||
{
|
|
||||||
return this.iHost;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -458,6 +450,7 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable
|
|||||||
if( cfg != hasConfig )
|
if( cfg != hasConfig )
|
||||||
{
|
{
|
||||||
resetConfigCache = true;
|
resetConfigCache = true;
|
||||||
|
this.notifyNeighbors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( inventory == this.tanks )
|
else if( inventory == this.tanks )
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ public class PartFluidLevelEmitter extends PartUpgradeable implements IStackWatc
|
|||||||
@Override
|
@Override
|
||||||
public void onStackChange( IItemList<?> o, IAEStack<?> fullStack, IAEStack<?> diffStack, IActionSource src, IStorageChannel<?> chan )
|
public void onStackChange( IItemList<?> o, IAEStack<?> fullStack, IAEStack<?> diffStack, IActionSource src, IStorageChannel<?> chan )
|
||||||
{
|
{
|
||||||
if( chan == AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) && diffStack.equals( this.config.getFluidInSlot( 0 ) ) )
|
if( chan == AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) && fullStack.equals( this.config.getFluidInSlot( 0 ) ) )
|
||||||
{
|
{
|
||||||
this.lastReportedValue = fullStack.getStackSize();
|
this.lastReportedValue = fullStack.getStackSize();
|
||||||
this.updateState();
|
this.updateState();
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -185,6 +185,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
if( cfg != hasConfig )
|
if( cfg != hasConfig )
|
||||||
{
|
{
|
||||||
resetConfigCache = true;
|
resetConfigCache = true;
|
||||||
|
this.notifyNeighbors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( inv == this.patterns && ( !removed.isEmpty() || !added.isEmpty() ) )
|
else if( inv == this.patterns && ( !removed.isEmpty() || !added.isEmpty() ) )
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ package appeng.helpers;
|
|||||||
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import net.minecraft.inventory.InventoryCrafting;
|
import net.minecraft.inventory.InventoryCrafting;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
@@ -38,9 +37,6 @@ import appeng.api.networking.crafting.ICraftingPatternDetails;
|
|||||||
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.ContainerNull;
|
import appeng.container.ContainerNull;
|
||||||
import appeng.core.AEConfig;
|
|
||||||
import appeng.core.AELog;
|
|
||||||
import appeng.core.features.AEFeature;
|
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
import net.minecraftforge.common.crafting.IShapedRecipe;
|
import net.minecraftforge.common.crafting.IShapedRecipe;
|
||||||
@@ -50,13 +46,16 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
{
|
{
|
||||||
|
|
||||||
private static final int CRAFTING_GRID_DIMENSION = 3;
|
private static final int CRAFTING_GRID_DIMENSION = 3;
|
||||||
private static final int ALL_INPUT_LIMIT = CRAFTING_GRID_DIMENSION * CRAFTING_GRID_DIMENSION;
|
private static final int CRAFTING_INPUT_LIMIT = CRAFTING_GRID_DIMENSION * CRAFTING_GRID_DIMENSION;
|
||||||
|
public static final int PROCESSING_INPUT_HEIGHT = 4;
|
||||||
|
public static final int PROCESSING_INPUT_WIDTH = 4;
|
||||||
|
public static final int PROCESSING_INPUT_LIMIT = PROCESSING_INPUT_HEIGHT * PROCESSING_INPUT_WIDTH;
|
||||||
private static final int CRAFTING_OUTPUT_LIMIT = 1;
|
private static final int CRAFTING_OUTPUT_LIMIT = 1;
|
||||||
private static final int PROCESSING_OUTPUT_LIMIT = 3;
|
public static final int PROCESSING_OUTPUT_LIMIT = 6;
|
||||||
|
|
||||||
private final ItemStack patternItem;
|
private final ItemStack patternItem;
|
||||||
private final InventoryCrafting crafting = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
private final InventoryCrafting crafting;
|
||||||
private final InventoryCrafting testFrame = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
private final InventoryCrafting testFrame;
|
||||||
private final ItemStack correctOutput;
|
private final ItemStack correctOutput;
|
||||||
private final IRecipe standardRecipe;
|
private final IRecipe standardRecipe;
|
||||||
private final IAEItemStack[] condensedInputs;
|
private final IAEItemStack[] condensedInputs;
|
||||||
@@ -84,6 +83,9 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
final NBTTagList outTag = encodedValue.getTagList( "out", 10 );
|
final NBTTagList outTag = encodedValue.getTagList( "out", 10 );
|
||||||
this.isCrafting = encodedValue.getBoolean( "crafting" );
|
this.isCrafting = encodedValue.getBoolean( "crafting" );
|
||||||
|
|
||||||
|
crafting = new InventoryCrafting( new ContainerNull(), isCrafting ? 3 : 4, isCrafting ? 3 : 4 );
|
||||||
|
testFrame = new InventoryCrafting( new ContainerNull(), isCrafting ? 3 : 4, isCrafting ? 3 : 4 );
|
||||||
|
|
||||||
this.canSubstitute = this.isCrafting && encodedValue.getBoolean( "substitute" );
|
this.canSubstitute = this.isCrafting && encodedValue.getBoolean( "substitute" );
|
||||||
this.patternItem = is;
|
this.patternItem = is;
|
||||||
this.pattern = AEItemStack.fromItemStack( is );
|
this.pattern = AEItemStack.fromItemStack( is );
|
||||||
@@ -149,9 +151,9 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable<Patter
|
|||||||
}
|
}
|
||||||
final int outputLength = out.size();
|
final int outputLength = out.size();
|
||||||
|
|
||||||
this.inputs = in.toArray(new IAEItemStack[ALL_INPUT_LIMIT]);
|
this.inputs = in.toArray( new IAEItemStack[isCrafting ? CRAFTING_INPUT_LIMIT : PROCESSING_INPUT_LIMIT] );
|
||||||
this.outputs = out.toArray(new IAEItemStack[outputLength]);
|
this.outputs = out.toArray( new IAEItemStack[outputLength] );
|
||||||
this.substituteInputs = new HashMap<>(ALL_INPUT_LIMIT);
|
this.substituteInputs = new HashMap<>( CRAFTING_INPUT_LIMIT );
|
||||||
|
|
||||||
final Map<IAEItemStack, IAEItemStack> tmpOutputs = new HashMap<>();
|
final Map<IAEItemStack, IAEItemStack> tmpOutputs = new HashMap<>();
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import java.util.List;
|
|||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import appeng.client.gui.AEGuiHandler;
|
import appeng.client.gui.AEGuiHandler;
|
||||||
|
import appeng.container.implementations.ContainerExpandedProcessingPatternTerm;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
@@ -90,16 +91,13 @@ public class JEIPlugin implements IModPlugin
|
|||||||
this.registerDescriptions( definitions, registry );
|
this.registerDescriptions( definitions, registry );
|
||||||
|
|
||||||
// Allow recipe transfer from JEI to crafting and pattern terminal
|
// Allow recipe transfer from JEI to crafting and pattern terminal
|
||||||
registry.getRecipeTransferRegistry()
|
registry.getRecipeTransferRegistry().addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerCraftingTerm.class ), VanillaRecipeCategoryUid.CRAFTING );
|
||||||
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerCraftingTerm.class ),
|
registry.getRecipeTransferRegistry().addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ), Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
||||||
VanillaRecipeCategoryUid.CRAFTING );
|
registry.getRecipeTransferRegistry().addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerExpandedProcessingPatternTerm.class ), Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
||||||
registry.getRecipeTransferRegistry()
|
|
||||||
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ),
|
|
||||||
Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
|
||||||
|
|
||||||
aeGuiHandler = new AEGuiHandler();
|
aeGuiHandler = new AEGuiHandler();
|
||||||
registry.addAdvancedGuiHandlers(aeGuiHandler);
|
registry.addAdvancedGuiHandlers( aeGuiHandler );
|
||||||
registry.addGhostIngredientHandler( aeGuiHandler.getGuiContainerClass(), aeGuiHandler);
|
registry.addGhostIngredientHandler( aeGuiHandler.getGuiContainerClass(), aeGuiHandler );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import appeng.parts.misc.*;
|
||||||
|
import appeng.parts.reporting.*;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
|
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
|
||||||
@@ -57,11 +59,6 @@ import appeng.parts.automation.PartFormationPlane;
|
|||||||
import appeng.parts.automation.PartIdentityAnnihilationPlane;
|
import appeng.parts.automation.PartIdentityAnnihilationPlane;
|
||||||
import appeng.parts.automation.PartImportBus;
|
import appeng.parts.automation.PartImportBus;
|
||||||
import appeng.parts.automation.PartLevelEmitter;
|
import appeng.parts.automation.PartLevelEmitter;
|
||||||
import appeng.parts.misc.PartCableAnchor;
|
|
||||||
import appeng.parts.misc.PartInterface;
|
|
||||||
import appeng.parts.misc.PartInvertedToggleBus;
|
|
||||||
import appeng.parts.misc.PartStorageBus;
|
|
||||||
import appeng.parts.misc.PartToggleBus;
|
|
||||||
import appeng.parts.networking.PartCableCovered;
|
import appeng.parts.networking.PartCableCovered;
|
||||||
import appeng.parts.networking.PartCableGlass;
|
import appeng.parts.networking.PartCableGlass;
|
||||||
import appeng.parts.networking.PartCableSmart;
|
import appeng.parts.networking.PartCableSmart;
|
||||||
@@ -75,15 +72,6 @@ import appeng.parts.p2p.PartP2PItems;
|
|||||||
import appeng.parts.p2p.PartP2PLight;
|
import appeng.parts.p2p.PartP2PLight;
|
||||||
import appeng.parts.p2p.PartP2PRedstone;
|
import appeng.parts.p2p.PartP2PRedstone;
|
||||||
import appeng.parts.p2p.PartP2PTunnelME;
|
import appeng.parts.p2p.PartP2PTunnelME;
|
||||||
import appeng.parts.reporting.PartConversionMonitor;
|
|
||||||
import appeng.parts.reporting.PartCraftingTerminal;
|
|
||||||
import appeng.parts.reporting.PartDarkPanel;
|
|
||||||
import appeng.parts.reporting.PartInterfaceTerminal;
|
|
||||||
import appeng.parts.reporting.PartPanel;
|
|
||||||
import appeng.parts.reporting.PartPatternTerminal;
|
|
||||||
import appeng.parts.reporting.PartSemiDarkPanel;
|
|
||||||
import appeng.parts.reporting.PartStorageMonitor;
|
|
||||||
import appeng.parts.reporting.PartTerminal;
|
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
|
||||||
|
|
||||||
@@ -193,14 +181,13 @@ public enum PartType
|
|||||||
|
|
||||||
MONITOR( 160, "monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartPanel.class, "itemIlluminatedPanel" ),
|
MONITOR( 160, "monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartPanel.class, "itemIlluminatedPanel" ),
|
||||||
|
|
||||||
SEMI_DARK_MONITOR( 180, "semi_dark_monitor", EnumSet.of( AEFeature.PANELS ), EnumSet
|
SEMI_DARK_MONITOR( 180, "semi_dark_monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartSemiDarkPanel.class, "itemIlluminatedPanel" ),
|
||||||
.noneOf( IntegrationType.class ), PartSemiDarkPanel.class, "itemIlluminatedPanel" ),
|
|
||||||
|
|
||||||
DARK_MONITOR( 200, "dark_monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartDarkPanel.class, "itemIlluminatedPanel" ),
|
DARK_MONITOR( 200, "dark_monitor", EnumSet.of( AEFeature.PANELS ), EnumSet.noneOf( IntegrationType.class ), PartDarkPanel.class, "itemIlluminatedPanel" ),
|
||||||
|
|
||||||
STORAGE_BUS( 220, "storage_bus", EnumSet.of( AEFeature.STORAGE_BUS ), EnumSet.noneOf( IntegrationType.class ), PartStorageBus.class ),
|
STORAGE_BUS( 220, "storage_bus", EnumSet.of( AEFeature.STORAGE_BUS ), EnumSet.noneOf( IntegrationType.class ), PartStorageBus.class ),
|
||||||
FLUID_STORAGE_BUS( 221, "fluid_storage_bus", EnumSet.of( AEFeature.FLUID_STORAGE_BUS ), EnumSet
|
FLUID_STORAGE_BUS( 221, "fluid_storage_bus", EnumSet.of( AEFeature.FLUID_STORAGE_BUS ), EnumSet.noneOf( IntegrationType.class ), PartFluidStorageBus.class ),
|
||||||
.noneOf( IntegrationType.class ), PartFluidStorageBus.class ),
|
OREDICT_STORAGE_BUS( 222, "oredict_storage_bus", EnumSet.of( AEFeature.STORAGE_BUS ), EnumSet.noneOf( IntegrationType.class ), PartOreDicStorageBus.class ),
|
||||||
|
|
||||||
IMPORT_BUS( 240, "import_bus", EnumSet.of( AEFeature.IMPORT_BUS ), EnumSet.noneOf( IntegrationType.class ), PartImportBus.class ),
|
IMPORT_BUS( 240, "import_bus", EnumSet.of( AEFeature.IMPORT_BUS ), EnumSet.noneOf( IntegrationType.class ), PartImportBus.class ),
|
||||||
|
|
||||||
@@ -211,94 +198,83 @@ public enum PartType
|
|||||||
FLUID_EXPORT_BUS( 261, "fluid_export_bus", EnumSet.of( AEFeature.FLUID_EXPORT_BUS ), EnumSet.noneOf( IntegrationType.class ), PartFluidExportBus.class ),
|
FLUID_EXPORT_BUS( 261, "fluid_export_bus", EnumSet.of( AEFeature.FLUID_EXPORT_BUS ), EnumSet.noneOf( IntegrationType.class ), PartFluidExportBus.class ),
|
||||||
|
|
||||||
LEVEL_EMITTER( 280, "level_emitter", EnumSet.of( AEFeature.LEVEL_EMITTER ), EnumSet.noneOf( IntegrationType.class ), PartLevelEmitter.class ),
|
LEVEL_EMITTER( 280, "level_emitter", EnumSet.of( AEFeature.LEVEL_EMITTER ), EnumSet.noneOf( IntegrationType.class ), PartLevelEmitter.class ),
|
||||||
FLUID_LEVEL_EMITTER( 281, "fluid_level_emitter", EnumSet.of( AEFeature.FLUID_LEVEL_EMITTER ), EnumSet
|
FLUID_LEVEL_EMITTER( 281, "fluid_level_emitter", EnumSet.of( AEFeature.FLUID_LEVEL_EMITTER ), EnumSet.noneOf( IntegrationType.class ), PartFluidLevelEmitter.class ),
|
||||||
.noneOf( IntegrationType.class ), PartFluidLevelEmitter.class ),
|
|
||||||
|
|
||||||
ANNIHILATION_PLANE( 300, "annihilation_plane", EnumSet.of( AEFeature.ANNIHILATION_PLANE ), EnumSet
|
ANNIHILATION_PLANE( 300, "annihilation_plane", EnumSet.of( AEFeature.ANNIHILATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartAnnihilationPlane.class ),
|
||||||
.noneOf( IntegrationType.class ), PartAnnihilationPlane.class ),
|
|
||||||
|
|
||||||
IDENTITY_ANNIHILATION_PLANE( 301, "identity_annihilation_plane", EnumSet.of( AEFeature.ANNIHILATION_PLANE, AEFeature.IDENTITY_ANNIHILATION_PLANE ), EnumSet
|
IDENTITY_ANNIHILATION_PLANE( 301, "identity_annihilation_plane", EnumSet.of( AEFeature.ANNIHILATION_PLANE, AEFeature.IDENTITY_ANNIHILATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartIdentityAnnihilationPlane.class ),
|
||||||
.noneOf( IntegrationType.class ), PartIdentityAnnihilationPlane.class ),
|
|
||||||
|
|
||||||
FLUID_ANNIHILATION_PLANE( 302, "fluid_annihilation_plane", EnumSet.of( AEFeature.FLUID_ANNIHILATION_PLANE ), EnumSet
|
FLUID_ANNIHILATION_PLANE( 302, "fluid_annihilation_plane", EnumSet.of( AEFeature.FLUID_ANNIHILATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartFluidAnnihilationPlane.class ),
|
||||||
.noneOf( IntegrationType.class ), PartFluidAnnihilationPlane.class ),
|
|
||||||
|
|
||||||
FORMATION_PLANE( 320, "formation_plane", EnumSet.of( AEFeature.FORMATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartFormationPlane.class ),
|
FORMATION_PLANE( 320, "formation_plane", EnumSet.of( AEFeature.FORMATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartFormationPlane.class ),
|
||||||
|
|
||||||
FLUID_FORMATION_PLANE( 321, "fluid_formation_plane", EnumSet.of( AEFeature.FLUID_FORMATION_PLANE ), EnumSet
|
FLUID_FORMATION_PLANE( 321, "fluid_formation_plane", EnumSet.of( AEFeature.FLUID_FORMATION_PLANE ), EnumSet.noneOf( IntegrationType.class ), PartFluidFormationPlane.class ),
|
||||||
.noneOf( IntegrationType.class ), PartFluidFormationPlane.class ),
|
|
||||||
|
|
||||||
PATTERN_TERMINAL( 340, "pattern_terminal", EnumSet.of( AEFeature.PATTERNS ), EnumSet.noneOf( IntegrationType.class ), PartPatternTerminal.class ),
|
PATTERN_TERMINAL( 340, "pattern_terminal", EnumSet.of( AEFeature.PATTERNS ), EnumSet.noneOf( IntegrationType.class ), PartPatternTerminal.class ),
|
||||||
|
|
||||||
CRAFTING_TERMINAL( 360, "crafting_terminal", EnumSet.of( AEFeature.CRAFTING_TERMINAL ), EnumSet
|
EXPANDED_PROCESSING_PATTERN_TERMINAL( 341, "expanded_processing_pattern_terminal", EnumSet.of( AEFeature.PATTERNS ), EnumSet.noneOf( IntegrationType.class ), PartExpandedProcessingPatternTerminal.class ),
|
||||||
.noneOf( IntegrationType.class ), PartCraftingTerminal.class ),
|
|
||||||
|
CRAFTING_TERMINAL( 360, "crafting_terminal", EnumSet.of( AEFeature.CRAFTING_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartCraftingTerminal.class ),
|
||||||
|
|
||||||
TERMINAL( 380, "terminal", EnumSet.of( AEFeature.TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartTerminal.class ),
|
TERMINAL( 380, "terminal", EnumSet.of( AEFeature.TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartTerminal.class ),
|
||||||
|
|
||||||
STORAGE_MONITOR( 400, "storage_monitor", EnumSet.of( AEFeature.STORAGE_MONITOR ), EnumSet.noneOf( IntegrationType.class ), PartStorageMonitor.class ),
|
STORAGE_MONITOR( 400, "storage_monitor", EnumSet.of( AEFeature.STORAGE_MONITOR ), EnumSet.noneOf( IntegrationType.class ), PartStorageMonitor.class ),
|
||||||
|
|
||||||
CONVERSION_MONITOR( 420, "conversion_monitor", EnumSet.of( AEFeature.PART_CONVERSION_MONITOR ), EnumSet
|
CONVERSION_MONITOR( 420, "conversion_monitor", EnumSet.of( AEFeature.PART_CONVERSION_MONITOR ), EnumSet.noneOf( IntegrationType.class ), PartConversionMonitor.class ),
|
||||||
.noneOf( IntegrationType.class ), PartConversionMonitor.class ),
|
|
||||||
|
|
||||||
INTERFACE( 440, "interface", EnumSet.of( AEFeature.INTERFACE ), EnumSet.noneOf( IntegrationType.class ), PartInterface.class ),
|
INTERFACE( 440, "interface", EnumSet.of( AEFeature.INTERFACE ), EnumSet.noneOf( IntegrationType.class ), PartInterface.class ),
|
||||||
FLUID_INTERFACE( 441, "fluid_interface", EnumSet.of( AEFeature.FLUID_INTERFACE ), EnumSet.noneOf( IntegrationType.class ), PartFluidInterface.class ),
|
FLUID_INTERFACE( 441, "fluid_interface", EnumSet.of( AEFeature.FLUID_INTERFACE ), EnumSet.noneOf( IntegrationType.class ), PartFluidInterface.class ),
|
||||||
|
|
||||||
P2P_TUNNEL_ME( 460, "p2p_tunnel_me", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_ME ), EnumSet
|
P2P_TUNNEL_ME( 460, "p2p_tunnel_me", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_ME ), EnumSet.noneOf( IntegrationType.class ), PartP2PTunnelME.class, GuiText.METunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PTunnelME.class, GuiText.METunnel )
|
{
|
||||||
{
|
@Override
|
||||||
@Override
|
String getUnlocalizedName()
|
||||||
String getUnlocalizedName()
|
{
|
||||||
{
|
return "p2p_tunnel";
|
||||||
return "p2p_tunnel";
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
P2P_TUNNEL_REDSTONE( 461, "p2p_tunnel_redstone", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_REDSTONE ), EnumSet
|
P2P_TUNNEL_REDSTONE( 461, "p2p_tunnel_redstone", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_REDSTONE ), EnumSet.noneOf( IntegrationType.class ), PartP2PRedstone.class, GuiText.RedstoneTunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PRedstone.class, GuiText.RedstoneTunnel )
|
{
|
||||||
{
|
@Override
|
||||||
@Override
|
String getUnlocalizedName()
|
||||||
String getUnlocalizedName()
|
{
|
||||||
{
|
return "p2p_tunnel";
|
||||||
return "p2p_tunnel";
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
P2P_TUNNEL_ITEMS( 462, "p2p_tunnel_items", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_ITEMS ), EnumSet
|
P2P_TUNNEL_ITEMS( 462, "p2p_tunnel_items", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_ITEMS ), EnumSet.noneOf( IntegrationType.class ), PartP2PItems.class, GuiText.ItemTunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PItems.class, GuiText.ItemTunnel )
|
{
|
||||||
{
|
@Override
|
||||||
@Override
|
String getUnlocalizedName()
|
||||||
String getUnlocalizedName()
|
{
|
||||||
{
|
return "p2p_tunnel";
|
||||||
return "p2p_tunnel";
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
P2P_TUNNEL_FLUIDS( 463, "p2p_tunnel_fluids", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_FLUIDS ), EnumSet
|
P2P_TUNNEL_FLUIDS( 463, "p2p_tunnel_fluids", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_FLUIDS ), EnumSet.noneOf( IntegrationType.class ), PartP2PFluids.class, GuiText.FluidTunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PFluids.class, GuiText.FluidTunnel )
|
{
|
||||||
{
|
@Override
|
||||||
@Override
|
String getUnlocalizedName()
|
||||||
String getUnlocalizedName()
|
{
|
||||||
{
|
return "p2p_tunnel";
|
||||||
return "p2p_tunnel";
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
P2P_TUNNEL_IC2( 465, "p2p_tunnel_ic2", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_EU ), EnumSet
|
P2P_TUNNEL_IC2( 465, "p2p_tunnel_ic2", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_EU ), EnumSet.of( IntegrationType.IC2 ), PartP2PIC2Power.class, GuiText.EUTunnel )
|
||||||
.of( IntegrationType.IC2 ), PartP2PIC2Power.class, GuiText.EUTunnel )
|
{
|
||||||
{
|
@Override
|
||||||
@Override
|
String getUnlocalizedName()
|
||||||
String getUnlocalizedName()
|
{
|
||||||
{
|
return "p2p_tunnel";
|
||||||
return "p2p_tunnel";
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
P2P_TUNNEL_LIGHT( 467, "p2p_tunnel_light", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_LIGHT ), EnumSet
|
P2P_TUNNEL_LIGHT( 467, "p2p_tunnel_light", EnumSet.of( AEFeature.P2P_TUNNEL, AEFeature.P2P_TUNNEL_LIGHT ), EnumSet.noneOf( IntegrationType.class ), PartP2PLight.class, GuiText.LightTunnel )
|
||||||
.noneOf( IntegrationType.class ), PartP2PLight.class, GuiText.LightTunnel )
|
{
|
||||||
{
|
@Override
|
||||||
@Override
|
String getUnlocalizedName()
|
||||||
String getUnlocalizedName()
|
{
|
||||||
{
|
|
||||||
return "p2p_tunnel";
|
return "p2p_tunnel";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ import appeng.me.cache.CraftingGridCache;
|
|||||||
import appeng.me.pathfinding.IPathItem;
|
import appeng.me.pathfinding.IPathItem;
|
||||||
import appeng.util.IWorldCallable;
|
import appeng.util.IWorldCallable;
|
||||||
import appeng.util.ReadOnlyCollection;
|
import appeng.util.ReadOnlyCollection;
|
||||||
|
import net.minecraftforge.common.util.Constants;
|
||||||
|
|
||||||
|
|
||||||
public class GridNode implements IGridNode, IPathItem
|
public class GridNode implements IGridNode, IPathItem
|
||||||
@@ -333,7 +334,11 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
@Override
|
@Override
|
||||||
public void loadFromNBT( final String name, final NBTTagCompound nodeData )
|
public void loadFromNBT( final String name, final NBTTagCompound nodeData )
|
||||||
{
|
{
|
||||||
if( this.myGrid == null )
|
if( this.myGrid != null )
|
||||||
|
{
|
||||||
|
throw new IllegalStateException( "Loading data after part of a grid, this is invalid." );
|
||||||
|
}
|
||||||
|
if( nodeData.hasKey( name, 10 ) )
|
||||||
{
|
{
|
||||||
final NBTTagCompound node = nodeData.getCompoundTag( name );
|
final NBTTagCompound node = nodeData.getCompoundTag( name );
|
||||||
this.playerID = node.getInteger( "p" );
|
this.playerID = node.getInteger( "p" );
|
||||||
@@ -345,7 +350,9 @@ public class GridNode implements IGridNode, IPathItem
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
throw new IllegalStateException( "Loading data after part of a grid, this is invalid." );
|
this.playerID = -1; // Unknown owner
|
||||||
|
setLastSecurityKey( -1 );
|
||||||
|
setGridStorage( null );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -170,15 +170,14 @@ public class GridStorageCache implements IStorageGrid
|
|||||||
|
|
||||||
private CellChangeTracker addCellProvider( final ICellProvider cc, final CellChangeTracker tracker )
|
private CellChangeTracker addCellProvider( final ICellProvider cc, final CellChangeTracker tracker )
|
||||||
{
|
{
|
||||||
if( this.inactiveCellProviders.contains( cc ) && !this.activeCellProviders.contains( cc ))
|
if( this.inactiveCellProviders.contains( cc ) )
|
||||||
{
|
{
|
||||||
this.inactiveCellProviders.remove( cc );
|
this.inactiveCellProviders.remove( cc );
|
||||||
this.activeCellProviders.add( cc );
|
this.activeCellProviders.add( cc );
|
||||||
|
|
||||||
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
|
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
|
||||||
|
|
||||||
this.storageMonitors.forEach( ( channel, monitor ) ->
|
this.storageMonitors.forEach( ( channel, monitor ) -> {
|
||||||
{
|
|
||||||
for( final IMEInventoryHandler<?> h : cc.getCellArray( channel ) )
|
for( final IMEInventoryHandler<?> h : cc.getCellArray( channel ) )
|
||||||
{
|
{
|
||||||
tracker.postChanges( channel, 1, h, actionSrc );
|
tracker.postChanges( channel, 1, h, actionSrc );
|
||||||
@@ -247,8 +246,9 @@ public class GridStorageCache implements IStorageGrid
|
|||||||
this.removeCellProvider( cc, tracker );
|
this.removeCellProvider( cc, tracker );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tracker.applyChanges();
|
tracker.applyChanges();
|
||||||
|
|
||||||
|
this.storageMonitors.forEach( ( channel, monitor ) -> monitor.setForceUpdate( true ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T extends IAEStack<T>, C extends IStorageChannel<T>> void postChangesToNetwork( final C chan, final int upOrDown, final IItemList<T> availableItems, final IActionSource src )
|
private <T extends IAEStack<T>, C extends IStorageChannel<T>> void postChangesToNetwork( final C chan, final int upOrDown, final IItemList<T> availableItems, final IActionSource src )
|
||||||
|
|||||||
+27
-33
@@ -19,7 +19,6 @@
|
|||||||
package appeng.me.cache;
|
package appeng.me.cache;
|
||||||
|
|
||||||
|
|
||||||
import javax.annotation.Nonnegative;
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
@@ -36,7 +35,6 @@ import appeng.api.storage.channels.IItemStorageChannel;
|
|||||||
import appeng.api.storage.data.IAEStack;
|
import appeng.api.storage.data.IAEStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.me.storage.ItemWatcher;
|
import appeng.me.storage.ItemWatcher;
|
||||||
import com.google.common.collect.Queues;
|
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||||
|
|
||||||
@@ -47,9 +45,10 @@ import java.util.Map.Entry;
|
|||||||
public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
||||||
{
|
{
|
||||||
@Nonnull
|
@Nonnull
|
||||||
private static final Set<NetworkMonitor<?>> NESTED_MONITORS = new HashSet<>();
|
private static final HashMap<IActionSource, LinkedList<NetworkMonitor<?>>> src2MonitorsMap = new HashMap<>();
|
||||||
private static final HashMap<IActionSource, Set<NetworkMonitor<?>>> sourceSetHashMap = new HashMap<>();
|
private static final Set<IActionSource> nestingSources = new HashSet<>();
|
||||||
protected static boolean nested = false;
|
|
||||||
|
protected boolean wasNested = false;
|
||||||
protected boolean isNested = false;
|
protected boolean isNested = false;
|
||||||
|
|
||||||
@Nonnull
|
@Nonnull
|
||||||
@@ -62,11 +61,9 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
private final Object2ObjectMap<IMEMonitorHandlerReceiver<T>, Object> listeners;
|
private final Object2ObjectMap<IMEMonitorHandlerReceiver<T>, Object> listeners;
|
||||||
|
|
||||||
private boolean sendEvent = false;
|
private boolean sendEvent = false;
|
||||||
private boolean forceUpdate = false;
|
|
||||||
@Nonnegative
|
|
||||||
private int localDepthSemaphore = 0;
|
|
||||||
private long gridItemCount;
|
private long gridItemCount;
|
||||||
private long gridFluidCount;
|
private long gridFluidCount;
|
||||||
|
public boolean forceUpdate;
|
||||||
|
|
||||||
public NetworkMonitor( final GridStorageCache cache, final IStorageChannel<T> chan )
|
public NetworkMonitor( final GridStorageCache cache, final IStorageChannel<T> chan )
|
||||||
{
|
{
|
||||||
@@ -229,16 +226,13 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
|
|
||||||
protected void postChange( final boolean add, final Iterable<T> changes, final IActionSource src )
|
protected void postChange( final boolean add, final Iterable<T> changes, final IActionSource src )
|
||||||
{
|
{
|
||||||
|
src2MonitorsMap.putIfAbsent( src, new LinkedList<>() );
|
||||||
if( sourceSetHashMap.get( src ) != null && sourceSetHashMap.get( src ).contains( this ) )
|
if( src2MonitorsMap.get( src ).contains( this ) )
|
||||||
{
|
{
|
||||||
NESTED_MONITORS.add( this );
|
nestingSources.add( src );
|
||||||
nested = true;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
src2MonitorsMap.get( src ).add( this );
|
||||||
sourceSetHashMap.putIfAbsent( src, new HashSet<>() );
|
|
||||||
sourceSetHashMap.get( src ).add( this );
|
|
||||||
|
|
||||||
this.sendEvent = true;
|
this.sendEvent = true;
|
||||||
|
|
||||||
@@ -282,30 +276,26 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
|
|
||||||
this.notifyListenersOfChange( changes, src );
|
this.notifyListenersOfChange( changes, src );
|
||||||
|
|
||||||
sourceSetHashMap.get( src ).remove( this );
|
if( src2MonitorsMap.get( src ).getFirst() == this )
|
||||||
if( sourceSetHashMap.get( src ).isEmpty() )
|
|
||||||
{
|
{
|
||||||
sourceSetHashMap.remove( src );
|
boolean nested = nestingSources.contains( src );
|
||||||
}
|
src2MonitorsMap.get( src ).forEach( networkMonitor -> networkMonitor.isNested = nested );
|
||||||
|
|
||||||
if( sourceSetHashMap.isEmpty() )
|
src2MonitorsMap.get( src ).forEach( networkMonitor -> {
|
||||||
{
|
if( networkMonitor.isNested != networkMonitor.wasNested )
|
||||||
for( NetworkMonitor<?> nm : NESTED_MONITORS )
|
{
|
||||||
{
|
networkMonitor.wasNested = networkMonitor.isNested;
|
||||||
nm.setupForceUpdate();
|
networkMonitor.setForceUpdate( true );
|
||||||
}
|
}
|
||||||
nested = false;
|
} );
|
||||||
NESTED_MONITORS.clear();
|
src2MonitorsMap.remove( src );
|
||||||
|
nestingSources.remove( src );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setupForceUpdate()
|
public void setForceUpdate( boolean forceUpdate )
|
||||||
{
|
{
|
||||||
if( nested != isNested )
|
this.forceUpdate = forceUpdate;
|
||||||
{
|
|
||||||
isNested = nested;
|
|
||||||
forceUpdate();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void forceUpdate()
|
void forceUpdate()
|
||||||
@@ -373,6 +363,10 @@ public class NetworkMonitor<T extends IAEStack<T>> implements IMEMonitor<T>
|
|||||||
|
|
||||||
void onTick()
|
void onTick()
|
||||||
{
|
{
|
||||||
|
if( forceUpdate )
|
||||||
|
{
|
||||||
|
forceUpdate();
|
||||||
|
}
|
||||||
if( this.sendEvent )
|
if( this.sendEvent )
|
||||||
{
|
{
|
||||||
this.sendEvent = false;
|
this.sendEvent = false;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
import appeng.api.config.Upgrades;
|
import appeng.api.config.Upgrades;
|
||||||
import appeng.helpers.DualityInterface;
|
import appeng.helpers.DualityInterface;
|
||||||
|
import appeng.helpers.PatternHelper;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
@@ -742,24 +743,35 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if( details.isCraftable() )
|
||||||
|
{
|
||||||
|
ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ic = new InventoryCrafting( new ContainerNull(), PatternHelper.PROCESSING_INPUT_WIDTH, PatternHelper.PROCESSING_INPUT_HEIGHT );
|
||||||
|
}
|
||||||
|
|
||||||
ic = new InventoryCrafting( new ContainerNull(), 3, 3 );
|
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
|
|
||||||
for (int x = 0; x < input.length; x++) {
|
for( int x = 0; x < input.length; x++ )
|
||||||
if (input[x] != null) {
|
{
|
||||||
|
if( input[x] != null )
|
||||||
|
{
|
||||||
found = false;
|
found = false;
|
||||||
|
|
||||||
if (details.isCraftable()) {
|
if( details.isCraftable() )
|
||||||
|
{
|
||||||
final Collection<IAEItemStack> itemList;
|
final Collection<IAEItemStack> itemList;
|
||||||
|
|
||||||
if (details.canSubstitute()) {
|
if( details.canSubstitute() )
|
||||||
final List<IAEItemStack> substitutes = details.getSubstituteInputs(x);
|
{
|
||||||
itemList = new ArrayList<>(substitutes.size());
|
final List<IAEItemStack> substitutes = details.getSubstituteInputs( x );
|
||||||
|
itemList = new ArrayList<>( substitutes.size() );
|
||||||
|
|
||||||
for (IAEItemStack stack : substitutes) {
|
for( IAEItemStack stack : substitutes )
|
||||||
itemList.addAll(this.inventory.getItemList().findFuzzy(stack,
|
{
|
||||||
FuzzyMode.IGNORE_ALL));
|
itemList.addAll( this.inventory.getItemList().findFuzzy( stack, FuzzyMode.IGNORE_ALL ) );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
itemList = new ArrayList<>(1);
|
itemList = new ArrayList<>(1);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import net.minecraft.item.ItemStack;
|
|||||||
|
|
||||||
import appeng.api.implementations.IPowerChannelState;
|
import appeng.api.implementations.IPowerChannelState;
|
||||||
import appeng.api.networking.GridFlags;
|
import appeng.api.networking.GridFlags;
|
||||||
|
import appeng.api.networking.events.MENetworkBootingStatusChange;
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
import appeng.api.networking.events.MENetworkChannelsChanged;
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
import appeng.api.networking.events.MENetworkEventSubscribe;
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
||||||
@@ -59,6 +60,12 @@ public abstract class PartBasicState extends AEBasePart implements IPowerChannel
|
|||||||
this.getHost().markForUpdate();
|
this.getHost().markForUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void bootingRender( final MENetworkBootingStatusChange bs )
|
||||||
|
{
|
||||||
|
this.getHost().markForUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToStream( final ByteBuf data ) throws IOException
|
public void writeToStream( final ByteBuf data ) throws IOException
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -352,23 +352,11 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStackChange( IItemList<?> o, IAEStack<?> fullStack, IAEStack<?> diffStack, IActionSource src, IStorageChannel<?> chan )
|
public void onStackChange( final IItemList o, final IAEStack fullStack, final IAEStack diffStack, final IActionSource src, final IStorageChannel chan )
|
||||||
{
|
{
|
||||||
if( chan == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) )
|
if( chan == AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) && fullStack.equals( this.config.getAEStackInSlot( 0 ) ) && this.getInstalledUpgrades( Upgrades.FUZZY ) == 0 )
|
||||||
{
|
{
|
||||||
IAEItemStack myStack = this.config.getAEStackInSlot( 0 );
|
this.lastReportedValue = fullStack.getStackSize();
|
||||||
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
|
||||||
{
|
|
||||||
final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE );
|
|
||||||
if( Platform.itemComparisons().isFuzzyEqualItem( myStack.getDefinition(), ( (IAEItemStack) diffStack ).getDefinition(), fzMode ) )
|
|
||||||
{
|
|
||||||
this.lastReportedValue += diffStack.getStackSize();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( diffStack.equals( myStack ) )
|
|
||||||
{
|
|
||||||
this.lastReportedValue += diffStack.getStackSize();
|
|
||||||
}
|
|
||||||
this.updateState();
|
this.updateState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,8 +62,6 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
private StorageFilter mode;
|
private StorageFilter mode;
|
||||||
private AccessRestriction access;
|
private AccessRestriction access;
|
||||||
|
|
||||||
private ItemStack stackCache = null;
|
|
||||||
|
|
||||||
ItemHandlerAdapter( IItemHandler itemHandler, IGridProxyable proxy )
|
ItemHandlerAdapter( IItemHandler itemHandler, IGridProxyable proxy )
|
||||||
{
|
{
|
||||||
this.itemHandler = itemHandler;
|
this.itemHandler = itemHandler;
|
||||||
@@ -82,8 +80,8 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
||||||
{
|
{
|
||||||
// Try to reuse the cached stack
|
// Try to reuse the cached stack
|
||||||
@Nullable ItemStack currentCached = stackCache;
|
@Nullable ItemStack currentCached = iox.getCachedItemStack();
|
||||||
stackCache = null;
|
iox.setCachedItemStack(null);
|
||||||
|
|
||||||
ItemStack orgInput;
|
ItemStack orgInput;
|
||||||
int slotCount = this.itemHandler.getSlots();
|
int slotCount = this.itemHandler.getSlots();
|
||||||
@@ -108,9 +106,9 @@ 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( !remaining.isEmpty() && remaining != orgInput )
|
if( !remaining.isEmpty() )
|
||||||
{
|
{
|
||||||
stackCache = remaining;
|
iox.setCachedItemStack( remaining );
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point, we still have some items left...
|
// At this point, we still have some items left...
|
||||||
|
|||||||
@@ -0,0 +1,215 @@
|
|||||||
|
package appeng.parts.misc;
|
||||||
|
|
||||||
|
import appeng.api.AEApi;
|
||||||
|
import appeng.api.config.*;
|
||||||
|
import appeng.api.networking.storage.IBaseMonitor;
|
||||||
|
import appeng.api.networking.storage.IStorageGrid;
|
||||||
|
import appeng.api.networking.ticking.ITickManager;
|
||||||
|
import appeng.api.parts.IPartModel;
|
||||||
|
import appeng.api.storage.IMEInventory;
|
||||||
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.core.AppEng;
|
||||||
|
import appeng.core.sync.GuiBridge;
|
||||||
|
import appeng.items.parts.PartModels;
|
||||||
|
import appeng.me.GridAccessException;
|
||||||
|
import appeng.me.cache.GridStorageCache;
|
||||||
|
import appeng.me.storage.ITickingMonitor;
|
||||||
|
import appeng.me.storage.MEInventoryHandler;
|
||||||
|
import appeng.parts.PartModel;
|
||||||
|
import appeng.util.ConfigManager;
|
||||||
|
import appeng.util.Platform;
|
||||||
|
import appeng.util.item.OreHelper;
|
||||||
|
import appeng.util.prioritylist.OreDictPriorityList;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.EnumHand;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
|
|
||||||
|
|
||||||
|
public class PartOreDicStorageBus extends PartStorageBus
|
||||||
|
{
|
||||||
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/oredict_storage_bus_base" );
|
||||||
|
@PartModels
|
||||||
|
public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_off" ) );
|
||||||
|
@PartModels
|
||||||
|
public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_on" ) );
|
||||||
|
@PartModels
|
||||||
|
public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, new ResourceLocation( AppEng.MOD_ID, "part/storage_bus_has_channel" ) );
|
||||||
|
|
||||||
|
|
||||||
|
public String oreMatch;
|
||||||
|
OreDictPriorityList<IAEItemStack> priorityList;
|
||||||
|
|
||||||
|
public PartOreDicStorageBus( ItemStack is )
|
||||||
|
{
|
||||||
|
super( is );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFromNBT( NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.readFromNBT( data );
|
||||||
|
this.oreMatch = data.getString( "oreMatch" );
|
||||||
|
this.priorityList = new OreDictPriorityList<>( OreHelper.INSTANCE.getMatchingOre( oreMatch ), oreMatch );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToNBT( NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.writeToNBT( data );
|
||||||
|
data.setString( "oreMatch", getOreMatch() );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onPartActivate( final EntityPlayer player, final EnumHand hand, final Vec3d pos )
|
||||||
|
{
|
||||||
|
if( Platform.isServer() )
|
||||||
|
{
|
||||||
|
Platform.openGUI( player, this.getHost().getTile(), this.getSide(), GuiBridge.GUI_OREDICTSTORAGEBUS );
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GuiBridge getGuiBridge()
|
||||||
|
{
|
||||||
|
return GuiBridge.GUI_OREDICTSTORAGEBUS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MEInventoryHandler<IAEItemStack> getInternalHandler()
|
||||||
|
{
|
||||||
|
if( this.cached )
|
||||||
|
{
|
||||||
|
return this.handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean wasSleeping = this.monitor == null;
|
||||||
|
|
||||||
|
this.cached = true;
|
||||||
|
final TileEntity self = this.getHost().getTile();
|
||||||
|
final TileEntity target = self.getWorld().getTileEntity( self.getPos().offset( this.getSide().getFacing() ) );
|
||||||
|
final int newHandlerHash = this.createHandlerHash( target );
|
||||||
|
|
||||||
|
if( newHandlerHash != 0 && newHandlerHash == this.handlerHash )
|
||||||
|
{
|
||||||
|
return this.handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.handlerHash = newHandlerHash;
|
||||||
|
this.handler = null;
|
||||||
|
if( this.monitor != null )
|
||||||
|
{
|
||||||
|
( (IBaseMonitor<IAEItemStack>) monitor ).removeListener( this );
|
||||||
|
}
|
||||||
|
this.monitor = null;
|
||||||
|
if( target != null )
|
||||||
|
{
|
||||||
|
IMEInventory<IAEItemStack> inv = this.getInventoryWrapper( target );
|
||||||
|
|
||||||
|
if( inv instanceof ITickingMonitor )
|
||||||
|
{
|
||||||
|
this.monitor = (ITickingMonitor) inv;
|
||||||
|
this.monitor.setActionSource( mySrc );
|
||||||
|
this.monitor.setMode( (StorageFilter) this.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( inv != null )
|
||||||
|
{
|
||||||
|
this.handler = new MEInventoryHandler<>( inv, AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||||
|
|
||||||
|
this.handler.setBaseAccess( (AccessRestriction) this.getConfigManager().getSetting( Settings.ACCESS ) );
|
||||||
|
this.handler.setWhitelist( this.getInstalledUpgrades( Upgrades.INVERTER ) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST );
|
||||||
|
this.handler.setPriority( this.priority );
|
||||||
|
|
||||||
|
this.handler.setPartitionList( priorityList );
|
||||||
|
|
||||||
|
if( inv instanceof IBaseMonitor )
|
||||||
|
{
|
||||||
|
if( ( (AccessRestriction) ( (ConfigManager) this.getConfigManager() ).getSetting( Settings.ACCESS ) ).hasPermission( AccessRestriction.READ ) )
|
||||||
|
{
|
||||||
|
( (IBaseMonitor<IAEItemStack>) inv ).addListener( this, this.handler );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// update sleep state...
|
||||||
|
if( wasSleeping != ( this.monitor == null ) )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
final ITickManager tm = this.getProxy().getTick();
|
||||||
|
if( this.monitor == null )
|
||||||
|
{
|
||||||
|
tm.sleepDevice( this.getProxy().getNode() );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tm.wakeDevice( this.getProxy().getNode() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :(
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// force grid to update handlers...
|
||||||
|
( (GridStorageCache) this.getProxy().getGrid().getCache( IStorageGrid.class ) ).cellUpdate( null );
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :3
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getOreMatch()
|
||||||
|
{
|
||||||
|
if( this.oreMatch == null )
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return oreMatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void saveOreMatch( String oreMatch )
|
||||||
|
{
|
||||||
|
if( !this.oreMatch.equals( oreMatch ) )
|
||||||
|
{
|
||||||
|
this.oreMatch = oreMatch;
|
||||||
|
this.priorityList = new OreDictPriorityList<>( OreHelper.INSTANCE.getMatchingOre( oreMatch ), oreMatch );
|
||||||
|
if( this.handler != null )
|
||||||
|
{
|
||||||
|
handler.setPartitionList( this.priorityList );
|
||||||
|
}
|
||||||
|
this.getHost().markForSave();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPartModel getStaticModels()
|
||||||
|
{
|
||||||
|
if( this.isActive() && this.isPowered() )
|
||||||
|
{
|
||||||
|
return MODELS_HAS_CHANNEL;
|
||||||
|
}
|
||||||
|
else if( this.isPowered() )
|
||||||
|
{
|
||||||
|
return MODELS_ON;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MODELS_OFF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,229 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is part of Applied Energistics 2.
|
|
||||||
* Copyright (c) 2013 - 2018, AlgorithmX2, All rights reserved.
|
|
||||||
*
|
|
||||||
* Applied Energistics 2 is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* Applied Energistics 2 is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public License
|
|
||||||
* along with Applied Energistics 2. If not, see <http://www.gnu.org/licenses/lgpl>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package appeng.parts.misc;
|
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import appeng.api.config.AccessRestriction;
|
|
||||||
import appeng.fluids.parts.PartFluidInterface;
|
|
||||||
import appeng.fluids.tile.TileFluidInterface;
|
|
||||||
import appeng.tile.misc.TileInterface;
|
|
||||||
import appeng.tile.networking.TileCableBus;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
|
||||||
import net.minecraft.tileentity.TileEntity;
|
|
||||||
import net.minecraft.util.math.BlockPos;
|
|
||||||
import net.minecraft.world.IBlockAccess;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
|
||||||
import appeng.api.networking.events.MENetworkCellArrayUpdate;
|
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.networking.ticking.IGridTickable;
|
|
||||||
import appeng.api.parts.IPartCollisionHelper;
|
|
||||||
import appeng.api.storage.ICellContainer;
|
|
||||||
import appeng.api.storage.ICellInventory;
|
|
||||||
import appeng.api.storage.IMEInventoryHandler;
|
|
||||||
import appeng.api.storage.IStorageChannel;
|
|
||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
|
||||||
import appeng.api.util.AECableType;
|
|
||||||
import appeng.api.util.IConfigManager;
|
|
||||||
import appeng.helpers.IPriorityHost;
|
|
||||||
import appeng.me.GridAccessException;
|
|
||||||
import appeng.parts.automation.PartUpgradeable;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author BrockWS
|
|
||||||
* @version rv6 - 22/05/2018
|
|
||||||
* @since rv6 22/05/2018
|
|
||||||
*/
|
|
||||||
public abstract class PartSharedStorageBus extends PartUpgradeable implements IGridTickable, ICellContainer, IPriorityHost
|
|
||||||
{
|
|
||||||
private boolean wasActive = false;
|
|
||||||
private int priority = 0;
|
|
||||||
protected boolean accessChanged;
|
|
||||||
protected boolean readOncePass;
|
|
||||||
|
|
||||||
public PartSharedStorageBus( ItemStack is )
|
|
||||||
{
|
|
||||||
super( is );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void updateStatus()
|
|
||||||
{
|
|
||||||
final boolean currentActive = this.getProxy().isActive();
|
|
||||||
if( this.wasActive != currentActive )
|
|
||||||
{
|
|
||||||
this.wasActive = currentActive;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
|
||||||
this.getHost().markForUpdate();
|
|
||||||
}
|
|
||||||
catch( final GridAccessException ignore )
|
|
||||||
{
|
|
||||||
// :P
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void chanRender( final MENetworkChannelsChanged changedChannels )
|
|
||||||
{
|
|
||||||
this.updateStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper method to get this parts storage channel
|
|
||||||
*
|
|
||||||
* @return Storage channel
|
|
||||||
*/
|
|
||||||
public IStorageChannel getStorageChannel()
|
|
||||||
{
|
|
||||||
return AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract void resetCache();
|
|
||||||
|
|
||||||
protected abstract void resetCache( boolean fullReset );
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<IMEInventoryHandler> getCellArray( final IStorageChannel channel )
|
|
||||||
{
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void blinkCell( int slot )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void saveChanges( ICellInventory<?> cellInventory )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPriority()
|
|
||||||
{
|
|
||||||
return this.priority;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPriority( final int newValue )
|
|
||||||
{
|
|
||||||
this.priority = newValue;
|
|
||||||
this.getHost().markForSave();
|
|
||||||
this.resetCache( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void powerRender( final MENetworkPowerStatusChange c )
|
|
||||||
{
|
|
||||||
this.updateStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void upgradesChanged()
|
|
||||||
{
|
|
||||||
super.upgradesChanged();
|
|
||||||
this.resetCache( true );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateSetting( final IConfigManager manager, final Enum settingName, final Enum newValue )
|
|
||||||
{
|
|
||||||
if( settingName.name().equals( "ACCESS" ) )
|
|
||||||
{
|
|
||||||
this.accessChanged = true;
|
|
||||||
}
|
|
||||||
this.resetCache( true );
|
|
||||||
this.getHost().markForSave();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onNeighborChanged( IBlockAccess w, BlockPos pos, BlockPos neighbor )
|
|
||||||
{
|
|
||||||
if( pos.offset( this.getSide().getFacing() ).equals( neighbor ) )
|
|
||||||
{
|
|
||||||
|
|
||||||
final TileEntity te = w.getTileEntity( neighbor );
|
|
||||||
|
|
||||||
// In case the TE was destroyed, we have to do a full reset immediately.
|
|
||||||
if( te instanceof TileCableBus )
|
|
||||||
{
|
|
||||||
if( ( (TileCableBus) te ).getPart( this.getSide().getOpposite() ) instanceof PartFluidInterface )
|
|
||||||
{
|
|
||||||
this.resetCache( true );
|
|
||||||
this.resetCache();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( te == null || te instanceof TileFluidInterface )
|
|
||||||
{
|
|
||||||
this.resetCache( true );
|
|
||||||
this.resetCache();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.resetCache( false );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void readFromNBT( final NBTTagCompound data )
|
|
||||||
{
|
|
||||||
super.readFromNBT( data );
|
|
||||||
this.priority = data.getInteger( "priority" );
|
|
||||||
this.accessChanged = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToNBT( final NBTTagCompound data )
|
|
||||||
{
|
|
||||||
super.writeToNBT( data );
|
|
||||||
data.setInteger( "priority", this.priority );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void getBoxes( final IPartCollisionHelper bch )
|
|
||||||
{
|
|
||||||
bch.addBox( 3, 3, 15, 13, 13, 16 );
|
|
||||||
bch.addBox( 2, 2, 14, 14, 14, 15 );
|
|
||||||
bch.addBox( 5, 5, 12, 11, 11, 14 );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getUpgradeSlots()
|
|
||||||
{
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public float getCableConnectionLength( AECableType cable )
|
|
||||||
{
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -33,10 +33,6 @@ import net.minecraftforge.items.IItemHandler;
|
|||||||
import net.minecraftforge.items.wrapper.EmptyHandler;
|
import net.minecraftforge.items.wrapper.EmptyHandler;
|
||||||
|
|
||||||
import appeng.api.networking.IGridNode;
|
import appeng.api.networking.IGridNode;
|
||||||
import appeng.api.networking.events.MENetworkBootingStatusChange;
|
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.networking.ticking.IGridTickable;
|
import appeng.api.networking.ticking.IGridTickable;
|
||||||
import appeng.api.networking.ticking.TickRateModulation;
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
import appeng.api.networking.ticking.TickingRequest;
|
import appeng.api.networking.ticking.TickingRequest;
|
||||||
@@ -76,11 +72,14 @@ public class PartP2PItems extends PartP2PTunnel<PartP2PItems> implements IItemHa
|
|||||||
this.cachedInv = null;
|
this.cachedInv = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
for( PartP2PItems input : this.getInputs() )
|
if( this.isOutput() )
|
||||||
{
|
{
|
||||||
if( input != null && this.isOutput() )
|
for( PartP2PItems input : this.getInputs() )
|
||||||
{
|
{
|
||||||
input.onTunnelNetworkChange();
|
if( input != null )
|
||||||
|
{
|
||||||
|
input.onTunnelNetworkChange();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -171,51 +170,6 @@ public class PartP2PItems extends PartP2PTunnel<PartP2PItems> implements IItemHa
|
|||||||
return wasReq ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
|
return wasReq ? TickRateModulation.FASTER : TickRateModulation.SLOWER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateA( final MENetworkBootingStatusChange bs )
|
|
||||||
{
|
|
||||||
if( !this.isOutput() )
|
|
||||||
{
|
|
||||||
this.cachedInv = null;
|
|
||||||
final int olderSize = this.oldSize;
|
|
||||||
this.oldSize = this.getDestination().getSlots();
|
|
||||||
if( olderSize != this.oldSize )
|
|
||||||
{
|
|
||||||
this.getHost().notifyNeighbors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateB( final MENetworkChannelsChanged bs )
|
|
||||||
{
|
|
||||||
if( !this.isOutput() )
|
|
||||||
{
|
|
||||||
this.cachedInv = null;
|
|
||||||
final int olderSize = this.oldSize;
|
|
||||||
this.oldSize = this.getDestination().getSlots();
|
|
||||||
if( olderSize != this.oldSize )
|
|
||||||
{
|
|
||||||
this.getHost().notifyNeighbors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateC( final MENetworkPowerStatusChange bs )
|
|
||||||
{
|
|
||||||
if( !this.isOutput() )
|
|
||||||
{
|
|
||||||
this.cachedInv = null;
|
|
||||||
final int olderSize = this.oldSize;
|
|
||||||
this.oldSize = this.getDestination().getSlots();
|
|
||||||
if( olderSize != this.oldSize )
|
|
||||||
{
|
|
||||||
this.getHost().notifyNeighbors();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTunnelNetworkChange()
|
public void onTunnelNetworkChange()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ import net.minecraft.world.IBlockAccess;
|
|||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import appeng.api.networking.IGridNode;
|
import appeng.api.networking.IGridNode;
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.networking.ticking.IGridTickable;
|
import appeng.api.networking.ticking.IGridTickable;
|
||||||
import appeng.api.networking.ticking.TickRateModulation;
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
import appeng.api.networking.ticking.TickingRequest;
|
import appeng.api.networking.ticking.TickingRequest;
|
||||||
@@ -62,20 +60,6 @@ public class PartP2PLight extends PartP2PTunnel<PartP2PLight> implements IGridTi
|
|||||||
super( is );
|
super( is );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void chanRender( final MENetworkChannelsChanged c )
|
|
||||||
{
|
|
||||||
this.onTunnelNetworkChange();
|
|
||||||
super.chanRender( c );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void powerRender( final MENetworkPowerStatusChange c )
|
|
||||||
{
|
|
||||||
this.onTunnelNetworkChange();
|
|
||||||
super.powerRender( c );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToStream( final ByteBuf data ) throws IOException
|
public void writeToStream( final ByteBuf data ) throws IOException
|
||||||
{
|
{
|
||||||
@@ -115,9 +99,17 @@ public class PartP2PLight extends PartP2PTunnel<PartP2PLight> implements IGridTi
|
|||||||
this.lastValue = newLevel;
|
this.lastValue = newLevel;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
int light = 0;
|
||||||
|
for( PartP2PLight src : this.getInputs() )
|
||||||
|
{
|
||||||
|
if( src != null && src.getProxy().isActive() )
|
||||||
|
{
|
||||||
|
light = Math.max( light, src.lastValue );
|
||||||
|
}
|
||||||
|
}
|
||||||
for( final PartP2PLight out : this.getOutputs() )
|
for( final PartP2PLight out : this.getOutputs() )
|
||||||
{
|
{
|
||||||
out.setLightLevel( this.lastValue );
|
out.setLightLevel( light );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
@@ -198,17 +190,16 @@ public class PartP2PLight extends PartP2PTunnel<PartP2PLight> implements IGridTi
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
int light = 0;
|
||||||
for( PartP2PLight src : this.getInputs() )
|
for( PartP2PLight src : this.getInputs() )
|
||||||
{
|
{
|
||||||
if( src != null && src.getProxy().isActive() )
|
if( src != null && src.getProxy().isActive() )
|
||||||
{
|
{
|
||||||
this.setLightLevel( src.lastValue );
|
light = Math.max( light, src.lastValue );
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.getHost().markForUpdate();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.setLightLevel( light );
|
||||||
|
this.getHost().markForUpdate();
|
||||||
}
|
}
|
||||||
catch( GridAccessException e )
|
catch( GridAccessException e )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -31,10 +31,6 @@ import net.minecraft.util.math.BlockPos;
|
|||||||
import net.minecraft.world.IBlockAccess;
|
import net.minecraft.world.IBlockAccess;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
import appeng.api.networking.events.MENetworkBootingStatusChange;
|
|
||||||
import appeng.api.networking.events.MENetworkChannelsChanged;
|
|
||||||
import appeng.api.networking.events.MENetworkEventSubscribe;
|
|
||||||
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
|
||||||
import appeng.api.parts.IPartModel;
|
import appeng.api.parts.IPartModel;
|
||||||
import appeng.items.parts.PartModels;
|
import appeng.items.parts.PartModels;
|
||||||
import appeng.me.GridAccessException;
|
import appeng.me.GridAccessException;
|
||||||
@@ -60,25 +56,21 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
super( is );
|
super( is );
|
||||||
}
|
}
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateA( final MENetworkBootingStatusChange bs )
|
|
||||||
{
|
|
||||||
this.setNetworkReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setNetworkReady()
|
private void setNetworkReady()
|
||||||
{
|
{
|
||||||
if( this.isOutput() )
|
if( this.isOutput() )
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
int power = 0;
|
||||||
for( PartP2PRedstone in : this.getInputs() )
|
for( PartP2PRedstone in : this.getInputs() )
|
||||||
{
|
{
|
||||||
if( in != null )
|
if( in != null )
|
||||||
{
|
{
|
||||||
this.putInput( in.power );
|
power = Math.max( power, in.power );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.putInput( power );
|
||||||
}
|
}
|
||||||
catch( GridAccessException e )
|
catch( GridAccessException e )
|
||||||
{
|
{
|
||||||
@@ -95,12 +87,20 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.recursive = true;
|
this.recursive = true;
|
||||||
if( this.isOutput() && this.getProxy().isActive() )
|
if( this.isOutput() )
|
||||||
{
|
{
|
||||||
final int newPower = (Integer) o;
|
if( this.getProxy().isActive() )
|
||||||
if( this.power != newPower )
|
|
||||||
{
|
{
|
||||||
this.power = newPower;
|
final int newPower = (Integer) o;
|
||||||
|
if( this.power != newPower )
|
||||||
|
{
|
||||||
|
this.power = newPower;
|
||||||
|
this.notifyNeighbors();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.power = 0;
|
||||||
this.notifyNeighbors();
|
this.notifyNeighbors();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -120,18 +120,6 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateB( final MENetworkChannelsChanged bs )
|
|
||||||
{
|
|
||||||
this.setNetworkReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
|
||||||
public void changeStateC( final MENetworkPowerStatusChange bs )
|
|
||||||
{
|
|
||||||
this.setNetworkReady();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void readFromNBT( final NBTTagCompound tag )
|
public void readFromNBT( final NBTTagCompound tag )
|
||||||
{
|
{
|
||||||
@@ -176,7 +164,22 @@ public class PartP2PRedstone extends PartP2PTunnel<PartP2PRedstone>
|
|||||||
|
|
||||||
this.power = b.getWeakPower( state, this.getTile().getWorld(), target, srcSide );
|
this.power = b.getWeakPower( state, this.getTile().getWorld(), target, srcSide );
|
||||||
this.power = Math.max( this.power, b.getWeakPower( state, this.getTile().getWorld(), target, srcSide ) );
|
this.power = Math.max( this.power, b.getWeakPower( state, this.getTile().getWorld(), target, srcSide ) );
|
||||||
this.sendToOutput( this.power );
|
int powerOut = this.power;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
for( PartP2PRedstone in : this.getInputs() )
|
||||||
|
{
|
||||||
|
if( in != null )
|
||||||
|
{
|
||||||
|
powerOut = Math.max( in.power, powerOut );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch( GridAccessException e )
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
this.sendToOutput( powerOut );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ import java.util.ArrayList;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import appeng.api.networking.events.MENetworkBootingStatusChange;
|
||||||
|
import appeng.api.networking.events.MENetworkChannelsChanged;
|
||||||
|
import appeng.api.networking.events.MENetworkEventSubscribe;
|
||||||
|
import appeng.api.networking.events.MENetworkPowerStatusChange;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -152,6 +156,30 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
super.writeToStream( data );
|
super.writeToStream( data );
|
||||||
data.writeShort( this.getFrequency() );
|
data.writeShort( this.getFrequency() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void chanRender( final MENetworkChannelsChanged c )
|
||||||
|
{
|
||||||
|
this.onTunnelNetworkChange();
|
||||||
|
super.chanRender( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void powerRender( final MENetworkPowerStatusChange c )
|
||||||
|
{
|
||||||
|
this.onTunnelNetworkChange();
|
||||||
|
super.powerRender( c );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@MENetworkEventSubscribe
|
||||||
|
public void bootingRender( final MENetworkBootingStatusChange bs )
|
||||||
|
{
|
||||||
|
this.onTunnelNetworkChange();
|
||||||
|
super.bootingRender( bs );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public float getCableConnectionLength( AECableType cable )
|
public float getCableConnectionLength( AECableType cable )
|
||||||
@@ -177,8 +205,13 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final ItemStack is = player.getHeldItem( hand );
|
boolean pasteAsOutput = true;
|
||||||
|
ItemStack is = player.getHeldItem( hand );
|
||||||
|
if (is.isEmpty()) {
|
||||||
|
pasteAsOutput = false;
|
||||||
|
is = player.getHeldItemOffhand();
|
||||||
|
}
|
||||||
|
|
||||||
// UniqueIdentifier id = GameRegistry.findUniqueIdentifierFor( is.getItem() );
|
// UniqueIdentifier id = GameRegistry.findUniqueIdentifierFor( is.getItem() );
|
||||||
// AELog.info( "ID:" + id.toString() + " : " + is.getItemDamage() );
|
// AELog.info( "ID:" + id.toString() + " : " + is.getItemDamage() );
|
||||||
@@ -217,7 +250,8 @@ public abstract class PartP2PTunnel<T extends PartP2PTunnel> extends PartBasicSt
|
|||||||
if( newBus instanceof PartP2PTunnel )
|
if( newBus instanceof PartP2PTunnel )
|
||||||
{
|
{
|
||||||
final PartP2PTunnel newTunnel = (PartP2PTunnel) newBus;
|
final PartP2PTunnel newTunnel = (PartP2PTunnel) newBus;
|
||||||
if( !Keyboard.isKeyDown( Keyboard.KEY_LCONTROL ) && !Keyboard.isKeyDown( Keyboard.KEY_RCONTROL ) )
|
|
||||||
|
if( pasteAsOutput )
|
||||||
{
|
{
|
||||||
newTunnel.setOutput( true );
|
newTunnel.setOutput( true );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,138 @@
|
|||||||
|
package appeng.parts.reporting;
|
||||||
|
|
||||||
|
import appeng.api.implementations.ICraftingPatternItem;
|
||||||
|
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
||||||
|
import appeng.api.parts.IPartModel;
|
||||||
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
|
import appeng.core.AppEng;
|
||||||
|
import appeng.core.sync.GuiBridge;
|
||||||
|
import appeng.helpers.Reflected;
|
||||||
|
import appeng.items.parts.PartModels;
|
||||||
|
import appeng.parts.PartModel;
|
||||||
|
import appeng.tile.inventory.AppEngInternalInventory;
|
||||||
|
import appeng.util.inv.InvOperation;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
import static appeng.helpers.PatternHelper.PROCESSING_INPUT_LIMIT;
|
||||||
|
import static appeng.helpers.PatternHelper.PROCESSING_OUTPUT_LIMIT;
|
||||||
|
|
||||||
|
|
||||||
|
public class PartExpandedProcessingPatternTerminal extends AbstractPartTerminal
|
||||||
|
{
|
||||||
|
@PartModels
|
||||||
|
public static final ResourceLocation MODEL_OFF = new ResourceLocation( AppEng.MOD_ID, "part/expanded_processing_pattern_terminal_off" );
|
||||||
|
@PartModels
|
||||||
|
public static final ResourceLocation MODEL_ON = new ResourceLocation( AppEng.MOD_ID, "part/expanded_processing_pattern_terminal_on" );
|
||||||
|
|
||||||
|
public static final IPartModel MODELS_OFF = new PartModel( MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF );
|
||||||
|
public static final IPartModel MODELS_ON = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_ON );
|
||||||
|
public static final IPartModel MODELS_HAS_CHANNEL = new PartModel( MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL );
|
||||||
|
|
||||||
|
private final AppEngInternalInventory crafting = new AppEngInternalInventory( this, PROCESSING_INPUT_LIMIT );
|
||||||
|
|
||||||
|
private final AppEngInternalInventory output = new AppEngInternalInventory( this, PROCESSING_OUTPUT_LIMIT );
|
||||||
|
private final AppEngInternalInventory pattern = new AppEngInternalInventory( this, 2 );
|
||||||
|
|
||||||
|
@Reflected
|
||||||
|
public PartExpandedProcessingPatternTerminal( final ItemStack is )
|
||||||
|
{
|
||||||
|
super( is );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFromNBT( NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.readFromNBT( data );
|
||||||
|
this.crafting.readFromNBT( data, "processingGrid" );
|
||||||
|
this.pattern.readFromNBT( data, "pattern" );
|
||||||
|
this.output.readFromNBT( data, "outputList" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeToNBT( NBTTagCompound data )
|
||||||
|
{
|
||||||
|
super.writeToNBT( data );
|
||||||
|
this.crafting.writeToNBT( data, "processingGrid" );
|
||||||
|
this.pattern.writeToNBT( data, "pattern" );
|
||||||
|
this.output.writeToNBT( data, "outputList" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GuiBridge getGui( final EntityPlayer p )
|
||||||
|
{
|
||||||
|
int x = (int) p.posX;
|
||||||
|
int y = (int) p.posY;
|
||||||
|
int z = (int) p.posZ;
|
||||||
|
if( this.getHost().getTile() != null )
|
||||||
|
{
|
||||||
|
x = this.getTile().getPos().getX();
|
||||||
|
y = this.getTile().getPos().getY();
|
||||||
|
z = this.getTile().getPos().getZ();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL.hasPermissions( this.getHost().getTile(), x, y, z, this.getSide(), p ) )
|
||||||
|
{
|
||||||
|
return GuiBridge.GUI_EXPANDED_PROCESSING_PATTERN_TERMINAL;
|
||||||
|
}
|
||||||
|
return GuiBridge.GUI_ME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack )
|
||||||
|
{
|
||||||
|
if( inv == this.pattern && slot == 1 )
|
||||||
|
{
|
||||||
|
final ItemStack is = this.pattern.getStackInSlot( 1 );
|
||||||
|
if( !is.isEmpty() && is.getItem() instanceof ICraftingPatternItem )
|
||||||
|
{
|
||||||
|
final ICraftingPatternItem pattern = (ICraftingPatternItem) is.getItem();
|
||||||
|
final ICraftingPatternDetails details = pattern.getPatternForItem( is, this.getHost().getTile().getWorld() );
|
||||||
|
if( details != null )
|
||||||
|
{
|
||||||
|
for( int x = 0; x < this.crafting.getSlots() && x < details.getInputs().length; x++ )
|
||||||
|
{
|
||||||
|
final IAEItemStack item = details.getInputs()[x];
|
||||||
|
this.crafting.setStackInSlot( x, item == null ? ItemStack.EMPTY : item.createItemStack() );
|
||||||
|
}
|
||||||
|
|
||||||
|
for( int x = 0; x < this.output.getSlots() && x < details.getOutputs().length; x++ )
|
||||||
|
{
|
||||||
|
final IAEItemStack item = details.getOutputs()[x];
|
||||||
|
this.output.setStackInSlot( x, item == null ? ItemStack.EMPTY : item.createItemStack() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getHost().markForSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IItemHandler getInventoryByName( final String name )
|
||||||
|
{
|
||||||
|
if( name.equals( "crafting" ) )
|
||||||
|
{
|
||||||
|
return this.crafting;
|
||||||
|
}
|
||||||
|
if( name.equals( "output" ) )
|
||||||
|
{
|
||||||
|
return this.output;
|
||||||
|
}
|
||||||
|
if( name.equals( "pattern" ) )
|
||||||
|
{
|
||||||
|
return this.pattern;
|
||||||
|
}
|
||||||
|
return super.getInventoryByName( name );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IPartModel getStaticModels()
|
||||||
|
{
|
||||||
|
return this.selectModel( MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -495,12 +495,12 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, ITerminal
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
|
||||||
if( this.getProxy().isActive() )
|
if( this.getProxy().isActive() )
|
||||||
{
|
{
|
||||||
final IStorageGrid gs = this.getProxy().getStorage();
|
final IStorageGrid gs = this.getProxy().getStorage();
|
||||||
Platform.postChanges( gs, removed, added, this.mySrc );
|
Platform.postChanges( gs, removed, added, this.mySrc );
|
||||||
}
|
}
|
||||||
|
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException ignored )
|
catch( final GridAccessException ignored )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -263,12 +263,12 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
|
||||||
if( this.getProxy().isActive() )
|
if( this.getProxy().isActive() )
|
||||||
{
|
{
|
||||||
final IStorageGrid gs = this.getProxy().getStorage();
|
final IStorageGrid gs = this.getProxy().getStorage();
|
||||||
Platform.postChanges( gs, removed, added, this.mySrc );
|
Platform.postChanges( gs, removed, added, this.mySrc );
|
||||||
}
|
}
|
||||||
|
this.getProxy().getGrid().postEvent( new MENetworkCellArrayUpdate() );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException ignored )
|
catch( final GridAccessException ignored )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
private String displayName;
|
private String displayName;
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
private List<String> tooltip;
|
private List<String> tooltip;
|
||||||
|
private ItemStack cachedItemStack;
|
||||||
|
|
||||||
private AEItemStack(final AEItemStack is) {
|
private AEItemStack(final AEItemStack is) {
|
||||||
this.setStackSize(is.getStackSize());
|
this.setStackSize(is.getStackSize());
|
||||||
@@ -250,6 +251,18 @@ public final class AEItemStack extends AEStack<IAEItemStack> implements IAEItemS
|
|||||||
return this.isSameType(is);
|
return this.isSameType(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getCachedItemStack()
|
||||||
|
{
|
||||||
|
return this.cachedItemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCachedItemStack( ItemStack is )
|
||||||
|
{
|
||||||
|
this.cachedItemStack = is;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return this.getStackSize() + "x" + this.getDefinition().getItem().getRegistryName();
|
return this.getStackSize() + "x" + this.getDefinition().getItem().getRegistryName();
|
||||||
|
|||||||
@@ -19,13 +19,8 @@
|
|||||||
package appeng.util.item;
|
package appeng.util.item;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.cache.CacheLoader;
|
import com.google.common.cache.CacheLoader;
|
||||||
@@ -116,7 +111,7 @@ public class OreHelper
|
|||||||
boolean sameOre( final AEItemStack aeItemStack, final IAEItemStack is )
|
boolean sameOre( final AEItemStack aeItemStack, final IAEItemStack is )
|
||||||
{
|
{
|
||||||
final OreReference a = aeItemStack.getOre().orElse( null );
|
final OreReference a = aeItemStack.getOre().orElse( null );
|
||||||
final OreReference b = aeItemStack.getOre().orElse( null );
|
final OreReference b = ( (AEItemStack) is ).getOre().orElse( null );
|
||||||
|
|
||||||
return this.sameOre( a, b );
|
return this.sameOre( a, b );
|
||||||
}
|
}
|
||||||
@@ -160,8 +155,53 @@ public class OreHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
} )
|
} ).orElse( false );
|
||||||
.orElse( false );
|
}
|
||||||
|
|
||||||
|
public Set<Integer> getMatchingOre( String allow )
|
||||||
|
{
|
||||||
|
List<String> matchingOres = new ArrayList<>();
|
||||||
|
ConcurrentMap<String, List<ItemStack>> oreKeys = oreDictCache.asMap();
|
||||||
|
|
||||||
|
oreKeys.forEach( ( s, l ) -> {
|
||||||
|
|
||||||
|
if( allow.startsWith( "*" ) && allow.endsWith( "*" ) )
|
||||||
|
{
|
||||||
|
if( s.contains( allow.substring( 1, allow.length() - 1 ) ) )
|
||||||
|
{
|
||||||
|
matchingOres.add( s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( allow.startsWith( "*" ) )
|
||||||
|
{
|
||||||
|
if( s.endsWith( allow.substring( 1 ) ) )
|
||||||
|
{
|
||||||
|
matchingOres.add( s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( allow.endsWith( "*" ) )
|
||||||
|
{
|
||||||
|
if( s.startsWith( allow.substring( 0, allow.length() - 1 ) ) )
|
||||||
|
{
|
||||||
|
matchingOres.add( s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( s.matches( allow ) )
|
||||||
|
{
|
||||||
|
matchingOres.add( s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
|
||||||
|
Set<Integer> oreIDs = new HashSet<>();
|
||||||
|
for( String matchingOre : matchingOres )
|
||||||
|
{
|
||||||
|
oreIDs.add( OreDictionary.getOreID( matchingOre ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return oreIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ItemStack> getCachedOres( final String oreName )
|
List<ItemStack> getCachedOres( final String oreName )
|
||||||
|
|||||||
@@ -65,8 +65,8 @@ public class OreReference
|
|||||||
return this.aeOtherOptions;
|
return this.aeOtherOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection<Integer> getOres()
|
public Collection<Integer> getOres()
|
||||||
{
|
{
|
||||||
return this.ores;
|
return this.ores;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package appeng.util.prioritylist;
|
||||||
|
|
||||||
|
import appeng.api.storage.data.IAEStack;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
|
import appeng.util.item.OreReference;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
public class OreDictPriorityList<T extends IAEStack<T>> implements IPartitionList<T>
|
||||||
|
{
|
||||||
|
private final Set<Integer> oreIDs;
|
||||||
|
private final String oreMatch;
|
||||||
|
|
||||||
|
public OreDictPriorityList( Set<Integer> oreIDs, String oreMatch )
|
||||||
|
{
|
||||||
|
this.oreIDs = oreIDs;
|
||||||
|
this.oreMatch = oreMatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isListed( final T input )
|
||||||
|
{
|
||||||
|
OreReference or = ( (AEItemStack) input ).getOre().orElse( null );
|
||||||
|
if( or != null )
|
||||||
|
{
|
||||||
|
for( Integer oreID : or.getOres() )
|
||||||
|
{
|
||||||
|
if( this.oreIDs.contains( oreID ) )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEmpty()
|
||||||
|
{
|
||||||
|
return oreMatch.equals( "" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<T> getItems()
|
||||||
|
{
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -133,6 +133,7 @@ gui.appliedenergistics2.SecurityCardEditor=Biometric Card Editor
|
|||||||
gui.appliedenergistics2.Encoded=Encoded
|
gui.appliedenergistics2.Encoded=Encoded
|
||||||
gui.appliedenergistics2.Priority=Priority
|
gui.appliedenergistics2.Priority=Priority
|
||||||
gui.appliedenergistics2.StorageBus=Storage Bus
|
gui.appliedenergistics2.StorageBus=Storage Bus
|
||||||
|
gui.appliedenergistics2.OreDictStorageBus=Ore Dictionary Storage Bus
|
||||||
gui.appliedenergistics2.StorageBusFluids=Fluid Storage Bus
|
gui.appliedenergistics2.StorageBusFluids=Fluid Storage Bus
|
||||||
gui.appliedenergistics2.EnergyDrain=Passive Drain
|
gui.appliedenergistics2.EnergyDrain=Passive Drain
|
||||||
gui.appliedenergistics2.Installed=Installed
|
gui.appliedenergistics2.Installed=Installed
|
||||||
@@ -535,8 +536,10 @@ item.appliedenergistics2.multi_part.level_emitter.name=ME Level Emitter
|
|||||||
item.appliedenergistics2.multi_part.fluid_level_emitter.name=ME Fluid Level Emitter
|
item.appliedenergistics2.multi_part.fluid_level_emitter.name=ME Fluid Level Emitter
|
||||||
item.appliedenergistics2.multi_part.p2p_tunnel.name=P2P Tunnel
|
item.appliedenergistics2.multi_part.p2p_tunnel.name=P2P Tunnel
|
||||||
item.appliedenergistics2.multi_part.pattern_terminal.name=ME Pattern Terminal
|
item.appliedenergistics2.multi_part.pattern_terminal.name=ME Pattern Terminal
|
||||||
|
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME Extended Processing Pattern Terminal
|
||||||
item.appliedenergistics2.multi_part.quartz_fiber.name=Quartz Fiber
|
item.appliedenergistics2.multi_part.quartz_fiber.name=Quartz Fiber
|
||||||
item.appliedenergistics2.multi_part.storage_bus.name=ME Storage Bus
|
item.appliedenergistics2.multi_part.storage_bus.name=ME Storage Bus
|
||||||
|
item.appliedenergistics2.multi_part.oredict_storage_bus.name=ME OreDict Storage Bus
|
||||||
item.appliedenergistics2.multi_part.fluid_storage_bus.name=ME Fluid Storage Bus
|
item.appliedenergistics2.multi_part.fluid_storage_bus.name=ME Fluid Storage Bus
|
||||||
item.appliedenergistics2.multi_part.terminal.name=ME Terminal
|
item.appliedenergistics2.multi_part.terminal.name=ME Terminal
|
||||||
item.appliedenergistics2.multi_part.inverted_toggle_bus.name=ME Inverted Toggle Bus
|
item.appliedenergistics2.multi_part.inverted_toggle_bus.name=ME Inverted Toggle Bus
|
||||||
|
|||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"parent": "appliedenergistics2:item/part/display",
|
||||||
|
"textures": {
|
||||||
|
"front": "appliedenergistics2:items/part/expanded_processing_pattern_terminal",
|
||||||
|
"front_bright": "appliedenergistics2:parts/expanded_processing_pattern_terminal_bright",
|
||||||
|
"front_medium": "appliedenergistics2:parts/expanded_processing_pattern_terminal_medium",
|
||||||
|
"front_dark": "appliedenergistics2:parts/pattern_terminal_dark"
|
||||||
|
}
|
||||||
|
}
|
||||||
+106
@@ -0,0 +1,106 @@
|
|||||||
|
{
|
||||||
|
"parent": "appliedenergistics2:item/part/part",
|
||||||
|
"textures": {
|
||||||
|
"sides": "appliedenergistics2:parts/storage_bus_sides",
|
||||||
|
"back": "appliedenergistics2:parts/storage_bus_back",
|
||||||
|
"front": "appliedenergistics2:items/part/oredict_storage_bus"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
13,
|
||||||
|
13,
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#front"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
7
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#front"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
5,
|
||||||
|
5,
|
||||||
|
8
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
11,
|
||||||
|
11,
|
||||||
|
10
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#front"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"parent": "appliedenergistics2:part/display_off",
|
||||||
|
"textures": {
|
||||||
|
"lightsBright": "appliedenergistics2:parts/expanded_processing_pattern_terminal_bright",
|
||||||
|
"lightsMedium": "appliedenergistics2:parts/expanded_processing_pattern_terminal_medium",
|
||||||
|
"lightsDark": "appliedenergistics2:parts/pattern_terminal_dark"
|
||||||
|
}
|
||||||
|
}
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"ae2_uvl_marker": true,
|
||||||
|
"textures": {
|
||||||
|
"lightsBright": "appliedenergistics2:parts/expanded_processing_pattern_terminal_bright",
|
||||||
|
"lightsMedium": "appliedenergistics2:parts/expanded_processing_pattern_terminal_medium",
|
||||||
|
"lightsDark": "appliedenergistics2:parts/pattern_terminal_dark"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#lightsBright",
|
||||||
|
"tintindex": 3,
|
||||||
|
"uvlightmap": {
|
||||||
|
"sky": 0.007,
|
||||||
|
"block": 0.007
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#lightsMedium",
|
||||||
|
"tintindex": 2,
|
||||||
|
"uvlightmap": {
|
||||||
|
"sky": 0.007,
|
||||||
|
"block": 0.007
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"north": {
|
||||||
|
"texture": "#lightsDark",
|
||||||
|
"tintindex": 1,
|
||||||
|
"uvlightmap": {
|
||||||
|
"sky": 0.007,
|
||||||
|
"block": 0.007
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+130
@@ -0,0 +1,130 @@
|
|||||||
|
{
|
||||||
|
"textures": {
|
||||||
|
"sides": "appliedenergistics2:parts/storage_bus_sides",
|
||||||
|
"sidesStatus": "appliedenergistics2:parts/monitor_sides_status",
|
||||||
|
"back": "appliedenergistics2:parts/storage_bus_back",
|
||||||
|
"front": "appliedenergistics2:items/part/oredict_storage_bus",
|
||||||
|
"particle": "appliedenergistics2:parts/storage_bus_back"
|
||||||
|
},
|
||||||
|
"elements": [
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
3,
|
||||||
|
3,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
13,
|
||||||
|
13,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"north": {
|
||||||
|
"texture": "#front"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
14,
|
||||||
|
14,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"north": {
|
||||||
|
"texture": "#front"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
5,
|
||||||
|
5,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
11,
|
||||||
|
11,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"south": {
|
||||||
|
"texture": "#back"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"from": [
|
||||||
|
5,
|
||||||
|
5,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"to": [
|
||||||
|
11,
|
||||||
|
11,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"faces": {
|
||||||
|
"down": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"up": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"east": {
|
||||||
|
"texture": "#sides"
|
||||||
|
},
|
||||||
|
"west": {
|
||||||
|
"texture": "#sides"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
+41
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"type": "forge:and",
|
||||||
|
"values": [
|
||||||
|
{
|
||||||
|
"type": "appliedenergistics2:part_exists",
|
||||||
|
"part": "part.pattern_terminal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "appliedenergistics2:material_exists",
|
||||||
|
"material": "material.calculation_processor"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"result": {
|
||||||
|
"type": "appliedenergistics2:part",
|
||||||
|
"part": "part.expanded_processing_pattern_terminal"
|
||||||
|
},
|
||||||
|
"type": "appliedenergistics2:part_shaped",
|
||||||
|
"pattern": [
|
||||||
|
"c c",
|
||||||
|
"tft",
|
||||||
|
"c c"
|
||||||
|
],
|
||||||
|
"key": {
|
||||||
|
"f": {
|
||||||
|
"type": "appliedenergistics2:part",
|
||||||
|
"part": "cable_glass.fluix"
|
||||||
|
},
|
||||||
|
"t": {
|
||||||
|
"type": "appliedenergistics2:part",
|
||||||
|
"part": "part.pattern_terminal"
|
||||||
|
},
|
||||||
|
"c": {
|
||||||
|
"type": "appliedenergistics2:part",
|
||||||
|
"part": "material.calculation_processor"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 527 B |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 209 B |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 5.3 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 107 B |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 137 B |
Reference in New Issue
Block a user