Compare commits

...

35 Commits

Author SHA1 Message Date
PrototypeTrousers c3b1dea7c5 better level emitting 2021-03-31 17:34:43 -03:00
Salomão 40ec517480 level emitters cache rework 2021-03-30 23:05:15 -03:00
Salomão 2fdc16d3a8 Merge remote-tracking branch 'ALongStringOfNumbers/recipeConditions' into AE2-Omnifactory 2021-03-30 21:58:46 -03:00
Salomão 053485a95a another try at fixing level emitters 2021-03-30 21:57:53 -03:00
ALongStringOfNumbers e910af7734 Fix advancements to check if their parent item is enabled to prevent more logging 2021-03-30 15:36:25 -07:00
Salomão 59d7bd6c16 JEI recipe transfer fixes
re-checks the amount of items in the recipe
only do fuzzy search for damageable items
2021-03-29 21:20:46 -03:00
Salomão 1a11462ddd can now drag encoded patterns on the interface terminal 2021-03-29 01:53:59 -03:00
Salomão 77d615559f Add proper button and tooltips to interface terminal 2021-03-28 16:20:37 -03:00
ALongStringOfNumbers 6878bfa4b0 Fix parts 2021-03-27 01:26:29 -07:00
ALongStringOfNumbers f1d50eca1a More minor fixes 2021-03-26 22:10:24 -07:00
ALongStringOfNumbers 4ee32dd0b0 Fix some recipes not showing up due to bad conditions 2021-03-26 21:48:03 -07:00
ALongStringOfNumbers 66e589324a Make recipes and advancements conditional
Fix crash when fluix was disabled
2021-03-26 19:12:49 -07:00
Salomão 362b001cb4 level emitter dying fix 2021-03-25 22:48:42 -03:00
Salomão b6fd4b3c0f changed priority of JEI items on the 2021-03-23 22:23:58 -03:00
Salomão e364603a5a Changed level emitters to update only once when they tick 2021-03-17 21:35:26 -03:00
Salomão c58bebc346 Fix gregtech tileentities showing up as unnamed or draconium lens 2021-03-07 23:59:39 -03:00
Salomão 97f11f0c61 Fix storage drawers showing up as nothing on interface terminal 2021-03-07 23:56:52 -03:00
Salomão 5c2fa72f95 mix pattern terminal multiplying items above maxitemstack size 2021-03-07 00:01:01 -03:00
Salomão ebd8501301 fix inaccessible items setting in storage bus not being respected 2021-03-07 00:00:16 -03:00
Salomão fa07247bd7 Revert "also shrink the fluid skiplist if the tanks change sizes"
This reverts commit 892c919ee2.
2021-03-04 23:08:08 -03:00
Salomão 95d25ddf47 Revert "Skip un-extractable slots."
This reverts commit e2e6f6e83f.
2021-03-04 23:07:58 -03:00
Salomão 7a45e1faf4 Revert "rebuild skipslotlist if the the inventory grows or shrinks"
This reverts commit 7796c6d4b6.
2021-03-04 23:07:34 -03:00
Salomão 1f88494832 fix not being able to swap patterns on interface terminal 2021-03-03 09:57:02 -03:00
PrototypeTrousers c629b4e0cf Merge pull request #4 from Theisyat/AE2-Omnifactory
Fixed 'Only show Empty' in Interface Terminal
2021-03-02 19:56:16 -03:00
PrototypeTrousers 65ca607134 Merge branch 'AE2-Omnifactory' into AE2-Omnifactory 2021-03-02 19:55:52 -03:00
Salomão 898c07ca01 fix toggling full interfaces hiding all interfaces 2021-03-02 18:45:14 -03:00
Theisyat 883c267aa8 Fixed Interface Terminal and Added Stuff
Fixed 'Hide Full' Button

First Free Molecular Assembler Button

Added Button in Interface Terminal, which Searches for 'Molecular
Assembler' and sets the Interface Terminal to only show Assemblers with
free Slots.
2021-03-02 07:00:48 +01:00
Salomão 22cf913708 highlight interfaces from interface terminal. 2021-02-28 21:32:11 -03:00
Salomão b4ba1af1ec bind BlockPos of the interface on the list 2021-02-28 02:03:00 -03:00
Salomão 892c919ee2 also shrink the fluid skiplist if the tanks change sizes 2021-02-24 18:08:57 -03:00
Salomão a65b3d2ceb fix interface terminal GUI 2021-02-24 13:24:04 -03:00
Salomão c826a3e24f Add second search bar to Interface Terminal 2021-02-23 20:48:45 -03:00
Salomão fc98505f22 even more JEI integration
get ingredient from the crafting calculation GUIs
2021-02-22 22:33:05 -03:00
Salomão ea54ccbcf5 More JEI integration 2021-02-22 18:35:46 -03:00
Salomão 7796c6d4b6 rebuild skipslotlist if the the inventory grows or shrinks 2021-02-22 14:33:06 -03:00
379 changed files with 6059 additions and 165 deletions
+2 -1
View File
@@ -85,7 +85,8 @@ configurations {
}
dependencies {
deobfCompile "com.jaquadro.minecraft.storagedrawers:StorageDrawers:1.12.2-5.4.2:api"
compileOnly "com.jaquadro.minecraft.storagedrawers:StorageDrawers:1.12.2-5.4.2:api"
compileOnly "gregtechce:gregtech:1.12.2:1.12.0.662"
// installable runtime dependencies
mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
@@ -26,5 +26,20 @@ package appeng.api.config;
public enum ActionItems
{
WRENCH, CLOSE, STASH, ENCODE, SUBSTITUTION, MULTIPLY_BY_TWO, MULTIPLY_BY_THREE, INCREASE_BY_ONE, DIVIDE_BY_TWO, DIVIDE_BY_THREE, DECREASE_BY_ONE, MAX_COUNT
WRENCH,
CLOSE,
STASH,
ENCODE,
SUBSTITUTION,
MULTIPLY_BY_TWO,
MULTIPLY_BY_THREE,
INCREASE_BY_ONE,
DIVIDE_BY_TWO,
DIVIDE_BY_THREE,
DECREASE_BY_ONE,
MAX_COUNT,
FREE_MOLECULAR_SLOT_SHORTCUT,
TOGGLE_SHOW_FULL_INTERFACES_ON,
TOGGLE_SHOW_FULL_INTERFACES_OFF,
HIGHLIGHT_INTERFACE
}
@@ -25,6 +25,7 @@ import java.util.EnumMap;
import java.util.List;
import java.util.Random;
import appeng.helpers.HighlighterHandler;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.settings.KeyBinding;
@@ -37,6 +38,7 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.client.event.RenderLivingEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.client.model.ModelLoaderRegistry;
import net.minecraftforge.common.ForgeModContainer;
@@ -106,6 +108,11 @@ public class ClientHelper extends ServerHelper
}
}
@SubscribeEvent
public void renderWorldLastEvent( RenderWorldLastEvent event) {
HighlighterHandler.tick(event);
}
@Override
public World getWorld()
{
+80 -2
View File
@@ -31,11 +31,13 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import appeng.tile.inventory.AppEngInternalInventory;
import com.google.common.base.Joiner;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.items.IItemHandler;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
@@ -378,6 +380,59 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
}
}
}
else if( slot instanceof SlotDisconnected )
{
this.drag_click.add( slot );
if( this.drag_click.size() > 1 )
{
if( !itemstack.isEmpty() )
{
Set<IItemHandler> visitedInterfaces = new HashSet<>();
for( final Slot dr : this.drag_click )
{
IItemHandler interfaceHandler = ( (SlotDisconnected) slot ).getSlot().getInventory();
if (visitedInterfaces.contains( interfaceHandler )) break;
visitedInterfaces.add( interfaceHandler );
boolean canInsert = true;
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
{
if( ItemStack.areItemStacksEqual( interfaceHandler.getStackInSlot( s ), itemstack ) )
{
canInsert = false;
break;
}
}
if( canInsert )
{
if( slot.getStack().isEmpty() )
{
InventoryAction action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
final PacketInventoryAction p = new PacketInventoryAction( action, dr.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
NetworkHandler.instance().sendToServer( p );
}
}
}
}
else if( isShiftKeyDown() )
{
for( final Slot dr : this.drag_click )
{
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 );
}
}
}
}
}
else
{
super.mouseClickMove( x, y, c, d );
@@ -471,12 +526,35 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
if( slot instanceof SlotDisconnected )
{
if( this.drag_click.size() > 1 )
{
return;
}
InventoryAction action = null;
switch( clickType )
switch ( clickType )
{
case PICKUP: // pickup / set-down.
action = ( mouseButton == 1 ) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
if( slot.getStack().isEmpty() && !player.inventory.getItemStack().isEmpty() )
{
boolean canInsert = true;
IItemHandler interfaceHandler = ( (SlotDisconnected) slot ).getSlot().getInventory();
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
{
if( ItemStack.areItemStacksEqual( interfaceHandler.getStackInSlot( s ), player.inventory.getItemStack() ) )
{
canInsert = false;
break;
}
}
if( canInsert )
{
action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
}
break;
}
if( !slot.getStack().isEmpty() && player.inventory.getItemStack().getCount() <= 1 ) action = InventoryAction.PICKUP_OR_SET_DOWN;
break;
case QUICK_MOVE:
action = ( mouseButton == 1 ) ? InventoryAction.PICKUP_SINGLE : InventoryAction.SHIFT_CLICK;
@@ -0,0 +1,97 @@
package appeng.client.gui;
import javax.annotation.Nullable;
import appeng.api.storage.data.IAEItemStack;
import appeng.client.gui.implementations.GuiCraftAmount;
import appeng.client.gui.implementations.GuiCraftConfirm;
import appeng.client.gui.implementations.GuiCraftingCPU;
import appeng.client.gui.widgets.GuiCustomSlot;
import appeng.container.implementations.ContainerCraftAmount;
import mezz.jei.api.gui.IAdvancedGuiHandler;
import net.minecraft.client.renderer.RenderItem;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>
{
@Override
public Class<AEBaseGui> getGuiContainerClass()
{
return AEBaseGui.class;
}
@Nullable
@Override
public List<Rectangle> getGuiExtraAreas( AEBaseGui guiContainer )
{
return Collections.emptyList();
}
@Nullable
@Override
public Object getIngredientUnderMouse( AEBaseGui guiContainer, int mouseX, int mouseY )
{
List<IAEItemStack> visual = new ArrayList<>();
int guiSlotIdx = 0;
Object result = null;
if( guiContainer instanceof GuiCraftConfirm )
{
guiSlotIdx = getSlotidx( guiContainer, mouseX, mouseY, ( (GuiCraftConfirm) guiContainer ).getDisplayedRows() );
visual = ( (GuiCraftConfirm) guiContainer ).getVisual();
if( guiSlotIdx < visual.size() && guiSlotIdx != -1 )
{
result = visual.get( guiSlotIdx ).getDefinition();
}
else
{
return null;
}
}
if( guiContainer instanceof GuiCraftingCPU )
{
guiSlotIdx = getSlotidx( guiContainer, mouseX, mouseY, ( (GuiCraftingCPU) guiContainer ).getDisplayedRows() );
visual = ( (GuiCraftingCPU) guiContainer ).getVisual();
if( guiSlotIdx < visual.size() && guiSlotIdx != -1 )
{
result = visual.get( guiSlotIdx ).getDefinition();
}
else
{
return null;
}
}
if( guiContainer instanceof GuiCraftAmount )
{
if( guiContainer.getSlotUnderMouse() != null )
{
result = guiContainer.getSlotUnderMouse().getStack();
}
}
return result;
}
private int getSlotidx(AEBaseGui guiContainer, int mouseX, int mouseY, int rows)
{
int guileft = guiContainer.getGuiLeft();
int guitop = guiContainer.getGuiTop();
int currentScroll = guiContainer.getScrollBar().getCurrentScroll();
final int xo = 9;
final int yo = 19;
int guiSlotx = ( mouseX - guileft - xo ) / 67;
if( guiSlotx > 2 || mouseX < guileft + xo ) return -1;
int guiSloty = ( mouseY - guitop - yo ) / 23;
if( guiSloty > ( rows - 1 ) || mouseY < guitop + yo ) return -1;
return ( guiSloty * 3 ) + guiSlotx + ( currentScroll * 3 );
}
}
@@ -582,4 +582,14 @@ public class GuiCraftConfirm extends AEBaseGui
}
}
}
public List<IAEItemStack> getVisual()
{
return visual;
}
public int getDisplayedRows()
{
return this.rows;
}
}
@@ -493,4 +493,14 @@ public class GuiCraftingCPU extends AEBaseGui implements ISortSource
{
return ViewItems.ALL;
}
public List<IAEItemStack> getVisual()
{
return visual;
}
public int getDisplayedRows()
{
return DISPLAYED_ROWS;
}
}
@@ -20,20 +20,17 @@ package appeng.client.gui.implementations;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.*;
import appeng.api.config.ActionItems;
import appeng.api.config.Settings;
import appeng.client.gui.widgets.GuiImgButton;
import appeng.util.BlockPosUtils;
import com.google.common.collect.HashMultimap;
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 net.minecraft.nbt.NBTTagList;
@@ -49,6 +46,12 @@ import appeng.container.implementations.ContainerInterfaceTerminal;
import appeng.core.localization.GuiText;
import appeng.parts.reporting.PartInterfaceTerminal;
import appeng.util.Platform;
import net.minecraft.nbt.NBTUtil;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentString;
import static appeng.client.render.BlockPosHighlighter.hilightBlock;
public class GuiInterfaceTerminal extends AEBaseGui
@@ -57,26 +60,33 @@ public class GuiInterfaceTerminal extends AEBaseGui
private static final int LINES_ON_PAGE = 6;
// TODO: copied from GuiMEMonitorable. It looks not changed, maybe unneeded?
private final int offsetX = 9;
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 ArrayList<String> names = new ArrayList<>();
private final ArrayList<Object> lines = new ArrayList<>();
private final Map<String, Set<Object>> cachedSearches = new WeakHashMap<>();
private boolean refreshList = false;
private MEGuiTextField searchField;
private MEGuiTextField searchFieldOutputs;
private MEGuiTextField searchFieldInputs;
private PartInterfaceTerminal partInterfaceTerminal;
private GuiButton guiButtonHide;
private GuiButton guiButtonNextAssembler;
public GuiInterfaceTerminal( final InventoryPlayer inventoryPlayer, final PartInterfaceTerminal te )
{
super( new ContainerInterfaceTerminal( inventoryPlayer, te ) );
this.partInterfaceTerminal = te;
final GuiScrollbar scrollbar = new GuiScrollbar();
this.setScrollBar( scrollbar );
this.xSize = 195;
this.ySize = 222;
this.xSize = 208;
this.ySize = 256;
}
@Override
@@ -84,36 +94,64 @@ public class GuiInterfaceTerminal extends AEBaseGui
{
super.initGui();
this.getScrollBar().setLeft( 175 );
this.getScrollBar().setLeft( 189 );
this.getScrollBar().setHeight( 106 );
this.getScrollBar().setTop( 18 );
this.getScrollBar().setTop( 51 );
this.searchField = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 104, this.offsetX ), this.guiTop + 4, 65, 12 );
this.searchField.setEnableBackgroundDrawing( false );
this.searchField.setMaxStringLength( 25 );
this.searchField.setTextColor( 0xFFFFFF );
this.searchField.setVisible( true );
this.searchField.setFocused( true );
this.searchFieldInputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 32, this.offsetX ), this.guiTop + 25, 65, 12 );
this.searchFieldInputs.setEnableBackgroundDrawing( false );
this.searchFieldInputs.setMaxStringLength( 25 );
this.searchFieldInputs.setTextColor( 0xFFFFFF );
this.searchFieldInputs.setVisible( true );
this.searchFieldInputs.setFocused( false );
this.searchFieldOutputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 32, this.offsetX ), this.guiTop + 38, 65, 12 );
this.searchFieldOutputs.setEnableBackgroundDrawing( false );
this.searchFieldOutputs.setMaxStringLength( 25 );
this.searchFieldOutputs.setTextColor( 0xFFFFFF );
this.searchFieldOutputs.setVisible( true );
this.searchFieldOutputs.setFocused( true );
this.searchFieldInputs.setText( partInterfaceTerminal.in );
this.searchFieldOutputs.setText( partInterfaceTerminal.out );
}
@Override
public void onGuiClosed()
{
partInterfaceTerminal.saveSearchStrings( this.searchFieldInputs.getText().toLowerCase(), this.searchFieldOutputs.getText().toLowerCase() );
super.onGuiClosed();
}
@Override
protected boolean isPointInRegion( int rectX, int rectY, int rectWidth, int rectHeight, int pointX, int pointY )
{
if( searchFieldInputs.isMouseIn( pointX, pointY ) ) drawTooltip( pointX - guiLeft - offsetX, pointY - guiTop , "Inputs OR names" );
else if( searchFieldOutputs.isMouseIn( pointX, pointY ) ) drawTooltip( pointX - guiLeft - offsetX, pointY - guiTop, "Outputs OR names" );
return super.isPointInRegion( rectX, rectY, rectWidth, rectHeight, pointX, pointY );
}
@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.InterfaceTerminal.getLocal() ), 8, 6, 4210752 );
this.fontRenderer.drawString( GuiText.inventory.getLocal(), 8, this.ySize - 96 + 3, 4210752 );
this.fontRenderer.drawString( GuiText.inventory.getLocal(), this.offsetX + 2, this.ySize - 96 + 3, 4210752 );
final int ex = this.getScrollBar().getCurrentScroll();
final Iterator<Slot> o = this.inventorySlots.inventorySlots.iterator();
while( o.hasNext() )
{
if( o.next() instanceof SlotDisconnected )
{
o.remove();
}
}
this.guiButtonNextAssembler = new GuiImgButton(guiLeft + 123, guiTop + 25,Settings.ACTIONS, ActionItems.FREE_MOLECULAR_SLOT_SHORTCUT);
this.buttonList.add( guiButtonNextAssembler );
int offset = 17;
guiButtonHide = new GuiImgButton( guiLeft + 141, guiTop + 25,Settings.ACTIONS, this.partInterfaceTerminal.onlyInterfacesWithFreeSlots ?
ActionItems.TOGGLE_SHOW_FULL_INTERFACES_OFF :
ActionItems.TOGGLE_SHOW_FULL_INTERFACES_ON);
this.buttonList.add( guiButtonHide );
this.inventorySlots.inventorySlots.removeIf( slot -> slot instanceof SlotDisconnected );
int offset = 51;
for( int x = 0; x < LINES_ON_PAGE && ex + x < this.lines.size(); x++ )
{
final Object lineObj = this.lines.get( ex + x );
@@ -122,8 +160,13 @@ public class GuiInterfaceTerminal extends AEBaseGui
final ClientDCInternalInv inv = (ClientDCInternalInv) lineObj;
for( int z = 0; z < inv.getInventory().getSlots(); z++ )
{
this.inventorySlots.inventorySlots.add( new SlotDisconnected( inv, z, z * 18 + 8, 1 + offset ) );
this.inventorySlots.inventorySlots.add( new SlotDisconnected( inv, z, z * 18 + 22, 1 + offset ) );
}
GuiButton guiButton = new GuiImgButton(guiLeft + 4, guiTop + offset + 1, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE);
guiButtonHashMap.put( guiButton , inv);
this.buttonList.add( guiButton );
}
else if( lineObj instanceof String )
{
@@ -139,7 +182,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
name = name.substring( 0, name.length() - 1 );
}
this.fontRenderer.drawString( name, 10, 6 + offset, 4210752 );
this.fontRenderer.drawString( name, this.offsetX + 2, 6 + offset, 4210752 );
}
offset += 18;
}
@@ -148,24 +191,66 @@ public class GuiInterfaceTerminal extends AEBaseGui
@Override
protected void mouseClicked( final int xCoord, final int yCoord, final int btn ) throws IOException
{
this.searchField.mouseClicked( xCoord, yCoord, btn );
this.searchFieldInputs.mouseClicked( xCoord, yCoord, btn );
if( btn == 1 && this.searchField.isMouseIn( xCoord, yCoord ) )
if( btn == 1 && this.searchFieldInputs.isMouseIn( xCoord, yCoord ) )
{
this.searchField.setText( "" );
this.searchFieldInputs.setText( "" );
this.refreshList();
}
this.searchFieldOutputs.mouseClicked( xCoord, yCoord, btn );
if( btn == 1 && this.searchFieldOutputs.isMouseIn( xCoord, yCoord ) )
{
this.searchFieldOutputs.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();
hilightBlock( blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance(blockPos, blockPos2) );
mc.player.sendStatusMessage( new TextComponentString( "The interface is now highlighted at " + "X: " + blockPos.getX() + " Y: " + blockPos.getY() + " Z: " + blockPos.getZ() ), false );
mc.player.closeScreen();
}
if (btn == guiButtonHide)
{
partInterfaceTerminal.onlyInterfacesWithFreeSlots = !partInterfaceTerminal.onlyInterfacesWithFreeSlots;
this.refreshList();
}
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.refreshList();
this.partInterfaceTerminal.onlyInterfacesWithFreeSlots = currentOnlyInterfacesWithFreeSlots;
this.searchFieldOutputs.setText(currentSearchText);
}
}
@Override
public void drawBG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
{
this.bindTexture( "guis/interfaceterminal.png" );
this.bindTexture( "guis/newinterfaceterminal.png" );
this.drawTexturedModalRect( offsetX, offsetY, 0, 0, this.xSize, this.ySize );
int offset = 17;
int offset = 51;
final int ex = this.getScrollBar().getCurrentScroll();
for( int x = 0; x < LINES_ON_PAGE && ex + x < this.lines.size(); x++ )
@@ -177,14 +262,19 @@ public class GuiInterfaceTerminal extends AEBaseGui
GlStateManager.color( 1, 1, 1, 1 );
final int width = inv.getInventory().getSlots() * 18;
this.drawTexturedModalRect( offsetX + 7, offsetY + offset, 7, 139, width, 18 );
this.drawTexturedModalRect( offsetX + 20, offsetY + offset, 20, 173, width, 18 );
}
offset += 18;
}
if( this.searchField != null )
if( this.searchFieldInputs != null )
{
this.searchField.drawTextBox();
this.searchFieldInputs.drawTextBox();
}
if( this.searchFieldOutputs != null )
{
this.searchFieldOutputs.drawTextBox();
}
}
@@ -193,15 +283,21 @@ public class GuiInterfaceTerminal extends AEBaseGui
{
if( !this.checkHotbarKeys( key ) )
{
if( character == ' ' && this.searchField.getText().isEmpty() )
if( character == ' ' && this.searchFieldInputs.getText().isEmpty() && this.searchFieldInputs.isFocused() )
{
return;
}
if( this.searchField.textboxKeyTyped( character, key ) )
if( character == ' ' && this.searchFieldOutputs.getText().isEmpty() && this.searchFieldOutputs.isFocused())
{
return;
}
if( this.searchFieldInputs.textboxKeyTyped( character, key ) || this.searchFieldOutputs.textboxKeyTyped( character, key ))
{
this.refreshList();
}
else
{
super.keyTyped( character, key );
@@ -227,6 +323,7 @@ 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" )) );
for( int x = 0; x < current.getInventory().getSlots(); x++ )
{
@@ -260,41 +357,68 @@ public class GuiInterfaceTerminal extends AEBaseGui
private void refreshList()
{
this.byName.clear();
this.buttonList.clear();
final String searchFilterLowerCase = this.searchField.getText().toLowerCase();
final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase();
final String searchFieldOutputs = this.searchFieldOutputs.getText().toLowerCase();
final Set<Object> cachedSearch = this.getCacheForSearchTerm( searchFilterLowerCase );
final Set<Object> cachedSearch = this.getCacheForSearchTerm( "IN:" + searchFieldInputs + " OUT:" + searchFieldOutputs + partInterfaceTerminal.onlyInterfacesWithFreeSlots);
final boolean rebuild = cachedSearch.isEmpty();
for( final ClientDCInternalInv entry : this.byId.values() )
{
// ignore inventory if not doing a full rebuild or cache already marks it as miss.
// 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 = searchFilterLowerCase.isEmpty();
boolean found = (searchFieldInputs.isEmpty() && searchFieldOutputs.isEmpty() && !partInterfaceTerminal.onlyInterfacesWithFreeSlots);
// Search if the current inventory holds a pattern containing the search term.
if( !found && !searchFilterLowerCase.isEmpty() )
if( !found )
{
for( final ItemStack itemStack : entry.getInventory() )
{
found = this.itemStackMatchesSearchTerm( itemStack, searchFilterLowerCase );
if( !searchFieldInputs.isEmpty() && !searchFieldOutputs.isEmpty() )
found = ( this.itemStackMatchesSearchTerm( itemStack, searchFieldInputs, 0 ) || this.itemStackMatchesSearchTerm( itemStack, searchFieldOutputs, 1 ) );
else if( !searchFieldInputs.isEmpty() )
found = ( this.itemStackMatchesSearchTerm( itemStack, searchFieldInputs, 0 ) );
else if( !searchFieldOutputs.isEmpty() )
found = ( this.itemStackMatchesSearchTerm( itemStack, searchFieldOutputs, 1 ) );
if( found )
{
break;
}
}
}
// If only Interfaces with empty slots should be shown, check that here
boolean interfaceHasFreeSlots = false;
if (partInterfaceTerminal.onlyInterfacesWithFreeSlots) {
for( final ItemStack itemStack : entry.getInventory() )
{
if(itemStack.isEmpty()){
interfaceHasFreeSlots = true;
break;
}
}
}
// if found, filter skipped or machine name matching the search term, add it
if( found || entry.getName().toLowerCase().contains( searchFilterLowerCase ) )
if( found || (entry.getName().toLowerCase().contains( searchFieldInputs ) && entry.getName().toLowerCase().contains( searchFieldOutputs )))
{
this.byName.put( entry.getName(), entry );
cachedSearch.add( entry );
if (!partInterfaceTerminal.onlyInterfacesWithFreeSlots)
{
this.byName.put( entry.getName(), entry );
cachedSearch.add( entry );
}
else if ( interfaceHasFreeSlots ){
this.byName.put( entry.getName(), entry );
cachedSearch.add( entry );
}
}
else
{
@@ -324,7 +448,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
this.getScrollBar().setRange( 0, this.lines.size() - LINES_ON_PAGE, 2 );
}
private boolean itemStackMatchesSearchTerm( final ItemStack itemStack, final String searchTerm )
private boolean itemStackMatchesSearchTerm( final ItemStack itemStack, final String searchTerm,int pass )
{
if( itemStack.isEmpty() )
{
@@ -338,14 +462,21 @@ public class GuiInterfaceTerminal extends AEBaseGui
return false;
}
// Potential later use to filter by input
// NBTTagList inTag = encodedValue.getTagList( "in", 10 );
final NBTTagList outTag = encodedValue.getTagList( "out", 10 );
NBTTagList tag = new NBTTagList();
for( int i = 0; i < outTag.tagCount(); i++ )
if (pass == 0)
{
tag = encodedValue.getTagList( "in", 10 );
}
else
{
tag = encodedValue.getTagList( "out", 10 );
}
for( int i = 0; i < tag.tagCount(); i++ )
{
final ItemStack parsedItemStack = new ItemStack( outTag.getCompoundTagAt( i ) );
final ItemStack parsedItemStack = new ItemStack( tag.getCompoundTagAt( i ) );
if( !parsedItemStack.isEmpty() )
{
final String displayName = Platform
@@ -142,6 +142,11 @@ public class GuiImgButton extends GuiButton implements ITooltip
this.registerApp( 11 + 4 * 16, Settings.ACTIONS, ActionItems.DECREASE_BY_ONE, ButtonToolTips.DecreaseByOne, ButtonToolTips.DecreaseByOneDesc );
this.registerApp( 12 + 4 * 16, Settings.ACTIONS, ActionItems.MAX_COUNT, ButtonToolTips.MaxCount, ButtonToolTips.MaxCountDesc );
this.registerApp( 6 + 5 * 16, Settings.ACTIONS, ActionItems.FREE_MOLECULAR_SLOT_SHORTCUT, ButtonToolTips.FreeMolecularSlotShortcut, ButtonToolTips.FreeMolecularSlotShortcutDesc );
this.registerApp( 7 + 5 * 16, Settings.ACTIONS, ActionItems.TOGGLE_SHOW_FULL_INTERFACES_ON, ButtonToolTips.ToggleShowFullInterfaces, ButtonToolTips.ToggleShowFullInterfacesOnDesc );
this.registerApp( 8 + 5 * 16, Settings.ACTIONS, ActionItems.TOGGLE_SHOW_FULL_INTERFACES_OFF, ButtonToolTips.ToggleShowFullInterfaces, ButtonToolTips.ToggleShowFullInterfacesOffDesc );
this.registerApp( 6 + 6 * 16, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE, ButtonToolTips.HighlightInterface, "" );
this.registerApp( 8, Settings.ACTIONS, ActionItems.ENCODE, ButtonToolTips.Encode, ButtonToolTips.EncodeDescription );
this.registerApp( 4 + 3 * 16, Settings.ACTIONS, ItemSubstitution.ENABLED, ButtonToolTips.Substitutions, ButtonToolTips.SubstitutionsDescEnabled );
this.registerApp( 7 + 3 * 16, Settings.ACTIONS, ItemSubstitution.DISABLED, ButtonToolTips.Substitutions, ButtonToolTips.SubstitutionsDescDisabled );
@@ -37,7 +37,7 @@ public class ClientDCInternalInv implements Comparable<ClientDCInternalInv>
public ClientDCInternalInv( final int size, final long id, final long sortBy, final String unlocalizedName )
{
this.inventory = new AppEngInternalInventory( null, size );
this.inventory = new AppEngInternalInventory( null, size, 1 );
this.unlocalizedName = unlocalizedName;
this.id = id;
this.sortBy = sortBy;
@@ -0,0 +1,25 @@
package appeng.client.render;
import net.minecraft.util.math.BlockPos;
// taken from McJty's McJtyLib
public class BlockPosHighlighter
{
private static BlockPos hilightedBlock;
private static long expireHilight;
public static void hilightBlock( BlockPos c, long expireHilight ) {
hilightedBlock = c;
BlockPosHighlighter.expireHilight = expireHilight;
}
public static BlockPos getHilightedBlock() {
return hilightedBlock;
}
public static long getExpireHilight() {
return expireHilight;
}
}
@@ -51,6 +51,12 @@ public class ContainerCraftAmount extends AEBaseContainer
this.addSlotToContainer( this.getCraftingItem() );
}
@Override
public Slot getSlot( int slotId )
{
return super.getSlot( 0 );
}
@Override
public void detectAndSendChanges()
{
@@ -28,6 +28,8 @@ 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;
@@ -78,7 +80,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
this.grid = anchor.getActionableNode().getGrid();
}
this.bindPlayerInventory( ip, 0, 222 - /* height of player inventory */82 );
this.bindPlayerInventory( ip, 14, 256 - /* height of player inventory */82 );
}
@Override
@@ -256,7 +258,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
if( hasItemInHand )
{
ItemStack extra = playerHand.removeItems( 1, ItemStack.EMPTY, null );
if( !extra.isEmpty() )
if( !extra.isEmpty() && !interfaceSlot.containsItems())
{
extra = interfaceSlot.addItems( extra );
}
@@ -378,6 +380,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
{
tag.setLong( "sortBy", inv.sortBy );
tag.setString( "un", inv.unlocalizedName );
tag.setTag("pos", NBTUtil.createPosTag( inv.pos ) );
}
for( int x = 0; x < length; x++ )
@@ -408,6 +411,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
private final String unlocalizedName;
private final IItemHandler client;
private final IItemHandler server;
private final BlockPos pos;
public InvTracker( final DualityInterface dual, final IItemHandler patterns, final String unlocalizedName )
{
@@ -415,6 +419,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
this.client = new AppEngInternalInventory( null, this.server.getSlots() );
this.unlocalizedName = unlocalizedName;
this.sortBy = dual.getSortValue();
this.pos = dual.getLocation().getPos();
}
}
@@ -291,7 +291,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
for( int x = 0; x < this.craftingSlots.length; x++ )
{
input[x] = this.craftingSlots[x].getStack();
if( !input[x].isEmpty() && input[x].getCount() * multiple > 64 )
if( !input[x].isEmpty() && input[x].getCount() * multiple > input[x].getMaxStackSize() )
{
canMultiplyInputs = false;
}
@@ -299,7 +299,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
for( final OptionalSlotFake outputSlot : this.outputSlots )
{
final ItemStack out = outputSlot.getStack();
if( !out.isEmpty() && out.getCount() * multiple > 64 )
if( !out.isEmpty() && out.getCount() * multiple > out.getMaxStackSize() )
{
canMultiplyOutputs = false;
}
@@ -369,7 +369,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
for( int x = 0; x < this.craftingSlots.length; x++ )
{
input[x] = this.craftingSlots[x].getStack();
if( !input[x].isEmpty() && input[x].getCount() + increase > 64 )
if( !input[x].isEmpty() && input[x].getCount() + increase > input[x].getMaxStackSize() )
{
canIncreaseInputs = false;
}
@@ -377,7 +377,7 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
for( final OptionalSlotFake outputSlot : this.outputSlots )
{
final ItemStack out = outputSlot.getStack();
if( !out.isEmpty() && out.getCount() + increase > 64 )
if( !out.isEmpty() && out.getCount() + increase > out.getMaxStackSize() )
{
canIncreaseOutputs = false;
}
@@ -450,11 +450,11 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
for( int x = 0; x < this.craftingSlots.length; x++ )
{
input[x] = this.craftingSlots[x].getStack();
if( !input[x].isEmpty() && 64 - input[x].getCount() > maxInputStackGrowth )
if( !input[x].isEmpty() && input[x].getMaxStackSize() - input[x].getCount() > maxInputStackGrowth )
{
maxInputStackGrowth = 64 - input[x].getCount();
maxInputStackGrowth = input[x].getMaxStackSize() - input[x].getCount();
}
if( !input[x].isEmpty() && input[x].getCount() + maxInputStackGrowth > 64 )
if( !input[x].isEmpty() && input[x].getCount() + maxInputStackGrowth > input[x].getMaxStackSize() )
{
canGrowInputs = false;
}
@@ -463,9 +463,9 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA
{
final ItemStack out = outputSlot.getStack();
{
maxOutputStackGrowth = 64 - out.getCount();
maxOutputStackGrowth = out.getMaxStackSize() - out.getCount();
}
if( !out.isEmpty() && out.getCount() + maxOutputStackGrowth > 64 )
if( !out.isEmpty() && out.getCount() + maxOutputStackGrowth > out.getMaxStackSize() )
{
canGrowOutputs = false;
}
@@ -616,7 +616,12 @@ public final class ApiBlocks implements IBlocks
private static IBlockDefinition makeStairs( String registryName, FeatureFactory registry, IBlockDefinition block )
{
return registry.block( registryName, () -> new BlockStairCommon( block.maybeBlock().get(), block.identifier() ) )
if( !block.maybeBlock().isPresent() )
{
return new BlockDefinition( registryName, null, null );
}
IBlockDefinition stairs = registry.block( registryName, () -> new BlockStairCommon( block.maybeBlock().get(), block.identifier() ) )
.features( AEFeature.DECORATIVE_BLOCKS )
.rendering( new BlockRenderingCustomizer()
{
@@ -629,6 +634,10 @@ public final class ApiBlocks implements IBlocks
}
} )
.build();
Verify.verify(stairs.maybeBlock().isPresent());
return stairs;
}
@Override
@@ -19,6 +19,7 @@
package appeng.core.localization;
import appeng.api.config.SchedulingMode;
import net.minecraft.util.text.translation.I18n;
@@ -151,6 +152,13 @@ public enum ButtonToolTips
DecreaseByOneDesc,
MaxCount,
MaxCountDesc,
FreeMolecularSlotShortcut,
FreeMolecularSlotShortcutDesc,
ToggleShowFullInterfaces,
ToggleShowFullInterfacesOnDesc,
ToggleShowFullInterfacesOffDesc,
HighlightInterface,
HighlightInterfaceDesc,
// Used in the tooltips of the items in the terminal, when moused over
ItemsStored,
@@ -24,8 +24,10 @@ import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
import appeng.api.config.FuzzyMode;
import appeng.api.storage.data.IItemList;
import appeng.container.implementations.ContainerPatternTerm;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
@@ -169,6 +171,11 @@ public class PacketJEIRecipe extends AppEngPacket
// already the correct item?
ItemStack newItem = this.canUseInSlot( x, currentItem );
if ( !cct.useRealItems() && this.recipe[x] != null ) {
if (this.recipe[x].length > 0 )
currentItem.setCount( recipe[x][0].getCount() );
}
// put away old item
if( newItem != currentItem && security.hasPermission( player, SecurityPermissions.INJECT ) )
{
@@ -208,7 +215,7 @@ public class PacketJEIRecipe extends AppEngPacket
IAEItemStack mostDamaged = null;
for( IAEItemStack is : outList )
{
if (!is.isCraftable())
if( !is.isCraftable() && is.getItem().isDamageable() )
{
if( mostDamaged == null || mostDamaged.getItemDamage() < is.getItemDamage() )
{
@@ -256,14 +263,17 @@ public class PacketJEIRecipe extends AppEngPacket
else
{
currentItem = ad.simulateSimilarRemove(recipe[x][y].getCount(), this.recipe[x][y],FuzzyMode.IGNORE_ALL, null );
if( currentItem.isEmpty() )
{
currentItem = this.recipe[x][y].copy();
}
}
}
}
}
if (!cct.useRealItems())
{
if( currentItem.isEmpty() && this.recipe[x] != null )
{
currentItem = this.recipe[x][0].copy();
}
}
}
ItemHandlerUtil.setStackInSlot( craftMatrix, x, currentItem );
}
@@ -26,7 +26,9 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import net.minecraft.item.ItemStack;
import appeng.api.config.Settings;
import appeng.api.config.StorageFilter;
import appeng.parts.misc.PartStorageBus;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidTankProperties;
@@ -62,12 +64,18 @@ public class FluidHandlerAdapter implements IMEInventory<IAEFluidStack>, IBaseMo
private final IFluidHandler fluidHandler;
private final IGridProxyable proxyable;
private final FluidHandlerAdapter.InventoryCache cache;
private StorageFilter mode;
FluidHandlerAdapter( IFluidHandler fluidHandler, IGridProxyable proxy )
{
this.fluidHandler = fluidHandler;
this.proxyable = proxy;
this.cache = new FluidHandlerAdapter.InventoryCache( this.fluidHandler );
if( this.proxyable instanceof PartStorageBus )
{
PartStorageBus partStorageBus = (PartStorageBus) this.proxyable;
this.mode = ( (StorageFilter) partStorageBus.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
}
this.cache = new FluidHandlerAdapter.InventoryCache( this.fluidHandler, this.mode);
}
@Override
@@ -196,13 +204,12 @@ public class FluidHandlerAdapter implements IMEInventory<IAEFluidStack>, IBaseMo
{
private IAEFluidStack[] cachedAeStacks = new IAEFluidStack[0];
private final IFluidHandler fluidHandler;
private ArrayList<Integer> skipSlots;
private final StorageFilter mode;
public InventoryCache( IFluidHandler fluidHandler )
public InventoryCache( IFluidHandler fluidHandler, StorageFilter mode )
{
this.mode = mode;
this.fluidHandler = fluidHandler;
this.skipSlots = new ArrayList<>(this.fluidHandler.getTankProperties().length);
}
public List<IAEFluidStack> update()
@@ -215,23 +222,20 @@ public class FluidHandlerAdapter implements IMEInventory<IAEFluidStack>, IBaseMo
if( slots > this.cachedAeStacks.length )
{
this.cachedAeStacks = Arrays.copyOf( this.cachedAeStacks, slots );
this.skipSlots = new ArrayList<>(this.fluidHandler.getTankProperties().length);
}
for( int slot = 0; slot < slots; slot++ )
{
if (skipSlots.contains( slot ))
continue;
// Save the old stuff
final IAEFluidStack oldAEFS = this.cachedAeStacks[slot];
FluidStack newFS = tankProperties[slot].getContents();
if (newFS != null) {
if (this.fluidHandler.drain( 1, false ) == null){
if( this.mode == StorageFilter.EXTRACTABLE_ONLY && newFS != null )
{
if( this.fluidHandler.drain( 1, false ) == null )
{
newFS = null;
skipSlots.add( slot );
}
}
this.handlePossibleSlotChanges( slot, oldAEFS, newFS, changes );
}
@@ -33,6 +33,8 @@ import appeng.integration.modules.gregtech.GTCEInventoryAdaptor;
import appeng.util.*;
import com.google.common.collect.ImmutableSet;
import gregtech.api.block.machines.BlockMachine;
import gregtech.api.metatileentity.MetaTileEntity;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Items;
@@ -48,6 +50,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.fml.common.Loader;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.wrapper.RangedWrapper;
@@ -109,6 +112,8 @@ import appeng.util.inv.IInventoryDestination;
import appeng.util.inv.InvOperation;
import appeng.util.item.AEItemStack;
import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
{
@@ -1235,6 +1240,13 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
final IBlockState directedBlockState = hostWorld.getBlockState( targ );
final Block directedBlock = directedBlockState.getBlock();
ItemStack what = new ItemStack( directedBlock, 1, directedBlock.getMetaFromState( directedBlockState ) );
if ( Loader.isModLoaded("gregtech") && directedBlock instanceof BlockMachine )
{
MetaTileEntity metaTileEntity = getMetaTileEntity(hostWorld, targ);
return metaTileEntity.getMetaFullName();
}
try
{
Vec3d from = new Vec3d( hostTile.getPos().getX() + 0.5, hostTile.getPos().getY() + 0.5, hostTile.getPos().getZ() + 0.5 );
@@ -0,0 +1,96 @@
package appeng.helpers;
import appeng.client.render.BlockPosHighlighter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import org.lwjgl.opengl.GL11;
// taken from McJty's McJtyLib
public class HighlighterHandler
{
public static void tick( RenderWorldLastEvent event ) {
renderHilightedBlock(event);
}
private static void renderHilightedBlock( RenderWorldLastEvent event ) {
BlockPos c = BlockPosHighlighter.getHilightedBlock();
if (c == null) {
return;
}
Minecraft mc = Minecraft.getMinecraft();
long time = System.currentTimeMillis();
if (time > BlockPosHighlighter.getExpireHilight()) {
BlockPosHighlighter.hilightBlock(null, -1);
return;
}
if (((time / 500) & 1) == 0) {
return;
}
EntityPlayerSP p = mc.player;
double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * event.getPartialTicks();
double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * event.getPartialTicks();
double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * event.getPartialTicks();
GlStateManager.pushMatrix();
GlStateManager.color(1.0f, 0, 0);
GlStateManager.glLineWidth(3);
GlStateManager.translate(-doubleX, -doubleY, -doubleZ);
GlStateManager.disableDepth();
GlStateManager.disableTexture2D();
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder buffer = tessellator.getBuffer();
float mx = c.getX();
float my = c.getY();
float mz = c.getZ();
buffer.begin( GL11.GL_LINES, DefaultVertexFormats.POSITION_COLOR);
renderHighLightedBlocksOutline(buffer, mx, my, mz, 1.0f, 0.0f, 0.0f, 1.0f);
tessellator.draw();
GlStateManager.enableTexture2D();
GlStateManager.popMatrix();
}
public static void renderHighLightedBlocksOutline(BufferBuilder buffer, float mx, float my, float mz, float r, float g, float b, float a) {
buffer.pos(mx, my, mz).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex();
buffer.pos(mx, my, mz).color(r, g, b, a).endVertex();
buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex();
buffer.pos(mx, my, mz).color(r, g, b, a).endVertex();
buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my + 1, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex();
buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex();
buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx, my + 1, mz).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my, mz).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my + 1, mz).color(r, g, b, a).endVertex();
buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx + 1, my, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx, my, mz + 1).color(r, g, b, a).endVertex();
buffer.pos(mx, my + 1, mz + 1).color(r, g, b, a).endVertex();
}
}
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import appeng.client.gui.AEGuiHandler;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
@@ -93,6 +94,9 @@ public class JEIPlugin implements IModPlugin
registry.getRecipeTransferRegistry()
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ),
Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
AEGuiHandler aeGuiHandler = new AEGuiHandler();
registry.addAdvancedGuiHandlers(aeGuiHandler);
}
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
+6 -4
View File
@@ -19,9 +19,9 @@
package appeng.me.cache;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.*;
import appeng.parts.automation.PartLevelEmitter;
import com.google.common.base.Preconditions;
import net.minecraft.crash.CrashReport;
@@ -46,6 +46,7 @@ public class TickManagerCache implements ITickManager
private final HashMap<IGridNode, TickTracker> alertable = new HashMap<>();
private final HashMap<IGridNode, TickTracker> sleeping = new HashMap<>();
private final HashMap<IGridNode, TickTracker> awake = new HashMap<>();
private final HashMap<IGridNode, TickTracker> laterTicker = new HashMap<>();
private final PriorityQueue<TickTracker> upcomingTicks = new PriorityQueue<>();
private long currentTick = 0;
@@ -86,7 +87,7 @@ public class TickManagerCache implements ITickManager
{
this.currentTick++;
while( !this.upcomingTicks.isEmpty() )
while ( !this.upcomingTicks.isEmpty() )
{
tt = this.upcomingTicks.peek();
@@ -101,7 +102,7 @@ public class TickManagerCache implements ITickManager
final int diff = (int) ( this.currentTick - tt.getLastTick() );
final TickRateModulation mod = tt.getGridTickable().tickingRequest( tt.getNode(), diff );
switch( mod )
switch ( mod )
{
case FASTER:
tt.setCurrentRate( tt.getCurrentRate() - 2 );
@@ -137,6 +138,7 @@ public class TickManagerCache implements ITickManager
tt.addEntityCrashInfo( crashreportcategory );
throw new ReportedException( crashreport );
}
PartLevelEmitter.wipeCache();
}
private void addToQueue( final TickTracker tt )
@@ -19,6 +19,7 @@
package appeng.me.storage;
import appeng.api.config.StorageFilter;
import appeng.api.networking.security.IActionSource;
import appeng.api.networking.ticking.TickRateModulation;
@@ -30,4 +31,8 @@ public interface ITickingMonitor
void setActionSource( IActionSource actionSource );
default void setMode( StorageFilter setting )
{
}
}
@@ -19,9 +19,14 @@
package appeng.parts.automation;
import java.util.Collection;
import java.util.Random;
import appeng.me.Grid;
import appeng.me.GridNode;
import appeng.util.item.AEItemStack;
import it.unimi.dsi.fastutil.objects.Object2LongMap;
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
@@ -118,6 +123,9 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
private double centerX;
private double centerY;
private double centerZ;
static Object2LongMap<Grid> gridItemCount = new Object2LongOpenHashMap<>();
static Object2ObjectOpenHashMap<Grid, Object2LongMap<AEItemStack>> fuzzyAEItemStackCount = new Object2ObjectOpenHashMap<>();
static Object2ObjectOpenHashMap<Grid, Object2LongMap<AEItemStack>> preciseAEItemStackCount = new Object2ObjectOpenHashMap<>();
@Reflected
public PartLevelEmitter( final ItemStack is )
@@ -315,40 +323,91 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
}
private void updateReportingValue( final IMEMonitor<IAEItemStack> monitor )
{
updateReportingValue( monitor,null );
}
private void updateReportingValue( final IMEMonitor<IAEItemStack> monitor, Iterable<IAEItemStack> change )
{
final IAEItemStack myStack = this.config.getAEStackInSlot( 0 );
if( myStack == null )
GridNode node = (GridNode) (this.getGridNode());
if( node != null )
{
this.lastReportedValue = 0;
for( final IAEItemStack st : monitor.getStorageList() )
final Grid g = node.getInternalGrid();
if( myStack == null )
{
this.lastReportedValue += st.getStackSize();
if( change != null )
{
if( gridItemCount.containsKey( g ) )
{
change.forEach( iaeItemStack -> lastReportedValue += iaeItemStack.getStackSize() );
}
}
gridItemCount.computeIfAbsent( g, ( aLong ) -> {
this.lastReportedValue = 0;
monitor.getStorageList().forEach( iaeItemStack -> lastReportedValue += iaeItemStack.getStackSize() );
return ( lastReportedValue );
} );
this.lastReportedValue = gridItemCount.get( g );
}
}
else if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
{
this.lastReportedValue = 0;
final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE );
final Collection<IAEItemStack> fuzzyList = monitor.getStorageList().findFuzzy( myStack, fzMode );
for( final IAEItemStack st : fuzzyList )
else if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
{
this.lastReportedValue += st.getStackSize();
}
}
else
{
final IAEItemStack r = monitor.getStorageList().findPrecise( myStack );
if( r == null )
{
this.lastReportedValue = 0;
final FuzzyMode fzMode = (FuzzyMode) this.getConfigManager().getSetting( Settings.FUZZY_MODE );
if( change != null )
{
if( fuzzyAEItemStackCount.containsKey( g ) )
{
change.forEach( iaeItemStack -> {
if( iaeItemStack.sameOre( myStack ) ) lastReportedValue += iaeItemStack.getStackSize();
} );
}
}
fuzzyAEItemStackCount.computeIfAbsent( g, ( grid -> new Object2LongOpenHashMap<>() ) );
fuzzyAEItemStackCount.get( g ).computeIfAbsent( (AEItemStack) myStack, ( aLong -> {
this.lastReportedValue = 0;
monitor.getStorageList().findFuzzy( myStack, fzMode ).forEach( iaeItemStack -> lastReportedValue += iaeItemStack.getStackSize() );
return ( lastReportedValue );
} ) );
this.lastReportedValue = fuzzyAEItemStackCount.get( g ).get( myStack );
if( this.lastReportedValue == 0 )
{
fuzzyAEItemStackCount.get( g ).remove( myStack );
fuzzyAEItemStackCount.trim();
}
}
else
{
this.lastReportedValue = r.getStackSize();
if( change != null )
{
if( preciseAEItemStackCount.containsKey( g ) )
{
change.forEach( iaeItemStack -> {
if( iaeItemStack.isSameType( myStack ) ) lastReportedValue += iaeItemStack.getStackSize();
} );
}
}
preciseAEItemStackCount.computeIfAbsent( g, ( grid -> new Object2LongOpenHashMap<>() ) );
preciseAEItemStackCount.get( g ).computeIfAbsent( (AEItemStack) myStack, ( aLong -> {
this.lastReportedValue = 0;
IAEItemStack precise = monitor.getStorageList().findPrecise( myStack );
if( precise != null ) lastReportedValue = precise.getStackSize();
return ( lastReportedValue );
} ) );
this.lastReportedValue = preciseAEItemStackCount.get( g ).get( myStack );
if( this.lastReportedValue == 0 )
{
preciseAEItemStackCount.get( g ).remove( myStack );
preciseAEItemStackCount.trim();
}
}
}
this.updateState();
}
@@ -400,7 +459,7 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
@Override
public void postChange( final IBaseMonitor<IAEItemStack> monitor, final Iterable<IAEItemStack> change, final IActionSource actionSource )
{
this.updateReportingValue( (IMEMonitor<IAEItemStack>) monitor );
this.updateReportingValue( (IMEMonitor<IAEItemStack>) monitor, change );
}
@Override
@@ -576,4 +635,10 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
return this.isLevelEmitterOn() ? MODEL_ON_OFF : MODEL_OFF_OFF;
}
}
public static void wipeCache(){
fuzzyAEItemStackCount.clear();
preciseAEItemStackCount.clear();
gridItemCount.clear();
}
}
@@ -26,9 +26,9 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import it.unimi.dsi.fastutil.ints.IntList;
import appeng.api.config.Settings;
import appeng.api.config.StorageFilter;
import net.minecraft.item.ItemStack;
import net.minecraft.util.NonNullList;
import net.minecraftforge.items.IItemHandler;
import appeng.api.AEApi;
@@ -59,12 +59,18 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
private final IItemHandler itemHandler;
private final IGridProxyable proxyable;
private final InventoryCache cache;
private StorageFilter mode;
ItemHandlerAdapter( IItemHandler itemHandler, IGridProxyable proxy )
{
this.itemHandler = itemHandler;
this.proxyable = proxy;
this.cache = new InventoryCache( this.itemHandler );
if( this.proxyable instanceof PartStorageBus )
{
PartStorageBus partStorageBus = (PartStorageBus) this.proxyable;
this.mode = ( (StorageFilter) partStorageBus.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
}
this.cache = new InventoryCache( this.itemHandler, this.mode );
}
@Override
@@ -270,12 +276,12 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
{
private IAEItemStack[] cachedAeStacks = new IAEItemStack[0];
private final IItemHandler itemHandler;
private ArrayList<Integer> skipSlots;
private final StorageFilter mode;
public InventoryCache( IItemHandler itemHandler )
public InventoryCache( IItemHandler itemHandler, StorageFilter mode )
{
this.mode = mode;
this.itemHandler = itemHandler;
this.skipSlots = new ArrayList<>(this.itemHandler.getSlots());
}
public IItemList<IAEItemStack> getAvailableItems( IItemList<IAEItemStack> out )
@@ -293,20 +299,18 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
if( slots > this.cachedAeStacks.length )
{
this.cachedAeStacks = Arrays.copyOf( this.cachedAeStacks, slots );
this.skipSlots = new ArrayList<>(this.itemHandler.getSlots());
}
for( int slot = 0; slot < slots; slot++ )
{
if (skipSlots.contains( slot ))
continue;
// Save the old stuff
final IAEItemStack oldAeIS = this.cachedAeStacks[slot];
ItemStack newIS = this.itemHandler.getStackInSlot( slot );
if (!newIS.isEmpty()) {
if (this.itemHandler.extractItem( slot,1,true ).isEmpty()){
if( this.mode == StorageFilter.EXTRACTABLE_ONLY && !newIS.isEmpty() )
{
if( this.itemHandler.extractItem( slot, 1, true ).isEmpty() )
{
newIS = ItemStack.EMPTY;
skipSlots.add( slot );
}
}
this.handlePossibleSlotChanges( slot, oldAeIS, newIS, changes );
@@ -484,6 +484,7 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
{
this.monitor = (ITickingMonitor) inv;
this.monitor.setActionSource( new MachineSource( this ) );
this.monitor.setMode( (StorageFilter) this.getConfigManager().getSetting( Settings.STORAGE_FILTER ) );
}
if( inv != null )
@@ -44,6 +44,9 @@ public class PartInterfaceTerminal extends AbstractPartDisplay
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 String out = "";
public boolean onlyInterfacesWithFreeSlots = false;
public PartInterfaceTerminal( final ItemStack is )
{
@@ -69,4 +72,8 @@ public class PartInterfaceTerminal extends AbstractPartDisplay
return this.selectModel( MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL );
}
public void saveSearchStrings(String in, String out){
this.in = in;
this.out = out;
}
}
@@ -0,0 +1,36 @@
package appeng.recipes.factories.conditions;
import appeng.core.Api;
import appeng.core.AppEng;
import com.google.gson.JsonObject;
import net.minecraft.util.JsonUtils;
import net.minecraftforge.common.crafting.IConditionFactory;
import net.minecraftforge.common.crafting.JsonContext;
import java.util.function.BooleanSupplier;
public class PartExists implements IConditionFactory {
private static final String JSON_MATERIAL_KEY = "part";
@Override
public BooleanSupplier parse(JsonContext jsonContext, JsonObject jsonObject )
{
final boolean result;
if( JsonUtils.isString( jsonObject, JSON_MATERIAL_KEY ) )
{
final String part = JsonUtils.getString( jsonObject, JSON_MATERIAL_KEY );
final Object item = Api.INSTANCE.registries().recipes().resolveItem( AppEng.MOD_ID, part );
result = item != null;
}
else
{
result = false;
}
return () -> result;
}
}
@@ -0,0 +1,41 @@
package appeng.util;
import net.minecraft.util.math.BlockPos;
public class BlockPosUtils
{
public static long getDistance( BlockPos blockPos, BlockPos blockPos2 )
{
int x;
if( (blockPos.getX() > 0 && blockPos2.getX() > 0) || (blockPos.getX() < 0 && blockPos2.getX() < 0))
{
x = blockPos.getX() - blockPos2.getX();
}
else
{
x = blockPos.getX() + blockPos2.getX();
}
int y;
if( (blockPos.getY() > 0 && blockPos2.getY() > 0) || (blockPos.getY() < 0 && blockPos2.getY() < 0) )
{
y = blockPos.getY() - blockPos2.getY();
}
else
{
y = blockPos.getY() + blockPos2.getY();
}
int z;
if( (blockPos.getZ() > 0 && blockPos2.getZ() > 0) || (blockPos.getZ() < 0 && blockPos2.getZ() < 0) )
{
z = blockPos.getZ() - blockPos2.getZ();
}
else
{
z = blockPos.getZ() + blockPos2.getZ();
}
return Math.abs( x ) + Math.abs( y ) + Math.abs( z );
}
}
@@ -197,7 +197,7 @@ public class AdaptorItemRepository extends InventoryAdaptor
@Override
public boolean hasSlots()
{
return false;
return true;
}
@Override
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:part",
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:1"
}
],
"display": {
"icon": {
"item": "appliedenergistics2:material",
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:1"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:charger"
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_compass"
}
],
"display": {
"icon": {
"item": "appliedenergistics2:sky_compass"
@@ -1,4 +1,31 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:controller"
@@ -1,4 +1,55 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:crafting_storage_1k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:crafting_storage_4k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:crafting_storage_16k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:crafting_storage_64k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:360"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:340"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:crafting_storage_64k"
@@ -1,4 +1,35 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:360"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:part",
@@ -1,4 +1,27 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:facade"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:facade"
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:material",
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_growth_accelerator"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:quartz_growth_accelerator"
@@ -1,4 +1,27 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:interface"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:interface"
@@ -1,4 +1,46 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_1k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_4k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_16k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_64k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:io_port"
}
],
"display": {
"icon": {
"item": "appliedenergistics2:io_port"
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:part",
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:part",
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:part",
@@ -1,4 +1,35 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:network_tool"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:network_tool"
@@ -1,4 +1,27 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:460"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:part",
@@ -1,4 +1,39 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:360"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:340"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:part",
@@ -1,4 +1,46 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_1k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_4k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_16k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_64k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:portable_cell"
}
],
"display": {
"icon": {
"item": "appliedenergistics2:portable_cell"
@@ -1,4 +1,27 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:material",
@@ -1,4 +1,31 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:460"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quantum_link"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:quantum_link"
@@ -1,4 +1,50 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_1k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_4k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_16k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_64k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:io_port"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:spatial_io_port"
}
],
"display": {
"icon": {
"item": "appliedenergistics2:spatial_storage_cell_128_cubed"
@@ -1,4 +1,50 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_1k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_4k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_16k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_64k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:io_port"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:spatial_io_port"
}
],
"display": {
"icon": {
"item": "appliedenergistics2:spatial_io_port"
@@ -1,4 +1,31 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:charger"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:7"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:16"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:interface"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:part:220"
}
]
}
],
"display": {
"icon": {
"item": "appliedenergistics2:part",
@@ -1,4 +1,42 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_1k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_4k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_16k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:storage_cell_64k"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:13"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:14"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:15"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:material:19"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:controller"
}
],
"display": {
"icon": {
"item": "appliedenergistics2:storage_cell_64k"
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.fluix_dust"
}
],
"type": "appliedenergistics2:grinder",
"input": {
"type": "forge:ore_dict",
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_block"
}
],
"type": "appliedenergistics2:grinder",
"input": {
"item": "appliedenergistics2:sky_stone_block"
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.engineering_processor"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.engineering_processor_print"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.silicon_print"
}
]
}
],
"type": "appliedenergistics2:inscriber",
"mode": "press",
"result": {
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.calculation_processor_press"
}
],
"type": "appliedenergistics2:inscriber",
"mode": "inscribe",
"result": {
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.calculation_processor_print"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.calculation_processor_press"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.purified_certus_quartz_crystal"
}
]
}
],
"type": "appliedenergistics2:inscriber",
"mode": "inscribe",
"result": {
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.calculation_processor"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.calculation_processor_print"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.silicon_print"
}
]
}
],
"type": "appliedenergistics2:inscriber",
"mode": "press",
"result": {
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.engineering_processor_press"
}
],
"type": "appliedenergistics2:inscriber",
"mode": "inscribe",
"result": {
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.engineering_processor_print"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.engineering_processor_press"
}
]
}
],
"type": "appliedenergistics2:inscriber",
"mode": "inscribe",
"result": {
@@ -1,4 +1,23 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.logic_processor"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.logic_processor_print"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.silicon_print"
}
]
}
],
"type": "appliedenergistics2:inscriber",
"mode": "press",
"result": {
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.logic_processor_press"
}
],
"type": "appliedenergistics2:inscriber",
"mode": "inscribe",
"result": {
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.logic_processor_print"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.logic_processor_press"
}
]
}
],
"type": "appliedenergistics2:inscriber",
"mode": "inscribe",
"result": {
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.silicon_press"
}
],
"type": "appliedenergistics2:inscriber",
"mode": "inscribe",
"result": {
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.silicon_print"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.silicon_press"
}
]
}
],
"type": "appliedenergistics2:inscriber",
"mode": "inscribe",
"result": {
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.flour"
}
],
"type": "appliedenergistics2:smelt",
"result": {
"item": "minecraft:bread"
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.silicon"
}
],
"type": "appliedenergistics2:smelt",
"result": {
"part": "material.silicon"
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:smooth_sky_stone_block"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_block"
}
]
}
],
"type": "appliedenergistics2:smelt",
"result": {
"item": "appliedenergistics2:smooth_sky_stone_block"
@@ -363,6 +363,12 @@ gui.tooltips.appliedenergistics2.DecreaseByOne=Decrease one
gui.tooltips.appliedenergistics2.DecreaseByOneDesc=Will try to add decrease the items set in the crafting slots by one DOES NOT MAINTAIN INGREDIENT RATIO
gui.tooltips.appliedenergistics2.MaxCount=Maximize slot count
gui.tooltips.appliedenergistics2.MaxCountDesc=Will maximize the output maintaing the input ratio of the items set in the crafting slots
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcut=Show Crafting interfaces with free slots
gui.tooltips.appliedenergistics2.FreeMolecularSlotShortcutDesc=Shortcut that toggles interfaces with free slots and searches for molecular assemblers
gui.tooltips.appliedenergistics2.ToggleShowFullInterfaces=Toggles showing interfaces with full slots
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOnDesc=Showing all interfaces
gui.tooltips.appliedenergistics2.ToggleShowFullInterfacesOffDesc=Showing only interfaces with free slots
gui.tooltips.appliedenergistics2.HighlightInterface=Highlight interface
// Units
gui.appliedenergistics2.units.appliedenergstics=AE
@@ -1,7 +1,8 @@
{
"conditions": {
"material_exists": "appeng.recipes.factories.conditions.MaterialExists",
"features": "appeng.recipes.factories.conditions.Features"
"features": "appeng.recipes.factories.conditions.Features",
"part_exists": "appeng.recipes.factories.conditions.PartExists"
},
"ingredients": {
"part": "appeng.recipes.factories.ingredients.PartIngredientFactory"
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_block"
}
],
"result": {
"item": "appliedenergistics2:quartz_block"
},
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_block"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.purified_certus_quartz_crystal"
}
]
}
],
"result": {
"item": "appliedenergistics2:quartz_block"
},
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_pillar"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:quartz_pillar",
"count": 2
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:chiseled_quartz_block"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:chiseled_quartz_block",
"count": 2
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:fluix_block"
}
],
"result": {
"item": "appliedenergistics2:fluix_block"
},
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:fluix_block"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.purified_fluix_crystal"
}
]
}
],
"result": {
"item": "appliedenergistics2:fluix_block"
},
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:light_detector"
}
],
"result": {
"item": "appliedenergistics2:light_detector"
},
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "appliedenergistics2:material_exists",
"material": "material.purified_nether_quartz_crystal"
}
],
"result": {
"item": "minecraft:quartz_block",
"data": 0
@@ -1,4 +1,20 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_fixture"
},
{
"type": "appliedenergistics2:material_exists",
"material": "material.certus_quartz_crystal_charged"
}
]
}
],
"result": {
"item": "appliedenergistics2:quartz_fixture",
"count": 2
@@ -1,4 +1,10 @@
{
"conditions": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_glass"
}
],
"result": {
"item": "appliedenergistics2:quartz_glass",
"count": 4
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_vibrant_glass"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_glass"
}
]
}
],
"result": {
"item": "appliedenergistics2:quartz_vibrant_glass"
},
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_brick"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:smooth_sky_stone_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:sky_stone_brick"
},
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_small_brick"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_brick"
}
]
}
],
"result": {
"item": "appliedenergistics2:sky_stone_small_brick"
},
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:smooth_sky_stone_block"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_small_brick"
}
]
}
],
"result": {
"item": "appliedenergistics2:smooth_sky_stone_block"
},
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:chiseled_quartz_slab"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:chiseled_quartz_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:chiseled_quartz_slab",
"data": 0,
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:fluix_slab"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:fluix_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:fluix_slab",
"data": 0,
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_slab"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:quartz_slab",
"data": 0,
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_pillar_slab"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_pillar"
}
]
}
],
"result": {
"item": "appliedenergistics2:quartz_pillar_slab",
"data": 0,
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_slab"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:sky_stone_slab",
"data": 0,
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_brick_slab"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_brick"
}
]
}
],
"result": {
"item": "appliedenergistics2:sky_stone_brick_slab",
"data": 0,
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_small_brick_slab"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_small_brick"
}
]
}
],
"result": {
"item": "appliedenergistics2:sky_stone_small_brick_slab",
"data": 0,
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:smooth_sky_stone_slab"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:smooth_sky_stone_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:smooth_sky_stone_slab",
"data": 0,
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:chiseled_quartz_stairs"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:chiseled_quartz_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:chiseled_quartz_stairs",
"count": 4
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:fluix_stairs"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:fluix_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:fluix_stairs",
"count": 4
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_stairs"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:quartz_stairs",
"count": 4
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_pillar_stairs"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:quartz_pillar"
}
]
}
],
"result": {
"item": "appliedenergistics2:quartz_pillar_stairs",
"count": 4
@@ -1,4 +1,19 @@
{
"conditions": [
{
"type": "forge:and",
"values": [
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_stairs"
},
{
"type": "minecraft:item_exists",
"item": "appliedenergistics2:sky_stone_block"
}
]
}
],
"result": {
"item": "appliedenergistics2:sky_stone_stairs",
"count": 4

Some files were not shown because too many files have changed in this diff Show More