Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 104d6fc34d | |||
| 40caeec92f | |||
| 119cdbc2c0 | |||
| a44c74b0d7 | |||
| a55dbb061c | |||
| 9fdf0345b3 | |||
| 346f5aeaac | |||
| d4b5d0dc26 | |||
| d77838146d | |||
| 5b1f98b2d8 | |||
| 1c197c0f20 | |||
| 46a1faaca2 | |||
| dd28b610e1 | |||
| aa2bb45199 | |||
| 48146af137 | |||
| 582d7f140c | |||
| ffdc052d99 | |||
| de7d6321f0 | |||
| 235eef23e3 | |||
| c7fcdf7d8b | |||
| 3a6ab149e4 | |||
| 9337eceb82 | |||
| 35f91bf0d0 | |||
| 6d14d082b0 | |||
| 98ad919f1b | |||
| fb4af262b7 | |||
| 5f774749e8 | |||
| 81b3ff6976 | |||
| c8698fc2bf | |||
| be9fb6d04c | |||
| 90ca2c7e92 | |||
| 39ac308889 | |||
| 4d268b97a9 | |||
| 4b6fbf68b6 | |||
| a289dec832 | |||
| a4f50ea9ef | |||
| 0e8f7c9d03 | |||
| 7c0935f447 | |||
| 3455e815b8 | |||
| a08e61b818 | |||
| ed702a5c73 | |||
| 1364117374 | |||
| ed4b864ba2 | |||
| e67b196e19 |
@@ -4,7 +4,7 @@ aebuild=7
|
||||
aegroup=appeng
|
||||
aebasename=appliedenergistics2
|
||||
extended=extended_life
|
||||
extendedversion=v52b
|
||||
extendedversion=v0.52.11
|
||||
#########################################################
|
||||
# Versions #
|
||||
#########################################################
|
||||
|
||||
@@ -108,6 +108,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
||||
private List<IGhostIngredientHandler.Target<Object>> hoveredIngredientTargets = new ArrayList<>();
|
||||
private Object bookmarkedIngredient;
|
||||
private boolean isDraggingJeiGhostItem;
|
||||
private boolean haltDragging = false;
|
||||
|
||||
public void setJeiGhostItem( boolean jeiGhostItem )
|
||||
{
|
||||
@@ -437,6 +438,15 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
||||
super.mouseClicked( xCoord, yCoord, btn );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void mouseReleased( int mouseX, int mouseY, int state )
|
||||
{
|
||||
this.drag_click.clear();
|
||||
this.haltDragging = false;
|
||||
|
||||
super.mouseReleased( mouseX, mouseY, state );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void mouseClickMove( final int x, final int y, final int c, final long d )
|
||||
{
|
||||
@@ -450,48 +460,48 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
||||
|
||||
if( slot instanceof SlotFake && !itemstack.isEmpty() )
|
||||
{
|
||||
this.drag_click.add( slot );
|
||||
if( this.drag_click.size() > 1 )
|
||||
if( this.drag_click.add( slot ) )
|
||||
{
|
||||
for( final Slot dr : this.drag_click )
|
||||
{
|
||||
final PacketInventoryAction p = new PacketInventoryAction( c == 0 ? InventoryAction.PICKUP_OR_SET_DOWN : InventoryAction.PLACE_SINGLE, dr.slotNumber, 0 );
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
}
|
||||
final PacketInventoryAction p = new PacketInventoryAction( c == 0 ? InventoryAction.PICKUP_OR_SET_DOWN : InventoryAction.PLACE_SINGLE, slot.slotNumber, 0 );
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
}
|
||||
}
|
||||
else if( slot instanceof SlotDisconnected )
|
||||
{
|
||||
this.drag_click.add( slot );
|
||||
if( this.drag_click.size() > 1 )
|
||||
if( !haltDragging && this.drag_click.add( slot ) )
|
||||
{
|
||||
if( !itemstack.isEmpty() )
|
||||
{
|
||||
for( final Slot dr : this.drag_click )
|
||||
if( slot.getStack().isEmpty() )
|
||||
{
|
||||
if( slot.getStack().isEmpty() )
|
||||
InventoryAction action;
|
||||
if( slot.getSlotStackLimit() == 1 )
|
||||
{
|
||||
InventoryAction action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
||||
final PacketInventoryAction p = new PacketInventoryAction( action, dr.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
action = InventoryAction.PICKUP_OR_SET_DOWN;
|
||||
}
|
||||
final PacketInventoryAction p = new PacketInventoryAction( action, slot.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if( isShiftKeyDown() )
|
||||
else if( isShiftKeyDown() )
|
||||
{
|
||||
for( final Slot dr : this.drag_click )
|
||||
{
|
||||
for( final Slot dr : this.drag_click )
|
||||
InventoryAction action = null;
|
||||
if( !slot.getStack().isEmpty() )
|
||||
{
|
||||
InventoryAction action = null;
|
||||
if( !slot.getStack().isEmpty() )
|
||||
{
|
||||
action = InventoryAction.SHIFT_CLICK;
|
||||
}
|
||||
if( action != null )
|
||||
{
|
||||
final PacketInventoryAction p = new PacketInventoryAction( action, dr.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
}
|
||||
action = InventoryAction.SHIFT_CLICK;
|
||||
}
|
||||
if( action != null )
|
||||
{
|
||||
final PacketInventoryAction p = new PacketInventoryAction( action, dr.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -628,7 +638,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
||||
|
||||
if( slot instanceof SlotDisconnected )
|
||||
{
|
||||
if( this.drag_click.size() > 1 )
|
||||
if( this.drag_click.size() >= 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -638,11 +648,11 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
||||
switch ( clickType )
|
||||
{
|
||||
case PICKUP: // pickup / set-down.
|
||||
if( slot.getStack().isEmpty() && !player.inventory.getItemStack().isEmpty() )
|
||||
if( mouseButton == 1 )
|
||||
{
|
||||
action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
||||
}
|
||||
if( !slot.getStack().isEmpty() && player.inventory.getItemStack().getCount() <= 1 )
|
||||
else
|
||||
{
|
||||
action = InventoryAction.PICKUP_OR_SET_DOWN;
|
||||
}
|
||||
@@ -858,7 +868,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
||||
}
|
||||
}
|
||||
|
||||
private void mouseWheelEvent( final int x, final int y, final int wheel )
|
||||
protected void mouseWheelEvent( final int x, final int y, final int wheel )
|
||||
{
|
||||
final Slot slot = this.getSlot( x, y );
|
||||
if( slot instanceof SlotME )
|
||||
|
||||
@@ -46,6 +46,7 @@ import appeng.helpers.WirelessTerminalGuiObject;
|
||||
import appeng.parts.reporting.PartCraftingTerminal;
|
||||
import appeng.parts.reporting.PartPatternTerminal;
|
||||
import appeng.parts.reporting.PartTerminal;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
|
||||
public class GuiCraftAmount extends AEBaseGui
|
||||
@@ -142,6 +143,7 @@ public class GuiCraftAmount extends AEBaseGui
|
||||
this.amountToCraft.setVisible( true );
|
||||
this.amountToCraft.setFocused( true );
|
||||
this.amountToCraft.setText( "1" );
|
||||
this.amountToCraft.setSelectionPos( 0 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -160,8 +162,8 @@ public class GuiCraftAmount extends AEBaseGui
|
||||
|
||||
try
|
||||
{
|
||||
Long.parseLong( this.amountToCraft.getText() );
|
||||
this.next.enabled = !this.amountToCraft.getText().isEmpty();
|
||||
long amt = Long.parseLong( this.amountToCraft.getText() );
|
||||
this.next.enabled = ( !this.amountToCraft.getText().isEmpty() && amt > 0 );
|
||||
}
|
||||
catch( final NumberFormatException e )
|
||||
{
|
||||
@@ -176,7 +178,7 @@ public class GuiCraftAmount extends AEBaseGui
|
||||
{
|
||||
if( !this.checkHotbarKeys( key ) )
|
||||
{
|
||||
if( key == 28 )
|
||||
if( key == Keyboard.KEY_RETURN || key == Keyboard.KEY_NUMPADENTER )
|
||||
{
|
||||
this.actionPerformed( this.next );
|
||||
}
|
||||
@@ -188,7 +190,7 @@ public class GuiCraftAmount extends AEBaseGui
|
||||
String out = this.amountToCraft.getText();
|
||||
|
||||
boolean fixed = false;
|
||||
while( out.startsWith( "0" ) && out.length() > 1 )
|
||||
while ( out.startsWith( "0" ) && out.length() > 1 )
|
||||
{
|
||||
out = out.substring( 1 );
|
||||
fixed = true;
|
||||
@@ -262,7 +264,7 @@ public class GuiCraftAmount extends AEBaseGui
|
||||
String out = this.amountToCraft.getText();
|
||||
|
||||
boolean fixed = false;
|
||||
while( out.startsWith( "0" ) && out.length() > 1 )
|
||||
while ( out.startsWith( "0" ) && out.length() > 1 )
|
||||
{
|
||||
out = out.substring( 1 );
|
||||
fixed = true;
|
||||
|
||||
@@ -0,0 +1,575 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, 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.client.gui.implementations;
|
||||
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
import appeng.api.config.ActionItems;
|
||||
import appeng.api.config.Settings;
|
||||
import appeng.client.gui.widgets.GuiImgButton;
|
||||
import appeng.container.implementations.ContainerInterfaceConfigurationTerminal;
|
||||
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||
import appeng.core.sync.network.NetworkHandler;
|
||||
import appeng.core.sync.packets.PacketInventoryAction;
|
||||
import appeng.helpers.DualityInterface;
|
||||
import appeng.helpers.InventoryAction;
|
||||
import appeng.parts.reporting.PartInterfaceConfigurationTerminal;
|
||||
import appeng.util.BlockPosUtils;
|
||||
import appeng.util.item.AEItemStack;
|
||||
import com.google.common.collect.HashMultimap;
|
||||
|
||||
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
import appeng.api.AEApi;
|
||||
import appeng.api.storage.channels.IItemStorageChannel;
|
||||
import appeng.client.gui.AEBaseGui;
|
||||
import appeng.client.gui.widgets.GuiScrollbar;
|
||||
import appeng.client.gui.widgets.MEGuiTextField;
|
||||
import appeng.client.me.ClientDCInternalInv;
|
||||
import appeng.client.me.SlotDisconnected;
|
||||
import appeng.core.localization.GuiText;
|
||||
import appeng.util.Platform;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.TextComponentString;
|
||||
import net.minecraftforge.common.DimensionManager;
|
||||
import org.lwjgl.input.Mouse;
|
||||
|
||||
|
||||
import static appeng.client.render.BlockPosHighlighter.hilightBlock;
|
||||
|
||||
|
||||
public class GuiInterfaceConfigurationTerminal extends AEBaseGui implements IJEIGhostIngredients
|
||||
{
|
||||
|
||||
private static final int LINES_ON_PAGE = 6;
|
||||
|
||||
// TODO: copied from GuiMEMonitorable. It looks not changed, maybe unneeded?
|
||||
private final int offsetX = 21;
|
||||
|
||||
private final HashMap<Long, ClientDCInternalInv> byId = new HashMap<>();
|
||||
private final HashMultimap<String, ClientDCInternalInv> byName = HashMultimap.create();
|
||||
private final HashMap<ClientDCInternalInv, BlockPos> blockPosHashMap = new HashMap<>();
|
||||
private final HashMap<GuiButton, ClientDCInternalInv> guiButtonHashMap = new HashMap<>();
|
||||
private final Map<ClientDCInternalInv, Integer> numUpgradesMap = new HashMap<>();
|
||||
private final ArrayList<String> names = new ArrayList<>();
|
||||
private final ArrayList<Object> lines = new ArrayList<>();
|
||||
private final Set<Object> matchedStacks = new HashSet<>();
|
||||
|
||||
private final Map<String, Set<Object>> cachedSearches = new WeakHashMap<>();
|
||||
|
||||
private boolean refreshList = false;
|
||||
private MEGuiTextField searchFieldInputs;
|
||||
private PartInterfaceConfigurationTerminal partInterfaceTerminal;
|
||||
private HashMap<ClientDCInternalInv, Integer> dimHashMap = new HashMap<>();
|
||||
public Map<IGhostIngredientHandler.Target<?>, Object> mapTargetSlot = new HashMap<>();
|
||||
|
||||
public GuiInterfaceConfigurationTerminal( final InventoryPlayer inventoryPlayer, final PartInterfaceConfigurationTerminal te )
|
||||
{
|
||||
super( new ContainerInterfaceConfigurationTerminal( inventoryPlayer, te ) );
|
||||
|
||||
this.partInterfaceTerminal = te;
|
||||
final GuiScrollbar scrollbar = new GuiScrollbar();
|
||||
this.setScrollBar( scrollbar );
|
||||
this.xSize = 208;
|
||||
this.ySize = 235;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initGui()
|
||||
{
|
||||
super.initGui();
|
||||
|
||||
this.getScrollBar().setLeft( 189 );
|
||||
this.getScrollBar().setHeight( 106 );
|
||||
this.getScrollBar().setTop( 31 );
|
||||
|
||||
this.searchFieldInputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 32, this.offsetX ), this.guiTop + 17, 65, 12 );
|
||||
this.searchFieldInputs.setEnableBackgroundDrawing( false );
|
||||
this.searchFieldInputs.setMaxStringLength( 25 );
|
||||
this.searchFieldInputs.setTextColor( 0xFFFFFF );
|
||||
this.searchFieldInputs.setVisible( true );
|
||||
this.searchFieldInputs.setFocused( false );
|
||||
|
||||
this.searchFieldInputs.setText( partInterfaceTerminal.in );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGuiClosed()
|
||||
{
|
||||
partInterfaceTerminal.saveSearchStrings( this.searchFieldInputs.getText().toLowerCase() );
|
||||
super.onGuiClosed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawFG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
||||
{
|
||||
this.buttonList.clear();
|
||||
|
||||
this.fontRenderer.drawString( this.getGuiDisplayName( GuiText.InterfaceConfigurationTerminal.getLocal() ), 8, 6, 4210752 );
|
||||
this.fontRenderer.drawString( GuiText.inventory.getLocal(), this.offsetX + 2, this.ySize - 96 + 3, 4210752 );
|
||||
|
||||
final int currentScroll = this.getScrollBar().getCurrentScroll();
|
||||
|
||||
this.inventorySlots.inventorySlots.removeIf( slot -> slot instanceof SlotDisconnected );
|
||||
|
||||
int offset = 30;
|
||||
int linesDraw = 0;
|
||||
for( int x = 0; x < LINES_ON_PAGE && linesDraw < LINES_ON_PAGE && currentScroll + x < this.lines.size(); x++ )
|
||||
{
|
||||
final Object lineObj = this.lines.get( currentScroll + x );
|
||||
if( lineObj instanceof ClientDCInternalInv )
|
||||
{
|
||||
final ClientDCInternalInv inv = (ClientDCInternalInv) lineObj;
|
||||
|
||||
GuiButton guiButton = new GuiImgButton( guiLeft + 4, guiTop + offset, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE );
|
||||
guiButtonHashMap.put( guiButton, inv );
|
||||
this.buttonList.add( guiButton );
|
||||
int extraLines = numUpgradesMap.get( inv );
|
||||
|
||||
for( int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE; ++row )
|
||||
{
|
||||
for( int z = 0; z < 9; z++ )
|
||||
{
|
||||
this.inventorySlots.inventorySlots.add( new SlotDisconnected( inv, z + ( row * 9 ), ( z * 18 + 22 ), offset ) );
|
||||
if( this.matchedStacks.contains( inv.getInventory().getStackInSlot( z + ( row * 9 ) ) ) )
|
||||
{
|
||||
drawRect( z * 18 + 22, offset, z * 18 + 22 + 16, offset + 16, 0x2A00FF00 );
|
||||
}
|
||||
}
|
||||
linesDraw++;
|
||||
offset += 18;
|
||||
}
|
||||
}
|
||||
else if( lineObj instanceof String )
|
||||
{
|
||||
String name = (String) lineObj;
|
||||
final int rows = this.byName.get( name ).size();
|
||||
if( rows > 1 )
|
||||
{
|
||||
name = name + " (" + rows + ')';
|
||||
}
|
||||
|
||||
while ( name.length() > 2 && this.fontRenderer.getStringWidth( name ) > 155 )
|
||||
{
|
||||
name = name.substring( 0, name.length() - 1 );
|
||||
}
|
||||
this.fontRenderer.drawString( name, this.offsetX + 2, 5 + offset, 4210752 );
|
||||
linesDraw++;
|
||||
offset += 18;
|
||||
}
|
||||
}
|
||||
|
||||
if( searchFieldInputs.isMouseIn( mouseX, mouseY ) )
|
||||
{
|
||||
drawTooltip( Mouse.getEventX() * this.width / this.mc.displayWidth - offsetX, mouseY - guiTop, "Inputs OR names" );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void mouseClicked( final int xCoord, final int yCoord, final int btn ) throws IOException
|
||||
{
|
||||
this.searchFieldInputs.mouseClicked( xCoord, yCoord, btn );
|
||||
|
||||
if( btn == 1 && this.searchFieldInputs.isMouseIn( xCoord, yCoord ) )
|
||||
{
|
||||
this.searchFieldInputs.setText( "" );
|
||||
this.refreshList();
|
||||
}
|
||||
|
||||
super.mouseClicked( xCoord, yCoord, btn );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void actionPerformed( final GuiButton btn ) throws IOException
|
||||
{
|
||||
if( guiButtonHashMap.containsKey( btn ) )
|
||||
{
|
||||
BlockPos blockPos = blockPosHashMap.get( guiButtonHashMap.get( this.selectedButton ) );
|
||||
BlockPos blockPos2 = mc.player.getPosition();
|
||||
int playerDim = mc.world.provider.getDimension();
|
||||
int interfaceDim = dimHashMap.get( guiButtonHashMap.get( this.selectedButton ) );
|
||||
if( playerDim != interfaceDim )
|
||||
{
|
||||
try
|
||||
{
|
||||
mc.player.sendStatusMessage( new TextComponentString( "Interface located at dimension: " + interfaceDim + " [" + DimensionManager.getWorld( interfaceDim ).provider.getDimensionType().getName() + "] and cant be highlighted" ), false );
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
mc.player.sendStatusMessage( new TextComponentString( "Interface is located in another dimension and cannot be highlighted" ), false );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hilightBlock( blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance( blockPos, blockPos2 ), playerDim );
|
||||
mc.player.sendStatusMessage( new TextComponentString( "The interface is now highlighted at " + "X: " + blockPos.getX() + " Y: " + blockPos.getY() + " Z: " + blockPos.getZ() ), false );
|
||||
}
|
||||
mc.player.closeScreen();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void mouseWheelEvent( final int x, final int y, final int wheel )
|
||||
{
|
||||
final Slot slot = this.getSlot( x, y );
|
||||
if( slot instanceof SlotDisconnected )
|
||||
{
|
||||
final ItemStack stack = slot.getStack();
|
||||
if( stack != ItemStack.EMPTY )
|
||||
{
|
||||
InventoryAction direction = wheel > 0 ? InventoryAction.PLACE_SINGLE : InventoryAction.PICKUP_SINGLE;
|
||||
final PacketInventoryAction p = new PacketInventoryAction( direction, slot.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
super.mouseWheelEvent( x, y, wheel );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawBG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
||||
{
|
||||
this.bindTexture( "guis/interfaceconfigurationterminal.png" );
|
||||
this.drawTexturedModalRect( offsetX, offsetY, 0, 0, this.xSize, this.ySize );
|
||||
|
||||
int offset = 29;
|
||||
final int ex = this.getScrollBar().getCurrentScroll();
|
||||
int linesDraw = 0;
|
||||
for( int x = 0; x < LINES_ON_PAGE && linesDraw < LINES_ON_PAGE && ex + x < this.lines.size(); x++ )
|
||||
{
|
||||
final Object lineObj = this.lines.get( ex + x );
|
||||
if( lineObj instanceof ClientDCInternalInv )
|
||||
{
|
||||
GlStateManager.color( 1, 1, 1, 1 );
|
||||
final int width = 9 * 18;
|
||||
|
||||
int extraLines = numUpgradesMap.get( lineObj );
|
||||
|
||||
for( int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE; ++row )
|
||||
{
|
||||
this.drawTexturedModalRect( offsetX + 20, offsetY + offset, 20, 170, width, 18 );
|
||||
offset += 18;
|
||||
linesDraw++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
offset += 18;
|
||||
linesDraw++;
|
||||
}
|
||||
}
|
||||
|
||||
if( this.searchFieldInputs != null )
|
||||
{
|
||||
this.searchFieldInputs.drawTextBox();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void keyTyped( final char character, final int key ) throws IOException
|
||||
{
|
||||
if( !this.checkHotbarKeys( key ) )
|
||||
{
|
||||
if( character == ' ' && this.searchFieldInputs.getText().isEmpty() && this.searchFieldInputs.isFocused() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( this.searchFieldInputs.textboxKeyTyped( character, key ) )
|
||||
{
|
||||
this.refreshList();
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
super.keyTyped( character, key );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void postUpdate( final NBTTagCompound in )
|
||||
{
|
||||
if( in.getBoolean( "clear" ) )
|
||||
{
|
||||
this.byId.clear();
|
||||
this.refreshList = true;
|
||||
}
|
||||
|
||||
for( final Object oKey : in.getKeySet() )
|
||||
{
|
||||
final String key = (String) oKey;
|
||||
if( key.startsWith( "=" ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
final long id = Long.parseLong( key.substring( 1 ), Character.MAX_RADIX );
|
||||
final NBTTagCompound invData = in.getCompoundTag( key );
|
||||
final ClientDCInternalInv current = this.getById( id, invData.getLong( "sortBy" ), invData.getString( "un" ) );
|
||||
blockPosHashMap.put( current, NBTUtil.getPosFromTag( invData.getCompoundTag( "pos" ) ) );
|
||||
dimHashMap.put( current, invData.getInteger( "dim" ) );
|
||||
numUpgradesMap.put( current, invData.getInteger( "numUpgrades" ) );
|
||||
|
||||
for( int x = 0; x < current.getInventory().getSlots(); x++ )
|
||||
{
|
||||
final String which = Integer.toString( x );
|
||||
if( invData.hasKey( which ) )
|
||||
{
|
||||
current.getInventory().setStackInSlot( x, new ItemStack( invData.getCompoundTag( which ) ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( final NumberFormatException ignored )
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( this.refreshList )
|
||||
{
|
||||
this.refreshList = false;
|
||||
// invalid caches on refresh
|
||||
this.cachedSearches.clear();
|
||||
this.refreshList();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuilds the list of interfaces.
|
||||
* <p>
|
||||
* Respects a search term if present (ignores case) and adding only matching patterns.
|
||||
*/
|
||||
private void refreshList()
|
||||
{
|
||||
this.byName.clear();
|
||||
this.buttonList.clear();
|
||||
this.matchedStacks.clear();
|
||||
|
||||
final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase();
|
||||
|
||||
final Set<Object> cachedSearch = this.getCacheForSearchTerm( searchFieldInputs );
|
||||
final boolean rebuild = cachedSearch.isEmpty();
|
||||
|
||||
for( final ClientDCInternalInv entry : this.byId.values() )
|
||||
{
|
||||
// ignore inventory if not doing a full rebuild and cache already marks it as miss.
|
||||
if( !rebuild && !cachedSearch.contains( entry ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Shortcut to skip any filter if search term is ""/empty
|
||||
|
||||
boolean found = searchFieldInputs.isEmpty();
|
||||
|
||||
// Search if the current inventory holds a pattern containing the search term.
|
||||
if( !found )
|
||||
{
|
||||
int slot = 0;
|
||||
for( final ItemStack itemStack : entry.getInventory() )
|
||||
{
|
||||
if( slot > 8 + numUpgradesMap.get( entry ) * 9 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
if( this.itemStackMatchesSearchTerm( itemStack, searchFieldInputs ) )
|
||||
{
|
||||
found = true;
|
||||
matchedStacks.add( itemStack );
|
||||
}
|
||||
slot++;
|
||||
}
|
||||
}
|
||||
// if found, filter skipped or machine name matching the search term, add it
|
||||
if( found || entry.getName().toLowerCase().contains( searchFieldInputs ) )
|
||||
{
|
||||
this.byName.put( entry.getName(), entry );
|
||||
cachedSearch.add( entry );
|
||||
}
|
||||
else
|
||||
{
|
||||
cachedSearch.remove( entry );
|
||||
}
|
||||
}
|
||||
|
||||
this.names.clear();
|
||||
this.names.addAll( this.byName.keySet() );
|
||||
|
||||
Collections.sort( this.names );
|
||||
|
||||
this.lines.clear();
|
||||
this.lines.ensureCapacity( this.getMaxRows() );
|
||||
|
||||
for( final String n : this.names )
|
||||
{
|
||||
this.lines.add( n );
|
||||
|
||||
final ArrayList<ClientDCInternalInv> clientInventories = new ArrayList<>();
|
||||
clientInventories.addAll( this.byName.get( n ) );
|
||||
|
||||
Collections.sort( clientInventories );
|
||||
this.lines.addAll( clientInventories );
|
||||
}
|
||||
|
||||
this.getScrollBar().setRange( 0, this.lines.size() - 1, 1 );
|
||||
}
|
||||
|
||||
private boolean itemStackMatchesSearchTerm( final ItemStack itemStack, final String searchTerm )
|
||||
{
|
||||
if( itemStack.isEmpty() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean foundMatchingItemStack = false;
|
||||
|
||||
final String displayName = Platform
|
||||
.getItemDisplayName( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( itemStack ) )
|
||||
.toLowerCase();
|
||||
|
||||
for( String term : searchTerm.split( " " ) )
|
||||
{
|
||||
if( term.length() > 1 && ( term.startsWith( "-" ) || term.startsWith( "!" ) ) )
|
||||
{
|
||||
term = term.substring( 1 );
|
||||
if( displayName.contains( term ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if( displayName.contains( term ) )
|
||||
{
|
||||
foundMatchingItemStack = true;
|
||||
}
|
||||
}
|
||||
return foundMatchingItemStack;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to retrieve a cache for a with search term as keyword.
|
||||
* <p>
|
||||
* If this cache should be empty, it will populate it with an earlier cache if available or at least the cache for
|
||||
* the empty string.
|
||||
*
|
||||
* @param searchTerm the corresponding search
|
||||
* @return a Set matching a superset of the search term
|
||||
*/
|
||||
private Set<Object> getCacheForSearchTerm( final String searchTerm )
|
||||
{
|
||||
if( !this.cachedSearches.containsKey( searchTerm ) )
|
||||
{
|
||||
this.cachedSearches.put( searchTerm, new HashSet<>() );
|
||||
}
|
||||
|
||||
final Set<Object> cache = this.cachedSearches.get( searchTerm );
|
||||
|
||||
if( cache.isEmpty() && searchTerm.length() > 1 )
|
||||
{
|
||||
cache.addAll( this.getCacheForSearchTerm( searchTerm.substring( 0, searchTerm.length() - 1 ) ) );
|
||||
return cache;
|
||||
}
|
||||
|
||||
return cache;
|
||||
}
|
||||
|
||||
/**
|
||||
* The max amount of unique names and each inv row. Not affected by the filtering.
|
||||
*
|
||||
* @return max amount of unique names and each inv row
|
||||
*/
|
||||
private int getMaxRows()
|
||||
{
|
||||
return this.names.size() + this.byId.size();
|
||||
}
|
||||
|
||||
private ClientDCInternalInv getById( final long id, final long sortBy, final String string )
|
||||
{
|
||||
ClientDCInternalInv o = this.byId.get( id );
|
||||
|
||||
if( o == null )
|
||||
{
|
||||
this.byId.put( id, o = new ClientDCInternalInv( DualityInterface.NUMBER_OF_CONFIG_SLOTS, id, sortBy, string, 64 ) );
|
||||
this.refreshList = true;
|
||||
}
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
@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 SlotDisconnected )
|
||||
{
|
||||
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, (SlotDisconnected) 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 IJEIGhostIngredients.super.getFakeSlotTargetMap();
|
||||
}
|
||||
}
|
||||
@@ -72,9 +72,9 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
|
||||
private final HashMap<Long, ClientDCInternalInv> byId = new HashMap<>();
|
||||
private final HashMultimap<String, ClientDCInternalInv> byName = HashMultimap.create();
|
||||
private final HashMap<ClientDCInternalInv,BlockPos> blockPosHashMap = new HashMap<>();
|
||||
private final HashMap<GuiButton,ClientDCInternalInv> guiButtonHashMap = new HashMap<>();
|
||||
private final Map<ClientDCInternalInv,Integer> numUpgradesMap = new HashMap<>();
|
||||
private final HashMap<ClientDCInternalInv, BlockPos> blockPosHashMap = new HashMap<>();
|
||||
private final HashMap<GuiButton, ClientDCInternalInv> guiButtonHashMap = new HashMap<>();
|
||||
private final Map<ClientDCInternalInv, Integer> numUpgradesMap = new HashMap<>();
|
||||
private final ArrayList<String> names = new ArrayList<>();
|
||||
private final ArrayList<Object> lines = new ArrayList<>();
|
||||
private final Set<Object> matchedStacks = new HashSet<>();
|
||||
@@ -87,7 +87,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
private PartInterfaceTerminal partInterfaceTerminal;
|
||||
private GuiButton guiButtonHide;
|
||||
private GuiButton guiButtonNextAssembler;
|
||||
private HashMap<ClientDCInternalInv,Integer> dimHashMap = new HashMap<>();
|
||||
private HashMap<ClientDCInternalInv, Integer> dimHashMap = new HashMap<>();
|
||||
|
||||
public GuiInterfaceTerminal( final InventoryPlayer inventoryPlayer, final PartInterfaceTerminal te )
|
||||
{
|
||||
@@ -166,9 +166,9 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
this.buttonList.add( guiButton );
|
||||
int extraLines = numUpgradesMap.get( inv );
|
||||
|
||||
for( int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE ; ++row )
|
||||
for( int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE; ++row )
|
||||
{
|
||||
for( int z = 0; z < 9 ; z++ )
|
||||
for( int z = 0; z < 9; z++ )
|
||||
{
|
||||
this.inventorySlots.inventorySlots.add( new SlotDisconnected( inv, z + ( row * 9 ), ( z * 18 + 22 ), offset ) );
|
||||
if( this.matchedStacks.contains( inv.getInventory().getStackInSlot( z + ( row * 9 ) ) ) )
|
||||
@@ -199,8 +199,14 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
}
|
||||
}
|
||||
|
||||
if( searchFieldInputs.isMouseIn( mouseX, mouseY ) ) drawTooltip( Mouse.getEventX() * this.width / this.mc.displayWidth - offsetX, mouseY - guiTop, "Inputs OR names" );
|
||||
else if( searchFieldOutputs.isMouseIn( mouseX, mouseY ) ) drawTooltip( Mouse.getEventX() * this.width / this.mc.displayWidth - offsetX, mouseY - guiTop, "Outputs OR names" );
|
||||
if( searchFieldInputs.isMouseIn( mouseX, mouseY ) )
|
||||
{
|
||||
drawTooltip( Mouse.getEventX() * this.width / this.mc.displayWidth - offsetX, mouseY - guiTop, "Inputs OR names" );
|
||||
}
|
||||
else if( searchFieldOutputs.isMouseIn( mouseX, mouseY ) )
|
||||
{
|
||||
drawTooltip( Mouse.getEventX() * this.width / this.mc.displayWidth - offsetX, mouseY - guiTop, "Outputs OR names" );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -237,9 +243,12 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
int interfaceDim = dimHashMap.get( guiButtonHashMap.get( this.selectedButton ) );
|
||||
if( playerDim != interfaceDim )
|
||||
{
|
||||
try {
|
||||
try
|
||||
{
|
||||
mc.player.sendStatusMessage( new TextComponentString( "Interface located at dimension: " + interfaceDim + " [" + DimensionManager.getWorld( interfaceDim ).provider.getDimensionType().getName() + "] and cant be highlighted" ), false );
|
||||
} catch(Exception e){
|
||||
}
|
||||
catch( Exception e )
|
||||
{
|
||||
mc.player.sendStatusMessage( new TextComponentString( "Interface is located in another dimension and cannot be highlighted" ), false );
|
||||
}
|
||||
}
|
||||
@@ -251,25 +260,25 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
mc.player.closeScreen();
|
||||
}
|
||||
|
||||
if (btn == guiButtonHide)
|
||||
if( btn == guiButtonHide )
|
||||
{
|
||||
partInterfaceTerminal.onlyInterfacesWithFreeSlots = !partInterfaceTerminal.onlyInterfacesWithFreeSlots;
|
||||
this.refreshList();
|
||||
}
|
||||
|
||||
if (btn == guiButtonNextAssembler)
|
||||
if( btn == guiButtonNextAssembler )
|
||||
{
|
||||
// Set Search to "Molecular Assembler" and set "Only Free Interface"
|
||||
boolean currentOnlyInterfacesWithFreeSlots = this.partInterfaceTerminal.onlyInterfacesWithFreeSlots;
|
||||
String currentSearchText = this.searchFieldOutputs.getText();
|
||||
|
||||
this.partInterfaceTerminal.onlyInterfacesWithFreeSlots = true;
|
||||
this.searchFieldOutputs.setText("Molecular Assembler");
|
||||
this.searchFieldOutputs.setText( "Molecular Assembler" );
|
||||
|
||||
this.refreshList();
|
||||
|
||||
this.partInterfaceTerminal.onlyInterfacesWithFreeSlots = currentOnlyInterfacesWithFreeSlots;
|
||||
this.searchFieldOutputs.setText(currentSearchText);
|
||||
this.searchFieldOutputs.setText( currentSearchText );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,12 +303,13 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
|
||||
for( int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE; ++row )
|
||||
{
|
||||
this.drawTexturedModalRect( offsetX + 20, offsetY + offset , 20, 173, width, 18 );
|
||||
this.drawTexturedModalRect( offsetX + 20, offsetY + offset, 20, 173, width, 18 );
|
||||
offset += 18;
|
||||
linesDraw++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
offset += 18;
|
||||
linesDraw++;
|
||||
}
|
||||
@@ -326,12 +336,12 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
return;
|
||||
}
|
||||
|
||||
if( character == ' ' && this.searchFieldOutputs.getText().isEmpty() && this.searchFieldOutputs.isFocused())
|
||||
if( character == ' ' && this.searchFieldOutputs.getText().isEmpty() && this.searchFieldOutputs.isFocused() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( this.searchFieldInputs.textboxKeyTyped( character, key ) || this.searchFieldOutputs.textboxKeyTyped( character, key ))
|
||||
if( this.searchFieldInputs.textboxKeyTyped( character, key ) || this.searchFieldOutputs.textboxKeyTyped( character, key ) )
|
||||
{
|
||||
this.refreshList();
|
||||
}
|
||||
@@ -361,9 +371,9 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
final long id = Long.parseLong( key.substring( 1 ), Character.MAX_RADIX );
|
||||
final NBTTagCompound invData = in.getCompoundTag( key );
|
||||
final ClientDCInternalInv current = this.getById( id, invData.getLong( "sortBy" ), invData.getString( "un" ) );
|
||||
blockPosHashMap.put( current, NBTUtil.getPosFromTag( invData.getCompoundTag( "pos" )) );
|
||||
dimHashMap.put( current, invData.getInteger( "dim" ));
|
||||
numUpgradesMap.put( current, invData.getInteger("numUpgrades"));
|
||||
blockPosHashMap.put( current, NBTUtil.getPosFromTag( invData.getCompoundTag( "pos" ) ) );
|
||||
dimHashMap.put( current, invData.getInteger( "dim" ) );
|
||||
numUpgradesMap.put( current, invData.getInteger( "numUpgrades" ) );
|
||||
|
||||
for( int x = 0; x < current.getInventory().getSlots(); x++ )
|
||||
{
|
||||
@@ -391,7 +401,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
|
||||
/**
|
||||
* Rebuilds the list of interfaces.
|
||||
*
|
||||
* <p>
|
||||
* Respects a search term if present (ignores case) and adding only matching patterns.
|
||||
*/
|
||||
private void refreshList()
|
||||
@@ -403,7 +413,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase();
|
||||
final String searchFieldOutputs = this.searchFieldOutputs.getText().toLowerCase();
|
||||
|
||||
final Set<Object> cachedSearch = this.getCacheForSearchTerm( "IN:" + searchFieldInputs + " OUT:" + searchFieldOutputs + partInterfaceTerminal.onlyInterfacesWithFreeSlots);
|
||||
final Set<Object> cachedSearch = this.getCacheForSearchTerm( "IN:" + searchFieldInputs + " OUT:" + searchFieldOutputs + partInterfaceTerminal.onlyInterfacesWithFreeSlots );
|
||||
final boolean rebuild = cachedSearch.isEmpty();
|
||||
|
||||
for( final ClientDCInternalInv entry : this.byId.values() )
|
||||
@@ -416,7 +426,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
|
||||
// Shortcut to skip any filter if search term is ""/empty
|
||||
|
||||
boolean found = (searchFieldInputs.isEmpty() && searchFieldOutputs.isEmpty() && !partInterfaceTerminal.onlyInterfacesWithFreeSlots);
|
||||
boolean found = ( searchFieldInputs.isEmpty() && searchFieldOutputs.isEmpty() && !partInterfaceTerminal.onlyInterfacesWithFreeSlots );
|
||||
boolean interfaceHasFreeSlots = false;
|
||||
|
||||
// Search if the current inventory holds a pattern containing the search term.
|
||||
@@ -425,42 +435,52 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
int slot = 0;
|
||||
for( final ItemStack itemStack : entry.getInventory() )
|
||||
{
|
||||
if (slot > 8 + numUpgradesMap.get(entry) * 9) {
|
||||
if( slot > 8 + numUpgradesMap.get( entry ) * 9 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
if( !searchFieldInputs.isEmpty() && !searchFieldOutputs.isEmpty() ) {
|
||||
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldInputs, 0) || this.itemStackMatchesSearchTerm(itemStack, searchFieldOutputs, 1)) {
|
||||
if( !searchFieldInputs.isEmpty() && !searchFieldOutputs.isEmpty() )
|
||||
{
|
||||
if( this.itemStackMatchesSearchTerm( itemStack, searchFieldInputs, 0 ) || this.itemStackMatchesSearchTerm( itemStack, searchFieldOutputs, 1 ) )
|
||||
{
|
||||
found = true;
|
||||
matchedStacks.add(itemStack);
|
||||
matchedStacks.add( itemStack );
|
||||
}
|
||||
}
|
||||
else if( !searchFieldInputs.isEmpty() ) {
|
||||
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldInputs, 0)) {
|
||||
else if( !searchFieldInputs.isEmpty() )
|
||||
{
|
||||
if( this.itemStackMatchesSearchTerm( itemStack, searchFieldInputs, 0 ) )
|
||||
{
|
||||
found = true;
|
||||
matchedStacks.add(itemStack);
|
||||
matchedStacks.add( itemStack );
|
||||
}
|
||||
}
|
||||
else if( !searchFieldOutputs.isEmpty() ) {
|
||||
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldOutputs, 1)) {
|
||||
else if( !searchFieldOutputs.isEmpty() )
|
||||
{
|
||||
if( this.itemStackMatchesSearchTerm( itemStack, searchFieldOutputs, 1 ) )
|
||||
{
|
||||
found = true;
|
||||
matchedStacks.add(itemStack);
|
||||
matchedStacks.add( itemStack );
|
||||
}
|
||||
}
|
||||
// If only Interfaces with empty slots should be shown, check that here
|
||||
if(itemStack.isEmpty())
|
||||
if( itemStack.isEmpty() )
|
||||
{
|
||||
interfaceHasFreeSlots = true;
|
||||
}
|
||||
slot++;
|
||||
}
|
||||
}
|
||||
// if found, filter skipped or machine name matching the search term, add it
|
||||
if( found || (entry.getName().toLowerCase().contains( searchFieldInputs ) && entry.getName().toLowerCase().contains( searchFieldOutputs )))
|
||||
if( found || ( entry.getName().toLowerCase().contains( searchFieldInputs ) && entry.getName().toLowerCase().contains( searchFieldOutputs ) ) )
|
||||
{
|
||||
if (!partInterfaceTerminal.onlyInterfacesWithFreeSlots)
|
||||
if( !partInterfaceTerminal.onlyInterfacesWithFreeSlots )
|
||||
{
|
||||
this.byName.put( entry.getName(), entry );
|
||||
cachedSearch.add( entry );
|
||||
}
|
||||
else if ( interfaceHasFreeSlots ){
|
||||
else if( interfaceHasFreeSlots )
|
||||
{
|
||||
this.byName.put( entry.getName(), entry );
|
||||
cachedSearch.add( entry );
|
||||
}
|
||||
@@ -493,7 +513,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
this.getScrollBar().setRange( 0, this.lines.size() - 1, 1 );
|
||||
}
|
||||
|
||||
private boolean itemStackMatchesSearchTerm( final ItemStack itemStack, final String searchTerm,int pass )
|
||||
private boolean itemStackMatchesSearchTerm( final ItemStack itemStack, final String searchTerm, int pass )
|
||||
{
|
||||
if( itemStack.isEmpty() )
|
||||
{
|
||||
@@ -509,7 +529,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
|
||||
NBTTagList tag = new NBTTagList();
|
||||
|
||||
if (pass == 0)
|
||||
if( pass == 0 )
|
||||
{
|
||||
tag = encodedValue.getTagList( "in", 10 );
|
||||
}
|
||||
@@ -518,32 +538,44 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
tag = encodedValue.getTagList( "out", 10 );
|
||||
}
|
||||
|
||||
boolean foundMatchingItemStack = false;
|
||||
|
||||
for( int i = 0; i < tag.tagCount(); i++ )
|
||||
{
|
||||
|
||||
final ItemStack parsedItemStack = new ItemStack( tag.getCompoundTagAt( i ) );
|
||||
if( !parsedItemStack.isEmpty() )
|
||||
{
|
||||
final String displayName = Platform
|
||||
.getItemDisplayName( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createStack( parsedItemStack ) )
|
||||
.toLowerCase();
|
||||
if( displayName.contains( searchTerm ) )
|
||||
|
||||
for( String term : searchTerm.split( " " ) )
|
||||
{
|
||||
return true;
|
||||
if( term.length() > 1 && ( term.startsWith( "-" ) || term.startsWith( "!" ) ) )
|
||||
{
|
||||
term = term.substring( 1 );
|
||||
if( displayName.contains( term ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if( displayName.contains( term ) )
|
||||
{
|
||||
foundMatchingItemStack = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return foundMatchingItemStack;
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to retrieve a cache for a with search term as keyword.
|
||||
*
|
||||
* <p>
|
||||
* If this cache should be empty, it will populate it with an earlier cache if available or at least the cache for
|
||||
* the empty string.
|
||||
*
|
||||
* @param searchTerm the corresponding search
|
||||
*
|
||||
* @return a Set matching a superset of the search term
|
||||
*/
|
||||
private Set<Object> getCacheForSearchTerm( final String searchTerm )
|
||||
|
||||
@@ -20,8 +20,12 @@ package appeng.client.gui.implementations;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import appeng.client.me.SlotME;
|
||||
import appeng.container.slot.SlotRestrictedInput;
|
||||
import appeng.core.features.ColoredItemDefinition;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.input.Mouse;
|
||||
|
||||
@@ -100,6 +104,7 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
private boolean isAutoFocus = false;
|
||||
private int currentMouseX = 0;
|
||||
private int currentMouseY = 0;
|
||||
private boolean delayedUpdate;
|
||||
|
||||
public GuiMEMonitorable( final InventoryPlayer inventoryPlayer, final ITerminalHost te )
|
||||
{
|
||||
@@ -159,8 +164,26 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
this.repo.postUpdate( is );
|
||||
}
|
||||
|
||||
this.repo.updateView();
|
||||
this.setScrollBar();
|
||||
if( isShiftKeyDown() )
|
||||
{
|
||||
for( Slot slot : this.inventorySlots.inventorySlots )
|
||||
{
|
||||
if( slot instanceof SlotME )
|
||||
{
|
||||
if( this.isPointInRegion( slot.xPos, slot.yPos, 18, 18, currentMouseX, currentMouseY ) )
|
||||
{
|
||||
this.delayedUpdate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !this.delayedUpdate )
|
||||
{
|
||||
this.repo.updateView();
|
||||
this.setScrollBar();
|
||||
}
|
||||
}
|
||||
|
||||
private void setScrollBar()
|
||||
@@ -429,7 +452,7 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
}
|
||||
|
||||
this.drawTexturedModalRect( offsetX, offsetY + 16 + this.rows * 18 + this.lowerTextureOffset, 0, 106 - 18 - 18, x_width,
|
||||
99 + this.reservedSpace - this.lowerTextureOffset );
|
||||
99 + this.reservedSpace - this.lowerTextureOffset );
|
||||
|
||||
if( this.viewCell )
|
||||
{
|
||||
@@ -526,6 +549,33 @@ public class GuiMEMonitorable extends AEBaseMEGui implements ISortSource, IConfi
|
||||
public void updateScreen()
|
||||
{
|
||||
this.repo.setPower( this.monitorableContainer.isPowered() );
|
||||
if( this.delayedUpdate )
|
||||
{
|
||||
if( isShiftKeyDown() )
|
||||
{
|
||||
this.delayedUpdate = false;
|
||||
for( Slot slot : this.inventorySlots.inventorySlots )
|
||||
{
|
||||
if( slot instanceof SlotME )
|
||||
{
|
||||
if( this.isPointInRegion( slot.xPos, slot.yPos, 18, 18, currentMouseX, currentMouseY ) )
|
||||
{
|
||||
this.delayedUpdate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.delayedUpdate = false;
|
||||
}
|
||||
}
|
||||
if( !this.delayedUpdate )
|
||||
{
|
||||
this.repo.updateView();
|
||||
this.setScrollBar();
|
||||
}
|
||||
super.updateScreen();
|
||||
}
|
||||
|
||||
|
||||
@@ -43,6 +43,14 @@ public class ClientDCInternalInv implements Comparable<ClientDCInternalInv>
|
||||
this.sortBy = sortBy;
|
||||
}
|
||||
|
||||
public ClientDCInternalInv( final int size, final long id, final long sortBy, final String unlocalizedName, int stackSize )
|
||||
{
|
||||
this.inventory = new AppEngInternalInventory( null, size, stackSize );
|
||||
this.unlocalizedName = unlocalizedName;
|
||||
this.id = id;
|
||||
this.sortBy = sortBy;
|
||||
}
|
||||
|
||||
public String getName()
|
||||
{
|
||||
final String s = I18n.translateToLocal( this.unlocalizedName + ".name" );
|
||||
|
||||
@@ -99,6 +99,12 @@ public class ItemRepo
|
||||
}
|
||||
}
|
||||
|
||||
public long getItemCount( final IAEItemStack is )
|
||||
{
|
||||
IAEItemStack st = this.list.findPrecise( is );
|
||||
return st == null ? 0 : st.getStackSize();
|
||||
}
|
||||
|
||||
public void setViewCell( final ItemStack[] list )
|
||||
{
|
||||
this.myPartitionList = ItemViewCell.createFilter( list );
|
||||
@@ -120,10 +126,11 @@ public class ItemRepo
|
||||
this.updateJEI( this.searchString );
|
||||
}
|
||||
|
||||
this.innerSearch = this.searchString;
|
||||
final boolean terminalSearchToolTips = AEConfig.instance().getConfigManager().getSetting( Settings.SEARCH_TOOLTIPS ) != YesNo.NO;
|
||||
|
||||
boolean searchMod = false;
|
||||
|
||||
this.innerSearch = searchString.toLowerCase();
|
||||
if( this.innerSearch.startsWith( "@" ) )
|
||||
{
|
||||
searchMod = true;
|
||||
@@ -133,13 +140,13 @@ public class ItemRepo
|
||||
Pattern m = null;
|
||||
try
|
||||
{
|
||||
m = Pattern.compile( this.innerSearch.toLowerCase(), Pattern.CASE_INSENSITIVE );
|
||||
m = Pattern.compile( this.innerSearch, Pattern.CASE_INSENSITIVE );
|
||||
}
|
||||
catch( final Throwable ignore )
|
||||
{
|
||||
try
|
||||
{
|
||||
m = Pattern.compile( Pattern.quote( this.innerSearch.toLowerCase() ), Pattern.CASE_INSENSITIVE );
|
||||
m = Pattern.compile( Pattern.quote( this.innerSearch ), Pattern.CASE_INSENSITIVE );
|
||||
}
|
||||
catch( final Throwable __ )
|
||||
{
|
||||
@@ -168,26 +175,35 @@ public class ItemRepo
|
||||
continue;
|
||||
}
|
||||
|
||||
final String dspName = searchMod ? Platform.getModId( is ) : Platform.getItemDisplayName( is );
|
||||
boolean foundMatchingItemStack = false;
|
||||
notDone = true;
|
||||
final String dspName = ( searchMod ? Platform.getModId( is ) : Platform.getItemDisplayName( is ) ).toLowerCase();
|
||||
boolean foundMatchingItemStack = true;
|
||||
|
||||
if( m.matcher( dspName.toLowerCase() ).find() )
|
||||
for( String term : innerSearch.split( " " ) )
|
||||
{
|
||||
notDone = false;
|
||||
foundMatchingItemStack = true;
|
||||
if( term.length() > 1 && ( term.startsWith( "-" ) || term.startsWith( "!" ) ) )
|
||||
{
|
||||
term = term.substring( 1 );
|
||||
if( dspName.contains( term ) )
|
||||
{
|
||||
foundMatchingItemStack = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if( !dspName.contains( term ) )
|
||||
{
|
||||
foundMatchingItemStack = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( terminalSearchToolTips && notDone && !searchMod )
|
||||
if( terminalSearchToolTips && !foundMatchingItemStack )
|
||||
{
|
||||
final List<String> tooltip = Platform.getTooltip( is );
|
||||
|
||||
for( final String line : tooltip )
|
||||
{
|
||||
if( m.matcher( line ).find() )
|
||||
{
|
||||
foundMatchingItemStack = true;
|
||||
notDone = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
package appeng.client.me;
|
||||
|
||||
|
||||
import appeng.container.slot.IJEITargetSlot;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.IInventory;
|
||||
import net.minecraft.item.ItemStack;
|
||||
@@ -28,7 +29,7 @@ import appeng.items.misc.ItemEncodedPattern;
|
||||
import appeng.util.Platform;
|
||||
|
||||
|
||||
public class SlotDisconnected extends AppEngSlot
|
||||
public class SlotDisconnected extends AppEngSlot implements IJEITargetSlot
|
||||
{
|
||||
|
||||
private final ClientDCInternalInv mySlot;
|
||||
|
||||
@@ -20,6 +20,8 @@ package appeng.container.implementations;
|
||||
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.IContainerListener;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
import appeng.api.config.CondenserOutput;
|
||||
@@ -43,6 +45,7 @@ public class ContainerCondenser extends AEBaseContainer implements IProgressProv
|
||||
public long storedPower = 0;
|
||||
@GuiSync( 2 )
|
||||
public CondenserOutput output = CondenserOutput.TRASH;
|
||||
private ItemStack prevStack = ItemStack.EMPTY;
|
||||
|
||||
public ContainerCondenser( final InventoryPlayer ip, final TileCondenser condenser )
|
||||
{
|
||||
@@ -62,6 +65,7 @@ public class ContainerCondenser extends AEBaseContainer implements IProgressProv
|
||||
@Override
|
||||
public void detectAndSendChanges()
|
||||
{
|
||||
final ItemStack is = this.condenser.getInternalInventory().getStackInSlot( 1 );
|
||||
if( Platform.isServer() )
|
||||
{
|
||||
final double maxStorage = this.condenser.getStorage();
|
||||
@@ -70,6 +74,14 @@ public class ContainerCondenser extends AEBaseContainer implements IProgressProv
|
||||
this.requiredEnergy = requiredEnergy == 0 ? (int) maxStorage : (int) Math.min( requiredEnergy, maxStorage );
|
||||
this.storedPower = (int) this.condenser.getStoredPower();
|
||||
this.setOutput( (CondenserOutput) this.condenser.getConfigManager().getSetting( Settings.CONDENSER_OUTPUT ) );
|
||||
|
||||
for( final IContainerListener listener : this.listeners )
|
||||
{
|
||||
if( !ItemStack.areItemsEqual( is, prevStack ) )
|
||||
{
|
||||
listener.sendSlotContents( this, 1, is );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
super.detectAndSendChanges();
|
||||
|
||||
@@ -10,7 +10,9 @@ 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.EntityPlayerMP;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.IContainerListener;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTBase;
|
||||
@@ -29,500 +31,523 @@ 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;
|
||||
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 );
|
||||
public ContainerExpandedProcessingPatternTerm( InventoryPlayer ip, ITerminalHost monitorable )
|
||||
{
|
||||
super( ip, monitorable, false );
|
||||
|
||||
this.expandedProcessingPatternTerminal = (PartExpandedProcessingPatternTerminal) monitorable;
|
||||
this.expandedProcessingPatternTerminal = (PartExpandedProcessingPatternTerminal) monitorable;
|
||||
|
||||
final IItemHandler patternInv = this.getExpandedPatternTerminal().getInventoryByName( "pattern" );
|
||||
final IItemHandler output = this.getExpandedPatternTerminal().getInventoryByName( "output" );
|
||||
final IItemHandler patternInv = this.getExpandedPatternTerminal().getInventoryByName( "pattern" );
|
||||
final IItemHandler output = this.getExpandedPatternTerminal().getInventoryByName( "output" );
|
||||
|
||||
this.crafting = this.getExpandedPatternTerminal().getInventoryByName( "crafting" );
|
||||
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 < 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 );
|
||||
}
|
||||
}
|
||||
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.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.patternSlotOUT.setStackLimit( 1 );
|
||||
|
||||
this.bindPlayerInventory( ip, 0, 0 );
|
||||
}
|
||||
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 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 saveChanges()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack )
|
||||
{
|
||||
@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 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();
|
||||
public void encode()
|
||||
{
|
||||
ItemStack output = this.patternSlotOUT.getStack();
|
||||
|
||||
final ItemStack[] in = this.getInputs();
|
||||
final ItemStack[] out = this.getOutputs();
|
||||
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;
|
||||
}
|
||||
// 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.
|
||||
}
|
||||
// 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 );
|
||||
}
|
||||
// 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 );
|
||||
}
|
||||
}
|
||||
// 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();
|
||||
// encode the slot.
|
||||
final NBTTagCompound encodedValue = new NBTTagCompound();
|
||||
|
||||
final NBTTagList tagIn = new NBTTagList();
|
||||
final NBTTagList tagOut = new NBTTagList();
|
||||
final NBTTagList tagIn = new NBTTagList();
|
||||
final NBTTagList tagOut = new NBTTagList();
|
||||
|
||||
for( final ItemStack i : in )
|
||||
{
|
||||
tagIn.appendTag( this.createItemTag( i ) );
|
||||
}
|
||||
for( final ItemStack i : in )
|
||||
{
|
||||
tagIn.appendTag( this.createItemTag( i ) );
|
||||
}
|
||||
|
||||
for( final ItemStack i : out )
|
||||
{
|
||||
tagOut.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 );
|
||||
encodedValue.setTag( "in", tagIn );
|
||||
encodedValue.setTag( "out", tagOut );
|
||||
encodedValue.setBoolean( "crafting", false );
|
||||
encodedValue.setBoolean( "substitute", false );
|
||||
|
||||
output.setTagCompound( encodedValue );
|
||||
}
|
||||
output.setTagCompound( encodedValue );
|
||||
}
|
||||
|
||||
boolean isPattern( final ItemStack output )
|
||||
{
|
||||
if( output.isEmpty() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
boolean isPattern( final ItemStack output )
|
||||
{
|
||||
if( output.isEmpty() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
final IDefinitions definitions = AEApi.instance().definitions();
|
||||
final IDefinitions definitions = AEApi.instance().definitions();
|
||||
|
||||
boolean isPattern = definitions.items().encodedPattern().isSameAs( output );
|
||||
isPattern |= definitions.materials().blankPattern().isSameAs( output );
|
||||
boolean isPattern = definitions.items().encodedPattern().isSameAs( output );
|
||||
isPattern |= definitions.materials().blankPattern().isSameAs( output );
|
||||
|
||||
return isPattern;
|
||||
}
|
||||
return isPattern;
|
||||
}
|
||||
|
||||
NBTBase createItemTag( final ItemStack i )
|
||||
{
|
||||
final NBTTagCompound c = new NBTTagCompound();
|
||||
NBTBase createItemTag( final ItemStack i )
|
||||
{
|
||||
final NBTTagCompound c = new NBTTagCompound();
|
||||
|
||||
if( !i.isEmpty() )
|
||||
{
|
||||
i.writeToNBT( c );
|
||||
}
|
||||
if( !i.isEmpty() )
|
||||
{
|
||||
i.writeToNBT( c );
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isSlotEnabled( final int idx )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@Override
|
||||
public boolean isSlotEnabled( final int idx )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected ItemStack[] getInputs()
|
||||
{
|
||||
final ItemStack[] input = new ItemStack[16];
|
||||
boolean hasValue = false;
|
||||
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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
if( hasValue )
|
||||
{
|
||||
return input;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected ItemStack[] getOutputs()
|
||||
{
|
||||
final List<ItemStack> list = new ArrayList<>( 3 );
|
||||
boolean hasValue = false;
|
||||
protected ItemStack[] getOutputs()
|
||||
{
|
||||
final List<ItemStack> list = new ArrayList<>( 3 );
|
||||
boolean hasValue = false;
|
||||
|
||||
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||
{
|
||||
final ItemStack out = outputSlot.getStack();
|
||||
for( final OptionalSlotFake outputSlot : this.outputSlots )
|
||||
{
|
||||
final ItemStack out = outputSlot.getStack();
|
||||
|
||||
if( !out.isEmpty() && out.getCount() > 0 )
|
||||
{
|
||||
list.add( out );
|
||||
hasValue = true;
|
||||
}
|
||||
}
|
||||
if( !out.isEmpty() && out.getCount() > 0 )
|
||||
{
|
||||
list.add( out );
|
||||
hasValue = true;
|
||||
}
|
||||
}
|
||||
|
||||
if( hasValue )
|
||||
{
|
||||
return list.toArray( new ItemStack[0] );
|
||||
}
|
||||
return null;
|
||||
}
|
||||
if( hasValue )
|
||||
{
|
||||
return list.toArray( new ItemStack[0] );
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void clear()
|
||||
{
|
||||
for( final Slot s : this.gridSlots )
|
||||
{
|
||||
s.putStack( ItemStack.EMPTY );
|
||||
}
|
||||
public void clear()
|
||||
{
|
||||
for( final Slot s : this.gridSlots )
|
||||
{
|
||||
s.putStack( ItemStack.EMPTY );
|
||||
}
|
||||
|
||||
for( final Slot s : this.outputSlots )
|
||||
{
|
||||
s.putStack( ItemStack.EMPTY );
|
||||
}
|
||||
for( final Slot s : this.outputSlots )
|
||||
{
|
||||
s.putStack( ItemStack.EMPTY );
|
||||
}
|
||||
|
||||
this.detectAndSendChanges();
|
||||
}
|
||||
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 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;
|
||||
}
|
||||
@Override
|
||||
public boolean useRealItems()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public PartExpandedProcessingPatternTerminal getExpandedPatternTerminal()
|
||||
{
|
||||
return this.expandedProcessingPatternTerminal;
|
||||
}
|
||||
public PartExpandedProcessingPatternTerminal getExpandedPatternTerminal()
|
||||
{
|
||||
return this.expandedProcessingPatternTerminal;
|
||||
}
|
||||
|
||||
public void multiply( int multiple )
|
||||
{
|
||||
ItemStack[] input = new ItemStack[gridSlots.length];
|
||||
boolean canMultiplyInputs = true;
|
||||
boolean canMultiplyOutputs = true;
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSlotChange( final Slot s )
|
||||
{
|
||||
if( s == this.patternSlotOUT && Platform.isServer() )
|
||||
{
|
||||
for( final IContainerListener listener : this.listeners )
|
||||
{
|
||||
for( final Slot slot : this.inventorySlots )
|
||||
{
|
||||
if( slot instanceof OptionalSlotFake || slot instanceof SlotFakeCraftingMatrix )
|
||||
{
|
||||
listener.sendSlotContents( this, slot.slotNumber, slot.getStack() );
|
||||
}
|
||||
}
|
||||
if( listener instanceof EntityPlayerMP )
|
||||
{
|
||||
( (EntityPlayerMP) listener ).isChangingQuantityOnly = false;
|
||||
}
|
||||
}
|
||||
this.detectAndSendChanges();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,400 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, 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.container.implementations;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import appeng.parts.reporting.PartInterfaceConfigurationTerminal;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
import appeng.api.config.Settings;
|
||||
import appeng.api.config.YesNo;
|
||||
import appeng.api.networking.IGrid;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import appeng.api.networking.security.IActionHost;
|
||||
import appeng.container.AEBaseContainer;
|
||||
import appeng.core.sync.network.NetworkHandler;
|
||||
import appeng.core.sync.packets.PacketCompressedNBT;
|
||||
import appeng.helpers.DualityInterface;
|
||||
import appeng.helpers.IInterfaceHost;
|
||||
import appeng.helpers.InventoryAction;
|
||||
import appeng.parts.misc.PartInterface;
|
||||
import appeng.tile.inventory.AppEngInternalInventory;
|
||||
import appeng.tile.misc.TileInterface;
|
||||
import appeng.util.Platform;
|
||||
import appeng.util.helpers.ItemHandlerUtil;
|
||||
import appeng.util.inv.WrapperRangeItemHandler;
|
||||
|
||||
|
||||
public final class ContainerInterfaceConfigurationTerminal extends AEBaseContainer
|
||||
{
|
||||
|
||||
/**
|
||||
* this stuff is all server side..
|
||||
*/
|
||||
|
||||
private static long autoBase = Long.MIN_VALUE;
|
||||
private final Map<IInterfaceHost, ConfigTracker> diList = new HashMap<>();
|
||||
private final Map<Long, ConfigTracker> byId = new HashMap<>();
|
||||
private IGrid grid;
|
||||
private NBTTagCompound data = new NBTTagCompound();
|
||||
|
||||
public ContainerInterfaceConfigurationTerminal( final InventoryPlayer ip, final PartInterfaceConfigurationTerminal anchor )
|
||||
{
|
||||
super( ip, anchor );
|
||||
|
||||
if( Platform.isServer() )
|
||||
{
|
||||
this.grid = anchor.getActionableNode().getGrid();
|
||||
}
|
||||
|
||||
this.bindPlayerInventory( ip, 14, 235 - /* height of player inventory */82 );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectAndSendChanges()
|
||||
{
|
||||
if( Platform.isClient() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
super.detectAndSendChanges();
|
||||
|
||||
if( this.grid == null )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int total = 0;
|
||||
boolean missing = false;
|
||||
|
||||
final IActionHost host = this.getActionHost();
|
||||
if( host != null )
|
||||
{
|
||||
final IGridNode agn = host.getActionableNode();
|
||||
if( agn != null && agn.isActive() )
|
||||
{
|
||||
for( final IGridNode gn : this.grid.getMachines( TileInterface.class ) )
|
||||
{
|
||||
if( gn.isActive() )
|
||||
{
|
||||
final IInterfaceHost ih = (IInterfaceHost) gn.getMachine();
|
||||
if( ih.getInterfaceDuality().getConfigManager().getSetting( Settings.INTERFACE_TERMINAL ) == YesNo.NO )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final ConfigTracker t = this.diList.get( ih );
|
||||
|
||||
if( t == null )
|
||||
{
|
||||
missing = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
final DualityInterface dual = ih.getInterfaceDuality();
|
||||
if( !t.unlocalizedName.equals( dual.getTermName() ) )
|
||||
{
|
||||
missing = true;
|
||||
}
|
||||
}
|
||||
|
||||
total++;
|
||||
}
|
||||
}
|
||||
|
||||
for( final IGridNode gn : this.grid.getMachines( PartInterface.class ) )
|
||||
{
|
||||
if( gn.isActive() )
|
||||
{
|
||||
final IInterfaceHost ih = (IInterfaceHost) gn.getMachine();
|
||||
if( ih.getInterfaceDuality().getConfigManager().getSetting( Settings.INTERFACE_TERMINAL ) == YesNo.NO )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
final ConfigTracker t = this.diList.get( ih );
|
||||
|
||||
if( t == null )
|
||||
{
|
||||
missing = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
final DualityInterface dual = ih.getInterfaceDuality();
|
||||
if( !t.unlocalizedName.equals( dual.getTermName() ) )
|
||||
{
|
||||
missing = true;
|
||||
}
|
||||
}
|
||||
|
||||
total++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( total != this.diList.size() || missing )
|
||||
{
|
||||
this.regenList( this.data );
|
||||
}
|
||||
else
|
||||
{
|
||||
for( final Entry<IInterfaceHost, ConfigTracker> en : this.diList.entrySet() )
|
||||
{
|
||||
final ConfigTracker inv = en.getValue();
|
||||
for( int x = 0; x < inv.server.getSlots(); x++ )
|
||||
{
|
||||
if( this.isDifferent( inv.server.getStackInSlot( x ), inv.client.getStackInSlot( x ) ) )
|
||||
{
|
||||
this.addItems( this.data, inv, x, 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( !this.data.hasNoTags() )
|
||||
{
|
||||
try
|
||||
{
|
||||
NetworkHandler.instance().sendTo( new PacketCompressedNBT( this.data ), (EntityPlayerMP) this.getPlayerInv().player );
|
||||
}
|
||||
catch( final IOException e )
|
||||
{
|
||||
// :P
|
||||
}
|
||||
|
||||
this.data = new NBTTagCompound();
|
||||
}
|
||||
}
|
||||
|
||||
public ConfigTracker getSlotByID( long id )
|
||||
{
|
||||
return this.byId.get( id );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doAction( final EntityPlayerMP player, final InventoryAction action, final int slot, final long id )
|
||||
{
|
||||
final ConfigTracker inv = this.byId.get( id );
|
||||
if( inv != null )
|
||||
{
|
||||
final boolean hasItemInHand = !player.inventory.getItemStack().isEmpty();
|
||||
final IItemHandler theSlot = new WrapperRangeItemHandler( inv.server, slot, slot + 1 );
|
||||
|
||||
ItemStack inSlot = theSlot.getStackInSlot( 0 );
|
||||
|
||||
switch ( action )
|
||||
{
|
||||
case PICKUP_OR_SET_DOWN:
|
||||
if( hasItemInHand )
|
||||
{
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, player.inventory.getItemStack().copy() );
|
||||
}
|
||||
else
|
||||
{
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, ItemStack.EMPTY );
|
||||
}
|
||||
break;
|
||||
case PLACE_SINGLE:
|
||||
if( inSlot.getMaxStackSize() > inSlot.getCount() )
|
||||
{
|
||||
inSlot.grow( 1 );
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot );
|
||||
}
|
||||
break;
|
||||
case PICKUP_SINGLE:
|
||||
if( theSlot.getStackInSlot( 0 ).getCount() > 1 )
|
||||
{
|
||||
inSlot.shrink( 1 );
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot );
|
||||
}
|
||||
break;
|
||||
case SPLIT_OR_PLACE_SINGLE:
|
||||
if( hasItemInHand )
|
||||
{
|
||||
if( ItemStack.areItemsEqual( inSlot, player.inventory.getItemStack() ) && ItemStack.areItemStackTagsEqual( inSlot, player.inventory.getItemStack() ) )
|
||||
{
|
||||
inSlot.grow( 1 );
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot.copy() );
|
||||
}
|
||||
else
|
||||
{
|
||||
ItemStack configuredStack = player.inventory.getItemStack().copy();
|
||||
configuredStack.setCount( 1 );
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, configuredStack );
|
||||
}
|
||||
|
||||
}
|
||||
else if( !inSlot.isEmpty() )
|
||||
{
|
||||
inSlot.shrink( 1 );
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot.copy() );
|
||||
}
|
||||
|
||||
break;
|
||||
case SHIFT_CLICK:
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, ItemStack.EMPTY );
|
||||
break;
|
||||
|
||||
case CREATIVE_DUPLICATE:
|
||||
|
||||
if( player.capabilities.isCreativeMode && hasItemInHand )
|
||||
{
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, player.inventory.getItemStack().copy() );
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
this.updateHeld( player );
|
||||
}
|
||||
}
|
||||
|
||||
private void regenList( final NBTTagCompound data )
|
||||
{
|
||||
this.byId.clear();
|
||||
this.diList.clear();
|
||||
|
||||
final IActionHost host = this.getActionHost();
|
||||
if( host != null )
|
||||
{
|
||||
final IGridNode agn = host.getActionableNode();
|
||||
if( agn != null && agn.isActive() )
|
||||
{
|
||||
for( final IGridNode gn : this.grid.getMachines( TileInterface.class ) )
|
||||
{
|
||||
final IInterfaceHost ih = (IInterfaceHost) gn.getMachine();
|
||||
final DualityInterface dual = ih.getInterfaceDuality();
|
||||
if( gn.isActive() && dual.getConfigManager().getSetting( Settings.INTERFACE_TERMINAL ) == YesNo.YES )
|
||||
{
|
||||
this.diList.put( ih, new ConfigTracker( dual, dual.getConfig(), dual.getTermName() ) );
|
||||
}
|
||||
}
|
||||
|
||||
for( final IGridNode gn : this.grid.getMachines( PartInterface.class ) )
|
||||
{
|
||||
final IInterfaceHost ih = (IInterfaceHost) gn.getMachine();
|
||||
final DualityInterface dual = ih.getInterfaceDuality();
|
||||
if( gn.isActive() && dual.getConfigManager().getSetting( Settings.INTERFACE_TERMINAL ) == YesNo.YES )
|
||||
{
|
||||
this.diList.put( ih, new ConfigTracker( dual, dual.getConfig(), dual.getTermName() ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data.setBoolean( "clear", true );
|
||||
|
||||
for( final Entry<IInterfaceHost, ConfigTracker> en : this.diList.entrySet() )
|
||||
{
|
||||
final ConfigTracker inv = en.getValue();
|
||||
this.byId.put( inv.which, inv );
|
||||
this.addItems( data, inv, 0, inv.server.getSlots() );
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isDifferent( final ItemStack a, final ItemStack b )
|
||||
{
|
||||
if( a.isEmpty() && b.isEmpty() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if( a.isEmpty() || b.isEmpty() )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return !ItemStack.areItemStacksEqual( a, b );
|
||||
}
|
||||
|
||||
private void addItems( final NBTTagCompound data, final ConfigTracker inv, final int offset, final int length )
|
||||
{
|
||||
final String name = '=' + Long.toString( inv.which, Character.MAX_RADIX );
|
||||
final NBTTagCompound tag = data.getCompoundTag( name );
|
||||
|
||||
if( tag.hasNoTags() )
|
||||
{
|
||||
tag.setLong( "sortBy", inv.sortBy );
|
||||
tag.setString( "un", inv.unlocalizedName );
|
||||
tag.setTag( "pos", NBTUtil.createPosTag( inv.pos ) );
|
||||
tag.setInteger( "dim", inv.dim );
|
||||
}
|
||||
|
||||
for( int x = 0; x < length; x++ )
|
||||
{
|
||||
final NBTTagCompound itemNBT = new NBTTagCompound();
|
||||
|
||||
final ItemStack is = inv.server.getStackInSlot( x + offset );
|
||||
|
||||
// "update" client side.
|
||||
ItemHandlerUtil.setStackInSlot( inv.client, x + offset, is.isEmpty() ? ItemStack.EMPTY : is.copy() );
|
||||
|
||||
if( !is.isEmpty() )
|
||||
{
|
||||
is.writeToNBT( itemNBT );
|
||||
}
|
||||
|
||||
tag.setTag( Integer.toString( x + offset ), itemNBT );
|
||||
}
|
||||
|
||||
data.setTag( name, tag );
|
||||
}
|
||||
|
||||
public static class ConfigTracker
|
||||
{
|
||||
|
||||
private final long sortBy;
|
||||
private final long which = autoBase++;
|
||||
private final String unlocalizedName;
|
||||
private final IItemHandler client;
|
||||
private final IItemHandler server;
|
||||
private final BlockPos pos;
|
||||
private final int dim;
|
||||
|
||||
public ConfigTracker( final DualityInterface dual, final IItemHandler configSlots, final String unlocalizedName )
|
||||
{
|
||||
this.server = configSlots;
|
||||
this.client = new AppEngInternalInventory( null, this.server.getSlots() );
|
||||
this.unlocalizedName = unlocalizedName;
|
||||
this.sortBy = dual.getSortValue();
|
||||
this.pos = dual.getLocation().getPos();
|
||||
this.dim = dual.getLocation().getWorld().provider.getDimension();
|
||||
}
|
||||
|
||||
public IItemHandler getServer()
|
||||
{
|
||||
return server;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ package appeng.container.implementations;
|
||||
|
||||
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
@@ -50,7 +51,7 @@ public class ContainerNetworkTool extends AEBaseContainer
|
||||
for( int x = 0; x < 3; x++ )
|
||||
{
|
||||
this.addSlotToContainer( ( new SlotRestrictedInput( SlotRestrictedInput.PlacableItemType.UPGRADES, te
|
||||
.getInventory(), y * 3 + x, 80 - 18 + x * 18, 37 - 18 + y * 18, this.getInventoryPlayer() ) ) );
|
||||
.getInventory(), y * 3 + x, 80 - 18 + x * 18, 37 - 18 + y * 18, this.getInventoryPlayer() ) ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,6 +98,13 @@ public class ContainerNetworkTool extends AEBaseContainer
|
||||
super.detectAndSendChanges();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSlotChange( Slot s )
|
||||
{
|
||||
super.detectAndSendChanges();
|
||||
}
|
||||
|
||||
|
||||
public boolean isFacadeMode()
|
||||
{
|
||||
return this.facadeMode;
|
||||
|
||||
@@ -138,6 +138,15 @@ public class AppEngSlot extends Slot
|
||||
public void onSlotChanged()
|
||||
{
|
||||
this.setIsValid( hasCalculatedValidness.NotAvailable );
|
||||
if( this.isSlotEnabled() )
|
||||
{
|
||||
ItemHandlerUtil.setStackInSlot( this.itemHandler, this.index, this.getStack().copy() );
|
||||
|
||||
if( this.getContainer() != null )
|
||||
{
|
||||
this.getContainer().onSlotChange( this );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,26 +19,7 @@
|
||||
package appeng.core;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.common.config.Property;
|
||||
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
|
||||
import net.minecraftforge.fml.common.ModContainer;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import appeng.api.config.CondenserOutput;
|
||||
import appeng.api.config.PowerMultiplier;
|
||||
import appeng.api.config.PowerUnits;
|
||||
import appeng.api.config.SearchBoxMode;
|
||||
import appeng.api.config.Settings;
|
||||
import appeng.api.config.TerminalStyle;
|
||||
import appeng.api.config.YesNo;
|
||||
import appeng.api.config.*;
|
||||
import appeng.api.util.IConfigManager;
|
||||
import appeng.api.util.IConfigurableObject;
|
||||
import appeng.core.features.AEFeature;
|
||||
@@ -47,6 +28,17 @@ import appeng.items.materials.MaterialType;
|
||||
import appeng.util.ConfigManager;
|
||||
import appeng.util.IConfigManagerHost;
|
||||
import appeng.util.Platform;
|
||||
import com.google.common.collect.Sets;
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.common.config.Configuration;
|
||||
import net.minecraftforge.common.config.Property;
|
||||
import net.minecraftforge.fml.client.event.ConfigChangedEvent;
|
||||
import net.minecraftforge.fml.common.ModContainer;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.*;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
|
||||
public final class AEConfig extends Configuration implements IConfigurableObject, IConfigManagerHost
|
||||
@@ -55,80 +47,33 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
public static final String VERSION = "@version@";
|
||||
public static final String CHANNEL = "@aechannel@";
|
||||
public static final String PACKET_CHANNEL = "AE";
|
||||
|
||||
// Config instance
|
||||
private static AEConfig instance;
|
||||
|
||||
// Tunnels
|
||||
public static final double TUNNEL_POWER_LOSS = 0.05;
|
||||
// Default Grindstone ores
|
||||
private static final String[] ORES_VANILLA = {
|
||||
"Obsidian", "Ender", "EnderPearl", "Coal", "Iron", "Gold",
|
||||
"Charcoal", "NetherQuartz"
|
||||
};
|
||||
private static final String[] ORES_VANILLA = {"Obsidian", "Ender", "EnderPearl", "Coal", "Iron", "Gold", "Charcoal", "NetherQuartz"};
|
||||
private static final String[] ORES_AE = {"CertusQuartz", "Wheat", "Fluix"};
|
||||
private static final String[] ORES_COMMON = {
|
||||
"Copper", "Tin", "Silver", "Lead", "Bronze"
|
||||
};
|
||||
private static final String[] ORES_MISC = {
|
||||
"Brass", "Platinum", "Nickel", "Invar", "Aluminium", "Electrum",
|
||||
"Osmium", "Zinc"
|
||||
};
|
||||
|
||||
private String[] nonBlockingItems = {
|
||||
"[gregtech|actuallyadditions]", "gregtech:circuit.integrated",
|
||||
"gregtech:shape.mold.plate", "gregtech:shape.mold.gear",
|
||||
"gregtech:shape.mold.credit", "gregtech:shape.mold.bottle",
|
||||
"gregtech:shape.mold.ingot", "gregtech:shape.mold.ball",
|
||||
"gregtech:shape.mold.block", "gregtech:shape.mold.nugget",
|
||||
"gregtech:shape.mold.cylinder", "gregtech:shape.mold.anvil",
|
||||
"gregtech:shape.mold.name", "gregtech:shape.mold.gear.small",
|
||||
"gregtech:shape.mold.rotor", "gregtech:shape.extruder.plate",
|
||||
"gregtech:shape.extruder.rod", "gregtech:shape.extruder.bolt",
|
||||
"gregtech:shape.extruder.ring", "gregtech:shape.extruder.cell",
|
||||
"gregtech:shape.extruder.ingot", "gregtech:shape.extruder.wire",
|
||||
"gregtech:shape.extruder.pipe.tiny",
|
||||
"gregtech:shape.extruder.pipe.small",
|
||||
"gregtech:shape.extruder.pipe.medium",
|
||||
"gregtech:shape.extruder.pipe.normal",
|
||||
"gregtech:shape.extruder.pipe.large",
|
||||
"gregtech:shape.extruder.pipe.huge",
|
||||
"gregtech:shape.extruder.block", "gregtech:shape.extruder.sword",
|
||||
"gregtech:shape.extruder.pickaxe", "gregtech:shape.extruder.shovel",
|
||||
"gregtech:shape.extruder.axe", "gregtech:shape.extruder.hoe",
|
||||
"gregtech:shape.extruder.hammer", "gregtech:shape.extruder.file",
|
||||
"gregtech:shape.extruder.saw", "gregtech:shape.extruder.gear",
|
||||
"gregtech:shape.extruder.bottle", "gregtech:shape.extruder.foil",
|
||||
"gregtech:shape.extruder.gear_small",
|
||||
"gregtech:shape.extruder.rod_long", "gregtech:shape.extruder.rotor",
|
||||
"gregtech:glass_lens.white", "gregtech:glass_lens.orange",
|
||||
"gregtech:glass_lens.magenta", "gregtech:glass_lens.light_blue",
|
||||
"gregtech:glass_lens.yellow", "gregtech:glass_lens.lime",
|
||||
"gregtech:glass_lens.pink", "gregtech:glass_lens.gray",
|
||||
"gregtech:glass_lens.light_gray", "gregtech:glass_lens.cyan",
|
||||
"gregtech:glass_lens.purple", "gregtech:glass_lens.blue",
|
||||
"gregtech:glass_lens.brown", "gregtech:glass_lens.green",
|
||||
"gregtech:glass_lens.red", "gregtech:glass_lens.black",
|
||||
"contenttweaker:smallgearextrudershape",
|
||||
"contenttweaker:creativeportabletankmold", "ore:lensAlmandine",
|
||||
"ore:lensBlueTopaz", "ore:lensDiamond", "ore:lensEmerald",
|
||||
"ore:lensGreenSapphire", "ore:lensRutile", "ore:lensRuby",
|
||||
"ore:lensSapphire", "ore:lensTopaz", "ore:lensJasper",
|
||||
"ore:lensGlass", "ore:lensOlivine", "ore:lensOpal",
|
||||
"ore:lensAmethyst", "ore:lensLapis", "ore:lensEnderPearl",
|
||||
"ore:lensEnderEye", "ore:lensGarnetRed", "ore:lensGarnetYellow",
|
||||
"ore:lensVinteum", "ore:lensNetherStar",
|
||||
};
|
||||
|
||||
private static final String[] ORES_COMMON = {"Copper", "Tin", "Silver", "Lead", "Bronze"};
|
||||
private static final String[] ORES_MISC = {"Brass", "Platinum", "Nickel", "Invar", "Aluminium", "Electrum", "Osmium", "Zinc"};
|
||||
// Default Energy Conversion Rates
|
||||
private static final double DEFAULT_IC2_EXCHANGE = 2.0;
|
||||
private static final double DEFAULT_GTEU_EXCHANGE = 2.0;
|
||||
private static final double DEFAULT_RF_EXCHANGE = 0.5;
|
||||
|
||||
// Config instance
|
||||
private static AEConfig instance;
|
||||
private final IConfigManager settings = new ConfigManager( this );
|
||||
|
||||
private final EnumSet<AEFeature> featureFlags = EnumSet.noneOf( AEFeature.class );
|
||||
private final File configFile;
|
||||
// GUI Buttons
|
||||
private final int[] craftByStacks = {1, 10, 100, 1000};
|
||||
private final int[] priorityByStacks = {1, 10, 100, 1000};
|
||||
private final int[] levelByStacks = {1, 10, 100, 1000};
|
||||
private final int[] levelByMillibuckets = {10, 100, 1000, 10000};
|
||||
private final Set<String> grinderBlackList;
|
||||
private final int chargedChange = 4;
|
||||
private final double wirelessHighWirelessCount = 64;
|
||||
private String[] nonBlockingItems = {"[gregtech|actuallyadditions]", "gregtech:circuit.integrated", "gregtech:shape.mold.plate", "gregtech:shape.mold.gear", "gregtech:shape.mold.credit", "gregtech:shape.mold.bottle", "gregtech:shape.mold.ingot", "gregtech:shape.mold.ball", "gregtech:shape.mold.block", "gregtech:shape.mold.nugget", "gregtech:shape.mold.cylinder", "gregtech:shape.mold.anvil", "gregtech:shape.mold.name", "gregtech:shape.mold.gear.small", "gregtech:shape.mold.rotor", "gregtech:shape.extruder.plate", "gregtech:shape.extruder.rod", "gregtech:shape.extruder.bolt", "gregtech:shape.extruder.ring", "gregtech:shape.extruder.cell", "gregtech:shape.extruder.ingot", "gregtech:shape.extruder.wire", "gregtech:shape.extruder.pipe.tiny", "gregtech:shape.extruder.pipe.small", "gregtech:shape.extruder.pipe.medium", "gregtech:shape.extruder.pipe.normal", "gregtech:shape.extruder.pipe.large", "gregtech:shape.extruder.pipe.huge", "gregtech:shape.extruder.block", "gregtech:shape.extruder.sword", "gregtech:shape.extruder.pickaxe", "gregtech:shape.extruder.shovel", "gregtech:shape.extruder.axe", "gregtech:shape.extruder.hoe", "gregtech:shape.extruder.hammer", "gregtech:shape.extruder.file", "gregtech:shape.extruder.saw", "gregtech:shape.extruder.gear", "gregtech:shape.extruder.bottle", "gregtech:shape.extruder.foil", "gregtech:shape.extruder.gear_small", "gregtech:shape.extruder.rod_long", "gregtech:shape.extruder.rotor", "gregtech:glass_lens.white", "gregtech:glass_lens.orange", "gregtech:glass_lens.magenta", "gregtech:glass_lens.light_blue", "gregtech:glass_lens.yellow", "gregtech:glass_lens.lime", "gregtech:glass_lens.pink", "gregtech:glass_lens.gray", "gregtech:glass_lens.light_gray", "gregtech:glass_lens.cyan", "gregtech:glass_lens.purple", "gregtech:glass_lens.blue", "gregtech:glass_lens.brown", "gregtech:glass_lens.green", "gregtech:glass_lens.red", "gregtech:glass_lens.black", "contenttweaker:smallgearextrudershape", "contenttweaker:creativeportabletankmold", "ore:lensAlmandine", "ore:lensBlueTopaz", "ore:lensDiamond", "ore:lensEmerald", "ore:lensGreenSapphire", "ore:lensRutile", "ore:lensRuby", "ore:lensSapphire", "ore:lensTopaz", "ore:lensJasper", "ore:lensGlass", "ore:lensOlivine", "ore:lensOpal", "ore:lensAmethyst", "ore:lensLapis", "ore:lensEnderPearl", "ore:lensEnderEye", "ore:lensGarnetRed", "ore:lensGarnetYellow", "ore:lensVinteum", "ore:lensNetherStar",};
|
||||
private boolean updatable = false;
|
||||
|
||||
// Misc
|
||||
private boolean removeCrashingItemsOnLoad = false;
|
||||
private int formationPlaneEntityLimit = 128;
|
||||
@@ -138,24 +83,14 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
private boolean disableColoredCableRecipesInJEI = true;
|
||||
private int craftingCalculationTimePerTick = 5;
|
||||
private PowerUnits selectedPowerUnit = PowerUnits.AE;
|
||||
|
||||
// GUI Buttons
|
||||
private final int[] craftByStacks = {1, 10, 100, 1000};
|
||||
private final int[] priorityByStacks = {1, 10, 100, 1000};
|
||||
private final int[] levelByStacks = {1, 10, 100, 1000};
|
||||
private final int[] levelByMillibuckets = {10, 100, 1000, 10000};
|
||||
|
||||
// Spatial IO/Dimension
|
||||
private int storageProviderID = -1;
|
||||
private int storageDimensionID = -1;
|
||||
private double spatialPowerExponent = 1.35;
|
||||
private double spatialPowerMultiplier = 1250.0;
|
||||
|
||||
// Grindstone
|
||||
private String[] grinderOres = Stream.of( ORES_VANILLA, ORES_AE, ORES_COMMON, ORES_MISC ).flatMap( Stream::of ).toArray( String[]::new );
|
||||
private Set<String> grinderBlackList;
|
||||
private double oreDoublePercentage = 90.0;
|
||||
|
||||
// Batteries
|
||||
private int wirelessTerminalBattery = 1600000;
|
||||
private int entropyManipulatorBattery = 200000;
|
||||
@@ -163,20 +98,16 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
private int portableCellBattery = 20000;
|
||||
private int colorApplicatorBattery = 20000;
|
||||
private int chargedStaffBattery = 8000;
|
||||
|
||||
// Certus quartz
|
||||
private float spawnChargedChance = 0.92f;
|
||||
private int quartzOresPerCluster = 4;
|
||||
private int quartzOresClusterAmount = 15;
|
||||
private int chargedChange = 4;
|
||||
|
||||
// Meteors
|
||||
private int minMeteoriteDistance = 707;
|
||||
private int minMeteoriteDistanceSq = this.minMeteoriteDistance * this.minMeteoriteDistance;
|
||||
private double meteoriteClusterChance = 0.1;
|
||||
private int meteoriteMaximumSpawnHeight = 180;
|
||||
private int[] meteoriteDimensionWhitelist = {0};
|
||||
|
||||
// Wireless
|
||||
private double wirelessBaseCost = 8;
|
||||
private double wirelessCostMultiplier = 1;
|
||||
@@ -184,10 +115,8 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
private double wirelessBaseRange = 16;
|
||||
private double wirelessBoosterRangeMultiplier = 1;
|
||||
private double wirelessBoosterExp = 1.5;
|
||||
private double wirelessHighWirelessCount = 64;
|
||||
|
||||
// Tunnels
|
||||
public static final double TUNNEL_POWER_LOSS = 0.05;
|
||||
// Autocrafting
|
||||
private boolean enableCraftingSubstitutes = false;
|
||||
|
||||
private AEConfig( final File configFile )
|
||||
{
|
||||
@@ -249,6 +178,9 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
this.colorApplicatorBattery = this.get( "battery", "colorApplicator", this.colorApplicatorBattery ).getInt( this.colorApplicatorBattery );
|
||||
this.matterCannonBattery = this.get( "battery", "matterCannon", this.matterCannonBattery ).getInt( this.matterCannonBattery );
|
||||
|
||||
this.addCustomCategoryComment( "autocrafting", "Enable patterns with substitutions on to have their substitutes to be auto craftable.\nThis changes the crafting tree, and can show missing ingredients for the substitute, instead of the patterned item" );
|
||||
this.enableCraftingSubstitutes = this.get( "autocrafting", "EnableAutocraftinSubstitutes", this.enableCraftingSubstitutes ).getBoolean( this.enableCraftingSubstitutes );
|
||||
|
||||
this.clientSync();
|
||||
|
||||
this.addCustomCategoryComment( "features", "Warning: Disabling a feature may disable other features depending on it." );
|
||||
@@ -670,11 +602,21 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
return this.storageProviderID;
|
||||
}
|
||||
|
||||
void setStorageProviderID( int id )
|
||||
{
|
||||
this.storageProviderID = id;
|
||||
}
|
||||
|
||||
public int getStorageDimensionID()
|
||||
{
|
||||
return this.storageDimensionID;
|
||||
}
|
||||
|
||||
void setStorageDimensionID( int id )
|
||||
{
|
||||
this.storageDimensionID = id;
|
||||
}
|
||||
|
||||
public double getSpatialPowerExponent()
|
||||
{
|
||||
return this.spatialPowerExponent;
|
||||
@@ -810,20 +752,15 @@ public final class AEConfig extends Configuration implements IConfigurableObject
|
||||
return this.wirelessBoosterExp;
|
||||
}
|
||||
|
||||
// Setters keep visibility as low as possible.
|
||||
|
||||
public double getWirelessHighWirelessCount()
|
||||
{
|
||||
return this.wirelessHighWirelessCount;
|
||||
}
|
||||
|
||||
// Setters keep visibility as low as possible.
|
||||
|
||||
void setStorageProviderID( int id )
|
||||
public boolean getEnableCraftingSubstitutes()
|
||||
{
|
||||
this.storageProviderID = id;
|
||||
}
|
||||
|
||||
void setStorageDimensionID( int id )
|
||||
{
|
||||
this.storageDimensionID = id;
|
||||
return this.enableCraftingSubstitutes;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -359,16 +359,16 @@ public final class ApiBlocks implements IBlocks
|
||||
this.tinyTNT = registry.block( "tiny_tnt", BlockTinyTNT::new )
|
||||
.features( AEFeature.TINY_TNT )
|
||||
.bootstrap( ( block, item ) -> (IPreInitComponent) side -> BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.putObject( item,
|
||||
new DispenserBehaviorTinyTNT() ) )
|
||||
new DispenserBehaviorTinyTNT() ) )
|
||||
.bootstrap( ( block, item ) -> (IEntityRegistrationComponent) r ->
|
||||
{
|
||||
r.register( EntityEntryBuilder.create()
|
||||
.entity( EntityTinyTNTPrimed.class )
|
||||
.id( new ResourceLocation( "appliedenergistics2", EntityTinyTNTPrimed.class.getName() ),
|
||||
EntityIds.get( EntityTinyTNTPrimed.class ) )
|
||||
.name( "EntityTinyTNTPrimed" )
|
||||
.tracker( 16, 4, true )
|
||||
.build() );
|
||||
.entity( EntityTinyTNTPrimed.class )
|
||||
.id( new ResourceLocation( "appliedenergistics2", EntityTinyTNTPrimed.class.getName() ),
|
||||
EntityIds.get( EntityTinyTNTPrimed.class ) )
|
||||
.name( "EntityTinyTNTPrimed" )
|
||||
.tracker( 16, 4, true )
|
||||
.build() );
|
||||
} )
|
||||
.build();
|
||||
this.securityStation = registry.block( "security_station", BlockSecurityStation::new )
|
||||
@@ -397,7 +397,6 @@ public final class ApiBlocks implements IBlocks
|
||||
.tileEntity( new TileEntityDefinition( TileSpatialIOPort.class ) )
|
||||
.build();
|
||||
this.controller = registry.block( "controller", BlockController::new )
|
||||
.features( AEFeature.CHANNELS )
|
||||
.tileEntity( new TileEntityDefinition( TileController.class ) )
|
||||
.useCustomItemModel()
|
||||
.rendering( new ControllerRendering() )
|
||||
@@ -635,7 +634,7 @@ public final class ApiBlocks implements IBlocks
|
||||
} )
|
||||
.build();
|
||||
|
||||
Verify.verify(stairs.maybeBlock().isPresent());
|
||||
Verify.verify( stairs.maybeBlock().isPresent() );
|
||||
|
||||
return stairs;
|
||||
}
|
||||
|
||||
@@ -80,6 +80,7 @@ public final class ApiParts implements IParts
|
||||
private final IItemDefinition interfaceTerminal;
|
||||
private final IItemDefinition patternTerminal;
|
||||
private final IItemDefinition expandedProcessingPatternTerminal;
|
||||
private final IItemDefinition interfaceConfigurationTerminal;
|
||||
private final IItemDefinition craftingTerminal;
|
||||
private final IItemDefinition terminal;
|
||||
private final IItemDefinition storageMonitor;
|
||||
@@ -142,6 +143,7 @@ public final class ApiParts implements IParts
|
||||
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.expandedProcessingPatternTerminal = new DamagedItemDefinition( "part.terminal.expanded_processing_pattern", itemPart.createPart( PartType.EXPANDED_PROCESSING_PATTERN_TERMINAL ) );
|
||||
this.interfaceConfigurationTerminal = new DamagedItemDefinition( "part.terminal.interface_configuration_terminal", itemPart.createPart( PartType.INTERFACE_CONFIGURATION_TERMINAL ) );
|
||||
this.craftingTerminal = new DamagedItemDefinition( "part.terminal.crafting", itemPart.createPart( PartType.CRAFTING_TERMINAL ) );
|
||||
this.terminal = new DamagedItemDefinition( "part.terminal", itemPart.createPart( PartType.TERMINAL ) );
|
||||
this.storageMonitor = new DamagedItemDefinition( "part.monitor.storage", itemPart.createPart( PartType.STORAGE_MONITOR ) );
|
||||
|
||||
@@ -172,6 +172,7 @@ public enum GuiText
|
||||
Missing,
|
||||
|
||||
InterfaceTerminal,
|
||||
InterfaceConfigurationTerminal,
|
||||
NoCraftingCPUs,
|
||||
Clean,
|
||||
InvalidPattern,
|
||||
|
||||
@@ -23,7 +23,7 @@ import java.lang.reflect.Constructor;
|
||||
|
||||
import appeng.container.implementations.*;
|
||||
import appeng.parts.misc.PartOreDicStorageBus;
|
||||
import appeng.parts.reporting.PartExpandedProcessingPatternTerminal;
|
||||
import appeng.parts.reporting.*;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
@@ -74,9 +74,6 @@ import appeng.items.contents.QuartzKnifeObj;
|
||||
import appeng.parts.automation.PartFormationPlane;
|
||||
import appeng.parts.automation.PartLevelEmitter;
|
||||
import appeng.parts.misc.PartStorageBus;
|
||||
import appeng.parts.reporting.PartCraftingTerminal;
|
||||
import appeng.parts.reporting.PartInterfaceTerminal;
|
||||
import appeng.parts.reporting.PartPatternTerminal;
|
||||
import appeng.tile.crafting.TileCraftingTile;
|
||||
import appeng.tile.crafting.TileMolecularAssembler;
|
||||
import appeng.tile.grindstone.TileGrinder;
|
||||
@@ -180,7 +177,9 @@ public enum GuiBridge implements IGuiHandler
|
||||
|
||||
GUI_INTERFACE_TERMINAL( ContainerInterfaceTerminal.class, PartInterfaceTerminal.class, GuiHostType.WORLD, SecurityPermissions.BUILD ),
|
||||
|
||||
GUI_CRAFTING_STATUS( ContainerCraftingStatus.class, ITerminalHost.class, GuiHostType.ITEM_OR_WORLD, SecurityPermissions.CRAFT );
|
||||
GUI_CRAFTING_STATUS( ContainerCraftingStatus.class, ITerminalHost.class, GuiHostType.ITEM_OR_WORLD, SecurityPermissions.CRAFT ),
|
||||
|
||||
GUI_INTERFACE_CONFIGURATION_TERMINAL( ContainerInterfaceConfigurationTerminal.class, PartInterfaceConfigurationTerminal.class, GuiHostType.WORLD, SecurityPermissions.BUILD );
|
||||
|
||||
private final Class tileClass;
|
||||
private final Class containerClass;
|
||||
@@ -343,7 +342,7 @@ public enum GuiBridge implements IGuiHandler
|
||||
if( target == null )
|
||||
{
|
||||
throw new IllegalStateException( "Cannot find " + this.containerClass.getName() + "( " + this.typeName( inventory ) + ", " + this
|
||||
.typeName( tE ) + " )" );
|
||||
.typeName( tE ) + " )" );
|
||||
}
|
||||
|
||||
return target.newInstance( inventory, tE );
|
||||
@@ -441,7 +440,7 @@ public enum GuiBridge implements IGuiHandler
|
||||
if( target == null )
|
||||
{
|
||||
throw new IllegalStateException( "Cannot find " + this.containerClass.getName() + "( " + this.typeName( inventory ) + ", " + this
|
||||
.typeName( tE ) + " )" );
|
||||
.typeName( tE ) + " )" );
|
||||
}
|
||||
|
||||
return target.newInstance( inventory, tE );
|
||||
|
||||
@@ -27,6 +27,7 @@ import java.io.OutputStream;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
import appeng.client.gui.implementations.GuiInterfaceConfigurationTerminal;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
|
||||
@@ -113,5 +114,9 @@ public class PacketCompressedNBT extends AppEngPacket
|
||||
{
|
||||
( (GuiInterfaceTerminal) gs ).postUpdate( this.in );
|
||||
}
|
||||
else if( gs instanceof GuiInterfaceConfigurationTerminal )
|
||||
{
|
||||
( (GuiInterfaceConfigurationTerminal) gs ).postUpdate( this.in );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,34 +21,23 @@ public class PacketInformPlayer extends AppEngPacket
|
||||
public PacketInformPlayer( ByteBuf stream ) throws IOException
|
||||
{
|
||||
this.type = InfoType.values()[stream.readInt()];
|
||||
if( type == InfoType.PARTIAL_ITEM_EXTRACTION )
|
||||
switch ( type )
|
||||
{
|
||||
this.reportedItem = AEItemStack.fromPacket( stream );
|
||||
this.actualItem = AEItemStack.fromPacket( stream );
|
||||
}
|
||||
else if( type == InfoType.NO_ITEMS_EXTRACTED )
|
||||
{
|
||||
this.reportedItem = AEItemStack.fromPacket( stream );
|
||||
case PARTIAL_ITEM_EXTRACTION:
|
||||
this.reportedItem = AEItemStack.fromPacket( stream );
|
||||
this.actualItem = AEItemStack.fromPacket( stream );
|
||||
break;
|
||||
case NO_ITEMS_EXTRACTED:
|
||||
this.reportedItem = AEItemStack.fromPacket( stream );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public PacketInformPlayer( final IAEItemStack iaeItemStack ) throws IOException
|
||||
public PacketInformPlayer( IAEItemStack expected, IAEItemStack actual, InfoType type ) throws IOException
|
||||
{
|
||||
this( iaeItemStack, null );
|
||||
}
|
||||
|
||||
public PacketInformPlayer( IAEItemStack extra, IAEItemStack result ) throws IOException
|
||||
{
|
||||
this.reportedItem = extra;
|
||||
this.actualItem = result;
|
||||
if( actualItem == null )
|
||||
{
|
||||
this.type = InfoType.NO_ITEMS_EXTRACTED;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.type = InfoType.PARTIAL_ITEM_EXTRACTION;
|
||||
}
|
||||
this.reportedItem = expected;
|
||||
this.actualItem = actual;
|
||||
this.type = type;
|
||||
|
||||
final ByteBuf data = Unpooled.buffer();
|
||||
|
||||
@@ -78,12 +67,10 @@ public class PacketInformPlayer extends AppEngPacket
|
||||
{
|
||||
AppEng.proxy.getPlayers().get( 0 ).sendStatusMessage( new TextComponentString( "System reported " + reportedItem.getStackSize() + " " + reportedItem.getItem().getItemStackDisplayName( reportedItem.getDefinition() ) + " available but could not extract anything" ), false );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public enum InfoType
|
||||
{
|
||||
PARTIAL_ITEM_EXTRACTION,
|
||||
NO_ITEMS_EXTRACTED
|
||||
PARTIAL_ITEM_EXTRACTION, NO_ITEMS_EXTRACTED
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,9 @@ import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.client.me.SlotDisconnected;
|
||||
import appeng.container.implementations.ContainerInterfaceConfigurationTerminal;
|
||||
import appeng.container.implementations.ContainerInterfaceConfigurationTerminal.ConfigTracker;
|
||||
import appeng.container.slot.IJEITargetSlot;
|
||||
import appeng.container.slot.SlotFake;
|
||||
import appeng.core.AELog;
|
||||
@@ -30,11 +33,14 @@ import appeng.core.sync.network.NetworkHandler;
|
||||
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||
import appeng.fluids.container.ContainerFluidConfigurable;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
import appeng.util.helpers.ItemHandlerUtil;
|
||||
import appeng.util.inv.WrapperRangeItemHandler;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
|
||||
@@ -50,6 +56,7 @@ import appeng.helpers.InventoryAction;
|
||||
import appeng.util.Platform;
|
||||
import appeng.util.item.AEItemStack;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
|
||||
public class PacketInventoryAction extends AppEngPacket
|
||||
@@ -111,14 +118,25 @@ public class PacketInventoryAction extends AppEngPacket
|
||||
this.configureWrite( data );
|
||||
}
|
||||
|
||||
public PacketInventoryAction(final InventoryAction action, final IJEITargetSlot slot, final IAEItemStack slotItem ) throws IOException
|
||||
public PacketInventoryAction( final InventoryAction action, final IJEITargetSlot slot, final IAEItemStack slotItem ) throws IOException
|
||||
{
|
||||
|
||||
this.action = action;
|
||||
if (slot instanceof SlotFake)
|
||||
this.slot = ((SlotFake) slot).slotNumber;
|
||||
else this.slot = ((GuiFluidSlot) slot).getId();
|
||||
this.id = 0;
|
||||
if( slot instanceof SlotFake )
|
||||
{
|
||||
this.slot = ( (SlotFake) slot ).slotNumber;
|
||||
this.id = 0;
|
||||
}
|
||||
else if( slot instanceof SlotDisconnected )
|
||||
{
|
||||
this.slot = ( (SlotDisconnected) slot ).getSlotIndex();
|
||||
this.id = ( (SlotDisconnected) slot ).getSlot().getId();
|
||||
}
|
||||
else
|
||||
{
|
||||
this.slot = ( (GuiFluidSlot) slot ).getId();
|
||||
this.id = 0;
|
||||
}
|
||||
this.slotItem = slotItem;
|
||||
|
||||
final ByteBuf data = Unpooled.buffer();
|
||||
@@ -205,29 +223,44 @@ public class PacketInventoryAction extends AppEngPacket
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( this.slot < sender.openContainer.inventorySlots.size() && sender.openContainer.inventorySlots.get( this.slot ) instanceof SlotFake )
|
||||
else if( sender.openContainer instanceof ContainerInterfaceConfigurationTerminal )
|
||||
{
|
||||
if( this.slotItem != null )
|
||||
ConfigTracker inv = ( (ContainerInterfaceConfigurationTerminal) sender.openContainer ).getSlotByID( this.id );
|
||||
final IItemHandler theSlot = new WrapperRangeItemHandler( inv.getServer(), 0, slot + 1 );
|
||||
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, this.slot, this.slotItem.createItemStack() );
|
||||
|
||||
}
|
||||
else if( this.slot < sender.openContainer.inventorySlots.size() )
|
||||
{
|
||||
Slot senderSlot = sender.openContainer.inventorySlots.get( this.slot );
|
||||
if( senderSlot instanceof SlotFake )
|
||||
{
|
||||
sender.openContainer.inventorySlots.get( this.slot ).putStack( this.slotItem.createItemStack() );
|
||||
if( sender.openContainer.inventorySlots.get( this.slot ).getStack().isEmpty() )
|
||||
if( this.slotItem != null )
|
||||
{
|
||||
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||
if( aefs != null )
|
||||
senderSlot.putStack( this.slotItem.createItemStack() );
|
||||
if( senderSlot.getStack().isEmpty() )
|
||||
{
|
||||
FluidStack fluid = aefs.getFluidStack();
|
||||
sender.openContainer.inventorySlots.get( this.slot ).putStack( AEFluidStack.fromFluidStack( fluid ).asItemStackRepresentation() );
|
||||
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||
if( aefs != null )
|
||||
{
|
||||
FluidStack fluid = aefs.getFluidStack();
|
||||
senderSlot.putStack( AEFluidStack.fromFluidStack( fluid ).asItemStackRepresentation() );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else sender.openContainer.inventorySlots.get( this.slot ).putStack( ItemStack.EMPTY );
|
||||
try
|
||||
{
|
||||
NetworkHandler.instance().sendTo( new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.fromItemStack( ItemStack.EMPTY ) ), sender );
|
||||
}
|
||||
catch( final IOException e )
|
||||
{
|
||||
AELog.debug( e );
|
||||
else
|
||||
{
|
||||
senderSlot.putStack( ItemStack.EMPTY );
|
||||
}
|
||||
try
|
||||
{
|
||||
NetworkHandler.instance().sendTo( new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.fromItemStack( ItemStack.EMPTY ) ), sender );
|
||||
}
|
||||
catch( final IOException e )
|
||||
{
|
||||
AELog.debug( e );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import appeng.api.networking.IGridNode;
|
||||
import appeng.api.networking.crafting.ICraftingCallback;
|
||||
import appeng.api.networking.crafting.ICraftingGrid;
|
||||
import appeng.api.networking.crafting.ICraftingJob;
|
||||
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
||||
import appeng.api.networking.security.IActionHost;
|
||||
import appeng.api.networking.security.IActionSource;
|
||||
import appeng.api.networking.storage.IStorageGrid;
|
||||
@@ -38,7 +39,6 @@ import appeng.core.AELog;
|
||||
import appeng.hooks.TickHandler;
|
||||
import appeng.me.cache.GridStorageCache;
|
||||
import com.google.common.base.Stopwatch;
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
@@ -55,45 +55,48 @@ public class CraftingJob implements Runnable, ICraftingJob
|
||||
private final World world;
|
||||
private final IItemList<IAEItemStack> crafting = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||
private final IItemList<IAEItemStack> missing = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||
private final IItemList<IAEItemStack> neededForLoop = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||
private final Object2ObjectOpenHashMap<CraftingTreeNode, IAEItemStack> reserved = new Object2ObjectOpenHashMap<>();
|
||||
|
||||
private final HashMap<String, TwoIntegers> opsAndMultiplier = new HashMap<>();
|
||||
private final Object monitor = new Object();
|
||||
private final Stopwatch tickSpreadingWatch = Stopwatch.createUnstarted();
|
||||
private final Stopwatch craftingTreeWatch = Stopwatch.createUnstarted();
|
||||
private final IAEItemStack output;
|
||||
private final IActionSource actionSrc;
|
||||
private final ICraftingCallback callback;
|
||||
private final ICraftingGrid cc;
|
||||
private CraftingTreeNode tree;
|
||||
private final IAEItemStack output;
|
||||
private boolean simulate = false;
|
||||
private MECraftingInventory availableCheck;
|
||||
private long bytes = 0;
|
||||
private final IActionSource actionSrc;
|
||||
private final ICraftingCallback callback;
|
||||
private boolean running = false;
|
||||
private boolean done = false;
|
||||
private int time;
|
||||
private int incTime;
|
||||
|
||||
private World wrapWorld( final World w )
|
||||
{
|
||||
return w;
|
||||
}
|
||||
|
||||
public CraftingJob( final World w, final IGrid grid, final IActionSource actionSrc, final IAEItemStack what, final ICraftingCallback callback )
|
||||
{
|
||||
this.world = w;
|
||||
this.world = this.wrapWorld( w );
|
||||
this.output = what.copy();
|
||||
this.actionSrc = actionSrc;
|
||||
|
||||
this.callback = callback;
|
||||
|
||||
ICraftingGrid cc = grid.getCache( ICraftingGrid.class );
|
||||
this.cc = grid.getCache( ICraftingGrid.class );
|
||||
final GridStorageCache sg = grid.getCache( IStorageGrid.class );
|
||||
this.original = sg.getExtractableList( actionSrc );
|
||||
|
||||
this.availableCheck = new MECraftingInventory( this.original, false, false, false );
|
||||
this.setTree( this.getCraftingTree( cc, what ) );
|
||||
this.availableCheck = null;
|
||||
}
|
||||
|
||||
private CraftingTreeNode getCraftingTree( final ICraftingGrid cc, final IAEItemStack what )
|
||||
{
|
||||
return new CraftingTreeNode( cc, this, what, what.getStackSize(), null, -1 );
|
||||
return new CraftingTreeNode( cc, this, what, null, -1, 0 );
|
||||
}
|
||||
|
||||
void refund( final IAEItemStack o )
|
||||
@@ -111,7 +114,7 @@ public class CraftingJob implements Runnable, ICraftingJob
|
||||
return this.availableCheck.extractItems( available, Actionable.SIMULATE, this.actionSrc );
|
||||
}
|
||||
|
||||
void addTask( IAEItemStack what, final long crafts )
|
||||
void addTask( IAEItemStack what, final long crafts, final ICraftingPatternDetails details, final int depth )
|
||||
{
|
||||
if( crafts > 0 )
|
||||
{
|
||||
@@ -127,22 +130,6 @@ public class CraftingJob implements Runnable, ICraftingJob
|
||||
this.missing.add( what );
|
||||
}
|
||||
|
||||
public void reserve( CraftingTreeNode node, IAEItemStack stack )
|
||||
{
|
||||
this.checkUse( stack );
|
||||
reserved.put( node, stack );
|
||||
}
|
||||
|
||||
public IItemList<IAEItemStack> getNeededForLoop()
|
||||
{
|
||||
return neededForLoop;
|
||||
}
|
||||
|
||||
public Object2ObjectOpenHashMap<CraftingTreeNode, IAEItemStack> getReserved()
|
||||
{
|
||||
return reserved;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
@@ -154,11 +141,9 @@ public class CraftingJob implements Runnable, ICraftingJob
|
||||
this.handlePausing();
|
||||
|
||||
final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true );
|
||||
craftingInventory.ignore( this.output );
|
||||
|
||||
this.availableCheck = new MECraftingInventory( this.original, false, false, false );
|
||||
this.reserved.values().forEach( availableCheck::reserve );
|
||||
this.reserved.values().forEach( craftingInventory::reserve );
|
||||
|
||||
craftingTreeWatch.start();
|
||||
this.getTree().request( craftingInventory, this.output.getStackSize(), this.actionSrc );
|
||||
craftingTreeWatch.stop();
|
||||
@@ -188,12 +173,10 @@ public class CraftingJob implements Runnable, ICraftingJob
|
||||
if( actionSrc.player().isPresent() )
|
||||
{
|
||||
final MECraftingInventory craftingInventory = new MECraftingInventory( this.original, true, false, true );
|
||||
craftingInventory.ignore( this.output );
|
||||
|
||||
this.getTree().setSimulate();
|
||||
|
||||
this.availableCheck = new MECraftingInventory( this.original, false, false, false );
|
||||
this.reserved.values().forEach( availableCheck::reserve );
|
||||
this.reserved.values().forEach( craftingInventory::reserve );
|
||||
|
||||
craftingTreeWatch.reset().start();
|
||||
this.getTree().request( craftingInventory, this.output.getStackSize(), this.actionSrc );
|
||||
craftingTreeWatch.stop();
|
||||
|
||||
@@ -39,10 +39,8 @@ import net.minecraftforge.fml.common.Optional;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@Optional.Interface( iface = "gregtech.api.items.IToolItem", modid = "gregtech" )
|
||||
public class CraftingTreeNode
|
||||
{
|
||||
@@ -58,22 +56,33 @@ public class CraftingTreeNode
|
||||
private final IAEItemStack what;
|
||||
// what are the crafting patterns for this?
|
||||
private final ArrayList<CraftingTreeProcess> nodes = new ArrayList<>();
|
||||
private final boolean canEmit;
|
||||
private CraftingTreeNode loopHead;
|
||||
private final ICraftingGrid cc;
|
||||
private final int depth;
|
||||
private int bytes = 0;
|
||||
private boolean canEmit = false;
|
||||
private long missing = 0;
|
||||
private long howManyEmitted = 0;
|
||||
private boolean exhausted = false;
|
||||
|
||||
public CraftingTreeNode( final ICraftingGrid cc, final CraftingJob job, final IAEItemStack wat, long amount, final CraftingTreeProcess par, final int slot )
|
||||
public CraftingTreeNode( final ICraftingGrid cc, final CraftingJob job, final IAEItemStack wat, final CraftingTreeProcess par, final int slot, final int depth )
|
||||
{
|
||||
this.what = wat;
|
||||
this.parent = par;
|
||||
this.slot = slot;
|
||||
this.world = job.getWorld();
|
||||
this.job = job;
|
||||
this.cc = cc;
|
||||
this.depth = depth;
|
||||
|
||||
this.canEmit = cc.canEmitFor( this.what );
|
||||
}
|
||||
|
||||
public void addNode()
|
||||
{
|
||||
if( !nodes.isEmpty() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if( this.canEmit )
|
||||
{
|
||||
@@ -83,55 +92,16 @@ public class CraftingTreeNode
|
||||
for( final ICraftingPatternDetails details : cc.getCraftingFor( this.what, this.parent == null ? null : this.parent.details, slot, this.world ) )// in
|
||||
// order.
|
||||
{
|
||||
int times = 1;
|
||||
for( IAEItemStack o : details.getCondensedOutputs() )
|
||||
if( this.parent == null || notRecursive( details ) && this.parent.details != details )
|
||||
{
|
||||
if( what.equals( o ) )
|
||||
{
|
||||
times = (int) ( amount / o.getStackSize() + ( amount % o.getStackSize() != 0 ? 1 : 0 ) );
|
||||
}
|
||||
this.nodes.add( new CraftingTreeProcess( cc, job, details, this, depth + 1 ) );
|
||||
}
|
||||
|
||||
if( this.parent == null )
|
||||
{
|
||||
this.nodes.add( new CraftingTreeProcess( cc, job, details, times, this ) );
|
||||
continue;
|
||||
}
|
||||
if( details == parent.details )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
CraftingTreeNode recursive = recursiveNode( this );
|
||||
if( recursive == null )
|
||||
{
|
||||
this.nodes.add( new CraftingTreeProcess( cc, job, details, times, this ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
reserveForNode();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void reserveForNode()
|
||||
{
|
||||
if( this.equals( loopHead ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
IAEItemStack available = job.checkAvailable( this.what );
|
||||
if( available != null && available.getStackSize() >= this.what.getStackSize() )
|
||||
{
|
||||
this.job.reserve( this, this.what.copy() );
|
||||
}
|
||||
else
|
||||
{
|
||||
parent.reserveForNode();
|
||||
}
|
||||
}
|
||||
|
||||
IAEItemStack request( final MECraftingInventory inv, long l, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
||||
{
|
||||
addNode();
|
||||
this.job.handlePausing();
|
||||
if( this.canEmit )
|
||||
{
|
||||
@@ -145,74 +115,55 @@ public class CraftingTreeNode
|
||||
}
|
||||
|
||||
final IItemList<IAEItemStack> inventoryList = inv.getItemList();
|
||||
|
||||
IAEItemStack reserved = job.getReserved().get( this );
|
||||
|
||||
final List<IAEItemStack> thingsUsed = new ArrayList<>();
|
||||
|
||||
this.what.setStackSize( l );
|
||||
|
||||
if( this.getSlot() >= 0 && this.parent != null && this.parent.details.isCraftable() )
|
||||
{
|
||||
Collection<IAEItemStack> itemList = new HashSet<>();
|
||||
Collection<IAEItemStack> itemList = new ArrayList<>();
|
||||
|
||||
if( this.what.getItem().isDamageable() || Platform.isGTDamageableItem( this.what.getItem() ) )
|
||||
boolean damageableItem = this.what.getItem().isDamageable() || Platform.isGTDamageableItem( this.what.getItem() );
|
||||
|
||||
if( this.parent.details.canSubstitute() )
|
||||
{
|
||||
itemList.addAll( inventoryList.findFuzzy( this.what, FuzzyMode.IGNORE_ALL ) );
|
||||
|
||||
if( this.parent.details.canSubstitute() )
|
||||
for( IAEItemStack subs : this.parent.details.getSubstituteInputs( this.slot ) )
|
||||
{
|
||||
for( IAEItemStack is : inventoryList )
|
||||
if( damageableItem )
|
||||
{
|
||||
if( is.fuzzyComparison( this.what, FuzzyMode.IGNORE_ALL ) )
|
||||
{
|
||||
itemList.add( is );
|
||||
}
|
||||
itemList.addAll( inventoryList.findFuzzy( subs, FuzzyMode.IGNORE_ALL ) );
|
||||
}
|
||||
subs = inventoryList.findPrecise( subs );
|
||||
if( subs != null )
|
||||
{
|
||||
itemList.add( subs );
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
final IAEItemStack item = inventoryList.findPrecise( this.what );
|
||||
if( item != null )
|
||||
if( damageableItem )
|
||||
{
|
||||
itemList.add( item );
|
||||
itemList.addAll( inventoryList.findFuzzy( this.what, FuzzyMode.IGNORE_ALL ) );
|
||||
}
|
||||
if( this.parent.details.canSubstitute() )
|
||||
else
|
||||
{
|
||||
for( IAEItemStack s : parent.details.getSubstituteInputs( this.slot ) )
|
||||
final IAEItemStack item = inventoryList.findPrecise( this.what );
|
||||
if( item != null )
|
||||
{
|
||||
if( s != null )
|
||||
{
|
||||
for( IAEItemStack ss : inventoryList.findFuzzy( s, FuzzyMode.IGNORE_ALL ) )
|
||||
{
|
||||
if( ss != null )
|
||||
{
|
||||
itemList.add( ss );
|
||||
}
|
||||
}
|
||||
}
|
||||
itemList.add( item );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for( IAEItemStack fuzz : itemList )
|
||||
{
|
||||
if( this.parent.details.isValidItemForSlot( this.getSlot(), fuzz.getDefinition(), this.world ) )
|
||||
if( this.parent.details.isValidItemForSlot( this.getSlot(), fuzz.copy().getCachedItemStack( 1 ), this.world ) )
|
||||
{
|
||||
fuzz = fuzz.copy();
|
||||
fuzz.setStackSize( l );
|
||||
|
||||
final IAEItemStack available;
|
||||
|
||||
if( reserved != null )
|
||||
{
|
||||
available = reserved;
|
||||
}
|
||||
else
|
||||
{
|
||||
available = inv.extractItems( fuzz, Actionable.MODULATE, src );
|
||||
}
|
||||
final IAEItemStack available = inv.extractItems( fuzz, Actionable.MODULATE, src );
|
||||
|
||||
if( available != null )
|
||||
{
|
||||
@@ -225,11 +176,6 @@ public class CraftingTreeNode
|
||||
thingsUsed.add( is.copy() );
|
||||
this.used.add( is );
|
||||
}
|
||||
else if( reserved != null )
|
||||
{
|
||||
thingsUsed.add( reserved.copy() );
|
||||
this.used.add( reserved );
|
||||
}
|
||||
}
|
||||
|
||||
this.bytes += available.getStackSize();
|
||||
@@ -245,20 +191,7 @@ public class CraftingTreeNode
|
||||
}
|
||||
else
|
||||
{
|
||||
final IAEItemStack available;
|
||||
|
||||
if( parent == null && this.what.equals( job.getOutput() ) )
|
||||
{
|
||||
available = null;
|
||||
}
|
||||
else if( reserved != null )
|
||||
{
|
||||
available = reserved;
|
||||
}
|
||||
else
|
||||
{
|
||||
available = inv.extractItems( this.what, Actionable.MODULATE, src );
|
||||
}
|
||||
final IAEItemStack available = inv.extractItems( this.what, Actionable.MODULATE, src );
|
||||
|
||||
if( available != null )
|
||||
{
|
||||
@@ -271,11 +204,6 @@ public class CraftingTreeNode
|
||||
thingsUsed.add( is.copy() );
|
||||
this.used.add( is );
|
||||
}
|
||||
else if( reserved != null )
|
||||
{
|
||||
thingsUsed.add( reserved.copy() );
|
||||
this.used.add( reserved );
|
||||
}
|
||||
}
|
||||
|
||||
this.bytes += available.getStackSize();
|
||||
@@ -297,7 +225,6 @@ public class CraftingTreeNode
|
||||
while ( pro.possible && l > 0 )
|
||||
{
|
||||
final IAEItemStack madeWhat = pro.getAmountCrafted( this.what );
|
||||
|
||||
pro.request( inv, pro.getTimes( l, madeWhat.getStackSize() ), src );
|
||||
|
||||
madeWhat.setStackSize( l );
|
||||
@@ -328,9 +255,7 @@ public class CraftingTreeNode
|
||||
while ( pro.possible && l > 0 )
|
||||
{
|
||||
final MECraftingInventory subInv = new MECraftingInventory( inv, true, true, true );
|
||||
final IAEItemStack madeWhat = pro.getAmountCrafted( this.what );
|
||||
|
||||
pro.request( subInv, pro.getTimes( l, madeWhat.getStackSize() ), src );
|
||||
pro.request( subInv, 1, src );
|
||||
|
||||
this.what.setStackSize( l );
|
||||
final IAEItemStack available = subInv.extractItems( this.what, Actionable.MODULATE, src );
|
||||
@@ -382,24 +307,17 @@ public class CraftingTreeNode
|
||||
throw new CraftBranchFailure( this.what, l );
|
||||
}
|
||||
|
||||
CraftingTreeNode recursiveNode( CraftingTreeNode node )
|
||||
boolean notRecursive( ICraftingPatternDetails details )
|
||||
{
|
||||
if( this.parent == null )
|
||||
{
|
||||
return null;
|
||||
return true;
|
||||
}
|
||||
if( node != this )
|
||||
if( this.parent.details == details )
|
||||
{
|
||||
if( node.what.equals( this.what ) )
|
||||
{
|
||||
if( node.what.getStackSize() == this.what.getStackSize() )
|
||||
{
|
||||
loopHead = this;
|
||||
return node;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return this.parent.notRecursive( node );
|
||||
return this.parent.notRecursive( details );
|
||||
}
|
||||
|
||||
void dive( final CraftingJob job )
|
||||
@@ -442,21 +360,21 @@ public class CraftingTreeNode
|
||||
{
|
||||
for( final IAEItemStack i : this.used )
|
||||
{
|
||||
final IAEItemStack ex = storage.extractItems( i, Actionable.MODULATE, src );
|
||||
final IAEItemStack actuallyExtracted = storage.extractItems( i, Actionable.MODULATE, src );
|
||||
|
||||
if( ex == null || ex.getStackSize() != i.getStackSize() )
|
||||
if( actuallyExtracted == null || actuallyExtracted.getStackSize() != i.getStackSize() )
|
||||
{
|
||||
if( src.player().isPresent() )
|
||||
{
|
||||
try
|
||||
{
|
||||
if( ex == null )
|
||||
if( actuallyExtracted == null )
|
||||
{
|
||||
NetworkHandler.instance().sendTo( new PacketInformPlayer( i ), (EntityPlayerMP) src.player().get() );
|
||||
NetworkHandler.instance().sendTo( new PacketInformPlayer( i, null, PacketInformPlayer.InfoType.NO_ITEMS_EXTRACTED ), (EntityPlayerMP) src.player().get() );
|
||||
}
|
||||
else
|
||||
{
|
||||
NetworkHandler.instance().sendTo( new PacketInformPlayer( ex, i ), (EntityPlayerMP) src.player().get() );
|
||||
NetworkHandler.instance().sendTo( new PacketInformPlayer( i, actuallyExtracted, PacketInformPlayer.InfoType.PARTIAL_ITEM_EXTRACTION ), (EntityPlayerMP) src.player().get() );
|
||||
}
|
||||
}
|
||||
catch( IOException e )
|
||||
@@ -467,7 +385,7 @@ public class CraftingTreeNode
|
||||
throw new CraftBranchFailure( i, i.getStackSize() );
|
||||
}
|
||||
|
||||
craftingCPUCluster.addStorage( ex );
|
||||
craftingCPUCluster.addStorage( actuallyExtracted );
|
||||
}
|
||||
|
||||
if( this.howManyEmitted > 0 )
|
||||
|
||||
@@ -20,12 +20,12 @@ package appeng.crafting;
|
||||
|
||||
|
||||
import appeng.api.config.Actionable;
|
||||
import appeng.api.config.FuzzyMode;
|
||||
import appeng.api.networking.crafting.ICraftingGrid;
|
||||
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
||||
import appeng.api.networking.security.IActionSource;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.api.storage.data.IItemList;
|
||||
import appeng.core.AEConfig;
|
||||
import appeng.me.cluster.implementations.CraftingCPUCluster;
|
||||
import appeng.util.Platform;
|
||||
import appeng.util.item.AEItemStack;
|
||||
@@ -41,21 +41,33 @@ import java.util.Map.Entry;
|
||||
|
||||
public class CraftingTreeProcess
|
||||
{
|
||||
final ICraftingPatternDetails details;
|
||||
private final CraftingTreeNode parent;
|
||||
final ICraftingPatternDetails details;
|
||||
private final CraftingJob job;
|
||||
private final Object2LongArrayMap<CraftingTreeNode> nodes = new Object2LongArrayMap<>();
|
||||
private final int depth;
|
||||
private final ICraftingGrid cc;
|
||||
private final World world;
|
||||
boolean possible = true;
|
||||
private long crafts = 0;
|
||||
private long bytes = 0;
|
||||
private boolean hasContainerItem = false;
|
||||
|
||||
public CraftingTreeProcess( final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, int times, final CraftingTreeNode craftingTreeNode )
|
||||
public CraftingTreeProcess( final ICraftingGrid cc, final CraftingJob job, final ICraftingPatternDetails details, final CraftingTreeNode craftingTreeNode, final int depth )
|
||||
{
|
||||
this.parent = craftingTreeNode;
|
||||
this.details = details;
|
||||
this.job = job;
|
||||
World world = job.getWorld();
|
||||
this.depth = depth;
|
||||
this.cc = cc;
|
||||
this.world = job.getWorld();
|
||||
}
|
||||
|
||||
public void addProcess()
|
||||
{
|
||||
if( !nodes.isEmpty() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final IAEItemStack[] list = details.getInputs();
|
||||
|
||||
@@ -76,53 +88,119 @@ public class CraftingTreeProcess
|
||||
{
|
||||
part = list[x];
|
||||
isPartContainer = true;
|
||||
this.hasContainerItem = true;
|
||||
}
|
||||
|
||||
long wantedSize = isPartContainer ? part.getStackSize() : part.getStackSize() * times;
|
||||
long wantedSize = part.getStackSize();
|
||||
|
||||
if( details.canSubstitute() && cc.getCraftingFor( part, details, x, world ).isEmpty() )
|
||||
if( AEConfig.instance().getEnableCraftingSubstitutes() )
|
||||
{
|
||||
for( IAEItemStack subs : details.getSubstituteInputs( x ) )
|
||||
{
|
||||
if( subs.fuzzyComparison( part, FuzzyMode.IGNORE_ALL ) )
|
||||
{
|
||||
this.nodes.put( new CraftingTreeNode( cc, job, subs.copy(), wantedSize, this, x ), part.getStackSize() / times );
|
||||
wantedSize = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//try to order the crafting of a substitute
|
||||
ICraftingPatternDetails prioritizedPattern = null;
|
||||
IAEItemStack prioritizedIAE = null;
|
||||
for( IAEItemStack subs : details.getSubstituteInputs( x ) )
|
||||
{
|
||||
if( subs.equals( part ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
ImmutableCollection<ICraftingPatternDetails> detailCollection = cc.getCraftingFor( subs, details, x, world );
|
||||
IAEItemStack found;
|
||||
long remaining;
|
||||
long requestAmount;
|
||||
|
||||
for( ICraftingPatternDetails sp : detailCollection )
|
||||
if( details.canSubstitute() )
|
||||
{
|
||||
for( IAEItemStack subs : details.getSubstituteInputs( x ) )
|
||||
{
|
||||
if( prioritizedPattern == null )
|
||||
found = job.checkAvailable( subs );
|
||||
|
||||
if( found != null )
|
||||
{
|
||||
prioritizedPattern = sp;
|
||||
prioritizedIAE = subs;
|
||||
remaining = found.getStackSize();
|
||||
}
|
||||
else
|
||||
{
|
||||
if( sp.getPriority() > prioritizedPattern.getPriority() )
|
||||
remaining = 0;
|
||||
}
|
||||
|
||||
if( remaining > 0 )
|
||||
{
|
||||
if( remaining >= wantedSize )
|
||||
{
|
||||
prioritizedPattern = sp;
|
||||
requestAmount = wantedSize;
|
||||
wantedSize = 0;
|
||||
//we have the items
|
||||
}
|
||||
else
|
||||
{
|
||||
requestAmount = remaining;
|
||||
wantedSize -= remaining;
|
||||
}
|
||||
subs = subs.copy().setStackSize( requestAmount );
|
||||
CraftingTreeNode node = new CraftingTreeNode( cc, job, subs, this, x, depth + 1 );
|
||||
this.nodes.put( node, requestAmount );
|
||||
if( wantedSize == 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( prioritizedIAE != null )
|
||||
}
|
||||
else
|
||||
{
|
||||
found = job.checkAvailable( part );
|
||||
|
||||
if( found != null )
|
||||
{
|
||||
this.nodes.put( new CraftingTreeNode( cc, job, prioritizedIAE.copy(), wantedSize, this, x ), part.getStackSize() / times );
|
||||
wantedSize = 0;
|
||||
break;
|
||||
remaining = found.getStackSize();
|
||||
}
|
||||
else
|
||||
{
|
||||
remaining = 0;
|
||||
}
|
||||
|
||||
if( remaining > 0 )
|
||||
{
|
||||
if( remaining >= wantedSize )
|
||||
{
|
||||
requestAmount = wantedSize;
|
||||
wantedSize = 0;
|
||||
//we have the items
|
||||
}
|
||||
else
|
||||
{
|
||||
requestAmount = remaining;
|
||||
wantedSize -= remaining;
|
||||
}
|
||||
part = part.copy().setStackSize( requestAmount );
|
||||
this.nodes.put( new CraftingTreeNode( cc, job, part, this, x, depth + 1 ), requestAmount );
|
||||
}
|
||||
}
|
||||
if( wantedSize > 0 )
|
||||
{
|
||||
if( details.canSubstitute() && cc.getCraftingFor( part, details, x, world ).isEmpty() )
|
||||
{
|
||||
//try to order the crafting of a substitute
|
||||
ICraftingPatternDetails prioritizedPattern = null;
|
||||
IAEItemStack prioritizedIAE = null;
|
||||
for( IAEItemStack subs : details.getSubstituteInputs( x ) )
|
||||
{
|
||||
ImmutableCollection<ICraftingPatternDetails> detailCollection = cc.getCraftingFor( subs, details, x, world );
|
||||
|
||||
for( ICraftingPatternDetails sp : detailCollection )
|
||||
{
|
||||
if( prioritizedPattern == null )
|
||||
{
|
||||
prioritizedPattern = sp;
|
||||
prioritizedIAE = subs;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( sp.getPriority() > prioritizedPattern.getPriority() )
|
||||
{
|
||||
prioritizedPattern = sp;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( prioritizedIAE != null )
|
||||
{
|
||||
subs = subs.copy().setStackSize( wantedSize );
|
||||
CraftingTreeNode node = new CraftingTreeNode( cc, job, subs, this, x, depth + 1 );
|
||||
this.nodes.put( node, wantedSize );
|
||||
wantedSize = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -130,7 +208,7 @@ public class CraftingTreeProcess
|
||||
{
|
||||
part = part.copy().setStackSize( wantedSize );
|
||||
// use the first slot...
|
||||
this.nodes.put( new CraftingTreeNode( cc, job, part.copy(), wantedSize, this, x ), part.getStackSize() / times );
|
||||
this.nodes.put( new CraftingTreeNode( cc, job, part, this, x, depth + 1 ), wantedSize );
|
||||
wantedSize = 0;
|
||||
}
|
||||
if( !isPartContainer && wantedSize == 0 )
|
||||
@@ -142,40 +220,38 @@ public class CraftingTreeProcess
|
||||
}
|
||||
}
|
||||
|
||||
CraftingTreeNode notRecursive( CraftingTreeNode node )
|
||||
boolean notRecursive( ICraftingPatternDetails details )
|
||||
{
|
||||
if( parent == null )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return this.parent.recursiveNode( node );
|
||||
return this.parent == null || this.parent.notRecursive( details );
|
||||
}
|
||||
|
||||
long getTimes( final long remaining, final long stackSize )
|
||||
{
|
||||
if( hasContainerItem )
|
||||
for( final IAEItemStack part : details.getCondensedOutputs() )
|
||||
{
|
||||
return 1;
|
||||
for( final IAEItemStack o : details.getCondensedInputs() )
|
||||
{
|
||||
if( part.equals( o ) || o.getItem().hasContainerItem( part.getDefinition() ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ( remaining / stackSize ) + ( remaining % stackSize != 0 ? 1 : 0 );
|
||||
}
|
||||
|
||||
void request( final MECraftingInventory inv, final long amountOfTimes, final IActionSource src ) throws CraftBranchFailure, InterruptedException
|
||||
{
|
||||
addProcess();
|
||||
this.job.handlePausing();
|
||||
List<IAEItemStack> containerItems = null;
|
||||
|
||||
// request and remove inputs...
|
||||
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
|
||||
{
|
||||
final IAEItemStack stack = entry.getKey().request( inv, details.isCraftable() && hasContainerItem ? 1 : entry.getValue() * amountOfTimes, src );
|
||||
final IAEItemStack stack = entry.getKey().request( inv, entry.getValue() * amountOfTimes, src );
|
||||
|
||||
if( stack.equals( job.getOutput() ) )
|
||||
{
|
||||
job.getNeededForLoop().add( stack.copy() );
|
||||
}
|
||||
|
||||
if( details.isCraftable() && stack.getItem().hasContainerItem( stack.getDefinition() ) )
|
||||
if( this.details.isCraftable() && stack.getItem().hasContainerItem( stack.getDefinition() ) )
|
||||
{
|
||||
final ItemStack is = Platform.getContainerItem( stack.createItemStack() );
|
||||
final IAEItemStack o = AEItemStack.fromItemStack( is );
|
||||
@@ -189,16 +265,16 @@ public class CraftingTreeProcess
|
||||
o.setCachedItemStack( is );
|
||||
containerItems.add( o );
|
||||
}
|
||||
if( containerItems != null )
|
||||
{
|
||||
for( IAEItemStack i : containerItems )
|
||||
{
|
||||
inv.injectItems( i, Actionable.MODULATE, src );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( containerItems != null )
|
||||
{
|
||||
for( IAEItemStack i : containerItems )
|
||||
{
|
||||
inv.injectItems( i, Actionable.MODULATE, src );
|
||||
}
|
||||
}
|
||||
|
||||
// assume its possible.
|
||||
|
||||
@@ -214,7 +290,7 @@ public class CraftingTreeProcess
|
||||
|
||||
void dive( final CraftingJob job )
|
||||
{
|
||||
job.addTask( this.getAmountCrafted( this.parent.getStack( 1 ) ), this.crafts );
|
||||
job.addTask( this.getAmountCrafted( this.parent.getStack( 1 ) ), this.crafts, this.details, this.depth );
|
||||
for( final Entry<CraftingTreeNode, Long> entry : this.nodes.object2LongEntrySet() )
|
||||
{
|
||||
entry.getKey().dive( job );
|
||||
@@ -284,9 +360,4 @@ public class CraftingTreeProcess
|
||||
entry.getKey().getPlan( plan );
|
||||
}
|
||||
}
|
||||
|
||||
public void reserveForNode()
|
||||
{
|
||||
parent.reserveForNode();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,11 +318,11 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
||||
{
|
||||
if( result == null )
|
||||
{
|
||||
NetworkHandler.instance().sendTo( new PacketInformPlayer( extra ), (EntityPlayerMP) src.player().get() );
|
||||
NetworkHandler.instance().sendTo( new PacketInformPlayer( null, extra, PacketInformPlayer.InfoType.NO_ITEMS_EXTRACTED ), (EntityPlayerMP) src.player().get() );
|
||||
}
|
||||
else
|
||||
{
|
||||
NetworkHandler.instance().sendTo( new PacketInformPlayer( extra, result ), (EntityPlayerMP) src.player().get() );
|
||||
NetworkHandler.instance().sendTo( new PacketInformPlayer( result, extra, PacketInformPlayer.InfoType.PARTIAL_ITEM_EXTRACTION ), (EntityPlayerMP) src.player().get() );
|
||||
}
|
||||
}
|
||||
catch( IOException e )
|
||||
@@ -361,6 +361,11 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
||||
return true;
|
||||
}
|
||||
|
||||
private void addMissing( final IAEItemStack extra )
|
||||
{
|
||||
this.missingCache.add( extra );
|
||||
}
|
||||
|
||||
void ignore( final IAEItemStack what )
|
||||
{
|
||||
final IAEItemStack list = this.localCache.findPrecise( what );
|
||||
@@ -369,18 +374,4 @@ public class MECraftingInventory implements IMEInventory<IAEItemStack>
|
||||
list.setStackSize( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
void reserve( final IAEItemStack what )
|
||||
{
|
||||
final IAEItemStack list = this.localCache.findPrecise( what );
|
||||
if( list != null )
|
||||
{
|
||||
list.decStackSize( what.getStackSize() );
|
||||
}
|
||||
}
|
||||
|
||||
private void addMissing( final IAEItemStack extra )
|
||||
{
|
||||
this.missingCache.add( extra );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,8 +62,10 @@ import appeng.me.storage.MEMonitorPassThrough;
|
||||
import appeng.me.storage.NullInventory;
|
||||
import appeng.parts.automation.StackUpgradeInventory;
|
||||
import appeng.parts.automation.UpgradeInventory;
|
||||
import appeng.parts.misc.PartInterface;
|
||||
import appeng.tile.inventory.AppEngInternalAEInventory;
|
||||
import appeng.tile.inventory.AppEngInternalInventory;
|
||||
import appeng.tile.networking.TileCableBus;
|
||||
import appeng.util.ConfigManager;
|
||||
import appeng.util.IConfigManagerHost;
|
||||
import appeng.util.InventoryAdaptor;
|
||||
@@ -90,6 +92,7 @@ import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.capabilities.CapabilityInject;
|
||||
import net.minecraftforge.fml.common.Loader;
|
||||
import net.minecraftforge.items.CapabilityItemHandler;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
@@ -98,8 +101,6 @@ import net.minecraftforge.items.wrapper.RangedWrapper;
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.*;
|
||||
|
||||
import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
|
||||
|
||||
|
||||
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
|
||||
{
|
||||
@@ -648,10 +649,6 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
||||
return true;
|
||||
}
|
||||
return out.getStackSize() != stack.getCount();
|
||||
// ItemStack after = adaptor.simulateAdd( stack );
|
||||
// if ( after == null )
|
||||
// return true;
|
||||
// return after.stackSize != stack.stackSize;
|
||||
}
|
||||
|
||||
public IItemHandler getConfig()
|
||||
@@ -800,6 +797,65 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
||||
return;
|
||||
}
|
||||
|
||||
if( te instanceof IInterfaceHost || ( te instanceof TileCableBus && ( (TileCableBus) te ).getPart( s.getOpposite() ) instanceof PartInterface ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
IInterfaceHost targetTE;
|
||||
if( te instanceof IInterfaceHost )
|
||||
{
|
||||
targetTE = (IInterfaceHost) te;
|
||||
}
|
||||
else
|
||||
{
|
||||
targetTE = (IInterfaceHost) ( (TileCableBus) te ).getPart( s.getOpposite() );
|
||||
}
|
||||
|
||||
if( !targetTE.getInterfaceDuality().sameGrid( this.gridProxy.getGrid() ) )
|
||||
{
|
||||
IStorageMonitorableAccessor mon = te.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, s.getOpposite() );
|
||||
if( mon != null )
|
||||
{
|
||||
IStorageMonitorable sm = mon.getInventory( this.mySource );
|
||||
if( sm != null && Platform.canAccess( targetTE.getInterfaceDuality().gridProxy, this.mySource ) )
|
||||
{
|
||||
IMEMonitor<IAEItemStack> inv = sm.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||
if( inv != null )
|
||||
{
|
||||
final Iterator<ItemStack> i = this.waitingToSendFacing.get( s ).iterator();
|
||||
while ( i.hasNext() )
|
||||
{
|
||||
ItemStack whatToSend = i.next();
|
||||
final IAEItemStack result = inv.injectItems( AEItemStack.fromItemStack( whatToSend ), Actionable.MODULATE, this.mySource );
|
||||
if( result != null )
|
||||
{
|
||||
whatToSend.setCount( (int) result.getStackSize() );
|
||||
}
|
||||
else
|
||||
{
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
if( this.waitingToSendFacing.get( s ).isEmpty() )
|
||||
{
|
||||
this.waitingToSendFacing.remove( s );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch( GridAccessException e )
|
||||
{
|
||||
throw new RuntimeException( e );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||
|
||||
final Iterator<ItemStack> i = this.waitingToSendFacing.get( s ).iterator();
|
||||
@@ -1124,20 +1180,73 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
||||
for( final EnumFacing s : visitedFaces )
|
||||
{
|
||||
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
||||
if( te instanceof IInterfaceHost )
|
||||
if( te instanceof IInterfaceHost || ( te instanceof TileCableBus && ( (TileCableBus) te ).getPart( s.getOpposite() ) instanceof PartInterface ) )
|
||||
{
|
||||
visitedFaces.remove( s );
|
||||
try
|
||||
{
|
||||
if( ( (IInterfaceHost) te ).getInterfaceDuality().sameGrid( this.gridProxy.getGrid() ) )
|
||||
IInterfaceHost targetTE;
|
||||
if( te instanceof IInterfaceHost )
|
||||
{
|
||||
targetTE = (IInterfaceHost) te;
|
||||
}
|
||||
else
|
||||
{
|
||||
targetTE = (IInterfaceHost) ( (TileCableBus) te ).getPart( s.getOpposite() );
|
||||
}
|
||||
|
||||
if( targetTE.getInterfaceDuality().sameGrid( this.gridProxy.getGrid() ) )
|
||||
{
|
||||
visitedFaces.remove( s );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
IStorageMonitorableAccessor mon = te.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, s.getOpposite() );
|
||||
if( mon != null )
|
||||
{
|
||||
IStorageMonitorable sm = mon.getInventory( this.mySource );
|
||||
if( sm != null && Platform.canAccess( targetTE.getInterfaceDuality().gridProxy, this.mySource ) )
|
||||
{
|
||||
if( this.isBlocking() && sm.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().size() > 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
IMEMonitor<IAEItemStack> inv = sm.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) );
|
||||
for( int x = 0; x < table.getSizeInventory(); x++ )
|
||||
{
|
||||
final ItemStack is = table.getStackInSlot( x );
|
||||
if( is.isEmpty() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
IAEItemStack result = inv.injectItems( AEItemStack.fromItemStack( is ), Actionable.SIMULATE, this.mySource );
|
||||
if( result != null )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for( int x = 0; x < table.getSizeInventory(); x++ )
|
||||
{
|
||||
final ItemStack is = table.getStackInSlot( x );
|
||||
if( !is.isEmpty() )
|
||||
{
|
||||
addToSendListFacing( is, s );
|
||||
}
|
||||
}
|
||||
pushItemsOut( s );
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if( te instanceof ICraftingMachine )
|
||||
@@ -1232,14 +1341,55 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
||||
for( final EnumFacing s : possibleDirections )
|
||||
{
|
||||
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
||||
IPhantomTile phantomTE;
|
||||
|
||||
if( te instanceof IInterfaceHost || ( te instanceof TileCableBus && ( (TileCableBus) te ).getPart( s.getOpposite() ) instanceof PartInterface ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
IInterfaceHost targetTE;
|
||||
if( te instanceof IInterfaceHost )
|
||||
{
|
||||
targetTE = (IInterfaceHost) te;
|
||||
}
|
||||
else
|
||||
{
|
||||
targetTE = (IInterfaceHost) ( (TileCableBus) te ).getPart( s.getOpposite() );
|
||||
}
|
||||
|
||||
if( targetTE.getInterfaceDuality().sameGrid( this.gridProxy.getGrid() ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
IStorageMonitorableAccessor mon = te.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, s.getOpposite() );
|
||||
if( mon != null )
|
||||
{
|
||||
IStorageMonitorable sm = mon.getInventory( this.mySource );
|
||||
if( sm != null && Platform.canAccess( targetTE.getInterfaceDuality().gridProxy, this.mySource ) )
|
||||
{
|
||||
if( sm.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getStorageList().isEmpty() )
|
||||
{
|
||||
allAreBusy = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||
if( ad != null )
|
||||
{
|
||||
if( Loader.isModLoaded( "actuallyadditions" ) && Loader.isModLoaded( "gregtech" ) && te instanceof IPhantomTile )
|
||||
{
|
||||
phantomTE = ( (IPhantomTile) te );
|
||||
IPhantomTile phantomTE = ( (IPhantomTile) te );
|
||||
if( phantomTE.hasBoundPosition() )
|
||||
{
|
||||
TileEntity phantom = w.getTileEntity( phantomTE.getBoundPosition() );
|
||||
@@ -1477,8 +1627,11 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
||||
|
||||
if( Loader.isModLoaded( "gregtech" ) && directedBlock instanceof BlockMachine )
|
||||
{
|
||||
MetaTileEntity metaTileEntity = getMetaTileEntity( hostWorld, targ );
|
||||
return metaTileEntity.getMetaFullName();
|
||||
MetaTileEntity metaTileEntity = Platform.getMetaTileEntity( directedTile.getWorld(), directedTile.getPos() );
|
||||
if( metaTileEntity != null )
|
||||
{
|
||||
return metaTileEntity.getMetaFullName();
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
@@ -1506,7 +1659,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
||||
|
||||
if( what.getItem() != Items.AIR )
|
||||
{
|
||||
return what.getUnlocalizedName();
|
||||
return what.getItem().getItemStackDisplayName( what );
|
||||
}
|
||||
|
||||
final Item item = Item.getItemFromBlock( directedBlock );
|
||||
|
||||
@@ -105,7 +105,7 @@ public enum PartType
|
||||
}
|
||||
},
|
||||
|
||||
CABLE_SMART( 40, "cable_smart", EnumSet.of( AEFeature.CHANNELS, AEFeature.SMART_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartCableSmart.class )
|
||||
CABLE_SMART( 40, "cable_smart", EnumSet.of( AEFeature.SMART_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartCableSmart.class )
|
||||
{
|
||||
@Override
|
||||
public boolean isCable()
|
||||
@@ -121,7 +121,7 @@ public enum PartType
|
||||
}
|
||||
},
|
||||
|
||||
CABLE_DENSE_SMART( 60, "cable_dense_smart", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartDenseCableSmart.class )
|
||||
CABLE_DENSE_SMART( 60, "cable_dense_smart", EnumSet.of( AEFeature.DENSE_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartDenseCableSmart.class )
|
||||
{
|
||||
@Override
|
||||
public boolean isCable()
|
||||
@@ -137,7 +137,7 @@ public enum PartType
|
||||
}
|
||||
},
|
||||
|
||||
CABLE_DENSE_COVERED( 500, "cable_dense_covered", EnumSet.of( AEFeature.CHANNELS, AEFeature.DENSE_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartDenseCableCovered.class )
|
||||
CABLE_DENSE_COVERED( 500, "cable_dense_covered", EnumSet.of( AEFeature.DENSE_CABLES ), EnumSet.noneOf( IntegrationType.class ), PartDenseCableCovered.class )
|
||||
{
|
||||
@Override
|
||||
public boolean isCable()
|
||||
@@ -284,7 +284,8 @@ public enum PartType
|
||||
|
||||
INTERFACE_TERMINAL( 480, "interface_terminal", EnumSet.of( AEFeature.INTERFACE_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartInterfaceTerminal.class ),
|
||||
|
||||
FLUID_TERMINAL( 520, "fluid_terminal", EnumSet.of( AEFeature.FLUID_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartFluidTerminal.class );
|
||||
FLUID_TERMINAL( 520, "fluid_terminal", EnumSet.of( AEFeature.FLUID_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartFluidTerminal.class ),
|
||||
INTERFACE_CONFIGURATION_TERMINAL( 521, "interface_configuration_terminal", EnumSet.of( AEFeature.INTERFACE_TERMINAL ), EnumSet.noneOf( IntegrationType.class ), PartInterfaceConfigurationTerminal.class );
|
||||
|
||||
private final int baseDamage;
|
||||
private final Set<AEFeature> features;
|
||||
|
||||
@@ -70,7 +70,6 @@ public class GridStorageCache implements IStorageGrid
|
||||
private final Map<IStorageChannel<? extends IAEStack>, NetworkInventoryHandler<?>> storageNetworks;
|
||||
private final Map<IStorageChannel<? extends IAEStack>, NetworkMonitor<?>> storageMonitors;
|
||||
private MECraftingInventory localCache = null;
|
||||
private final Int2ObjectMap<MECraftingInventory> extractableItemPriorityMap = new Int2ObjectOpenHashMap<>();
|
||||
private int localDepth;
|
||||
|
||||
public GridStorageCache( final IGrid g )
|
||||
@@ -86,7 +85,6 @@ public class GridStorageCache implements IStorageGrid
|
||||
public void onUpdateTick()
|
||||
{
|
||||
this.localCache = null;
|
||||
this.extractableItemPriorityMap.clear();
|
||||
this.storageMonitors.forEach( ( channel, monitor ) -> monitor.onTick() );
|
||||
}
|
||||
|
||||
@@ -176,19 +174,6 @@ public class GridStorageCache implements IStorageGrid
|
||||
|
||||
public MECraftingInventory getExtractableList( IActionSource src )
|
||||
{
|
||||
if( src instanceof MachineSource )
|
||||
{
|
||||
if( src.machine().isPresent() )
|
||||
{
|
||||
IActionHost machine = src.machine().get();
|
||||
if( machine instanceof IInterfaceHost )
|
||||
{
|
||||
extractableItemPriorityMap.putIfAbsent( ( (IPriorityHost) machine ).getPriority(), new MECraftingInventory( getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), src, false, false, false ) );
|
||||
return extractableItemPriorityMap.get( ( (IPriorityHost) machine ).getPriority() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( localCache == null )
|
||||
{
|
||||
localCache = new MECraftingInventory( getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ), src, false, false, false );
|
||||
@@ -205,12 +190,13 @@ public class GridStorageCache implements IStorageGrid
|
||||
|
||||
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
|
||||
|
||||
this.storageMonitors.forEach( ( channel, monitor ) -> {
|
||||
for( final IMEInventoryHandler<?> h : cc.getCellArray( channel ) )
|
||||
{
|
||||
tracker.postChanges( channel, 1, h, actionSrc );
|
||||
}
|
||||
} );
|
||||
this.storageMonitors.forEach( ( channel, monitor ) ->
|
||||
{
|
||||
for( final IMEInventoryHandler<?> h : cc.getCellArray( channel ) )
|
||||
{
|
||||
tracker.postChanges( channel, 1, h, actionSrc );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
return tracker;
|
||||
@@ -225,12 +211,13 @@ public class GridStorageCache implements IStorageGrid
|
||||
|
||||
final IActionSource actionSrc = cc instanceof IActionHost ? new MachineSource( (IActionHost) cc ) : new BaseActionSource();
|
||||
|
||||
this.storageMonitors.forEach( ( channel, monitor ) -> {
|
||||
for( final IMEInventoryHandler<IAEItemStack> h : cc.getCellArray( channel ) )
|
||||
{
|
||||
tracker.postChanges( channel, -1, h, actionSrc );
|
||||
}
|
||||
} );
|
||||
this.storageMonitors.forEach( ( channel, monitor ) ->
|
||||
{
|
||||
for( final IMEInventoryHandler<IAEItemStack> h : cc.getCellArray( channel ) )
|
||||
{
|
||||
tracker.postChanges( channel, -1, h, actionSrc );
|
||||
}
|
||||
} );
|
||||
}
|
||||
|
||||
return tracker;
|
||||
|
||||
@@ -19,6 +19,22 @@
|
||||
package appeng.me.cluster.implementations;
|
||||
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import appeng.api.config.Upgrades;
|
||||
import appeng.helpers.DualityInterface;
|
||||
import appeng.helpers.PatternHelper;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
|
||||
import net.minecraft.inventory.InventoryCrafting;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import appeng.api.AEApi;
|
||||
import appeng.api.config.Actionable;
|
||||
import appeng.api.config.FuzzyMode;
|
||||
@@ -27,7 +43,14 @@ import appeng.api.implementations.ICraftingPatternItem;
|
||||
import appeng.api.networking.IGrid;
|
||||
import appeng.api.networking.IGridHost;
|
||||
import appeng.api.networking.IGridNode;
|
||||
import appeng.api.networking.crafting.*;
|
||||
import appeng.api.networking.crafting.CraftingItemList;
|
||||
import appeng.api.networking.crafting.ICraftingCPU;
|
||||
import appeng.api.networking.crafting.ICraftingGrid;
|
||||
import appeng.api.networking.crafting.ICraftingJob;
|
||||
import appeng.api.networking.crafting.ICraftingLink;
|
||||
import appeng.api.networking.crafting.ICraftingMedium;
|
||||
import appeng.api.networking.crafting.ICraftingPatternDetails;
|
||||
import appeng.api.networking.crafting.ICraftingRequester;
|
||||
import appeng.api.networking.energy.IEnergyGrid;
|
||||
import appeng.api.networking.events.MENetworkCraftingCpuChange;
|
||||
import appeng.api.networking.security.IActionSource;
|
||||
@@ -40,8 +63,11 @@ import appeng.api.storage.data.IItemList;
|
||||
import appeng.api.util.WorldCoord;
|
||||
import appeng.container.ContainerNull;
|
||||
import appeng.core.AELog;
|
||||
import appeng.crafting.*;
|
||||
import appeng.helpers.PatternHelper;
|
||||
import appeng.crafting.CraftBranchFailure;
|
||||
import appeng.crafting.CraftingJob;
|
||||
import appeng.crafting.CraftingLink;
|
||||
import appeng.crafting.CraftingWatcher;
|
||||
import appeng.crafting.MECraftingInventory;
|
||||
import appeng.me.cache.CraftingGridCache;
|
||||
import appeng.me.cluster.IAECluster;
|
||||
import appeng.me.helpers.MachineSource;
|
||||
@@ -49,17 +75,6 @@ import appeng.tile.crafting.TileCraftingMonitorTile;
|
||||
import appeng.tile.crafting.TileCraftingTile;
|
||||
import appeng.util.Platform;
|
||||
import appeng.util.item.AEItemStack;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import net.minecraft.inventory.InventoryCrafting;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
||||
@@ -87,7 +102,6 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
||||
private IAEItemStack finalOutput;
|
||||
private boolean waiting = false;
|
||||
private IItemList<IAEItemStack> waitingFor = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||
private IItemList<IAEItemStack> neededForLoop = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||
private long availableStorage = 0;
|
||||
private MachineSource machineSrc = null;
|
||||
private int accelerator = 0;
|
||||
@@ -210,10 +224,13 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
||||
|
||||
public boolean canAccept( final IAEItemStack input )
|
||||
{
|
||||
if( input != null )
|
||||
if( input instanceof IAEItemStack )
|
||||
{
|
||||
final IAEItemStack is = this.waitingFor.findPrecise( input );
|
||||
return is != null && is.getStackSize() > 0;
|
||||
if( is != null && is.getStackSize() > 0 )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -287,28 +304,9 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
||||
|
||||
if( this.finalOutput.equals( what ) )
|
||||
{
|
||||
IAEItemStack isLoop = neededForLoop.findPrecise( finalOutput );
|
||||
IAEItemStack leftover = what;
|
||||
|
||||
if( isLoop != null && isLoop.getStackSize() > 0 )
|
||||
{
|
||||
if( isLoop.getStackSize() >= what.getStackSize() )
|
||||
{
|
||||
leftover = this.inventory.injectItems( what.copy(), type, src );
|
||||
isLoop.decStackSize( what.getStackSize() );
|
||||
}
|
||||
else
|
||||
{
|
||||
leftover = this.inventory.injectItems( what.copy().setStackSize( what.getStackSize() - isLoop.getStackSize() ), type, src );
|
||||
isLoop.decStackSize( what.getStackSize() - isLoop.getStackSize() );
|
||||
}
|
||||
if( leftover == null )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
this.finalOutput.decStackSize( leftover.getStackSize() );
|
||||
this.finalOutput.decStackSize( what.getStackSize() );
|
||||
|
||||
if( this.myLastLink != null )
|
||||
{
|
||||
@@ -338,28 +336,9 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
||||
|
||||
if( this.finalOutput.equals( insert ) )
|
||||
{
|
||||
IAEItemStack isLoop = neededForLoop.findPrecise( finalOutput );
|
||||
IAEItemStack leftover = input;
|
||||
|
||||
if( isLoop != null && isLoop.getStackSize() > 0 )
|
||||
{
|
||||
if( isLoop.getStackSize() >= insert.getStackSize() )
|
||||
{
|
||||
leftover = this.inventory.injectItems( insert.copy(), type, src );
|
||||
isLoop.decStackSize( insert.getStackSize() );
|
||||
}
|
||||
else
|
||||
{
|
||||
leftover = this.inventory.injectItems( insert.copy().setStackSize( insert.getStackSize() - isLoop.getStackSize() ), type, src );
|
||||
isLoop.decStackSize( insert.getStackSize() - isLoop.getStackSize() );
|
||||
}
|
||||
if( leftover == null )
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
this.finalOutput.decStackSize( leftover.getStackSize() );
|
||||
this.finalOutput.decStackSize( insert.getStackSize() );
|
||||
|
||||
if( this.myLastLink != null )
|
||||
{
|
||||
@@ -987,12 +966,10 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
||||
try
|
||||
{
|
||||
this.waitingFor.resetStatus();
|
||||
this.neededForLoop.resetStatus();
|
||||
( (CraftingJob) job ).getTree().setJob( ci, this, src );
|
||||
if( ci.commit( src ) )
|
||||
{
|
||||
this.finalOutput = job.getOutput();
|
||||
this.neededForLoop = ( (CraftingJob) job ).getNeededForLoop();
|
||||
this.waiting = false;
|
||||
this.isComplete = false;
|
||||
this.markDirty();
|
||||
|
||||
@@ -177,7 +177,7 @@ public class PartPlacement
|
||||
;
|
||||
if( held.getCount() == 0 )
|
||||
{
|
||||
player.inventory.mainInventory.set( player.inventory.currentItem, ItemStack.EMPTY );
|
||||
player.setHeldItem( hand, ItemStack.EMPTY );
|
||||
MinecraftForge.EVENT_BUS.post( new PlayerDestroyItemEvent( player, held, hand ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -319,16 +319,16 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
||||
return this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0;
|
||||
}
|
||||
|
||||
private void pushItemIntoTarget( final InventoryAdaptor d, final IEnergyGrid energy, final IMEInventory<IAEItemStack> inv, IAEItemStack ais )
|
||||
private void pushItemIntoTarget( final InventoryAdaptor d, final IEnergyGrid energy, final IMEInventory<IAEItemStack> inv, IAEItemStack org )
|
||||
{
|
||||
ItemStack inputStack = ais.getCachedItemStack( ais.getStackSize() );
|
||||
ItemStack inputStack = org.getCachedItemStack( org.getStackSize() );
|
||||
|
||||
ItemStack remaining = d.simulateAdd( inputStack );
|
||||
|
||||
// Store the stack in the cache for next time.
|
||||
if( !remaining.isEmpty() )
|
||||
{
|
||||
ais.setCachedItemStack( remaining );
|
||||
org.setCachedItemStack( remaining );
|
||||
if( remaining == inputStack )
|
||||
{
|
||||
return;
|
||||
@@ -339,7 +339,7 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
||||
|
||||
if( canFit > 0 )
|
||||
{
|
||||
ais = ais.copy();
|
||||
IAEItemStack ais = org.copy();
|
||||
ais.setStackSize( canFit );
|
||||
final IAEItemStack itemsToAdd = Platform.poweredExtraction( energy, inv, ais, this.mySrc );
|
||||
|
||||
@@ -360,6 +360,10 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
||||
this.didSomething = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
org.setCachedItemStack( inputStack );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package appeng.parts.p2p;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import appeng.api.parts.IPartModel;
|
||||
import appeng.items.parts.PartModels;
|
||||
import appeng.me.GridAccessException;
|
||||
@@ -23,7 +24,6 @@ public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower>
|
||||
private static final P2PModels MODELS = new P2PModels( "part/p2p/p2p_tunnel_gteu" );
|
||||
private static final IEnergyContainer NULL_ENERGY_STORAGE = new NullEnergyStorage();
|
||||
private final IEnergyContainer inputHandler = new InputEnergyStorage();
|
||||
private final IEnergyContainer outputHandler = new OutputEnergyStorage();
|
||||
private final Queue<PartP2PGTCEPower> outputs = new ArrayDeque<>();
|
||||
|
||||
public PartP2PGTCEPower( ItemStack is )
|
||||
@@ -67,9 +67,12 @@ public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower>
|
||||
@Override
|
||||
public boolean hasCapability( @Nonnull Capability<?> capability )
|
||||
{
|
||||
if( capability == GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER )
|
||||
if( !this.isOutput() )
|
||||
{
|
||||
return true;
|
||||
if( capability == GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return super.hasCapability( capability );
|
||||
}
|
||||
@@ -82,7 +85,7 @@ public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower>
|
||||
{
|
||||
if( this.isOutput() )
|
||||
{
|
||||
return (T) this.outputHandler;
|
||||
return null;
|
||||
}
|
||||
return (T) this.inputHandler;
|
||||
}
|
||||
@@ -112,7 +115,10 @@ public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower>
|
||||
{
|
||||
PartP2PGTCEPower target = outputs.poll();
|
||||
final IEnergyContainer output = target.getAttachedEnergyStorage();
|
||||
|
||||
if( output == this )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if( output == null || output.getEnergyCanBeInserted() <= 0 )
|
||||
{
|
||||
continue;
|
||||
@@ -140,24 +146,26 @@ public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower>
|
||||
}
|
||||
}
|
||||
|
||||
while ( !outputs.isEmpty() )
|
||||
voltage = (long) ( voltage * 0.95 );
|
||||
|
||||
if( voltage > 0 )
|
||||
{
|
||||
PartP2PGTCEPower target = outputs.poll();
|
||||
final IEnergyContainer output = target.getAttachedEnergyStorage();
|
||||
|
||||
if( output == null || !output.inputsEnergy( facing ) || output.getEnergyCanBeInserted() <= 0 )
|
||||
while ( !outputs.isEmpty() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
PartP2PGTCEPower target = outputs.poll();
|
||||
final IEnergyContainer output = target.getAttachedEnergyStorage();
|
||||
|
||||
if( output == null || !output.inputsEnergy( facing ) || output.getEnergyCanBeInserted() <= 0 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if( voltage > 0 )
|
||||
{
|
||||
amperesUsed += output.acceptEnergyFromNetwork( facing, voltage, amperage - amperesUsed );
|
||||
}
|
||||
|
||||
if( amperage == amperesUsed )
|
||||
{
|
||||
break;
|
||||
if( amperage >= amperesUsed )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return amperesUsed;
|
||||
@@ -200,67 +208,6 @@ public class PartP2PGTCEPower extends PartP2PTunnel<PartP2PGTCEPower>
|
||||
}
|
||||
}
|
||||
|
||||
class OutputEnergyStorage implements IEnergyContainer
|
||||
{
|
||||
@Override
|
||||
public long acceptEnergyFromNetwork( EnumFacing facing, long voltage, long amperage )
|
||||
{
|
||||
if( facing == getSide().getFacing() )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
final IEnergyContainer output = getAttachedEnergyStorage();
|
||||
voltage *= 0.95;
|
||||
if( voltage > 0 )
|
||||
{
|
||||
return output.acceptEnergyFromNetwork( facing, voltage, amperage );
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inputsEnergy( EnumFacing enumFacing )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean outputsEnergy( EnumFacing side )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long changeEnergy( long l )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getEnergyStored()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getEnergyCapacity()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getInputAmperage()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getInputVoltage()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static class NullEnergyStorage implements IEnergyContainer
|
||||
{
|
||||
@Override
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* This file is part of Applied Energistics 2.
|
||||
* Copyright (c) 2013 - 2014, 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.reporting;
|
||||
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
|
||||
import appeng.api.parts.IPartModel;
|
||||
import appeng.core.AppEng;
|
||||
import appeng.core.sync.GuiBridge;
|
||||
import appeng.items.parts.PartModels;
|
||||
import appeng.parts.PartModel;
|
||||
import appeng.util.Platform;
|
||||
|
||||
|
||||
public class PartInterfaceConfigurationTerminal extends AbstractPartDisplay
|
||||
{
|
||||
|
||||
@PartModels
|
||||
public static final ResourceLocation MODEL_OFF = new ResourceLocation( AppEng.MOD_ID, "part/interface_configuration_terminal_off" );
|
||||
@PartModels
|
||||
public static final ResourceLocation MODEL_ON = new ResourceLocation( AppEng.MOD_ID, "part/interface_configuration_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 );
|
||||
public String in = "";
|
||||
|
||||
public PartInterfaceConfigurationTerminal( final ItemStack is )
|
||||
{
|
||||
super( is );
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPartActivate( final EntityPlayer player, final EnumHand hand, final Vec3d pos )
|
||||
{
|
||||
if( !super.onPartActivate( player, hand, pos ) )
|
||||
{
|
||||
if( Platform.isServer() )
|
||||
{
|
||||
Platform.openGUI( player, this.getHost().getTile(), this.getSide(), GuiBridge.GUI_INTERFACE_CONFIGURATION_TERMINAL );
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPartModel getStaticModels()
|
||||
{
|
||||
return this.selectModel( MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL );
|
||||
}
|
||||
|
||||
public void saveSearchStrings( String in )
|
||||
{
|
||||
this.in = in;
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,10 @@ import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
|
||||
import appeng.core.AEConfig;
|
||||
import appeng.core.features.AEFeature;
|
||||
import appeng.util.item.OreHelper;
|
||||
import appeng.util.item.OreReference;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
@@ -184,11 +188,17 @@ public class TileCharger extends AENetworkPowerTile implements ICrankable, IGrid
|
||||
if( myItem.isEmpty() )
|
||||
{
|
||||
ItemStack held = player.inventory.getCurrentItem();
|
||||
|
||||
if( AEApi.instance().definitions().materials().certusQuartzCrystal().isSameAs( held ) || Platform.isChargeable( held ) )
|
||||
if( !held.isEmpty() )
|
||||
{
|
||||
held = player.inventory.decrStackSize( player.inventory.currentItem, 1 );
|
||||
this.inv.setStackInSlot( 0, held );
|
||||
if( AEConfig.instance().isFeatureEnabled( AEFeature.CERTUS ) )
|
||||
{
|
||||
final IMaterials materials = AEApi.instance().definitions().materials();
|
||||
if( AEItemStack.fromItemStack( held ).sameOre( AEItemStack.fromItemStack( materials.certusQuartzCrystal().maybeStack( 1 ).orElse( ItemStack.EMPTY ) ) ) || Platform.isChargeable( held ) )
|
||||
{
|
||||
held = player.inventory.decrStackSize( player.inventory.currentItem, 1 );
|
||||
this.inv.setStackInSlot( 0, held );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -254,7 +264,7 @@ public class TileCharger extends AENetworkPowerTile implements ICrankable, IGrid
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( this.getInternalCurrentPower() > POWER_THRESHOLD && materials.certusQuartzCrystal().isSameAs( myItem ) )
|
||||
else if( this.getInternalCurrentPower() > POWER_THRESHOLD && ( materials.certusQuartzCrystal().isSameAs( myItem ) || AEItemStack.fromItemStack( myItem ).sameOre( AEItemStack.fromItemStack( materials.certusQuartzCrystal().maybeStack( 1 ).orElse( ItemStack.EMPTY ) ) ) ) )
|
||||
{
|
||||
if( Platform.getRandomFloat() > 0.8f ) // simulate wait
|
||||
{
|
||||
@@ -298,9 +308,7 @@ public class TileCharger extends AENetworkPowerTile implements ICrankable, IGrid
|
||||
@Override
|
||||
public boolean allowInsert( IItemHandler inv, final int i, final ItemStack itemstack )
|
||||
{
|
||||
final IItemDefinition cert = AEApi.instance().definitions().materials().certusQuartzCrystal();
|
||||
|
||||
return Platform.isChargeable( itemstack ) || cert.isSameAs( itemstack );
|
||||
return AEItemStack.fromItemStack( itemstack ).sameOre( AEItemStack.fromItemStack( AEApi.instance().definitions().materials().certusQuartzCrystal().maybeStack( 1 ).orElse( ItemStack.EMPTY ) ) ) || Platform.isChargeable( itemstack );
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -125,7 +125,7 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
||||
|
||||
final double requiredPower = this.getRequiredPower();
|
||||
final ItemStack output = this.getOutput();
|
||||
while( requiredPower <= this.getStoredPower() && !output.isEmpty() && requiredPower > 0 )
|
||||
while ( requiredPower <= this.getStoredPower() && !output.isEmpty() && requiredPower > 0 )
|
||||
{
|
||||
if( this.canAddOutput( output ) )
|
||||
{
|
||||
@@ -163,7 +163,7 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
||||
{
|
||||
final IMaterials materials = AEApi.instance().definitions().materials();
|
||||
|
||||
switch( (CondenserOutput) this.cm.getSetting( Settings.CONDENSER_OUTPUT ) )
|
||||
switch ( (CondenserOutput) this.cm.getSetting( Settings.CONDENSER_OUTPUT ) )
|
||||
{
|
||||
case MATTER_BALLS:
|
||||
return materials.matterBall().maybeStack( 1 ).orElse( ItemStack.EMPTY );
|
||||
@@ -193,6 +193,24 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
||||
{
|
||||
if( inv == this.outputSlot )
|
||||
{
|
||||
if( !removed.isEmpty() )
|
||||
{
|
||||
final double requiredPower = this.getRequiredPower();
|
||||
final ItemStack output = this.getOutput();
|
||||
while ( requiredPower <= this.getStoredPower() && !output.isEmpty() && requiredPower > 0 )
|
||||
{
|
||||
if( this.canAddOutput( output ) )
|
||||
{
|
||||
this.setStoredPower( this.getStoredPower() - requiredPower );
|
||||
this.addOutput( output );
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
removed.shrink( output.getCount() );
|
||||
}
|
||||
}
|
||||
this.meHandler.outputChanged( added, removed );
|
||||
}
|
||||
}
|
||||
@@ -296,7 +314,7 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
||||
}
|
||||
}
|
||||
|
||||
private static final IFluidTankProperties[] EMPTY = { new FluidTankProperties( null, Fluid.BUCKET_VOLUME, true, false ) };
|
||||
private static final IFluidTankProperties[] EMPTY = {new FluidTankProperties( null, Fluid.BUCKET_VOLUME, true, false )};
|
||||
|
||||
/**
|
||||
* A fluid handler that exposes a 1 bucket tank that can only be filled, and - when filled - will add power
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
package appeng.util;
|
||||
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.security.InvalidParameterException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
@@ -36,8 +38,10 @@ import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import gregtech.api.block.machines.BlockMachine;
|
||||
import gregtech.api.items.IToolItem;
|
||||
import ic2.api.item.IC2Items;
|
||||
import gregtech.api.metatileentity.MetaTileEntity;
|
||||
import gregtech.api.util.GTUtility;
|
||||
import ic2.api.item.ICustomDamageItem;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
@@ -67,6 +71,7 @@ import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraft.util.registry.RegistryNamespaced;
|
||||
import net.minecraft.util.text.translation.I18n;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.WorldServer;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
@@ -77,6 +82,7 @@ import net.minecraftforge.fml.common.FMLCommonHandler;
|
||||
import net.minecraftforge.fml.common.Loader;
|
||||
import net.minecraftforge.fml.common.ModContainer;
|
||||
import net.minecraftforge.fml.common.Optional;
|
||||
import net.minecraftforge.fml.relauncher.ReflectionHelper;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
import net.minecraftforge.oredict.OreDictionary;
|
||||
@@ -158,6 +164,7 @@ public class Platform
|
||||
|
||||
private static final ItemComparisonHelper ITEM_COMPARISON_HELPER = new ItemComparisonHelper();
|
||||
private static final P2PHelper P2P_HELPER = new P2PHelper();
|
||||
private static Method reflectGTgetMTE;
|
||||
|
||||
public static ItemComparisonHelper itemComparisons()
|
||||
{
|
||||
@@ -1681,11 +1688,39 @@ public class Platform
|
||||
return isPurified;
|
||||
}
|
||||
|
||||
//consider methods below moving to a compability class
|
||||
public static boolean isGTDamageableItem( Item item )
|
||||
{
|
||||
return ( isModLoaded( "gregtech" ) && item instanceof IToolItem );
|
||||
}
|
||||
|
||||
public static MetaTileEntity getMetaTileEntity( IBlockAccess world, BlockPos pos )
|
||||
{
|
||||
if( reflectGTgetMTE == null )
|
||||
{
|
||||
try
|
||||
{
|
||||
reflectGTgetMTE = ReflectionHelper.findMethod( BlockMachine.class, "getMetaTileEntity", null, IBlockAccess.class, BlockPos.class );
|
||||
}
|
||||
catch( ReflectionHelper.UnableToFindMethodException e )
|
||||
{
|
||||
reflectGTgetMTE = ReflectionHelper.findMethod( GTUtility.class, "getMetaTileEntity", null, IBlockAccess.class, BlockPos.class );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
return (MetaTileEntity) reflectGTgetMTE.invoke( reflectGTgetMTE, world, pos );
|
||||
}
|
||||
catch( IllegalAccessException | InvocationTargetException e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean isIC2DamageableItem( Item item )
|
||||
{
|
||||
return ( isModLoaded( "IC2" ) && item instanceof ICustomDamageItem );
|
||||
|
||||
@@ -19,14 +19,13 @@
|
||||
package appeng.util.inv;
|
||||
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
import appeng.api.config.FuzzyMode;
|
||||
import appeng.util.InventoryAdaptor;
|
||||
import appeng.util.Platform;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
|
||||
public class AdaptorItemHandler extends InventoryAdaptor
|
||||
@@ -60,13 +59,13 @@ public class AdaptorItemHandler extends InventoryAdaptor
|
||||
|
||||
if( destination != null )
|
||||
{
|
||||
ItemStack extracted = this.itemHandler.extractItem( slot, amount, true );
|
||||
if( extracted.isEmpty() )
|
||||
if( !destination.canInsert( is ) )
|
||||
{
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
|
||||
if( !destination.canInsert( extracted ) )
|
||||
ItemStack extracted = this.itemHandler.extractItem( slot, amount, true );
|
||||
if( extracted.isEmpty() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -109,21 +108,20 @@ public class AdaptorItemHandler extends InventoryAdaptor
|
||||
final ItemStack is = this.itemHandler.getStackInSlot( slot );
|
||||
if( !is.isEmpty() && ( filter.isEmpty() || Platform.itemComparisons().isSameItem( is, filter ) ) )
|
||||
{
|
||||
ItemStack extracted = this.itemHandler.extractItem( slot, amount, true );
|
||||
if( destination != null )
|
||||
{
|
||||
if( !destination.canInsert( is ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ItemStack extracted = this.itemHandler.extractItem( slot, amount, true );
|
||||
if( extracted.isEmpty() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if( destination != null )
|
||||
{
|
||||
if( !destination.canInsert( extracted ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if( rv.isEmpty() )
|
||||
{
|
||||
// Use the first stack as a template for the result
|
||||
@@ -163,13 +161,13 @@ public class AdaptorItemHandler extends InventoryAdaptor
|
||||
|
||||
if( destination != null )
|
||||
{
|
||||
ItemStack simulated = this.itemHandler.extractItem( slot, amount, true );
|
||||
if( simulated.isEmpty() )
|
||||
if( !destination.canInsert( is ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if( !destination.canInsert( simulated ) )
|
||||
ItemStack simulated = this.itemHandler.extractItem( slot, amount, true );
|
||||
if( simulated.isEmpty() )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -177,6 +175,10 @@ public class AdaptorItemHandler extends InventoryAdaptor
|
||||
|
||||
// Attempt extracting it
|
||||
extracted = this.itemHandler.extractItem( slot, amount, false );
|
||||
if( !extracted.isEmpty() )
|
||||
{
|
||||
return extracted;
|
||||
}
|
||||
}
|
||||
|
||||
return extracted;
|
||||
@@ -196,15 +198,16 @@ public class AdaptorItemHandler extends InventoryAdaptor
|
||||
continue;
|
||||
}
|
||||
|
||||
if( destination != null && !destination.canInsert( is ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Attempt extracting it
|
||||
extracted = this.itemHandler.extractItem( slot, amount, true );
|
||||
|
||||
if( !extracted.isEmpty() && destination != null )
|
||||
if( !extracted.isEmpty() )
|
||||
{
|
||||
if( !destination.canInsert( extracted ) )
|
||||
{
|
||||
extracted = ItemStack.EMPTY; // Keep on looking...
|
||||
}
|
||||
return extracted;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ public class BlockingItemHandler extends BlockingInventoryAdaptor
|
||||
Object2ObjectOpenHashMap<Item, IntSet> map = NonBlockingItems.INSTANCE.getMap().get( domain );
|
||||
if( map.get( stack.getItem() ) != null )
|
||||
{
|
||||
return !map.get( stack.getItem() ).contains( stack.getItemDamage() );
|
||||
return !map.get( stack.getItem() ).contains( stack.getMetadata() );
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -283,15 +283,16 @@ public class AEItemStack extends AEStack<IAEItemStack> implements IAEItemStack
|
||||
{
|
||||
if( this.cachedItemStack != null )
|
||||
{
|
||||
if( Platform.itemComparisons().isSameItem( this.getDefinition(), this.cachedItemStack ) )
|
||||
{
|
||||
ItemStack currentCached = this.cachedItemStack;
|
||||
this.cachedItemStack = null;
|
||||
currentCached.setCount( Ints.saturatedCast( stackSize ) );
|
||||
return currentCached;
|
||||
}
|
||||
ItemStack currentCached = this.cachedItemStack;
|
||||
this.cachedItemStack = null;
|
||||
currentCached.setCount( Ints.saturatedCast( stackSize ) );
|
||||
return currentCached;
|
||||
}
|
||||
return ItemHandlerHelper.copyStackWithSize( this.getDefinition(), Ints.saturatedCast( stackSize ) );
|
||||
|
||||
ItemStack itemStack = this.createItemStack();
|
||||
itemStack.setCount( Ints.saturatedCast( stackSize ) );
|
||||
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -168,6 +168,7 @@ gui.appliedenergistics2.StoredFluids=Stored Fluids
|
||||
gui.appliedenergistics2.Terminal=Terminal
|
||||
gui.appliedenergistics2.InterfaceTerminal=Interface Terminal
|
||||
gui.appliedenergistics2.InterfaceTerminalHint=Show Or Hide on Interface Terminal.
|
||||
gui.appliedenergistics2.InterfaceConfigurationTerminal=Interface Configuration Terminal
|
||||
gui.appliedenergistics2.FormationPlane=Formation Plane
|
||||
gui.appliedenergistics2.FluidFormationPlane=Fluid Formation Plane
|
||||
gui.appliedenergistics2.VibrationChamber=Vibration Chamber
|
||||
@@ -548,6 +549,7 @@ item.appliedenergistics2.multi_part.inverted_toggle_bus.name=ME Inverted Toggle
|
||||
item.appliedenergistics2.multi_part.toggle_bus.name=ME Toggle Bus
|
||||
item.appliedenergistics2.multi_part.crafting_monitor.name=ME Crafting Monitor
|
||||
item.appliedenergistics2.multi_part.interface_terminal.name=ME Interface Terminal
|
||||
item.appliedenergistics2.multi_part.interface_configuration_terminal.name=ME Configuration Interface Terminal
|
||||
item.appliedenergistics2.multi_part.fluid_terminal.name=ME Fluid Terminal
|
||||
item.appliedenergistics2.multi_part.invalid_type.name=Disabled Item
|
||||
|
||||
|
||||
@@ -0,0 +1,662 @@
|
||||
# Japanese translate by tier940 & Quarri6343
|
||||
# 日本語ローカライズ担当: tier940 & Quarri6343
|
||||
# Corresponding Version: v0.52.3
|
||||
# 対応バージョン: v0.52.3
|
||||
|
||||
// Blocks
|
||||
tile.appliedenergistics2.cable_bus.name=AE2ケーブル または バス
|
||||
tile.appliedenergistics2.cell_workbench.name=セルワークベンチ
|
||||
tile.appliedenergistics2.charger.name=チャージ機
|
||||
tile.appliedenergistics2.chest.name=MEチェスト
|
||||
tile.appliedenergistics2.condenser.name=マターコンデンサー
|
||||
tile.appliedenergistics2.controller.name=MEコントローラ
|
||||
tile.appliedenergistics2.crank.name=木のクランク
|
||||
tile.appliedenergistics2.creative_energy_cell.name=クリエイティブ用エネルギーセル
|
||||
tile.appliedenergistics2.dense_energy_cell.name=高密度エネルギーセル
|
||||
tile.appliedenergistics2.energy_cell.name=エネルギーセル
|
||||
tile.appliedenergistics2.drive.name=MEドライブ
|
||||
tile.appliedenergistics2.energy_acceptor.name=エネルギー受容体
|
||||
tile.appliedenergistics2.grindstone.name=手動粉砕機
|
||||
tile.appliedenergistics2.matrix_frame.name=マトリクスフレーム
|
||||
tile.appliedenergistics2.io_port.name=ME入出力ポート
|
||||
tile.appliedenergistics2.inscriber.name=刻印機
|
||||
tile.appliedenergistics2.interface.name=MEインターフェース
|
||||
tile.appliedenergistics2.fluid_interface.name=ME液体インターフェース
|
||||
tile.appliedenergistics2.quantum_link.name=ME量子リンクチャンバー
|
||||
tile.appliedenergistics2.quantum_ring.name=ME量子フィールドリンク
|
||||
tile.appliedenergistics2.fluix_block.name=フルーシュブロック
|
||||
tile.appliedenergistics2.quartz_block.name=ケルタスクォーツブロック
|
||||
tile.appliedenergistics2.chiseled_quartz_block.name=模様入りケルタスクォーツブロック
|
||||
tile.appliedenergistics2.quartz_glass.name=クォーツガラス
|
||||
tile.appliedenergistics2.quartz_vibrant_glass.name=発光クォーツガラス
|
||||
tile.appliedenergistics2.quartz_pillar.name=柱状ケルタスクォーツブロック
|
||||
tile.appliedenergistics2.quartz_fixture.name=クォーツライト
|
||||
tile.appliedenergistics2.light_detector.name=レッドシグナルクォーツライト
|
||||
tile.appliedenergistics2.spatial_io_port.name=空間IOポート
|
||||
tile.appliedenergistics2.spatial_pylon.name=空間送信鉄塔
|
||||
tile.appliedenergistics2.tiny_tnt.name=極小TNT
|
||||
tile.appliedenergistics2.vibration_chamber.name=振動チャンバー
|
||||
tile.appliedenergistics2.wireless_access_point.name=ME無線アクセスポイント
|
||||
tile.appliedenergistics2.quartz_ore.name=ケルタスクォーツ鉱石
|
||||
tile.appliedenergistics2.charged_quartz_ore.name=チャージドケルタスクォーツ鉱石
|
||||
tile.appliedenergistics2.security_station.name=MEセキュリティターミナル
|
||||
tile.appliedenergistics2.quartz_growth_accelerator.name=クリスタル成長加速機
|
||||
tile.appliedenergistics2.sky_stone_block.name=スカイストーン
|
||||
tile.appliedenergistics2.smooth_sky_stone_block.name=スカイストーンブロック
|
||||
tile.appliedenergistics2.sky_stone_brick.name=スカイストーンレンガ
|
||||
tile.appliedenergistics2.sky_stone_small_brick.name=スカイストーン小レンガ
|
||||
tile.appliedenergistics2.sky_stone_chest.name=スカイストーンチェスト
|
||||
tile.appliedenergistics2.smooth_sky_stone_chest.name=スカイストーンブロックチェスト
|
||||
tile.appliedenergistics2.sky_compass.name=隕石探知コンパス
|
||||
tile.appliedenergistics2.crafting_monitor.name=クラフティングモニター
|
||||
tile.appliedenergistics2.crafting_storage_1k.name=1k クラフティングストレージ
|
||||
tile.appliedenergistics2.crafting_storage_4k.name=4k クラフティングストレージ
|
||||
tile.appliedenergistics2.crafting_storage_16k.name=16k クラフティングストレージ
|
||||
tile.appliedenergistics2.crafting_storage_64k.name=64k クラフティングストレージ
|
||||
tile.appliedenergistics2.crafting_accelerator.name=クラフティング並列処理ユニット
|
||||
tile.appliedenergistics2.crafting_unit.name=クラフティングユニット
|
||||
tile.appliedenergistics2.molecular_assembler.name=分子組立室
|
||||
|
||||
// Stairs
|
||||
tile.appliedenergistics2.fluix_stairs.name=フルーシュの階段
|
||||
tile.appliedenergistics2.quartz_stairs.name=ケルタスクォーツの階段
|
||||
tile.appliedenergistics2.chiseled_quartz_stairs.name=柱状ケルタスクォーツの階段
|
||||
tile.appliedenergistics2.quartz_pillar_stairs.name=模様入りケルタスクォーツの階段
|
||||
tile.appliedenergistics2.smooth_sky_stone_stairs.name=スカイストーンブロックの階段
|
||||
tile.appliedenergistics2.sky_stone_brick_stairs.name=スカイストーンレンガの階段
|
||||
tile.appliedenergistics2.sky_stone_small_brick_stairs.name=小さなスカイストーンレンガの階段
|
||||
tile.appliedenergistics2.sky_stone_stairs.name=スカイストーンの階段
|
||||
|
||||
// Slabs
|
||||
tile.appliedenergistics2.chiseled_quartz_slab.name=柱状ケルタスクォーツのハーフブロック
|
||||
tile.appliedenergistics2.fluix_slab.name=フルーシュのハーフブロック
|
||||
tile.appliedenergistics2.quartz_slab.name=ケルタスクォーツのハーフブロック
|
||||
tile.appliedenergistics2.smooth_sky_stone_slab.name=スカイストーンブロックのハーフブロック
|
||||
tile.appliedenergistics2.quartz_pillar_slab.name=様入りケルタスクォーツのハーフブロック
|
||||
tile.appliedenergistics2.sky_stone_brick_slab.name=スカイストーンレンガのハーフブロック
|
||||
tile.appliedenergistics2.sky_stone_small_brick_slab.name=小さなスカイストーンレンガのハーフブロック
|
||||
tile.appliedenergistics2.sky_stone_slab.name=スカイストーンのハーフブロック
|
||||
|
||||
// Chat Messages
|
||||
chat.appliedenergistics2.ChestCannotReadStorageCell=MEチェストがストレージセルを読み取れませんでした。
|
||||
chat.appliedenergistics2.SettingCleared=メモリカードを初期化。
|
||||
chat.appliedenergistics2.OutOfRange=無線範囲外です。
|
||||
chat.appliedenergistics2.InvalidMachine=無効な操作です。
|
||||
chat.appliedenergistics2.LoadedSettings=正常に設定を読み込みました。
|
||||
chat.appliedenergistics2.DeviceNotPowered=端末の充電が切れました。
|
||||
chat.appliedenergistics2.DeviceNotWirelessTerminal=端末は無線端末ではありません。
|
||||
chat.appliedenergistics2.DeviceNotLinked=端末はリンクされていません。
|
||||
chat.appliedenergistics2.StationCanNotBeLocated=セキュリティーステーションの位置を見つけられません。
|
||||
chat.appliedenergistics2.MachineNotPowered=機械にエネルギーがありません。
|
||||
chat.appliedenergistics2.CommunicationError=ネットワークとの通信エラーが発生しました。
|
||||
chat.appliedenergistics2.SavedSettings=正常に設定を保存しました。
|
||||
chat.appliedenergistics2.ResetSettings=新しい端末を設定してメモリカードにコピーしました。
|
||||
chat.appliedenergistics2.AmmoDepleted=マターボールを使い切りました。
|
||||
chat.appliedenergistics2.isNowLocked=モニターはロックされています。
|
||||
chat.appliedenergistics2.isNowUnlocked=モニターはロックされていません。
|
||||
|
||||
// Creative Tabs
|
||||
itemGroup.appliedenergistics2=Applied Energistics 2
|
||||
itemGroup.appliedenergistics2.facades=Applied Energistics 2 - 偽装板
|
||||
|
||||
// GUI
|
||||
gui.appliedenergistics2.CraftingTerminal=クラフティングターミナル
|
||||
gui.appliedenergistics2.METunnel=ME
|
||||
gui.appliedenergistics2.ItemTunnel=アイテム
|
||||
gui.appliedenergistics2.FluidTunnel=液体
|
||||
gui.appliedenergistics2.RedstoneTunnel=レッドストーン
|
||||
gui.appliedenergistics2.EUTunnel=EU
|
||||
gui.appliedenergistics2.FETunnel=FE
|
||||
gui.appliedenergistics2.GTEUTunnel=GTEU
|
||||
gui.appliedenergistics2.LightTunnel=光源
|
||||
gui.appliedenergistics2.OCTunnel=OC
|
||||
gui.appliedenergistics2.PressureTunnel=圧力
|
||||
|
||||
gui.appliedenergistics2.security.extract.name=搬出
|
||||
gui.appliedenergistics2.security.inject.name=搬入
|
||||
gui.appliedenergistics2.security.craft.name=クラフト
|
||||
gui.appliedenergistics2.security.build.name=設置
|
||||
gui.appliedenergistics2.security.security.name=セキュリティ
|
||||
|
||||
gui.appliedenergistics2.security.extract.tip=ユーザーはストレージからアイテムを引き出すことができます。
|
||||
gui.appliedenergistics2.security.inject.tip=ユーザーはストレージに新しいアイテムを入れることができます。
|
||||
gui.appliedenergistics2.security.craft.tip=ユーザーは新しいクラフトを開始することができます。
|
||||
gui.appliedenergistics2.security.build.tip=ユーザはネットワークの変更や設置などを行うことができます。
|
||||
gui.appliedenergistics2.security.security.tip=ユーザーはセキュリティターミナルの設定変更を行うことができます。
|
||||
|
||||
gui.appliedenergistics2.Efficiency=効率
|
||||
gui.appliedenergistics2.SCSSize=SCSサイズ
|
||||
gui.appliedenergistics2.SCSInvalid=無効
|
||||
gui.appliedenergistics2.RequiredPower=必要電力
|
||||
gui.appliedenergistics2.StoredPower=貯蔵電力
|
||||
gui.appliedenergistics2.MaxPower=最大電力
|
||||
gui.appliedenergistics2.QuartzCuttingKnife=クォーツナイフ
|
||||
gui.appliedenergistics2.Inscriber=刻印機
|
||||
gui.appliedenergistics2.Wireless=無線アクセスポイント
|
||||
gui.appliedenergistics2.WirelessTerminal=無線ターミナル
|
||||
gui.appliedenergistics2.NoPermissions=アクセス権が選択されていません。
|
||||
gui.appliedenergistics2.SecurityCardEditor=生体認証カードエディタ
|
||||
gui.appliedenergistics2.Encoded=エンコード済
|
||||
gui.appliedenergistics2.Priority=優先度
|
||||
gui.appliedenergistics2.StorageBus=ストレージバス
|
||||
gui.appliedenergistics2.OreDictStorageBus=鉱石辞書ストレージバス
|
||||
gui.appliedenergistics2.StorageBusFluids=液体ストレージバス
|
||||
gui.appliedenergistics2.EnergyDrain=受動排出
|
||||
gui.appliedenergistics2.Installed=インストール済
|
||||
gui.appliedenergistics2.NetworkTool=ネットワークツール
|
||||
gui.appliedenergistics2.PowerUsageRate=エネルギー使用量
|
||||
gui.appliedenergistics2.PowerInputRate=エネルギー入力量
|
||||
gui.appliedenergistics2.PortableCell=ポータブルセル
|
||||
gui.appliedenergistics2.Security=セキュリティターミナル
|
||||
gui.appliedenergistics2.CellWorkbench=セル作業台
|
||||
gui.appliedenergistics2.QuantumLinkChamber=量子リンクチャンバー
|
||||
gui.appliedenergistics2.IOPort=ME IOポート
|
||||
gui.appliedenergistics2.Chest=MEチェスト
|
||||
gui.appliedenergistics2.Condenser=マターコンデンサ
|
||||
gui.appliedenergistics2.Config=設定
|
||||
gui.appliedenergistics2.Drive=MEドライブ
|
||||
gui.appliedenergistics2.ExportBus=ME出力バス
|
||||
gui.appliedenergistics2.ExportBusFluids=ME液体出力バス
|
||||
gui.appliedenergistics2.GrindStone=手動粉砕機
|
||||
gui.appliedenergistics2.ImportBus=ME入力バス
|
||||
gui.appliedenergistics2.ImportBusFluids=ME液体入力バス
|
||||
gui.appliedenergistics2.Interface=MEインターフェース
|
||||
gui.appliedenergistics2.FluidInterface=ME液体インターフェース
|
||||
gui.appliedenergistics2.LevelEmitter=MEレベルエミッター
|
||||
gui.appliedenergistics2.FluidLevelEmitter=ME液体レベルエミッター
|
||||
gui.appliedenergistics2.Of=/
|
||||
gui.appliedenergistics2.Patterns=パターン
|
||||
gui.appliedenergistics2.SpatialIOPort=空間IOポート
|
||||
gui.appliedenergistics2.StoredEnergy=貯蔵エネルギー
|
||||
gui.appliedenergistics2.StoredItems=貯蔵アイテム
|
||||
gui.appliedenergistics2.StoredFluids=貯蔵液体
|
||||
gui.appliedenergistics2.Terminal=ターミナル
|
||||
gui.appliedenergistics2.InterfaceTerminal=インターフェースターミナル
|
||||
gui.appliedenergistics2.InterfaceTerminalHint=インターフェースターミナルから表示または非表示
|
||||
gui.appliedenergistics2.FormationPlane=形成プレーン
|
||||
gui.appliedenergistics2.FluidFormationPlane=液体形成プレーン
|
||||
gui.appliedenergistics2.VibrationChamber=振動チャンバー
|
||||
gui.appliedenergistics2.NetworkDetails=ネットワークの詳細
|
||||
gui.appliedenergistics2.StorageCells=MEストレージセル
|
||||
gui.appliedenergistics2.IOBuses=ME入力/出力バス
|
||||
gui.appliedenergistics2.IOBusesFluids=ME液体入力/出力バス
|
||||
gui.appliedenergistics2.Stores=Stores
|
||||
gui.appliedenergistics2.Stores=削除
|
||||
gui.appliedenergistics2.BytesUsed=バイト使用済み
|
||||
gui.appliedenergistics2.Types=タイプ
|
||||
gui.appliedenergistics2.Blank=空
|
||||
gui.appliedenergistics2.Unlinked=リンクされていない
|
||||
gui.appliedenergistics2.Linked=リンクされた
|
||||
gui.appliedenergistics2.StoredSize=格納サイズ
|
||||
gui.appliedenergistics2.SkyChest=スカイストーンチェスト
|
||||
gui.appliedenergistics2.PatternTerminal=パターンターミナル
|
||||
gui.appliedenergistics2.CraftingPattern=クラフティングパターン
|
||||
gui.appliedenergistics2.MolecularAssembler=分子組立室
|
||||
gui.appliedenergistics2.ProcessingPattern=プロセッシングパターン
|
||||
gui.appliedenergistics2.Crafts=クラフト
|
||||
gui.appliedenergistics2.And=と
|
||||
gui.appliedenergistics2.Creates=作成
|
||||
gui.appliedenergistics2.With=で
|
||||
gui.appliedenergistics2.Substitute=鉱石辞書で置換:
|
||||
gui.appliedenergistics2.Yes=Yes
|
||||
gui.appliedenergistics2.No=No
|
||||
gui.appliedenergistics2.InWorldCrafting=AE2 直接クラフト
|
||||
gui.appliedenergistics2.inWorldFluix=水たまりにチャージドケルタスクォーツ + ネザークォーツ + レッドストーンを落とし、しばらく待ってください。
|
||||
gui.appliedenergistics2.inWorldPurificationCertus=水源にケルタスクォーツの粉と砂からクラフトしたケルタスクォーツの種を入れてください。処理を速くするにはクリスタル成長加速機に隣接して水源を設置し、そこにクラフトした種を入れてください。
|
||||
gui.appliedenergistics2.inWorldPurificationNether=水源にネザークォーツの粉と砂からクラフトしたネザークォーツの種を入れてください。処理を速くするにはクリスタル成長加速機に隣接して水源を設置し、そこにクラフトした種を入れてください。
|
||||
gui.appliedenergistics2.inWorldPurificationFluix=水源にフルーシュの粉と砂からクラフトしたフルーシュの種を入れてください。処理を速くするにはクリスタル成長加速機に隣接して水源を設置し、そこにクラフトした種を入れてください。
|
||||
gui.appliedenergistics2.inWorldSingularity=作る為には一個のシンギュラリティとエンダーパールの粉を投げ、爆発に巻き込んでください。
|
||||
gui.appliedenergistics2.ChargedQuartz=チャージドケルタスクォーツは普通のケルタスクォーツをチャージ機にセットし、電力を供給することで作製されます。
|
||||
gui.appliedenergistics2.ChargedQuartzFind=チャージドケルタスクォーツは輝くことを除いて通常のケルタスクォーツに非常に似ています。見分け方は青い靄です。
|
||||
gui.appliedenergistics2.NoSecondOutput=副産物なし
|
||||
gui.appliedenergistics2.OfSecondOutput=%1$d%%の確率で副産物。
|
||||
gui.appliedenergistics2.MultipleOutputs=%1$d%%の確率で副産物、%2$d%%の確率で第二副産物。
|
||||
gui.appliedenergistics2.SelectAmount=数を選択
|
||||
gui.appliedenergistics2.CopyMode=コピーモード
|
||||
gui.appliedenergistics2.CopyModeDesc=ストレージセルを取り外したとき設定パネルの内容を消去するかどうか。
|
||||
gui.appliedenergistics2.Next=次
|
||||
gui.appliedenergistics2.Lumen=ルーメン
|
||||
gui.appliedenergistics2.Empty=空
|
||||
gui.appliedenergistics2.Stored=在庫
|
||||
gui.appliedenergistics2.Cancel=中止
|
||||
gui.appliedenergistics2.ETAFormat=HH:mm:ss
|
||||
gui.appliedenergistics2.Crafting=クラフティング
|
||||
gui.appliedenergistics2.Scheduled=予定
|
||||
gui.appliedenergistics2.CraftingStatus=クラフティング状況
|
||||
gui.appliedenergistics2.FromStorage=利用可
|
||||
gui.appliedenergistics2.ToCraft=クラフト予定
|
||||
gui.appliedenergistics2.CraftingPlan=クラフティング計画
|
||||
gui.appliedenergistics2.Automatic=自動
|
||||
gui.appliedenergistics2.Start=スタート
|
||||
gui.appliedenergistics2.Missing=不足
|
||||
gui.appliedenergistics2.Bytes=ストレージ
|
||||
gui.appliedenergistics2.Simulation=シミュレーション
|
||||
gui.appliedenergistics2.CoProcessors=Coプロセッサ
|
||||
gui.appliedenergistics2.CraftingCPU=クラフティングCPU
|
||||
gui.appliedenergistics2.NoCraftingCPUs=利用可能なCPUがありません。
|
||||
gui.appliedenergistics2.CalculatingWait=計算中です。お待ちください...。
|
||||
gui.appliedenergistics2.Clean=クリーン
|
||||
gui.appliedenergistics2.InvalidPattern=無効なパターン
|
||||
gui.appliedenergistics2.Range=範囲
|
||||
gui.appliedenergistics2.TransparentFacades=透明な偽装版
|
||||
gui.appliedenergistics2.TransparentFacadesHint=ネットワークツールがツールバーにあるとき偽装版の表示/非表示を切り替えられる。
|
||||
gui.appliedenergistics2.CPUs=CPU
|
||||
gui.appliedenergistics2.NoCraftingJobs=クラフティングが実行されていない。
|
||||
gui.appliedenergistics2.FacadeCrafting=偽装版クラフト
|
||||
gui.appliedenergistics2.inWorldCraftingPresses=金型は世界中に散らばっている隕石の中心にあります。隕石は隕石探知コンパスで探せます。
|
||||
gui.appliedenergistics2.Included=含める
|
||||
gui.appliedenergistics2.Excluded=含めない
|
||||
gui.appliedenergistics2.Partitioned=分割
|
||||
gui.appliedenergistics2.Precise=精密マッチ
|
||||
gui.appliedenergistics2.Fuzzy=抽象マッチ
|
||||
gui.appliedenergistics2.SmallFontCraft=クラフト
|
||||
gui.appliedenergistics2.LargeFontCraft=+
|
||||
gui.appliedenergistics2.Nothing=なし
|
||||
|
||||
// GUI Tooltips
|
||||
gui.tooltips.appliedenergistics2.Stash=アイテムを保存
|
||||
gui.tooltips.appliedenergistics2.StashDesc=グリッド上のアイテムをネットワークに戻す。
|
||||
gui.tooltips.appliedenergistics2.Substitutions=鉱石辞書の置換
|
||||
gui.tooltips.appliedenergistics2.SubstitutionsDescEnabled=材料を鉱石辞書で置換させる。
|
||||
gui.tooltips.appliedenergistics2.SubstitutionsDescDisabled=材料を鉱石辞書で置換させない。
|
||||
gui.tooltips.appliedenergistics2.SubstitutionsOn=置換は有効です
|
||||
gui.tooltips.appliedenergistics2.SubstitutionsOff=置換は無効です
|
||||
gui.tooltips.appliedenergistics2.Encode=パターンエンコーダ
|
||||
gui.tooltips.appliedenergistics2.EncodeDescription=現在エンコードされているパターン、または使用できるブランクパターンに入力されたパターンを書き込みます。
|
||||
gui.tooltips.appliedenergistics2.FuzzyMode=ファジー比較
|
||||
gui.tooltips.appliedenergistics2.FZPercent_25=25%%の分離損失
|
||||
gui.tooltips.appliedenergistics2.FZPercent_50=50%%の分離損失
|
||||
gui.tooltips.appliedenergistics2.FZPercent_75=75%%の分離損失
|
||||
gui.tooltips.appliedenergistics2.FZPercent_99=99%%の分離損失
|
||||
gui.tooltips.appliedenergistics2.SortOrder=昇順/降順
|
||||
gui.tooltips.appliedenergistics2.SortBy=並び替え方法
|
||||
gui.tooltips.appliedenergistics2.FZIgnoreAll=すべてマッチする
|
||||
gui.tooltips.appliedenergistics2.TransferDirection=転送方向
|
||||
gui.tooltips.appliedenergistics2.TransferToNetwork=ネットワークへ
|
||||
gui.tooltips.appliedenergistics2.TransferToStorageCell=ストレージセルへ
|
||||
gui.tooltips.appliedenergistics2.ToggleSortDirection=昇順/降順の切り替え
|
||||
gui.tooltips.appliedenergistics2.StoredItems=格納アイテム
|
||||
gui.tooltips.appliedenergistics2.StoredCraftable=格納アイテム/クラフト可能アイテム
|
||||
gui.tooltips.appliedenergistics2.View=表示アイテム
|
||||
gui.tooltips.appliedenergistics2.RedstoneMode=レッドストーン制御
|
||||
gui.tooltips.appliedenergistics2.OperationMode=動作モード
|
||||
gui.tooltips.appliedenergistics2.NumberOfItems=アイテム数
|
||||
gui.tooltips.appliedenergistics2.ItemName=アイテム名
|
||||
gui.tooltips.appliedenergistics2.PowerUnits=パワーユニット
|
||||
gui.tooltips.appliedenergistics2.IOMode=入出力モード
|
||||
gui.tooltips.appliedenergistics2.CondenserOutput=MEコンデンサ - 出力
|
||||
gui.tooltips.appliedenergistics2.PartitionStorage=パーティションストレージ
|
||||
gui.tooltips.appliedenergistics2.Clear=リセット
|
||||
gui.tooltips.appliedenergistics2.TrashController=Shift/Spaceで有効
|
||||
gui.tooltips.appliedenergistics2.InterfaceBlockingMode=ブロッキングモード
|
||||
gui.tooltips.appliedenergistics2.InterfaceCraftingMode=クラフティングモード
|
||||
gui.tooltips.appliedenergistics2.Trash=アイテムを破棄する
|
||||
gui.tooltips.appliedenergistics2.MatterBalls=\n%s個のアイテムごとにマターボールに変換する
|
||||
gui.tooltips.appliedenergistics2.Singularity=\n%s個のアイテムごとにシンギュラリティに変換する
|
||||
gui.tooltips.appliedenergistics2.Read=出力のみ
|
||||
gui.tooltips.appliedenergistics2.Write=入力のみ
|
||||
gui.tooltips.appliedenergistics2.ReadWrite=入出力可能
|
||||
gui.tooltips.appliedenergistics2.AlwaysActive=常時処理
|
||||
gui.tooltips.appliedenergistics2.ActiveWithoutSignal=RS信号なし
|
||||
gui.tooltips.appliedenergistics2.ActiveWithSignal=RS信号あり
|
||||
gui.tooltips.appliedenergistics2.ActiveOnPulse=RSパルス
|
||||
gui.tooltips.appliedenergistics2.EmitLevelsBelow=設定値以下で出力
|
||||
gui.tooltips.appliedenergistics2.EmitLevelAbove=設定値以上で出力
|
||||
gui.tooltips.appliedenergistics2.SearchMode_Auto=自動検索
|
||||
gui.tooltips.appliedenergistics2.SearchMode_Standard=通常検索
|
||||
gui.tooltips.appliedenergistics2.SearchMode_JEIAuto=JEI連携自動検索
|
||||
gui.tooltips.appliedenergistics2.SearchMode_JEIStandard=JEI連携通常検索
|
||||
gui.tooltips.appliedenergistics2.SearchMode_AutoKeep=自動検索を保持
|
||||
gui.tooltips.appliedenergistics2.SearchMode_StandardKeep=通常検索を保持
|
||||
gui.tooltips.appliedenergistics2.SearchMode_JEIAutoKeep=JEI連携自動検索を保持
|
||||
gui.tooltips.appliedenergistics2.SearchMode_JEIStandardKeep=JEI連携通常検索を保持
|
||||
gui.tooltips.appliedenergistics2.SearchMode=ボックス検索モード
|
||||
gui.tooltips.appliedenergistics2.PartitionStorageHint=現在の構成パーテーション
|
||||
gui.tooltips.appliedenergistics2.ClearSettings=コンフィグ/設定をクリア
|
||||
gui.tooltips.appliedenergistics2.Craftable=クラフト可能
|
||||
gui.tooltips.appliedenergistics2.MoveWhenEmpty=空になった時に移動
|
||||
gui.tooltips.appliedenergistics2.MoveWhenWorkIsDone=作業終了時に移動
|
||||
gui.tooltips.appliedenergistics2.MoveWhenFull=満杯になった時に移動
|
||||
gui.tooltips.appliedenergistics2.Disabled=無効
|
||||
gui.tooltips.appliedenergistics2.Enable=有効
|
||||
gui.tooltips.appliedenergistics2.Blocking=もし対象のインベントリにアイテムがあるなら入力しない
|
||||
gui.tooltips.appliedenergistics2.NonBlocking=対象のインベントリのアイテムを無視する
|
||||
gui.tooltips.appliedenergistics2.Craft=クラフティングカードの挙動
|
||||
gui.tooltips.appliedenergistics2.CraftOnly=在庫は使用せず、クラフトしたアイテムのみを出力する
|
||||
gui.tooltips.appliedenergistics2.CraftEither=在庫もしくはクラフトしたアイテムのどちらかを出力する
|
||||
gui.tooltips.appliedenergistics2.LevelType=レベルタイプ
|
||||
gui.tooltips.appliedenergistics2.LevelType_Energy=エネルギー
|
||||
gui.tooltips.appliedenergistics2.LevelType_Item=アイテム
|
||||
gui.tooltips.appliedenergistics2.InventoryTweaks=Inventory Tweaks
|
||||
gui.tooltips.appliedenergistics2.Mod=Mod
|
||||
gui.tooltips.appliedenergistics2.TerminalStyle=表示形式
|
||||
gui.tooltips.appliedenergistics2.TerminalStyle_Full=フルスクリーン
|
||||
gui.tooltips.appliedenergistics2.TerminalStyle_Tall=最小化
|
||||
gui.tooltips.appliedenergistics2.TerminalStyle_Small=最大化
|
||||
gui.tooltips.appliedenergistics2.DoesntDespawn=このアイテムは自然消滅しません
|
||||
gui.tooltips.appliedenergistics2.EmitterMode=クラフティングエミッターモード
|
||||
gui.tooltips.appliedenergistics2.CraftViaRedstone=クラフトするために赤石信号を発する
|
||||
gui.tooltips.appliedenergistics2.EmitWhenCrafting=クラフト中赤石信号を発する
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=アクセスできないアイテムを報告する
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=Yes: 搬出できないアイテムがネットワークで可視化されます
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=No: 搬出できるアイテムのみがネットワークで可視化されます
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleFluids=アクセスできない液体を報告する
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsYes=Yes: 搬出できない液体がネットワークで可視化されます
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsNo=No: 搬出できる液体のみがネットワークで可視化されます
|
||||
gui.tooltips.appliedenergistics2.BlockPlacement=ブロック設置について
|
||||
gui.tooltips.appliedenergistics2.BlockPlacementYes=ブロックは設置される
|
||||
gui.tooltips.appliedenergistics2.BlockPlacementNo=ブロックはアイテムとしてドロップされる
|
||||
gui.tooltips.appliedenergistics2.SchedulingMode=スケジューリングモード
|
||||
gui.tooltips.appliedenergistics2.SchedulingModeDefault=ネットワークが空になるまで最初のアイテムを搬出してから次のアイテムに移る
|
||||
gui.tooltips.appliedenergistics2.SchedulingModeRoundRobin=順番にアイテムを搬出する/ラウンドロビンモードで搬出する
|
||||
gui.tooltips.appliedenergistics2.SchedulingModeRandom=ランダムにアイテムを搬出する
|
||||
gui.tooltips.appliedenergistics2.FilterMode=検索フィルターの変更
|
||||
gui.tooltips.appliedenergistics2.FilterModeKeep=以前の検索フィルターに戻す
|
||||
gui.tooltips.appliedenergistics2.FilterModeClear=GUIを開くたびにリセットする
|
||||
gui.tooltips.appliedenergistics2.ItemsStored=在庫アイテム: %s
|
||||
gui.tooltips.appliedenergistics2.ItemsRequestable=要求可能なアイテム: %s
|
||||
gui.tooltips.appliedenergistics2.P2PFrequency=周波数: %s
|
||||
gui.tooltips.appliedenergistics2.MultiplyByTwo=アイテムを倍にする
|
||||
gui.tooltips.appliedenergistics2.MultiplyByTwoDesc=スロットのアイテム数を倍にすることを試みる。
|
||||
gui.tooltips.appliedenergistics2.MultiplyByThree=アイテムを3倍にする
|
||||
gui.tooltips.appliedenergistics2.MultiplyByThreeDesc=スロットのアイテム数を3倍にすることを試みる。
|
||||
gui.tooltips.appliedenergistics2.IncreaseByOne=1個追加
|
||||
gui.tooltips.appliedenergistics2.IncreaseByOneDesc=スロットのアイテム数を1個増やすことを試みる。材料の比率は保持されない。
|
||||
gui.tooltips.appliedenergistics2.DivideByTwo=2で割る
|
||||
gui.tooltips.appliedenergistics2.DivideByTwoDesc=スロットのアイテム数を2で割ることを試みる。
|
||||
gui.tooltips.appliedenergistics2.DivideByThree=3で割る
|
||||
gui.tooltips.appliedenergistics2.DivideByThreeDesc=スロットのアイテム数を3で割ることを試みる。
|
||||
gui.tooltips.appliedenergistics2.DecreaseByOne=1個減らす
|
||||
gui.tooltips.appliedenergistics2.DecreaseByOneDesc=スロットのアイテム数を1個減らすことを試みる。材料の比率は保持されない。
|
||||
gui.tooltips.appliedenergistics2.MaxCount=スロットのアイテム数を最大化
|
||||
gui.tooltips.appliedenergistics2.MaxCountDesc=材料アイテムの比率を保ったままスロットのアイテム数を最大化する。
|
||||
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcut=スロットが空いているインターフェースを表示する。
|
||||
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcutDesc=スロットが空いているインターフェースを切り替えて分子組立室を検索するショートカット。
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfaces=スロットが一杯になっているインターフェースの表示切り替え
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOnDesc=全てのインターフェースを表示。
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOffDesc=空きがあるインターフェースのみを表示。
|
||||
gui.tooltips.appliedenergistics2.HighlightInterface=インターフェースを強調表示
|
||||
|
||||
// Units
|
||||
gui.appliedenergistics2.units.appliedenergstics=AE
|
||||
gui.appliedenergistics2.units.ic2=EU
|
||||
gui.appliedenergistics2.units.rf=RF
|
||||
gui.appliedenergistics2.units.gteu=GTEU
|
||||
|
||||
// Colors
|
||||
gui.appliedenergistics2.White=白色
|
||||
gui.appliedenergistics2.Orange=橙色
|
||||
gui.appliedenergistics2.Magenta=赤紫色
|
||||
gui.appliedenergistics2.LightBlue=空色
|
||||
gui.appliedenergistics2.Yellow=黄色
|
||||
gui.appliedenergistics2.Lime=黄緑色
|
||||
gui.appliedenergistics2.Pink=桃色
|
||||
gui.appliedenergistics2.Gray=灰色
|
||||
gui.appliedenergistics2.LightGray=薄灰色
|
||||
gui.appliedenergistics2.Cyan=水色
|
||||
gui.appliedenergistics2.Purple=紫色
|
||||
gui.appliedenergistics2.Blue=青色
|
||||
gui.appliedenergistics2.Brown=茶色
|
||||
gui.appliedenergistics2.Green=緑色
|
||||
gui.appliedenergistics2.Red=赤色
|
||||
gui.appliedenergistics2.Black=黒色
|
||||
gui.appliedenergistics2.Fluix=フルーシュ
|
||||
|
||||
// Waila
|
||||
waila.appliedenergistics2.Crafting=クラフト中
|
||||
waila.appliedenergistics2.DeviceOnline=装置はオンラインです
|
||||
waila.appliedenergistics2.DeviceOffline=装置はオフラインです
|
||||
waila.appliedenergistics2.DeviceMissingChannel=装置のチャンネルが見つかりません
|
||||
waila.appliedenergistics2.Locked=ロックされています
|
||||
waila.appliedenergistics2.Unlocked=ロックされてません
|
||||
waila.appliedenergistics2.Showing=表示中
|
||||
waila.appliedenergistics2.Contains=格納
|
||||
waila.appliedenergistics2.Channels=%2$d中%1$dチャンネル使用中
|
||||
waila.appliedenergistics2.P2PUnlinked=設定待機中
|
||||
waila.appliedenergistics2.p2p_input_one_output=1個接続中 (接続元)
|
||||
waila.appliedenergistics2.p2p_input_many_outputs=%d個接続中 (接続元)
|
||||
waila.appliedenergistics2.p2p_output_one_input=1個接続中 (接続先)
|
||||
waila.appliedenergistics2.p2p_output_many_inputs=%d個接続中 (接続先)
|
||||
waila.appliedenergistics2.P2POutput=接続中 (接続先)
|
||||
|
||||
// TheOneProbe
|
||||
theoneprobe.appliedenergistics2.crafting=クラフト中: %1$s
|
||||
theoneprobe.appliedenergistics2.device_online=装置はオンラインです
|
||||
theoneprobe.appliedenergistics2.device_offline=装置はオフラインです
|
||||
theoneprobe.appliedenergistics2.device_missing_channel=装置のチャンネルが見つかりません
|
||||
theoneprobe.appliedenergistics2.locked=ロックされています
|
||||
theoneprobe.appliedenergistics2.unlocked=ロックされてません
|
||||
theoneprobe.appliedenergistics2.showing=表示中
|
||||
theoneprobe.appliedenergistics2.contains=格納
|
||||
theoneprobe.appliedenergistics2.channels=%2$d中%1$dチャンネル使用中
|
||||
theoneprobe.appliedenergistics2.p2p_unlinked=設定待機中
|
||||
theoneprobe.appliedenergistics2.p2p_input_one_output=1個接続中 (接続元)
|
||||
theoneprobe.appliedenergistics2.p2p_input_many_outputs=%d個接続中 (接続元)
|
||||
theoneprobe.appliedenergistics2.p2p_output_one_input=1個接続中 (接続先)
|
||||
theoneprobe.appliedenergistics2.p2p_output_many_inputs=%d個接続中 (接続先)
|
||||
theoneprobe.appliedenergistics2.p2p_output=接続中 (接続先)
|
||||
theoneprobe.appliedenergistics2.p2p_frequency=周波数: %1$s
|
||||
theoneprobe.appliedenergistics2.stored_energy=%1$d / %2$d
|
||||
|
||||
// Items
|
||||
item.appliedenergistics2.storage_cell_1k.name=1k MEストレージセル
|
||||
item.appliedenergistics2.storage_cell_4k.name=4k MEストレージセル
|
||||
item.appliedenergistics2.storage_cell_16k.name=16k MEストレージセル
|
||||
item.appliedenergistics2.storage_cell_64k.name=64k MEストレージセル
|
||||
item.appliedenergistics2.fluid_storage_cell_1k.name=1k ME液体セル
|
||||
item.appliedenergistics2.fluid_storage_cell_4k.name=4k ME液体セル
|
||||
item.appliedenergistics2.fluid_storage_cell_16k.name=16k ME液体セル
|
||||
item.appliedenergistics2.fluid_storage_cell_64k.name=64k ME液体セル
|
||||
item.appliedenergistics2.creative_storage_cell.name=クリエイティブ用MEストレージセル
|
||||
item.appliedenergistics2.encoded_pattern.name=エンコード済みパターン
|
||||
item.appliedenergistics2.view_cell.name=セルを表示
|
||||
item.appliedenergistics2.facade.name=ケーブル偽装板
|
||||
|
||||
item.appliedenergistics2.crystal_seed.certus.name=ケルタスクォーツの種
|
||||
item.appliedenergistics2.crystal_seed.nether.name=ネザークォーツの種
|
||||
item.appliedenergistics2.crystal_seed.fluix.name=フルーシュの種
|
||||
item.appliedenergistics2.material.invalid_type.name=このアイテムは無効
|
||||
item.appliedenergistics2.material.advanced_card.name=発展カード
|
||||
item.appliedenergistics2.material.annihilation_core.name=消滅コア
|
||||
item.appliedenergistics2.material.basic_card.name=基本カード
|
||||
item.appliedenergistics2.material.blank_pattern.name=ブランクパターン
|
||||
item.appliedenergistics2.material.calculation_processor.name=発展プロセッサ
|
||||
item.appliedenergistics2.material.card_capacity.name=容量カード
|
||||
item.appliedenergistics2.material.card_pattern_expansion.name=パターン拡張カード
|
||||
item.appliedenergistics2.material.card_fuzzy.name=ファジーカード
|
||||
item.appliedenergistics2.material.card_inverter.name=反転カード
|
||||
item.appliedenergistics2.material.card_redstone.name=レッドストーンカード
|
||||
item.appliedenergistics2.material.card_speed.name=加速カード
|
||||
item.appliedenergistics2.material.cell2_spatial_part.name=2³空間ストレージ
|
||||
item.appliedenergistics2.material.cell16_spatial_part.name=16³空間ストレージ
|
||||
item.appliedenergistics2.material.cell128_spatial_part.name=128³空間ストレージ
|
||||
item.appliedenergistics2.material.cell1k_part.name=1k MEストレージコンポーネント
|
||||
item.appliedenergistics2.material.cell4k_part.name=4k MEストレージコンポーネント
|
||||
item.appliedenergistics2.material.cell16k_part.name=16k MEストレージコンポーネント
|
||||
item.appliedenergistics2.material.cell64k_part.name=64k MEストレージコンポーネント
|
||||
item.appliedenergistics2.material.fluid_cell1k_part.name=1k ME液体コンポーネント
|
||||
item.appliedenergistics2.material.fluid_cell4k_part.name=4k ME液体コンポーネント
|
||||
item.appliedenergistics2.material.fluid_cell16k_part.name=16k ME液体コンポーネント
|
||||
item.appliedenergistics2.material.fluid_cell64k_part.name=64k ME液体コンポーネント
|
||||
item.appliedenergistics2.material.certus_quartz_crystal.name=ケルタスクォーツ
|
||||
item.appliedenergistics2.material.certus_quartz_crystal_charged.name=チャージドケルタスクォーツ
|
||||
item.appliedenergistics2.material.certus_quartz_dust.name=ケルタスクォーツの粉
|
||||
item.appliedenergistics2.material.empty_storage_cell.name=MEストレージセル筐体
|
||||
item.appliedenergistics2.material.ender_dust.name=エンダーパールの粉
|
||||
item.appliedenergistics2.material.engineering_processor.name=上級プロセッサ
|
||||
item.appliedenergistics2.material.flour.name=小麦粉
|
||||
item.appliedenergistics2.material.fluix_crystal.name=フルーシュクリスタル
|
||||
item.appliedenergistics2.material.fluix_dust.name=フルーシュの粉
|
||||
item.appliedenergistics2.material.fluix_pearl.name=フルーシュパール
|
||||
item.appliedenergistics2.material.formation_core.name=形成コア
|
||||
item.appliedenergistics2.material.gold_dust.name=金の粉
|
||||
item.appliedenergistics2.material.iron_dust.name=鉄の粉
|
||||
item.appliedenergistics2.material.logic_processor.name=基本プロセッサ
|
||||
item.appliedenergistics2.material.logic_processor_asm.name=未完成の基本プロセッサ
|
||||
item.appliedenergistics2.material.matter_ball.name=マターボール
|
||||
item.appliedenergistics2.material.nether_quartz_dust.name=ネザークォーツの粉
|
||||
item.appliedenergistics2.material.purified_certus_quartz_crystal.name=純粋なケルタスクォーツ
|
||||
item.appliedenergistics2.material.purified_fluix_crystal.name=純粋なフルーシュクリスタル
|
||||
item.appliedenergistics2.material.purified_nether_quartz_crystal.name=純粋なネザークォーツ
|
||||
item.appliedenergistics2.material.quantum_entangled_singularity.name=量子もつれシンギュラリティ
|
||||
item.appliedenergistics2.material.silicon.name=シリコン
|
||||
item.appliedenergistics2.material.singularity.name=シンギュラリティ
|
||||
item.appliedenergistics2.material.wireless.name=無線受信機
|
||||
item.appliedenergistics2.material.wireless_booster.name=無線ブースター
|
||||
item.appliedenergistics2.material.wooden_gear.name=木の歯車
|
||||
item.appliedenergistics2.material.engineering_processor_press.name=上級回路の金型
|
||||
item.appliedenergistics2.material.calculation_processor_press.name=発展回路の金型
|
||||
item.appliedenergistics2.material.logic_processor_press.name=基本回路の金型
|
||||
item.appliedenergistics2.material.engineering_processor_print.name=上級回路
|
||||
item.appliedenergistics2.material.calculation_processor_print.name=発展回路
|
||||
item.appliedenergistics2.material.logic_processor_print.name=基本回路
|
||||
item.appliedenergistics2.material.silicon_press.name=シリコン基板の金型
|
||||
item.appliedenergistics2.material.silicon_print.name=シリコン基板
|
||||
item.appliedenergistics2.material.name_press.name=名称銘記プレス
|
||||
item.appliedenergistics2.material.sky_dust.name=スカイストーンの粉
|
||||
item.appliedenergistics2.material.card_crafting.name=クラフティングカード
|
||||
|
||||
item.appliedenergistics2.multi_part.annihilation_plane.name=ME消滅プレーン
|
||||
item.appliedenergistics2.multi_part.fluid_annihilation_plane.name=ME液体消滅プレーン
|
||||
item.appliedenergistics2.multi_part.identity_annihilation_plane.name=ME同一性消滅プレーン
|
||||
item.appliedenergistics2.multi_part.cable_anchor.name=ケーブルアンカー
|
||||
item.appliedenergistics2.multi_part.cable_covered.name=MEカバーケーブル
|
||||
item.appliedenergistics2.multi_part.cable_glass.name=MEガラスケーブル
|
||||
item.appliedenergistics2.multi_part.cable_smart.name=MEスマートケーブル
|
||||
item.appliedenergistics2.multi_part.cable_dense_covered.name=ME高密度カバーケーブル
|
||||
item.appliedenergistics2.multi_part.cable_dense_smart.name=ME高密度スマートケーブル
|
||||
item.appliedenergistics2.multi_part.storage_monitor.name=MEストレージモニター
|
||||
item.appliedenergistics2.multi_part.conversion_monitor.name=ME変換モニター
|
||||
item.appliedenergistics2.multi_part.crafting_terminal.name=MEクラフティングターミナル
|
||||
item.appliedenergistics2.multi_part.semi_dark_monitor.name=照光パネル
|
||||
item.appliedenergistics2.multi_part.monitor.name=強照光パネル
|
||||
item.appliedenergistics2.multi_part.dark_monitor.name=弱照光パネル
|
||||
item.appliedenergistics2.multi_part.export_bus.name=ME出力バス
|
||||
item.appliedenergistics2.multi_part.fluid_export_bus.name=ME液体出力バス
|
||||
item.appliedenergistics2.multi_part.formation_plane.name=ME形成プレーン
|
||||
item.appliedenergistics2.multi_part.fluid_formation_plane.name=ME液体形成プレーン
|
||||
item.appliedenergistics2.multi_part.import_bus.name=ME入力バス
|
||||
item.appliedenergistics2.multi_part.fluid_import_bus.name=ME液体入力バス
|
||||
item.appliedenergistics2.multi_part.interface.name=MEインターフェース
|
||||
item.appliedenergistics2.multi_part.fluid_interface.name=ME液体インターフェース
|
||||
item.appliedenergistics2.multi_part.level_emitter.name=MEレベルエミッタ
|
||||
item.appliedenergistics2.multi_part.fluid_level_emitter.name=ME液体レベルエミッタ
|
||||
item.appliedenergistics2.multi_part.p2p_tunnel.name=P2Pトンネル
|
||||
item.appliedenergistics2.multi_part.pattern_terminal.name=MEパターンターミナル
|
||||
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME拡張パターンターミナル
|
||||
item.appliedenergistics2.multi_part.quartz_fiber.name=クォーツファイバー
|
||||
item.appliedenergistics2.multi_part.storage_bus.name=MEストレージバス
|
||||
item.appliedenergistics2.multi_part.oredict_storage_bus.name=ME鉱石辞書ストレージバス
|
||||
item.appliedenergistics2.multi_part.fluid_storage_bus.name=ME液体ストレージバス
|
||||
item.appliedenergistics2.multi_part.terminal.name=MEターミナル
|
||||
item.appliedenergistics2.multi_part.inverted_toggle_bus.name=ME反転切替バス
|
||||
item.appliedenergistics2.multi_part.toggle_bus.name=ME切替バス
|
||||
item.appliedenergistics2.multi_part.crafting_monitor.name=MEクラフティングモニター
|
||||
item.appliedenergistics2.multi_part.interface_terminal.name=MEインターフェースターミナル
|
||||
item.appliedenergistics2.multi_part.fluid_terminal.name=ME液体インターフェースターミナル
|
||||
item.appliedenergistics2.multi_part.invalid_type.name=無効アイテム
|
||||
|
||||
item.appliedenergistics2.spatial_storage_cell_128_cubed.name=128³空間ストレージセル
|
||||
item.appliedenergistics2.spatial_storage_cell_16_cubed.name=16³空間ストレージセル
|
||||
item.appliedenergistics2.spatial_storage_cell_2_cubed.name=2³空間ストレージセル
|
||||
|
||||
item.appliedenergistics2.certus_quartz_axe.name=ケルタスクォーツの斧
|
||||
item.appliedenergistics2.certus_quartz_cutting_knife.name=ケルタスクォーツのナイフ
|
||||
item.appliedenergistics2.certus_quartz_hoe.name=ケルタスクォーツのクワ
|
||||
item.appliedenergistics2.certus_quartz_pickaxe.name=ケルタスクォーツのツルハシ
|
||||
item.appliedenergistics2.certus_quartz_spade.name=ケルタスクォーツのシャベル
|
||||
item.appliedenergistics2.certus_quartz_sword.name=ケルタスクォーツの剣
|
||||
item.appliedenergistics2.certus_quartz_wrench.name=ケルタスクォーツのレンチ
|
||||
|
||||
item.appliedenergistics2.nether_quartz_axe.name=ネザークォーツの斧
|
||||
item.appliedenergistics2.nether_quartz_cutting_knife.name=ネザークォーツのナイフ
|
||||
item.appliedenergistics2.nether_quartz_hoe.name=ネザークォーツのクワ
|
||||
item.appliedenergistics2.nether_quartz_pickaxe.name=ネザークォーツのツルハシ
|
||||
item.appliedenergistics2.nether_quartz_spade.name=ネザークォーツのシャベル
|
||||
item.appliedenergistics2.nether_quartz_sword.name=ネザークォーツの剣
|
||||
item.appliedenergistics2.nether_quartz_wrench.name=ネザークォーツのレンチ
|
||||
|
||||
item.appliedenergistics2.paint_ball.name=ペイントボール
|
||||
item.appliedenergistics2.portable_cell.name=ポータブルセル
|
||||
item.appliedenergistics2.network_tool.name=ネットワークツール
|
||||
item.appliedenergistics2.charged_staff.name=チャージ済みの杖
|
||||
item.appliedenergistics2.entropy_manipulator.name=エントロピー操縦機
|
||||
item.appliedenergistics2.matter_cannon.name=マターキャノン
|
||||
item.appliedenergistics2.memory_card.name=メモリーカード
|
||||
item.appliedenergistics2.color_applicator.name=カラーアプリケーター
|
||||
item.appliedenergistics2.wireless_terminal.name=無線アクセスターミナル
|
||||
item.appliedenergistics2.biometric_card.name=生体認証カード
|
||||
|
||||
item.appliedenergistics2.debug_card.name=開発用.デバッグ用カード
|
||||
item.appliedenergistics2.debug_replicator_card.name=開発用.反復子カード
|
||||
|
||||
// Commands
|
||||
commands.ae2.usage=Applied Energistics 2のコマンド - リストが必要な場合は /ae2 list を使用し、コマンドのヘルプが必要な場合は /ae2 help _____ を使用します。
|
||||
commands.ae2.permissions=このコマンドを実行するための必要な権限を持っていません。
|
||||
commands.ae2.ChunkLogger=チャンクロードとアンロードに関するサーバーログへの書き込みを切り替えます。
|
||||
commands.ae2.ChunkLoggerOn=チャンクロギングを開始しました。
|
||||
commands.ae2.ChunkLoggerOff=チャンクロギングを終了しました。
|
||||
commands.ae2.Supporters=AE2サポーターの一覧を表示します。
|
||||
|
||||
// Achievements
|
||||
achievement.ae2.Root=Applied Energistics 2
|
||||
achievement.ae2.Root.desc=チェストだけでは物足りない?
|
||||
achievement.ae2.Compass=隕石ハンター
|
||||
achievement.ae2.Compass.desc=隕石探知コンパスを作る。
|
||||
achievement.ae2.Presses=未知なる技術
|
||||
achievement.ae2.Presses.desc=プロセッサの金型を見つける。
|
||||
achievement.ae2.SpatialIO=空間の調整
|
||||
achievement.ae2.SpatialIO.desc=空間IOポートを作る。
|
||||
achievement.ae2.SpatialIOExplorer=大胆に移動したい?
|
||||
achievement.ae2.SpatialIOExplorer.desc=空間ストレージセルに格納する。
|
||||
achievement.ae2.StorageCell=チェストより優れたもの
|
||||
achievement.ae2.StorageCell.desc=ストレージセルを作る。
|
||||
achievement.ae2.IOPort=ストレージセルをシャッフル
|
||||
achievement.ae2.IOPort.desc=入出力ポートを作る。
|
||||
achievement.ae2.CraftingTerminal=もっと大きな作業台
|
||||
achievement.ae2.CraftingTerminal.desc=クラフティングターミナルを作る。
|
||||
achievement.ae2.PatternTerminal=クラフティングの巨匠
|
||||
achievement.ae2.PatternTerminal.desc=パターンターミナルを作る。
|
||||
achievement.ae2.ChargedQuartz=ショッキング
|
||||
achievement.ae2.ChargedQuartz.desc=チャージドケルタスクォーツを見つける。
|
||||
achievement.ae2.Fluix=なんだか不自然ですね
|
||||
achievement.ae2.Fluix.desc=フルーシュクリスタルを作成する。
|
||||
achievement.ae2.Charger=フルーシュの生産
|
||||
achievement.ae2.Charger.desc=チャージ機を作る。
|
||||
achievement.ae2.CrystalGrowthAccelerator=加速なんてものじゃない
|
||||
achievement.ae2.CrystalGrowthAccelerator.desc=クリスタル成長加速機を作る。
|
||||
achievement.ae2.GlassCable=フルーシュエネルギーの接続
|
||||
achievement.ae2.GlassCable.desc=MEケーブルを作る。
|
||||
achievement.ae2.Controller=ネットワークの配電盤
|
||||
achievement.ae2.Controller.desc=コントローラを作る。
|
||||
achievement.ae2.Networking1=ネットワークの実習生
|
||||
achievement.ae2.Networking1.desc=ネットワーク上のチャンネルが8個に到達する。
|
||||
achievement.ae2.Networking2=ネットワークの設計者
|
||||
achievement.ae2.Networking2.desc=ネットワーク上のチャンネルが128個に到達する。
|
||||
achievement.ae2.Networking3=ネットワークの管理者
|
||||
achievement.ae2.Networking3.desc=ネットワーク上のチャンネルが2048個に到達する。
|
||||
achievement.ae2.P2P=ポイント・トゥ・ポイント(ピア・トゥ・ピアではない)
|
||||
achievement.ae2.P2P.desc=P2Pトンネルを作る。
|
||||
achievement.ae2.Recursive=再帰的なネットワーク
|
||||
achievement.ae2.Recursive.desc=ストレージバスにインターフェースを配置する。
|
||||
achievement.ae2.CraftingCPU=次世代のクラフティング
|
||||
achievement.ae2.CraftingCPU.desc=クラフティングユニットを作る。
|
||||
achievement.ae2.Facade=ネットワークの美意識
|
||||
achievement.ae2.Facade.desc=偽装板を作る。
|
||||
achievement.ae2.NetworkTool=ネットワークの診断
|
||||
achievement.ae2.NetworkTool.desc=ネットワークツールを作る。
|
||||
achievement.ae2.PortableCell=ストレージの放浪者
|
||||
achievement.ae2.PortableCell.desc=ポータブルセルを作る。
|
||||
achievement.ae2.StorageBus=無限大の可能性
|
||||
achievement.ae2.StorageBus.desc=ストレージバスを作る。
|
||||
achievement.ae2.QNB=量子トンネル
|
||||
achievement.ae2.QNB.desc=量子リンクを作る。
|
||||
|
||||
// Stats
|
||||
stat.ae2.ItemsInserted=MEストレージセルに搬入したアイテム数
|
||||
stat.ae2.ItemsExtracted=MEストレージセルから搬出したアイテム数
|
||||
stat.ae2.TurnedCranks=クランクを回した回数
|
||||
|
||||
// Keys
|
||||
key.appliedenergistics2.category=Applied Energistics 2
|
||||
key.toggle_focus.desc=検索ボックスの切り替え
|
||||
@@ -16,6 +16,7 @@ tile.appliedenergistics2.matrix_frame.name=Каркас матрицы
|
||||
tile.appliedenergistics2.io_port.name=МЭ порт ввода\вывода
|
||||
tile.appliedenergistics2.inscriber.name=Высекатель
|
||||
tile.appliedenergistics2.interface.name=МЭ интерфейс
|
||||
tile.appliedenergistics2.fluid_interface.name=МЭ жидкостный интерфейс
|
||||
tile.appliedenergistics2.quantum_link.name=МЭ камера квантовой связи
|
||||
tile.appliedenergistics2.quantum_ring.name=МЭ квантовое кольцо
|
||||
tile.appliedenergistics2.fluix_block.name=Изменчивый блок
|
||||
@@ -84,6 +85,7 @@ chat.appliedenergistics2.StationCanNotBeLocated=Станция не найден
|
||||
chat.appliedenergistics2.MachineNotPowered=Устройство без питания.
|
||||
chat.appliedenergistics2.CommunicationError=Ошибка связи с сетью.
|
||||
chat.appliedenergistics2.SavedSettings=Настройки успешно сохранены.
|
||||
chat.appliedenergistics2.ResetSettings=Новая конфигурация устройства создана и скопирована на карту памяти.
|
||||
chat.appliedenergistics2.AmmoDepleted=Боеприпасы исчерпаны.
|
||||
chat.appliedenergistics2.isNowLocked=Монитор заблокирован.
|
||||
chat.appliedenergistics2.isNowUnlocked=Монитор разблокирован.
|
||||
@@ -100,6 +102,7 @@ gui.appliedenergistics2.FluidTunnel=Жидкость
|
||||
gui.appliedenergistics2.RedstoneTunnel=Красный камень
|
||||
gui.appliedenergistics2.EUTunnel=EU
|
||||
gui.appliedenergistics2.FETunnel=FE
|
||||
gui.appliedenergistics2.GTEUTunnel=GTEU
|
||||
gui.appliedenergistics2.LightTunnel=Свет
|
||||
gui.appliedenergistics2.OCTunnel=OpenComputers
|
||||
gui.appliedenergistics2.PressureTunnel=Давление
|
||||
@@ -131,6 +134,8 @@ gui.appliedenergistics2.SecurityCardEditor=Редактор биометриче
|
||||
gui.appliedenergistics2.Encoded=Зашифрованный
|
||||
gui.appliedenergistics2.Priority=Приоритет
|
||||
gui.appliedenergistics2.StorageBus=Шина хранения
|
||||
gui.appliedenergistics2.OreDictStorageBus=Шина хранения по словарю руд
|
||||
gui.appliedenergistics2.StorageBusFluids=Шина хранения жидкости
|
||||
gui.appliedenergistics2.EnergyDrain=Пассивное потребление
|
||||
gui.appliedenergistics2.Installed=Установлено
|
||||
gui.appliedenergistics2.NetworkTool=Сетевой инструмент
|
||||
@@ -146,23 +151,30 @@ gui.appliedenergistics2.Condenser=Конденсатор материи
|
||||
gui.appliedenergistics2.Config=Настройки
|
||||
gui.appliedenergistics2.Drive=МЭ накопитель
|
||||
gui.appliedenergistics2.ExportBus=МЭ шина экспорта
|
||||
gui.appliedenergistics2.ExportBusFluids=МЭ жидкостная шина экспорта
|
||||
gui.appliedenergistics2.GrindStone=Дробитель
|
||||
gui.appliedenergistics2.ImportBus=МЭ шина импорта
|
||||
gui.appliedenergistics2.ImportBusFluids=MЭ жидкостная шина импорта
|
||||
gui.appliedenergistics2.Interface=МЭ интерфейс
|
||||
gui.appliedenergistics2.FluidInterface=МЭ жидкостный интерфейс
|
||||
gui.appliedenergistics2.LevelEmitter=МЭ излучатель уровня
|
||||
gui.appliedenergistics2.FluidLevelEmitter=МЭ жидкостный излучатель уровня
|
||||
gui.appliedenergistics2.Of=из
|
||||
gui.appliedenergistics2.Patterns=Шаблоны
|
||||
gui.appliedenergistics2.SpatialIOPort=Пространственный порт ввода\вывода
|
||||
gui.appliedenergistics2.StoredEnergy=Накопленная энергия
|
||||
gui.appliedenergistics2.StoredItems=Хранящиеся предметы
|
||||
gui.appliedenergistics2.StoredFluids=Хранящиеся жидкости
|
||||
gui.appliedenergistics2.Terminal=Терминал
|
||||
gui.appliedenergistics2.InterfaceTerminal=Терминал интерфейсов
|
||||
gui.appliedenergistics2.InterfaceTerminalHint=Показать или спрятать в терминале интерфейсов.
|
||||
gui.appliedenergistics2.FormationPlane=Плоскость формирования
|
||||
gui.appliedenergistics2.FluidFormationPlane=Плоскость формирования жидкости
|
||||
gui.appliedenergistics2.VibrationChamber=Вибрационная камера
|
||||
gui.appliedenergistics2.NetworkDetails=Подробности сети
|
||||
gui.appliedenergistics2.StorageCells=МЭ ячейки хранения
|
||||
gui.appliedenergistics2.IOBuses=МЭ шина импорта\экспорта
|
||||
gui.appliedenergistics2.IOBusesFluids=МЭ жидкостная шина импорта\экспорта
|
||||
gui.appliedenergistics2.Stores=Хранит
|
||||
gui.appliedenergistics2.BytesUsed=байт использовано
|
||||
gui.appliedenergistics2.Types=типов
|
||||
@@ -323,6 +335,9 @@ gui.tooltips.appliedenergistics2.EmitWhenCrafting=Излучать сигнал
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleItems=Сообщать о недоступных вещах
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsYes=Да: Предметы, которые не могут быть извлечены, будут видны.
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleItemsNo=Нет: Только извлекаемые предметы будут видны.
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleFluids=Сообщать о недоступных жидкостях
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsYes=Да: Жидкости, которые невозможно извлечь, будут видны.
|
||||
gui.tooltips.appliedenergistics2.ReportInaccessibleFluidsNo=Нет: будут видны только извлекаемые жидкости.
|
||||
gui.tooltips.appliedenergistics2.BlockPlacement=Размещение блоков
|
||||
gui.tooltips.appliedenergistics2.BlockPlacementYes=Блоки будут размещаться в виде блоков.
|
||||
gui.tooltips.appliedenergistics2.BlockPlacementNo=Блоки будут выпадать в виде предметов.
|
||||
@@ -335,11 +350,33 @@ gui.tooltips.appliedenergistics2.FilterModeKeep=Восстановить пре
|
||||
gui.tooltips.appliedenergistics2.FilterModeClear=Очищать при каждом открытии.
|
||||
gui.tooltips.appliedenergistics2.ItemsStored=Хранящиеся предметы: %s
|
||||
gui.tooltips.appliedenergistics2.ItemsRequestable=Запрашиваемые предметы: %s
|
||||
gui.tooltips.appliedenergistics2.P2PFrequency=Частота: %s
|
||||
gui.tooltips.appliedenergistics2.MultiplyByTwo=Удвоить колличество предметов
|
||||
gui.tooltips.appliedenergistics2.MultiplyByTwoDesc=Удвоить колличество предметов, установленных в слотах для крафта
|
||||
gui.tooltips.appliedenergistics2.MultiplyByThree=Утроить колличество предметов
|
||||
gui.tooltips.appliedenergistics2.MultiplyByThreeDesc=Утроить колличество предметов, установленных в слотах для крафта
|
||||
gui.tooltips.appliedenergistics2.IncreaseByOne=Увеличить на единицу
|
||||
gui.tooltips.appliedenergistics2.IncreaseByOneDesc=Добавить по одному предмету, установленных в слотах для крафта, на единицу. НЕ СОХРАНЯЕТ СООТНОШЕНИЕ ИНГРЕДИЕНТОВ
|
||||
gui.tooltips.appliedenergistics2.DivideByTwo=Разделить набор предметов на два
|
||||
gui.tooltips.appliedenergistics2.DivideByTwoDesc=Пытается разделить на 2 предметы, установленные в слотах для крафта
|
||||
gui.tooltips.appliedenergistics2.DivideByThree=Разделить набор элементов на три
|
||||
gui.tooltips.appliedenergistics2.DivideByThreeDesc=Пытается разделить на 3 предметы, установленные в слотах для крафта
|
||||
gui.tooltips.appliedenergistics2.DecreaseByOne=Уменьшить на единицу
|
||||
gui.tooltips.appliedenergistics2.DecreaseByOneDesc=Попытаюсь добавить уменьшение количества предметов, установленных в слотах для крафта, на единицу НЕ ПОДДЕРЖИВАЕТ СООТНОШЕНИЕ ИНГРЕДИЕНТОВ
|
||||
gui.tooltips.appliedenergistics2.MaxCount=Увеличить количество слотов
|
||||
gui.tooltips.appliedenergistics2.MaxCountDesc=Будет максимизировать выход, сохраняя коэффициент ввода предметов, установленных в слотах крафта
|
||||
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcut=Показать интерфейсы крафта со свободными слотами
|
||||
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcutDesc=Ярлык, который переключает интерфейсы со свободными слотами и ищет молекулярные ассемблеры
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfaces=Переключает отображение интерфейсов с заполненными слотами
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOnDesc=Показ всех интерфейсов
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOffDesc=Показаны только интерфейсы со свободными слотами
|
||||
gui.tooltips.appliedenergistics2.HighlightInterface=Подсветка интерфейса
|
||||
|
||||
// Units
|
||||
gui.appliedenergistics2.units.appliedenergstics=AE
|
||||
gui.appliedenergistics2.units.ic2=Energy Units
|
||||
gui.appliedenergistics2.units.rf=Redstone Flux
|
||||
gui.appliedenergistics2.units.gteu=GTEU
|
||||
|
||||
// Colors
|
||||
gui.appliedenergistics2.White=Белый
|
||||
@@ -373,6 +410,8 @@ waila.appliedenergistics2.Channels=Каналы: %1$d из %2$d
|
||||
waila.appliedenergistics2.P2PUnlinked=Не связанный
|
||||
waila.appliedenergistics2.P2PInputOneOutput=Связанный (Сторона ввода)
|
||||
waila.appliedenergistics2.P2PInputManyOutputs=Связанный (Сторона ввода) - %d выводов
|
||||
waila.appliedenergistics2.p2p_output_one_input=Связанный (Сторона вывода)
|
||||
waila.appliedenergistics2.p2p_output_many_inputs=Связанный (Сторона вывода) - %d выводов
|
||||
waila.appliedenergistics2.P2POutput=Связанный (Сторона вывода)
|
||||
|
||||
// TheOneProbe
|
||||
@@ -388,7 +427,10 @@ theoneprobe.appliedenergistics2.channels=Каналы: %1$d из %2$d
|
||||
theoneprobe.appliedenergistics2.p2p_unlinked=Не связанный
|
||||
theoneprobe.appliedenergistics2.p2p_input_one_output=Связанный (сторона ввода)
|
||||
theoneprobe.appliedenergistics2.p2p_input_many_outputs=Связанный (сторона ввода) - %d выводов
|
||||
theoneprobe.appliedenergistics2.p2p_output_one_input=Связанный (Сторона вывода)
|
||||
theoneprobe.appliedenergistics2.p2p_output_many_inputs=Связанный (Сторона вывода) - %d выводов
|
||||
theoneprobe.appliedenergistics2.p2p_output=Связанный (Сторона вывода)
|
||||
theoneprobe.appliedenergistics2.p2p_frequency=Частота: %1$s
|
||||
theoneprobe.appliedenergistics2.stored_energy=%1$d / %2$d
|
||||
|
||||
// Items
|
||||
@@ -396,6 +438,10 @@ item.appliedenergistics2.storage_cell_1k.name=1К МЭ ячейка хранен
|
||||
item.appliedenergistics2.storage_cell_4k.name=4К МЭ ячейка хранения
|
||||
item.appliedenergistics2.storage_cell_16k.name=16К МЭ ячейка хранения
|
||||
item.appliedenergistics2.storage_cell_64k.name=64К МЭ ячейка хранения
|
||||
item.appliedenergistics2.fluid_storage_cell_1k.name=1К МЭ жидкостная ячейка хранения
|
||||
item.appliedenergistics2.fluid_storage_cell_4k.name=4К МЭ жидкостная ячейка хранения
|
||||
item.appliedenergistics2.fluid_storage_cell_16k.name=16К МЭ жидкостная ячейка хранения
|
||||
item.appliedenergistics2.fluid_storage_cell_64k.name=64К МЭ жидкостная ячейка хранения
|
||||
item.appliedenergistics2.creative_storage_cell.name=Творческая МЭ ячейка хранения
|
||||
item.appliedenergistics2.encoded_pattern.name=Кодированный шаблон
|
||||
item.appliedenergistics2.view_cell.name=Ячейка представления
|
||||
@@ -411,6 +457,7 @@ item.appliedenergistics2.material.basic_card.name=Базовая карта
|
||||
item.appliedenergistics2.material.blank_pattern.name=Пустой шаблон
|
||||
item.appliedenergistics2.material.calculation_processor.name=Вычислительный процессор
|
||||
item.appliedenergistics2.material.card_capacity.name=Карта ёмкости
|
||||
item.appliedenergistics2.material.card_pattern_expansion.name=Карта расширения шаблона
|
||||
item.appliedenergistics2.material.card_fuzzy.name=Карта нечёткости
|
||||
item.appliedenergistics2.material.card_inverter.name=Карта инвертирования
|
||||
item.appliedenergistics2.material.card_redstone.name=Карта красного камня
|
||||
@@ -422,6 +469,10 @@ item.appliedenergistics2.material.cell1k_part.name=1К МЭ компонент
|
||||
item.appliedenergistics2.material.cell4k_part.name=4К МЭ компонент хранения
|
||||
item.appliedenergistics2.material.cell16k_part.name=16К МЭ компонент хранения
|
||||
item.appliedenergistics2.material.cell64k_part.name=64К МЭ компонент хранения
|
||||
item.appliedenergistics2.material.fluid_cell1k_part.name=1К МЭ жидкостный компонент хранения
|
||||
item.appliedenergistics2.material.fluid_cell4k_part.name=4К МЭ жидкостный компонент хранения
|
||||
item.appliedenergistics2.material.fluid_cell16k_part.name=16К МЭ жидкостный компонент хранения
|
||||
item.appliedenergistics2.material.fluid_cell64k_part.name=64К МЭ жидкостный компонент хранения
|
||||
item.appliedenergistics2.material.certus_quartz_crystal.name=Кристалл истинного кварца
|
||||
item.appliedenergistics2.material.certus_quartz_crystal_charged.name=Заряженный кристалл истинного кварца
|
||||
item.appliedenergistics2.material.certus_quartz_dust.name=Пыль истинного кварца
|
||||
@@ -461,6 +512,7 @@ item.appliedenergistics2.material.sky_dust.name=Пыль небесного ка
|
||||
item.appliedenergistics2.material.card_crafting.name=Карта крафта
|
||||
|
||||
item.appliedenergistics2.multi_part.annihilation_plane.name=МЭ плоскость истребления
|
||||
item.appliedenergistics2.multi_part.fluid_annihilation_plane.name=МЭ жидкостная плоскость истребления
|
||||
item.appliedenergistics2.multi_part.identity_annihilation_plane.name=МЭ id плоскость истребления
|
||||
item.appliedenergistics2.multi_part.cable_anchor.name=Кабельный якорь
|
||||
item.appliedenergistics2.multi_part.cable_covered.name=МЭ закрытый кабель
|
||||
@@ -475,19 +527,28 @@ item.appliedenergistics2.multi_part.semi_dark_monitor.name=Осветитель
|
||||
item.appliedenergistics2.multi_part.monitor.name=Яркая осветительная панель
|
||||
item.appliedenergistics2.multi_part.dark_monitor.name=Тёмная осветительная панель
|
||||
item.appliedenergistics2.multi_part.export_bus.name=МЭ шина экспорта
|
||||
item.appliedenergistics2.multi_part.fluid_export_bus.name=МЭ жидкостная шина экспорта
|
||||
item.appliedenergistics2.multi_part.formation_plane.name=МЭ плоскость формирования
|
||||
item.appliedenergistics2.multi_part.fluid_formation_plane.name=МЭ жидкостная плоскость формирования
|
||||
item.appliedenergistics2.multi_part.import_bus.name=МЭ шина импорта
|
||||
item.appliedenergistics2.multi_part.fluid_import_bus.name=МЭ жидкостная шина импорта
|
||||
item.appliedenergistics2.multi_part.interface.name=МЭ интерфейс
|
||||
item.appliedenergistics2.multi_part.fluid_interface.name=МЭ интерфейс жидкостей
|
||||
item.appliedenergistics2.multi_part.level_emitter.name=МЭ излучатель уровня
|
||||
item.appliedenergistics2.multi_part.fluid_level_emitter.name=МЭ излучатель уровня
|
||||
item.appliedenergistics2.multi_part.p2p_tunnel.name=Туннель точка-точка
|
||||
item.appliedenergistics2.multi_part.pattern_terminal.name=МЭ терминал шаблонов
|
||||
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME терминал расширенной схемы обработки
|
||||
item.appliedenergistics2.multi_part.quartz_fiber.name=Кварцевое оптическое волокно
|
||||
item.appliedenergistics2.multi_part.storage_bus.name=МЭ шина хранения
|
||||
item.appliedenergistics2.multi_part.oredict_storage_bus.name=МЭ шина хранения по словарю руд
|
||||
item.appliedenergistics2.multi_part.fluid_storage_bus.name=МЭ жидкостная шина хранения
|
||||
item.appliedenergistics2.multi_part.terminal.name=МЭ терминал
|
||||
item.appliedenergistics2.multi_part.inverted_toggle_bus.name=МЭ инвертированная шина переключения
|
||||
item.appliedenergistics2.multi_part.toggle_bus.name=МЭ шина переключения
|
||||
item.appliedenergistics2.multi_part.crafting_monitor.name=МЭ монитор крафта
|
||||
item.appliedenergistics2.multi_part.interface_terminal.name=МЭ терминал интерфейсов
|
||||
item.appliedenergistics2.multi_part.fluid_terminal.name=МЭ жидкостный терминал
|
||||
item.appliedenergistics2.multi_part.invalid_type.name=Отключенный предмет
|
||||
|
||||
item.appliedenergistics2.spatial_storage_cell_128_cubed.name=128³ пространственная ячейка хранения
|
||||
@@ -590,3 +651,7 @@ achievement.ae2.QNB.desc=Сделайте квантовое соединени
|
||||
stat.ae2.ItemsInserted=Предметов добавлено в МЭ хранилище
|
||||
stat.ae2.ItemsExtracted=Предметов извлечено из МЭ хранилища
|
||||
stat.ae2.TurnedCranks=Сломано рукояток
|
||||
|
||||
//Keys
|
||||
key.appliedenergistics2.category=Applied Energistics 2
|
||||
key.toggle_focus.desc=Переключить фокус окна поиска
|
||||
|
||||
@@ -102,6 +102,7 @@ gui.appliedenergistics2.FluidTunnel=流体
|
||||
gui.appliedenergistics2.RedstoneTunnel=红石
|
||||
gui.appliedenergistics2.EUTunnel=EU
|
||||
gui.appliedenergistics2.FETunnel=FE
|
||||
gui.appliedenergistics2.GTEUTunnel=GTEU
|
||||
gui.appliedenergistics2.LightTunnel=光
|
||||
gui.appliedenergistics2.OCTunnel=开放式电脑
|
||||
gui.appliedenergistics2.PressureTunnel=气压
|
||||
@@ -133,6 +134,7 @@ gui.appliedenergistics2.SecurityCardEditor=身份卡编辑
|
||||
gui.appliedenergistics2.Encoded=已编码
|
||||
gui.appliedenergistics2.Priority=优先级
|
||||
gui.appliedenergistics2.StorageBus=存储总线
|
||||
gui.appliedenergistics2.OreDictStorageBus=矿典存储总线
|
||||
gui.appliedenergistics2.StorageBusFluids=流体储存总线
|
||||
gui.appliedenergistics2.EnergyDrain=被动流失
|
||||
gui.appliedenergistics2.Installed=已安装
|
||||
@@ -349,11 +351,32 @@ gui.tooltips.appliedenergistics2.FilterModeClear=在每次打开时清空.
|
||||
gui.tooltips.appliedenergistics2.ItemsStored=存储物品: %s
|
||||
gui.tooltips.appliedenergistics2.ItemsRequestable=可请求: %s
|
||||
gui.tooltips.appliedenergistics2.P2PFrequency=频率: %s
|
||||
gui.tooltips.appliedenergistics2.MultiplyByTwo=物品数量×2
|
||||
gui.tooltips.appliedenergistics2.MultiplyByTwoDesc=将尝试将格内物品数量×2
|
||||
gui.tooltips.appliedenergistics2.MultiplyByThree=物品数量×3
|
||||
gui.tooltips.appliedenergistics2.MultiplyByThreeDesc=将尝试将格内物品数量×3
|
||||
gui.tooltips.appliedenergistics2.IncreaseByOne=物品数量+1
|
||||
gui.tooltips.appliedenergistics2.IncreaseByOneDesc=将尝试将格内物品数量+1 注:将不会维持比例
|
||||
gui.tooltips.appliedenergistics2.DivideByTwo=物品数量÷2
|
||||
gui.tooltips.appliedenergistics2.DivideByTwoDesc=将尝试将格内物品数量÷2
|
||||
gui.tooltips.appliedenergistics2.DivideByThree=物品数量÷3
|
||||
gui.tooltips.appliedenergistics2.DivideByThreeDesc=将尝试将格内物品数量÷3
|
||||
gui.tooltips.appliedenergistics2.DecreaseByOne=物品数量-1
|
||||
gui.tooltips.appliedenergistics2.DecreaseByOneDesc=将尝试将格内物品数量-1 注:将不会维持比例
|
||||
gui.tooltips.appliedenergistics2.MaxCount=物品数量最大
|
||||
gui.tooltips.appliedenergistics2.MaxCountDesc=将把格内物品数量最大化并维持比例
|
||||
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcut=显示有样板位的合成接口
|
||||
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcutDesc=快捷切换有样板位的分子装配室接口
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfaces=显示满样板的接口
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOnDesc=显示所有接口
|
||||
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOffDesc=仅显示有样板位的接口
|
||||
gui.tooltips.appliedenergistics2.HighlightInterface=高亮接口
|
||||
|
||||
// Units (单位)
|
||||
gui.appliedenergistics2.units.appliedenergstics=AE
|
||||
gui.appliedenergistics2.units.ic2=EU
|
||||
gui.appliedenergistics2.units.rf=RF
|
||||
gui.appliedenergistics2.units.gteu=GTEU
|
||||
|
||||
// Colors (颜色)
|
||||
gui.appliedenergistics2.White=白色
|
||||
@@ -387,6 +410,8 @@ waila.appliedenergistics2.Channels=%1$d / %2$d 频道
|
||||
waila.appliedenergistics2.P2PUnlinked=未连接
|
||||
waila.appliedenergistics2.P2PInputOneOutput=已连接(输入端)
|
||||
waila.appliedenergistics2.P2PInputManyOutputs=已连接(输入端)- %d 输出
|
||||
waila.appliedenergistics2.p2p_output_one_input=已连接(输出端)
|
||||
waila.appliedenergistics2.p2p_output_many_inputs=已连接(输出端)- %d 输入
|
||||
waila.appliedenergistics2.P2POutput=已连接(输出端)
|
||||
|
||||
// TheOneProbe
|
||||
@@ -402,6 +427,8 @@ theoneprobe.appliedenergistics2.channels=%1$d / %2$d 频道
|
||||
theoneprobe.appliedenergistics2.p2p_unlinked=未连接
|
||||
theoneprobe.appliedenergistics2.p2p_input_one_output=已连接(输入端)
|
||||
theoneprobe.appliedenergistics2.p2p_input_many_outputs=已连接(输入端)- %d 输出
|
||||
theoneprobe.appliedenergistics2.p2p_output_one_input=已连接(输出端)
|
||||
theoneprobe.appliedenergistics2.p2p_output_many_inputs=已连接(输出端)- %d 输入
|
||||
theoneprobe.appliedenergistics2.p2p_output=已连接(输出端)
|
||||
theoneprobe.appliedenergistics2.p2p_frequency=频率: %1$s
|
||||
theoneprobe.appliedenergistics2.stored_energy=%1$d / %2$d
|
||||
@@ -430,6 +457,7 @@ item.appliedenergistics2.material.basic_card.name=基础卡
|
||||
item.appliedenergistics2.material.blank_pattern.name=空白样板
|
||||
item.appliedenergistics2.material.calculation_processor.name=运算处理器
|
||||
item.appliedenergistics2.material.card_capacity.name=容量卡
|
||||
item.appliedenergistics2.material.card_pattern_expansion.name=样板扩展卡
|
||||
item.appliedenergistics2.material.card_fuzzy.name=模糊卡
|
||||
item.appliedenergistics2.material.card_inverter.name=反相卡
|
||||
item.appliedenergistics2.material.card_redstone.name=红石卡
|
||||
@@ -510,8 +538,10 @@ item.appliedenergistics2.multi_part.level_emitter.name=ME标准发信器
|
||||
item.appliedenergistics2.multi_part.fluid_level_emitter.name=ME流体标准发信器
|
||||
item.appliedenergistics2.multi_part.p2p_tunnel.name=P2P通道
|
||||
item.appliedenergistics2.multi_part.pattern_terminal.name=ME样板终端
|
||||
item.appliedenergistics2.multi_part.expanded_processing_pattern_terminal.name=ME增广处理样板终端
|
||||
item.appliedenergistics2.multi_part.quartz_fiber.name=石英纤维
|
||||
item.appliedenergistics2.multi_part.storage_bus.name=ME存储总线
|
||||
item.appliedenergistics2.multi_part.oredict_storage_bus.name=ME矿典存储总线
|
||||
item.appliedenergistics2.multi_part.fluid_storage_bus.name=ME流体储存总线
|
||||
item.appliedenergistics2.multi_part.terminal.name=ME终端
|
||||
item.appliedenergistics2.multi_part.inverted_toggle_bus.name=ME反相触发总线
|
||||
@@ -618,7 +648,7 @@ achievement.ae2.QNB=量子隧道
|
||||
achievement.ae2.QNB.desc=制作一个链接室
|
||||
|
||||
// Stats (统计)
|
||||
stat.ae2.ItemsInserted=物品已加入ME存储
|
||||
stat.ae2.ItemsInserted=物品已存入ME存储
|
||||
stat.ae2.ItemsExtracted=物品已取出ME存储
|
||||
stat.ae2.TurnedCranks=转动曲柄
|
||||
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"parent": "appliedenergistics2:item/part/display",
|
||||
"textures": {
|
||||
"front": "appliedenergistics2:items/part/interface_terminal",
|
||||
"front_bright": "appliedenergistics2:parts/interface_configuration_terminal_bright",
|
||||
"front_medium": "appliedenergistics2:parts/interface_configuration_terminal_medium",
|
||||
"front_dark": "appliedenergistics2:parts/interface_configuration_terminal_dark"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"parent": "appliedenergistics2:part/display_off",
|
||||
"textures": {
|
||||
"lightsBright": "appliedenergistics2:parts/interface_configuration_terminal_bright",
|
||||
"lightsMedium": "appliedenergistics2:parts/interface_configuration_terminal_medium",
|
||||
"lightsDark": "appliedenergistics2:parts/interface_configuration_terminal_dark"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"ae2_uvl_marker": true,
|
||||
"textures": {
|
||||
"lightsBright": "appliedenergistics2:parts/interface_configuration_terminal_bright",
|
||||
"lightsMedium": "appliedenergistics2:parts/interface_configuration_terminal_medium",
|
||||
"lightsDark": "appliedenergistics2:parts/interface_configuration_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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:interface"
|
||||
}
|
||||
],
|
||||
"result": {
|
||||
"type": "appliedenergistics2:part",
|
||||
"part": "part.interface_terminal"
|
||||
},
|
||||
"type": "appliedenergistics2:part_shapeless",
|
||||
"ingredients": [
|
||||
{
|
||||
"type": "appliedenergistics2:part",
|
||||
"part": "part.interface_configuration_terminal"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:interface"
|
||||
}
|
||||
],
|
||||
"result": {
|
||||
"type": "appliedenergistics2:part",
|
||||
"part": "part.interface_configuration_terminal"
|
||||
},
|
||||
"type": "appliedenergistics2:part_shapeless",
|
||||
"ingredients": [
|
||||
{
|
||||
"type": "appliedenergistics2:part",
|
||||
"part": "part.interface_terminal"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 284 B After Width: | Height: | Size: 351 B |
|
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 333 B |
|
Before Width: | Height: | Size: 304 B After Width: | Height: | Size: 392 B |
|
Before Width: | Height: | Size: 404 B After Width: | Height: | Size: 230 B |
|
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 236 B |
|
Before Width: | Height: | Size: 330 B After Width: | Height: | Size: 405 B |
|
Before Width: | Height: | Size: 344 B After Width: | Height: | Size: 443 B |
|
After Width: | Height: | Size: 5.0 KiB |
|
After Width: | Height: | Size: 205 B |
|
After Width: | Height: | Size: 5.0 KiB |