Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9c94c7342b | |||
| 399d67b42c | |||
| 10761a1e9d | |||
| d1ddf53d99 | |||
| f776b4d548 | |||
| 41180792e1 | |||
| 2269c05d98 | |||
| 63616e5730 | |||
| 6ca3e6e696 | |||
| a4b5cfc3b9 | |||
| 38b0a7a153 | |||
| aa4863a979 | |||
| 44c7a46315 | |||
| c3b1dea7c5 | |||
| 40ec517480 | |||
| 2fdc16d3a8 | |||
| 053485a95a | |||
| e910af7734 | |||
| 59d7bd6c16 | |||
| 1a11462ddd | |||
| 77d615559f | |||
| 6878bfa4b0 | |||
| f1d50eca1a | |||
| 4ee32dd0b0 | |||
| 66e589324a | |||
| 362b001cb4 | |||
| b6fd4b3c0f | |||
| e364603a5a |
@@ -85,8 +85,7 @@ configurations {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
deobfCompile "com.jaquadro.minecraft.storagedrawers:StorageDrawers:1.12.2-5.4.2:api"
|
||||
deobfCompile "gregtechce:gregtech:1.12.2:1.12.0.662"
|
||||
compileOnly "gregtechce:gregtech:1.12.2:1.12.0.662"
|
||||
|
||||
// installable runtime dependencies
|
||||
mods "mcp.mobius.waila:Hwyla:${hwyla_version}"
|
||||
@@ -106,8 +105,6 @@ dependencies {
|
||||
|
||||
// at runtime, use the full JEI jar
|
||||
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
|
||||
runtime "com.jaquadro.minecraft.storagedrawers:StorageDrawers:1.12.2-5.4.2"
|
||||
runtime "com.jaquadro.minecraft.chameleon:Chameleon:1.12-4.1.3"
|
||||
|
||||
// unit test dependencies
|
||||
testCompile "junit:junit:4.12"
|
||||
|
||||
@@ -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
|
||||
}
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
package com.jaquadro.minecraft.storagedrawers.api.capabilities;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.NonNullList;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* An interface for treating an inventory as a slotless, central repository of items.
|
||||
*
|
||||
* For all operations that accept a predicate, if a predicate is supplied, a stored ItemStack must pass the predicate
|
||||
* in order to be considered for the given operation.
|
||||
*
|
||||
* An IItemRepository implementation MAY relax or eliminate its own internal tests when a predicate is supplied. If
|
||||
* the predicate is derived from DefaultPredicate, then the implementation MUST apply any tests it would have applied
|
||||
* had no predicate been provided at all, in addition to testing the predicate itself.
|
||||
*/
|
||||
public interface IItemRepository
|
||||
{
|
||||
/**
|
||||
* Gets a list of all items in the inventory. The same item may appear multiple times with varying counts.
|
||||
|
||||
* @return A list of zero or more items in the inventory.
|
||||
*/
|
||||
@Nonnull
|
||||
NonNullList<ItemRecord> getAllItems ();
|
||||
|
||||
/**
|
||||
* Inserts an ItemStack into the inventory and returns the remainder.
|
||||
*
|
||||
* @param stack ItemStack to insert.
|
||||
* @param simulate If true, the insertion is only simulated
|
||||
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||
* @return The remaining ItemStack that was not inserted. If the entire stack was accepted, returns
|
||||
* ItemStack.EMPTY instead.
|
||||
*/
|
||||
@Nonnull
|
||||
ItemStack insertItem (@Nonnull ItemStack stack, boolean simulate, Predicate<ItemStack> predicate);
|
||||
|
||||
@Nonnull
|
||||
default ItemStack insertItem (@Nonnull ItemStack stack, boolean simulate) {
|
||||
return insertItem(stack, simulate, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to extract the given ItemStack from the inventory. The returned value will be a matching ItemStack
|
||||
* with a stack size equal to or less than amount, or the empty ItemStack if the item could not be found at all.
|
||||
* The returned stack size may exceed the ItemStack's getMaxStackSize() value.
|
||||
|
||||
* @param stack The item to extract. The stack size is ignored.
|
||||
* @param amount Amount to extract (may be greater than the stacks max limit)
|
||||
* @param simulate If true, the extraction is only simulated
|
||||
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||
* @return ItemStack extracted from the inventory, or ItemStack.EMPTY if nothing could be extracted.
|
||||
*/
|
||||
@Nonnull
|
||||
ItemStack extractItem (@Nonnull ItemStack stack, int amount, boolean simulate, Predicate<ItemStack> predicate);
|
||||
|
||||
@Nonnull
|
||||
default ItemStack extractItem (@Nonnull ItemStack stack, int amount, boolean simulate) {
|
||||
return extractItem(stack, amount, simulate, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of items matching the given ItemStack stored by the inventory.
|
||||
|
||||
* @param stack ItemStack to query.
|
||||
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||
* @return The number of stored matching items. A value of Integer.MAX_VALUE may indicate an infinite item source.
|
||||
*/
|
||||
default int getStoredItemCount (@Nonnull ItemStack stack, Predicate<ItemStack> predicate) {
|
||||
ItemStack amount = extractItem(stack, Integer.MAX_VALUE, true, predicate);
|
||||
return amount.getCount();
|
||||
}
|
||||
|
||||
default int getStoredItemCount (@Nonnull ItemStack stack) {
|
||||
return getStoredItemCount(stack, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number items matching the given ItemStack that additionally still be stored by the inventory.
|
||||
* Remaining capacity may include space that is internally empty or unassigned to any given item.
|
||||
*
|
||||
* @param stack ItemStack to query.
|
||||
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||
* @return The available remaining space for matching items.
|
||||
*/
|
||||
default int getRemainingItemCapacity (@Nonnull ItemStack stack, Predicate<ItemStack> predicate) {
|
||||
stack = stack.copy();
|
||||
stack.setCount(Integer.MAX_VALUE);
|
||||
ItemStack remainder = insertItem(stack, true, predicate);
|
||||
return Integer.MAX_VALUE - remainder.getCount();
|
||||
}
|
||||
|
||||
default int getRemainingItemCapacity (@Nonnull ItemStack stack) {
|
||||
return getRemainingItemCapacity(stack, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the total inventory capacity for items matching the given ItemStack.
|
||||
* Total capacity may include space that is internally empty or unassigned to any given item.
|
||||
*
|
||||
* @param stack ItemStack to query.
|
||||
* @param predicate See interface notes about predicates. Passing null specifies default matching.
|
||||
* @return The total capacity for matching items.
|
||||
*/
|
||||
default int getItemCapacity (@Nonnull ItemStack stack, Predicate<ItemStack> predicate) {
|
||||
long capacity = getStoredItemCount(stack, predicate) + getRemainingItemCapacity(stack, predicate);
|
||||
if (capacity > Integer.MAX_VALUE)
|
||||
return Integer.MAX_VALUE;
|
||||
return (int)capacity;
|
||||
}
|
||||
|
||||
default int getItemCapacity (@Nonnull ItemStack stack) {
|
||||
return getItemCapacity(stack, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* An item record representing an item and the amount stored.
|
||||
*
|
||||
* The ItemStack held by itemPrototype always reports a stack size of 1.
|
||||
* IT IS IMPORTANT THAT YOU NEVER MODIFY itemPrototype.
|
||||
*/
|
||||
class ItemRecord
|
||||
{
|
||||
@Nonnull
|
||||
public final ItemStack itemPrototype;
|
||||
public final int count;
|
||||
|
||||
public ItemRecord (@Nonnull ItemStack itemPrototype, int count) {
|
||||
this.itemPrototype = itemPrototype;
|
||||
this.count = count;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A variant of the standard Predicate interface that when passed to IItemRepository functions, will ask the
|
||||
* internal default predicate to be tested in addition to the custom predicate. An IItemRepository function
|
||||
* may choose to enforce its own predicate regardless.
|
||||
*/
|
||||
interface DefaultPredicate<T> extends Predicate<T> { }
|
||||
}
|
||||
@@ -19,6 +19,7 @@
|
||||
package appeng.client.gui;
|
||||
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.text.DecimalFormat;
|
||||
import java.text.ParseException;
|
||||
@@ -35,6 +36,8 @@ import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Stopwatch;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||
import net.minecraft.client.gui.Gui;
|
||||
import net.minecraftforge.fml.common.Optional;
|
||||
import org.lwjgl.input.Keyboard;
|
||||
import org.lwjgl.input.Mouse;
|
||||
@@ -90,6 +93,9 @@ import appeng.fluids.container.slots.IMEFluidSlot;
|
||||
import appeng.helpers.InventoryAction;
|
||||
import yalter.mousetweaks.api.IMTModGuiContainer2;
|
||||
|
||||
import static appeng.integration.modules.jei.JEIPlugin.aeGuiHandler;
|
||||
import static appeng.integration.modules.jei.JEIPlugin.runtime;
|
||||
|
||||
|
||||
@Optional.Interface( iface = "yalter.mousetweaks.api.IMTModGuiContainer2", modid = "mousetweaks" )
|
||||
public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContainer2
|
||||
@@ -104,6 +110,12 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
||||
private Stopwatch dbl_clickTimer = Stopwatch.createStarted();
|
||||
private ItemStack dbl_whichItem = ItemStack.EMPTY;
|
||||
private Slot bl_clicked;
|
||||
|
||||
public List<GuiCustomSlot> getGuiSlots()
|
||||
{
|
||||
return guiSlots;
|
||||
}
|
||||
|
||||
protected final List<GuiCustomSlot> guiSlots = new ArrayList<>();
|
||||
|
||||
public AEBaseGui( final Container container )
|
||||
@@ -186,6 +198,35 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
||||
this.drawTooltip( (ITooltip) c, mouseX, mouseY );
|
||||
}
|
||||
}
|
||||
/*
|
||||
if ( isPointInRegion( -guiLeft,-guiTop, mc.displayWidth, mc.displayHeight, mouseX,mouseY)){
|
||||
Object o = runtime.getBookmarkOverlay().getIngredientUnderMouse();
|
||||
if (o != null) {
|
||||
List<IGhostIngredientHandler.Target<Object>> hoveredIngredientTargets = aeGuiHandler.getTargets( this, o, false );
|
||||
if (hoveredIngredientTargets.size() > 0 )
|
||||
{
|
||||
GlStateManager.disableLighting();
|
||||
GlStateManager.disableDepth();
|
||||
for( IGhostIngredientHandler.Target target : hoveredIngredientTargets )
|
||||
{
|
||||
Rectangle area = target.getArea();
|
||||
Color color;
|
||||
if( area.contains( mouseX, mouseY ) )
|
||||
{
|
||||
color = new Color( 76, 201, 25, 128 );
|
||||
}
|
||||
else
|
||||
{
|
||||
color = new Color( 19, 201, 10, 64 );
|
||||
}
|
||||
Gui.drawRect( area.x, area.y, area.x + area.width, area.y + area.height, color.getRGB() );
|
||||
}
|
||||
GlStateManager.color( 1f, 1f, 1f, 1f );
|
||||
aeGuiHandler.getTargets( this, o, true );
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
protected void drawGuiSlot( GuiCustomSlot slot, int mouseX, int mouseY, float partialTicks )
|
||||
@@ -378,6 +419,43 @@ 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() )
|
||||
{
|
||||
for( final Slot dr : this.drag_click )
|
||||
{
|
||||
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,15 +549,24 @@ 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.
|
||||
if (slot.getStack().isEmpty() && !player.inventory.getItemStack().isEmpty())
|
||||
if( slot.getStack().isEmpty() && !player.inventory.getItemStack().isEmpty() )
|
||||
{
|
||||
action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
||||
if (!slot.getStack().isEmpty() && player.inventory.getItemStack().getCount() <= 1)
|
||||
}
|
||||
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;
|
||||
|
||||
@@ -2,26 +2,22 @@ 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 appeng.client.gui.implementations.*;
|
||||
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||
import appeng.container.slot.SlotFake;
|
||||
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||
import mezz.jei.api.gui.IAdvancedGuiHandler;
|
||||
import net.minecraft.client.renderer.RenderItem;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||
import net.minecraft.client.gui.GuiScreen;
|
||||
|
||||
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>
|
||||
public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>, IGhostIngredientHandler<AEBaseGui>
|
||||
{
|
||||
|
||||
@Override
|
||||
public Class<AEBaseGui> getGuiContainerClass()
|
||||
{
|
||||
@@ -39,8 +35,8 @@ public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>
|
||||
@Override
|
||||
public Object getIngredientUnderMouse( AEBaseGui guiContainer, int mouseX, int mouseY )
|
||||
{
|
||||
List<IAEItemStack> visual = new ArrayList<>();
|
||||
int guiSlotIdx = 0;
|
||||
List<IAEItemStack> visual;
|
||||
int guiSlotIdx;
|
||||
Object result = null;
|
||||
if( guiContainer instanceof GuiCraftConfirm )
|
||||
{
|
||||
@@ -94,4 +90,54 @@ public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>
|
||||
if( guiSloty > ( rows - 1 ) || mouseY < guitop + yo ) return -1;
|
||||
return ( guiSloty * 3 ) + guiSlotx + ( currentScroll * 3 );
|
||||
}
|
||||
|
||||
@Override
|
||||
public <I> List<Target<I>> getTargets( AEBaseGui gui, I ingredient, boolean doStart )
|
||||
{
|
||||
ArrayList<Target<I>> targets = new ArrayList<>();
|
||||
if( gui instanceof IJEIGhostIngredients )
|
||||
{
|
||||
IJEIGhostIngredients g = (IJEIGhostIngredients) gui;
|
||||
List<Target<?>> phantomTargets = g.getPhantomTargets( ingredient );
|
||||
targets.addAll( (List<Target<I>>) (Object) phantomTargets );
|
||||
}
|
||||
if( doStart && GuiScreen.isShiftKeyDown() )
|
||||
{
|
||||
if( gui instanceof GuiUpgradeable || gui instanceof GuiPatternTerm )
|
||||
{
|
||||
IJEIGhostIngredients ghostGui = ( (IJEIGhostIngredients) gui );
|
||||
for( Target<I> target : targets )
|
||||
{
|
||||
if( ghostGui.getFakeSlotTargetMap().get( target ) instanceof SlotFake )
|
||||
{
|
||||
if( ( (SlotFake) ghostGui.getFakeSlotTargetMap().get( target ) ).getStack().isEmpty() )
|
||||
{
|
||||
target.accept( ingredient );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if( ghostGui.getFakeSlotTargetMap().get( target ) instanceof GuiFluidSlot )
|
||||
{
|
||||
if( ( (GuiFluidSlot) ghostGui.getFakeSlotTargetMap().get( target ) ).getFluidStack() == null )
|
||||
{
|
||||
target.accept( ingredient );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return targets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onComplete(){
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldHighlightTargets()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -22,13 +22,15 @@ package appeng.client.gui.implementations;
|
||||
import java.io.IOException;
|
||||
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;
|
||||
@@ -47,6 +49,7 @@ import appeng.util.Platform;
|
||||
import net.minecraft.nbt.NBTUtil;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.text.TextComponentString;
|
||||
import org.lwjgl.input.Mouse;
|
||||
|
||||
|
||||
import static appeng.client.render.BlockPosHighlighter.hilightBlock;
|
||||
@@ -58,7 +61,7 @@ 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();
|
||||
@@ -66,6 +69,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
private final HashMap<GuiButton,ClientDCInternalInv> guiButtonHashMap = 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<>();
|
||||
|
||||
@@ -83,8 +87,8 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
this.partInterfaceTerminal = te;
|
||||
final GuiScrollbar scrollbar = new GuiScrollbar();
|
||||
this.setScrollBar( scrollbar );
|
||||
this.xSize = 195;
|
||||
this.ySize = 236;
|
||||
this.xSize = 208;
|
||||
this.ySize = 256;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -92,19 +96,18 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
{
|
||||
super.initGui();
|
||||
|
||||
this.getScrollBar().setLeft( 175 );
|
||||
this.getScrollBar().setLeft( 189 );
|
||||
this.getScrollBar().setHeight( 106 );
|
||||
this.getScrollBar().setTop( 32 );
|
||||
this.getScrollBar().setTop( 51 );
|
||||
|
||||
this.searchFieldInputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 16, this.offsetX ), this.guiTop + 18, 65, 12 );
|
||||
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( 105, this.offsetX ), this.guiTop + 4, 65, 12 );
|
||||
this.searchFieldOutputs = new MEGuiTextField( this.fontRenderer, this.guiLeft + Math.max( 94, this.offsetX ), this.guiTop + 18, 65, 12 );
|
||||
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 );
|
||||
@@ -128,26 +131,21 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
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();
|
||||
|
||||
this.guiButtonNextAssembler = new GuiButton( -1, guiLeft + 110, guiTop + 4, 12, 12, "M" );
|
||||
this.guiButtonNextAssembler = new GuiImgButton(guiLeft + 123, guiTop + 25,Settings.ACTIONS, ActionItems.FREE_MOLECULAR_SLOT_SHORTCUT);
|
||||
this.buttonList.add( guiButtonNextAssembler );
|
||||
|
||||
this.guiButtonHide = new GuiButton( -1, guiLeft + 128, guiTop + 4, 60, 12, "Hide Full" );
|
||||
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 );
|
||||
|
||||
final Iterator<Slot> o = this.inventorySlots.inventorySlots.iterator();
|
||||
while( o.hasNext() )
|
||||
{
|
||||
if( o.next() instanceof SlotDisconnected )
|
||||
{
|
||||
o.remove();
|
||||
}
|
||||
}
|
||||
this.inventorySlots.inventorySlots.removeIf( slot -> slot instanceof SlotDisconnected );
|
||||
|
||||
int offset = 32;
|
||||
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 );
|
||||
@@ -156,9 +154,12 @@ 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 ) );
|
||||
if (this.matchedStacks.contains(inv.getInventory().getStackInSlot(z)))
|
||||
drawRect( z * 18 + 22, 1 + offset, z * 18 + 22 + 16, 1 + offset + 16, 0x2A00FF00 );
|
||||
}
|
||||
GuiButton guiButton = new GuiButton( x, guiLeft + 1, guiTop + offset + 3, 8, 10, "?" );
|
||||
|
||||
GuiButton guiButton = new GuiImgButton(guiLeft + 4, guiTop + offset + 1, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE);
|
||||
guiButtonHashMap.put( guiButton , inv);
|
||||
this.buttonList.add( guiButton );
|
||||
|
||||
@@ -177,10 +178,14 @@ 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;
|
||||
}
|
||||
|
||||
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" );
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -212,8 +217,9 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
{
|
||||
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 );
|
||||
int dimension = mc.world.provider.getDimension();
|
||||
hilightBlock( blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance(blockPos, blockPos2), dimension );
|
||||
mc.player.sendStatusMessage( new TextComponentString( "The interface is now highlighted at " + "X: " + blockPos.getX() + " Y: " + blockPos.getY() + " Z: " + blockPos.getZ() ), false );
|
||||
mc.player.closeScreen();
|
||||
}
|
||||
|
||||
@@ -245,7 +251,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
this.bindTexture( "guis/newinterfaceterminal.png" );
|
||||
this.drawTexturedModalRect( offsetX, offsetY, 0, 0, this.xSize, this.ySize );
|
||||
|
||||
int offset = 32;
|
||||
int offset = 51;
|
||||
final int ex = this.getScrollBar().getCurrentScroll();
|
||||
|
||||
for( int x = 0; x < LINES_ON_PAGE && ex + x < this.lines.size(); x++ )
|
||||
@@ -257,7 +263,7 @@ 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, 153, width, 18 );
|
||||
this.drawTexturedModalRect( offsetX + 20, offsetY + offset, 20, 173, width, 18 );
|
||||
}
|
||||
offset += 18;
|
||||
}
|
||||
@@ -353,6 +359,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
{
|
||||
this.byName.clear();
|
||||
this.buttonList.clear();
|
||||
this.matchedStacks.clear();
|
||||
|
||||
final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase();
|
||||
final String searchFieldOutputs = this.searchFieldOutputs.getText().toLowerCase();
|
||||
@@ -371,37 +378,36 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
||||
// Shortcut to skip any filter if search term is ""/empty
|
||||
|
||||
boolean found = (searchFieldInputs.isEmpty() && searchFieldOutputs.isEmpty() && !partInterfaceTerminal.onlyInterfacesWithFreeSlots);
|
||||
boolean interfaceHasFreeSlots = false;
|
||||
|
||||
// Search if the current inventory holds a pattern containing the search term.
|
||||
if( !found )
|
||||
{
|
||||
for( final ItemStack itemStack : entry.getInventory() )
|
||||
{
|
||||
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( !searchFieldInputs.isEmpty() && !searchFieldOutputs.isEmpty() ) {
|
||||
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldInputs, 0) || this.itemStackMatchesSearchTerm(itemStack, searchFieldOutputs, 1)) {
|
||||
found = true;
|
||||
matchedStacks.add(itemStack);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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()){
|
||||
else if( !searchFieldInputs.isEmpty() ) {
|
||||
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldInputs, 0)) {
|
||||
found = true;
|
||||
matchedStacks.add(itemStack);
|
||||
}
|
||||
}
|
||||
else if( !searchFieldOutputs.isEmpty() ) {
|
||||
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldOutputs, 1)) {
|
||||
found = true;
|
||||
matchedStacks.add(itemStack);
|
||||
}
|
||||
}
|
||||
// If only Interfaces with empty slots should be shown, check that here
|
||||
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( searchFieldInputs ) && entry.getName().toLowerCase().contains( searchFieldOutputs )))
|
||||
{
|
||||
|
||||
@@ -19,11 +19,21 @@
|
||||
package appeng.client.gui.implementations;
|
||||
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||
import appeng.container.slot.SlotFake;
|
||||
import appeng.core.sync.packets.PacketInventoryAction;
|
||||
import appeng.helpers.InventoryAction;
|
||||
import appeng.util.item.AEItemStack;
|
||||
import mezz.jei.api.gui.IGhostIngredientHandler.Target;
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.init.Blocks;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import appeng.api.config.ActionItems;
|
||||
@@ -40,7 +50,7 @@ import appeng.core.sync.network.NetworkHandler;
|
||||
import appeng.core.sync.packets.PacketValueConfig;
|
||||
|
||||
|
||||
public class GuiPatternTerm extends GuiMEMonitorable
|
||||
public class GuiPatternTerm extends GuiMEMonitorable implements IJEIGhostIngredients
|
||||
{
|
||||
|
||||
private static final String BACKGROUND_CRAFTING_MODE = "guis/pattern.png";
|
||||
@@ -67,6 +77,7 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
||||
private GuiImgButton divThreeBtn;
|
||||
private GuiImgButton minusOneBtn;
|
||||
private GuiImgButton maxCountBtn;
|
||||
public Map<Target<?>,Object> mapTargetSlot = new HashMap<>();
|
||||
|
||||
public GuiPatternTerm( final InventoryPlayer inventoryPlayer, final ITerminalHost te )
|
||||
{
|
||||
@@ -274,4 +285,52 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
||||
|
||||
s.yPos = s.getY() + this.ySize - 78 - offsetPlayerSide;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Target<?>> getPhantomTargets(Object ingredient) {
|
||||
if (!(ingredient instanceof ItemStack )) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<Target<?>> targets = new ArrayList<>();
|
||||
for( Slot slot : this.inventorySlots.inventorySlots )
|
||||
{
|
||||
if( slot instanceof SlotFake )
|
||||
{
|
||||
ItemStack itemStack = (ItemStack) ingredient;
|
||||
Target<Object> target = new Target<Object>()
|
||||
{
|
||||
@Override
|
||||
public Rectangle getArea()
|
||||
{
|
||||
return new Rectangle( getGuiLeft() + slot.xPos, getGuiTop() + slot.yPos, 16, 16 );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept( Object ingredient )
|
||||
{
|
||||
final PacketInventoryAction p;
|
||||
try
|
||||
{
|
||||
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (SlotFake) slot, AEItemStack.fromItemStack( itemStack ) );
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
|
||||
}
|
||||
catch( IOException e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
targets.add( target );
|
||||
mapTargetSlot.putIfAbsent( target, slot );
|
||||
}
|
||||
}
|
||||
return targets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Target<?>, Object> getFakeSlotTargetMap()
|
||||
{
|
||||
return mapTargetSlot;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,8 +19,25 @@
|
||||
package appeng.client.gui.implementations;
|
||||
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.List;
|
||||
|
||||
import appeng.client.gui.widgets.GuiCustomSlot;
|
||||
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||
import appeng.container.slot.AppEngSlot;
|
||||
import appeng.container.slot.IJEITargetSlot;
|
||||
import appeng.container.slot.SlotFake;
|
||||
import appeng.core.sync.packets.PacketInventoryAction;
|
||||
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
import appeng.helpers.InventoryAction;
|
||||
import appeng.util.item.AEItemStack;
|
||||
import mezz.jei.api.gui.IGhostIngredientHandler.Target;
|
||||
import net.minecraft.inventory.Slot;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.fluids.*;
|
||||
import org.lwjgl.input.Mouse;
|
||||
|
||||
import net.minecraft.client.gui.GuiButton;
|
||||
@@ -43,9 +60,9 @@ import appeng.parts.automation.PartExportBus;
|
||||
import appeng.parts.automation.PartImportBus;
|
||||
|
||||
|
||||
public class GuiUpgradeable extends AEBaseGui
|
||||
public class GuiUpgradeable extends AEBaseGui implements IJEIGhostIngredients
|
||||
{
|
||||
|
||||
private final Map<Target<?>,Object> mapTargetSlot = new HashMap<>();
|
||||
protected final ContainerUpgradeable cvb;
|
||||
protected final IUpgradeableHost bc;
|
||||
|
||||
@@ -200,4 +217,108 @@ public class GuiUpgradeable extends AEBaseGui
|
||||
NetworkHandler.instance().sendToServer( new PacketConfigButton( this.schedulingMode.getSetting(), backwards ) );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Target<?>> getPhantomTargets(Object ingredient)
|
||||
{
|
||||
mapTargetSlot.clear();
|
||||
|
||||
FluidStack fluidStack = null;
|
||||
ItemStack itemStack = ItemStack.EMPTY;
|
||||
|
||||
if( ingredient instanceof ItemStack )
|
||||
{
|
||||
itemStack = (ItemStack) ingredient;
|
||||
fluidStack = FluidUtil.getFluidContained( itemStack );
|
||||
}
|
||||
else if( ingredient instanceof FluidStack )
|
||||
{
|
||||
fluidStack = (FluidStack) ingredient;
|
||||
}
|
||||
|
||||
if( !( ingredient instanceof ItemStack ) && !( ingredient instanceof FluidStack ) )
|
||||
return Collections.emptyList();
|
||||
|
||||
List<Target<?>> targets = new ArrayList<>();
|
||||
|
||||
List<IJEITargetSlot> slots = new ArrayList<>();
|
||||
if( this.inventorySlots.inventorySlots.size() > 0 )
|
||||
{
|
||||
for( Slot slot : this.inventorySlots.inventorySlots )
|
||||
{
|
||||
if( slot instanceof SlotFake && ( !itemStack.isEmpty() || this instanceof GuiCellWorkbench && fluidStack != null ) )
|
||||
{
|
||||
slots.add( (IJEITargetSlot) slot );
|
||||
}
|
||||
}
|
||||
}
|
||||
if( this.getGuiSlots().size() > 0 )
|
||||
{
|
||||
for( GuiCustomSlot slot : this.getGuiSlots() )
|
||||
{
|
||||
if( slot instanceof GuiFluidSlot && fluidStack != null )
|
||||
{
|
||||
slots.add( (IJEITargetSlot) slot );
|
||||
}
|
||||
}
|
||||
}
|
||||
for( Object slot : slots )
|
||||
{
|
||||
ItemStack finalItemStack = itemStack;
|
||||
FluidStack finalFluidStack = fluidStack;
|
||||
Target<Object> targetItem = new Target<Object>()
|
||||
{
|
||||
@Override
|
||||
public Rectangle getArea()
|
||||
{
|
||||
if( slot instanceof SlotFake )
|
||||
return new Rectangle( getGuiLeft() + ( (SlotFake) slot ).xPos, getGuiTop() + ( (SlotFake) slot ).yPos, 16, 16 );
|
||||
else
|
||||
{
|
||||
return new Rectangle( getGuiLeft() + ( (GuiFluidSlot) slot ).xPos(), getGuiTop() + ( (GuiFluidSlot) slot ).yPos(), 16, 16 );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept( Object ingredient )
|
||||
{
|
||||
PacketInventoryAction p = null;
|
||||
try
|
||||
{
|
||||
if( slot instanceof SlotFake )
|
||||
{
|
||||
if( finalItemStack.isEmpty() && finalFluidStack != null )
|
||||
{
|
||||
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (IJEITargetSlot) slot, AEItemStack.fromItemStack( FluidUtil.getFilledBucket( finalFluidStack ) ) );
|
||||
}
|
||||
else if( !finalItemStack.isEmpty() )
|
||||
{
|
||||
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (IJEITargetSlot) slot, AEItemStack.fromItemStack( finalItemStack ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if( finalFluidStack == null ) return;
|
||||
p = new PacketInventoryAction( InventoryAction.PLACE_JEI_GHOST_ITEM, (IJEITargetSlot) slot, AEItemStack.fromItemStack( AEFluidStack.fromFluidStack( finalFluidStack ).asItemStackRepresentation() ) );
|
||||
}
|
||||
NetworkHandler.instance().sendToServer( p );
|
||||
|
||||
}
|
||||
catch( IOException e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
targets.add( targetItem );
|
||||
mapTargetSlot.putIfAbsent( targetItem, slot );
|
||||
}
|
||||
return targets;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Target<?>, Object> getFakeSlotTargetMap()
|
||||
{
|
||||
return mapTargetSlot;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -8,9 +8,14 @@ public class BlockPosHighlighter
|
||||
private static BlockPos hilightedBlock;
|
||||
private static long expireHilight;
|
||||
|
||||
public static void hilightBlock( BlockPos c, long expireHilight ) {
|
||||
|
||||
|
||||
private static int dimension;
|
||||
|
||||
public static void hilightBlock( BlockPos c, long expireHilight, int dimension ) {
|
||||
hilightedBlock = c;
|
||||
BlockPosHighlighter.expireHilight = expireHilight;
|
||||
BlockPosHighlighter.dimension = dimension;
|
||||
}
|
||||
|
||||
public static BlockPos getHilightedBlock() {
|
||||
@@ -21,5 +26,9 @@ public class BlockPosHighlighter
|
||||
return expireHilight;
|
||||
}
|
||||
|
||||
public static int getDimension()
|
||||
{
|
||||
return dimension;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
package appeng.client.render;
|
||||
|
||||
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.gui.FontRenderer;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
@@ -30,6 +31,7 @@ import net.minecraft.util.EnumFacing;
|
||||
import appeng.api.storage.data.IAEItemStack;
|
||||
import appeng.util.IWideReadableNumberConverter;
|
||||
import appeng.util.ReadableNumberConverter;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
|
||||
/**
|
||||
@@ -143,4 +145,23 @@ public class TesrRenderHelper
|
||||
|
||||
}
|
||||
|
||||
public static void renderFluid2dWithAmount( IAEFluidStack fluidStack, float scale, float spacing )
|
||||
{
|
||||
final ItemStack renderStack = fluidStack.asItemStackRepresentation();
|
||||
|
||||
TesrRenderHelper.renderItem2d( renderStack, scale );
|
||||
|
||||
final long stackSize = fluidStack.getStackSize() / 1000;
|
||||
final String renderedStackSize = NUMBER_CONVERTER.toWideReadableForm( stackSize ) + "B";
|
||||
|
||||
// Render the item count
|
||||
final FontRenderer fr = Minecraft.getMinecraft().fontRenderer;
|
||||
final int width = fr.getStringWidth( renderedStackSize );
|
||||
GlStateManager.translate( 0.0f, spacing, 0 );
|
||||
GlStateManager.scale( 1.0f / 62.0f, 1.0f / 62.0f, 1.0f / 62.0f );
|
||||
GlStateManager.translate( -0.5f * width, 0.0f, 0.5f );
|
||||
fr.drawString( renderedStackSize, 0, 0, 0 );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
||||
this.grid = anchor.getActionableNode().getGrid();
|
||||
}
|
||||
|
||||
this.bindPlayerInventory( ip, 0, 236 - /* height of player inventory */82 );
|
||||
this.bindPlayerInventory( ip, 14, 256 - /* height of player inventory */82 );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -215,35 +215,48 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
||||
final IItemHandler theSlot = new WrapperFilteredItemHandler( new WrapperRangeItemHandler( inv.server, slot, slot + 1 ), new PatternSlotFilter() );
|
||||
final InventoryAdaptor interfaceSlot = new AdaptorItemHandler( theSlot );
|
||||
|
||||
switch( action )
|
||||
IItemHandler interfaceHandler = inv.server;
|
||||
boolean canInsert = true;
|
||||
|
||||
switch ( action )
|
||||
{
|
||||
case PICKUP_OR_SET_DOWN:
|
||||
|
||||
if( hasItemInHand )
|
||||
{
|
||||
ItemStack inSlot = theSlot.getStackInSlot( 0 );
|
||||
if( inSlot.isEmpty() )
|
||||
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
|
||||
{
|
||||
player.inventory.setItemStack( interfaceSlot.addItems( player.inventory.getItemStack() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
inSlot = inSlot.copy();
|
||||
final ItemStack inHand = player.inventory.getItemStack().copy();
|
||||
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, ItemStack.EMPTY );
|
||||
player.inventory.setItemStack( ItemStack.EMPTY );
|
||||
|
||||
player.inventory.setItemStack( interfaceSlot.addItems( inHand.copy() ) );
|
||||
|
||||
if( player.inventory.getItemStack().isEmpty() )
|
||||
if( Platform.itemComparisons().isSameItem( interfaceHandler.getStackInSlot( s ), player.inventory.getItemStack() ) )
|
||||
{
|
||||
player.inventory.setItemStack( inSlot );
|
||||
canInsert = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( canInsert )
|
||||
{
|
||||
ItemStack inSlot = theSlot.getStackInSlot( 0 );
|
||||
if( inSlot.isEmpty() )
|
||||
{
|
||||
player.inventory.setItemStack( interfaceSlot.addItems( player.inventory.getItemStack() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
player.inventory.setItemStack( inHand );
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot );
|
||||
inSlot = inSlot.copy();
|
||||
final ItemStack inHand = player.inventory.getItemStack().copy();
|
||||
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, ItemStack.EMPTY );
|
||||
player.inventory.setItemStack( ItemStack.EMPTY );
|
||||
|
||||
player.inventory.setItemStack( interfaceSlot.addItems( inHand.copy() ) );
|
||||
|
||||
if( player.inventory.getItemStack().isEmpty() )
|
||||
{
|
||||
player.inventory.setItemStack( inSlot );
|
||||
}
|
||||
else
|
||||
{
|
||||
player.inventory.setItemStack( inHand );
|
||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -254,17 +267,27 @@ public final class ContainerInterfaceTerminal extends AEBaseContainer
|
||||
|
||||
break;
|
||||
case SPLIT_OR_PLACE_SINGLE:
|
||||
|
||||
if( hasItemInHand )
|
||||
{
|
||||
ItemStack extra = playerHand.removeItems( 1, ItemStack.EMPTY, null );
|
||||
if( !extra.isEmpty() )
|
||||
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
|
||||
{
|
||||
extra = interfaceSlot.addItems( extra );
|
||||
if( Platform.itemComparisons().isSameItem( interfaceHandler.getStackInSlot( s ), player.inventory.getItemStack() ) )
|
||||
{
|
||||
canInsert = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( !extra.isEmpty() )
|
||||
if( canInsert )
|
||||
{
|
||||
playerHand.addItems( extra );
|
||||
ItemStack extra = playerHand.removeItems( 1, ItemStack.EMPTY, null );
|
||||
if( !extra.isEmpty() && !interfaceSlot.containsItems() )
|
||||
{
|
||||
extra = interfaceSlot.addItems( extra );
|
||||
}
|
||||
if( !extra.isEmpty() )
|
||||
{
|
||||
playerHand.addItems( extra );
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( !is.isEmpty() )
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package appeng.container.interfaces;
|
||||
|
||||
import mezz.jei.api.gui.IGhostIngredientHandler.Target;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public interface IJEIGhostIngredients
|
||||
{
|
||||
List<Target<?>> getPhantomTargets( Object ingredient );
|
||||
|
||||
default Map<Target<?>, Object> getFakeSlotTargetMap(){
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package appeng.container.slot;
|
||||
|
||||
public interface IJEITargetSlot {
|
||||
}
|
||||
@@ -24,7 +24,7 @@ import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
|
||||
public class SlotFake extends AppEngSlot
|
||||
public class SlotFake extends AppEngSlot implements IJEITargetSlot
|
||||
{
|
||||
|
||||
public SlotFake( final IItemHandler inv, final int idx, final int x, final int y )
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -21,9 +21,17 @@ package appeng.core.sync.packets;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.client.gui.implementations.GuiUpgradeable;
|
||||
import appeng.client.gui.widgets.GuiCustomSlot;
|
||||
import appeng.container.slot.IJEITargetSlot;
|
||||
import appeng.container.slot.SlotFake;
|
||||
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
@@ -40,6 +48,7 @@ import appeng.core.sync.network.INetworkInfo;
|
||||
import appeng.helpers.InventoryAction;
|
||||
import appeng.util.Platform;
|
||||
import appeng.util.item.AEItemStack;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
|
||||
|
||||
public class PacketInventoryAction extends AppEngPacket
|
||||
@@ -57,6 +66,7 @@ public class PacketInventoryAction extends AppEngPacket
|
||||
this.slot = stream.readInt();
|
||||
this.id = stream.readLong();
|
||||
final boolean hasItem = stream.readBoolean();
|
||||
|
||||
if( hasItem )
|
||||
{
|
||||
this.slotItem = AEItemStack.fromPacket( stream );
|
||||
@@ -70,7 +80,6 @@ public class PacketInventoryAction extends AppEngPacket
|
||||
// api
|
||||
public PacketInventoryAction( final InventoryAction action, final int slot, final IAEItemStack slotItem ) throws IOException
|
||||
{
|
||||
|
||||
if( Platform.isClient() )
|
||||
{
|
||||
throw new IllegalStateException( "invalid packet, client cannot post inv actions with stacks." );
|
||||
@@ -101,6 +110,36 @@ public class PacketInventoryAction extends AppEngPacket
|
||||
this.configureWrite( data );
|
||||
}
|
||||
|
||||
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;
|
||||
this.slotItem = slotItem;
|
||||
|
||||
final ByteBuf data = Unpooled.buffer();
|
||||
|
||||
data.writeInt( this.getPacketID() );
|
||||
data.writeInt( action.ordinal() );
|
||||
data.writeInt( this.slot );
|
||||
data.writeLong( this.id );
|
||||
|
||||
if( slotItem == null )
|
||||
{
|
||||
data.writeBoolean( false );
|
||||
}
|
||||
else
|
||||
{
|
||||
data.writeBoolean( true );
|
||||
slotItem.writeToPacket( data );
|
||||
}
|
||||
|
||||
this.configureWrite( data );
|
||||
}
|
||||
|
||||
// api
|
||||
public PacketInventoryAction( final InventoryAction action, final int slot, final long id )
|
||||
{
|
||||
@@ -150,6 +189,46 @@ public class PacketInventoryAction extends AppEngPacket
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( this.action == InventoryAction.PLACE_JEI_GHOST_ITEM )
|
||||
{
|
||||
if( sender.openContainer.inventorySlots.get( this.slot ) instanceof SlotFake )
|
||||
{
|
||||
if( this.slotItem != null ) {
|
||||
sender.openContainer.inventorySlots.get( this.slot ).putStack( this.slotItem.asItemStackRepresentation() );
|
||||
if (sender.openContainer.inventorySlots.get( this.slot ).getStack().isEmpty()){
|
||||
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||
if( aefs != null )
|
||||
{
|
||||
FluidStack fluid = aefs.getFluidStack();
|
||||
sender.openContainer.inventorySlots.get( this.slot ).putStack( AEFluidStack.fromFluidStack( fluid ).asItemStackRepresentation() );
|
||||
}
|
||||
}
|
||||
}
|
||||
else sender.openContainer.inventorySlots.get( this.slot ).putStack( ItemStack.EMPTY );
|
||||
}
|
||||
if( Minecraft.getMinecraft().currentScreen instanceof GuiUpgradeable )
|
||||
{
|
||||
GuiUpgradeable cs = ( (GuiUpgradeable) Minecraft.getMinecraft().currentScreen );
|
||||
if( cs.getGuiSlots().size() > 0 )
|
||||
{
|
||||
GuiCustomSlot ct = cs.getGuiSlots().get( this.slot );
|
||||
GuiFluidSlot gfs = (GuiFluidSlot) ct;
|
||||
if( this.slotItem != null )
|
||||
{
|
||||
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||
if( aefs != null )
|
||||
{
|
||||
FluidStack fluid = aefs.getFluidStack();
|
||||
gfs.setFluidStack( AEFluidStack.fromFluidStack( fluid ) );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gfs.setFluidStack( null );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
baseContainer.doAction( sender, this.action, this.slot, this.id );
|
||||
|
||||
@@ -171,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 ) )
|
||||
{
|
||||
@@ -210,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() )
|
||||
{
|
||||
@@ -237,22 +242,6 @@ public class PacketJEIRecipe extends AppEngPacket
|
||||
// Fall back using an existing item
|
||||
out = storage.extractItems( request, Actionable.SIMULATE, cct.getActionSource() );
|
||||
}
|
||||
|
||||
if( out == null )
|
||||
{
|
||||
IItemList<IAEItemStack> items = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList();
|
||||
Iterator<IAEItemStack> iterator = inv.getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ).getAvailableItems( items ).iterator();
|
||||
while ( iterator.hasNext() )
|
||||
{
|
||||
final IAEItemStack o = iterator.next();
|
||||
if( o.getDefinition().isItemEqual( request.getDefinition() ) && o.isCraftable() )
|
||||
{
|
||||
out = o;
|
||||
break;
|
||||
}
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( out != null )
|
||||
@@ -274,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 );
|
||||
}
|
||||
@@ -311,7 +303,7 @@ public class PacketJEIRecipe extends AppEngPacket
|
||||
{
|
||||
for( ItemStack option : this.recipe[slot] )
|
||||
{
|
||||
if( is.isItemEqual( option ) )
|
||||
if( ItemStack.areItemStacksEqual( is, option ) )
|
||||
{
|
||||
return is;
|
||||
}
|
||||
|
||||
@@ -90,6 +90,13 @@ public class GuiFluidLevelEmitter extends GuiUpgradeable
|
||||
this.level.drawTextBox();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void drawFG( int offsetX, int offsetY, int mouseX, int mouseY )
|
||||
{
|
||||
if( isPointInRegion( 24, 43,89,this.fontRenderer.FONT_HEIGHT,mouseX,mouseY ) ) drawTooltip( mouseX - guiLeft - 7, mouseY - guiTop + 25, "Amount in millibuckets" );
|
||||
super.drawFG( offsetX, offsetY, mouseX, mouseY );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean drawUpgrades()
|
||||
{
|
||||
|
||||
@@ -4,6 +4,7 @@ package appeng.fluids.client.gui.widgets;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import appeng.container.slot.IJEITargetSlot;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
@@ -23,7 +24,7 @@ import appeng.fluids.util.AEFluidStack;
|
||||
import appeng.fluids.util.IAEFluidTank;
|
||||
|
||||
|
||||
public class GuiFluidSlot extends GuiCustomSlot
|
||||
public class GuiFluidSlot extends GuiCustomSlot implements IJEITargetSlot
|
||||
{
|
||||
private final IAEFluidTank fluids;
|
||||
private final int slot;
|
||||
|
||||
@@ -26,10 +26,11 @@ public class HighlighterHandler
|
||||
return;
|
||||
}
|
||||
Minecraft mc = Minecraft.getMinecraft();
|
||||
int dimension = mc.world.provider.getDimension();
|
||||
long time = System.currentTimeMillis();
|
||||
|
||||
if (time > BlockPosHighlighter.getExpireHilight()) {
|
||||
BlockPosHighlighter.hilightBlock(null, -1);
|
||||
if (time > BlockPosHighlighter.getExpireHilight() || dimension != BlockPosHighlighter.getDimension()) {
|
||||
BlockPosHighlighter.hilightBlock(null, -1, BlockPosHighlighter.getDimension() );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,5 +43,6 @@ public enum InventoryAction
|
||||
ROLL_UP,
|
||||
ROLL_DOWN,
|
||||
AUTO_CRAFT,
|
||||
PLACE_SINGLE
|
||||
PLACE_SINGLE,
|
||||
PLACE_JEI_GHOST_ITEM
|
||||
}
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
package appeng.integration.modules.jei;
|
||||
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
@@ -27,14 +29,11 @@ import appeng.client.gui.AEGuiHandler;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import mezz.jei.api.*;
|
||||
import mezz.jei.config.Constants;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
|
||||
import mezz.jei.api.IJeiRuntime;
|
||||
import mezz.jei.api.IModPlugin;
|
||||
import mezz.jei.api.IModRegistry;
|
||||
import mezz.jei.api.ISubtypeRegistry;
|
||||
import mezz.jei.api.recipe.IRecipeCategoryRegistration;
|
||||
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
|
||||
|
||||
@@ -57,6 +56,9 @@ import appeng.items.parts.ItemFacade;
|
||||
@mezz.jei.api.JEIPlugin
|
||||
public class JEIPlugin implements IModPlugin
|
||||
{
|
||||
public static IJeiRuntime runtime;
|
||||
public static AEGuiHandler aeGuiHandler;
|
||||
|
||||
@Override
|
||||
public void registerItemSubtypes( ISubtypeRegistry subtypeRegistry )
|
||||
{
|
||||
@@ -95,8 +97,9 @@ public class JEIPlugin implements IModPlugin
|
||||
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ),
|
||||
Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
||||
|
||||
AEGuiHandler aeGuiHandler = new AEGuiHandler();
|
||||
aeGuiHandler = new AEGuiHandler();
|
||||
registry.addAdvancedGuiHandlers(aeGuiHandler);
|
||||
registry.addGhostIngredientHandler( aeGuiHandler.getGuiContainerClass(), aeGuiHandler);
|
||||
}
|
||||
|
||||
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
||||
@@ -219,5 +222,6 @@ public class JEIPlugin implements IModPlugin
|
||||
{
|
||||
JEIModule jeiModule = (JEIModule) Integrations.jei();
|
||||
jeiModule.setJei( new JeiRuntimeAdapter( jeiRuntime ) );
|
||||
runtime = jeiRuntime;
|
||||
}
|
||||
}
|
||||
|
||||
+6
-4
@@ -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,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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import appeng.api.storage.IStorageChannel;
|
||||
@@ -14,7 +13,6 @@ import appeng.api.storage.IStorageChannel;
|
||||
import appeng.core.AELog;
|
||||
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.NonNullList;
|
||||
|
||||
import appeng.api.AEApi;
|
||||
import appeng.api.config.Actionable;
|
||||
|
||||
@@ -401,10 +401,13 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
||||
}
|
||||
|
||||
// Check via cap for IItemRepository
|
||||
IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
||||
if( handlerRepo != null )
|
||||
if (ITEM_REPOSITORY_CAPABILITY != null && target.hasCapability( ITEM_REPOSITORY_CAPABILITY, targetSide ))
|
||||
{
|
||||
return new ItemRepositoryAdapter( handlerRepo, this );
|
||||
IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
||||
if( handlerRepo != null )
|
||||
{
|
||||
return new ItemRepositoryAdapter( handlerRepo, this );
|
||||
}
|
||||
}
|
||||
// Check via cap for IItemHandler
|
||||
IItemHandler handlerExt = target.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetSide );
|
||||
@@ -431,11 +434,14 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
||||
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
|
||||
}
|
||||
|
||||
final IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
||||
|
||||
if( handlerRepo != null )
|
||||
if (ITEM_REPOSITORY_CAPABILITY != null && target.hasCapability( ITEM_REPOSITORY_CAPABILITY, targetSide ))
|
||||
{
|
||||
return Objects.hash( target, handlerRepo, handlerRepo.getAllItems().size() );
|
||||
final IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
||||
|
||||
if( handlerRepo != null )
|
||||
{
|
||||
return Objects.hash( target, handlerRepo, handlerRepo.getAllItems().size() );
|
||||
}
|
||||
}
|
||||
|
||||
final IItemHandler itemHandler = target.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetSide );
|
||||
|
||||
@@ -21,6 +21,10 @@ package appeng.parts.reporting;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import appeng.api.storage.channels.IFluidStorageChannel;
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
import appeng.util.item.AEStack;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
@@ -31,6 +35,9 @@ import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.math.RayTraceResult;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
@@ -70,7 +77,9 @@ import appeng.util.item.AEItemStack;
|
||||
public abstract class AbstractPartMonitor extends AbstractPartDisplay implements IPartStorageMonitor, IStackWatcherHost
|
||||
{
|
||||
private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE;
|
||||
|
||||
private IAEItemStack configuredItem;
|
||||
private IAEFluidStack configuredFluid;
|
||||
private String lastHumanReadableText;
|
||||
private boolean isLocked;
|
||||
private IStackWatcher myWatcher;
|
||||
@@ -90,6 +99,9 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
|
||||
final NBTTagCompound myItem = data.getCompoundTag( "configuredItem" );
|
||||
this.configuredItem = AEItemStack.fromNBT( myItem );
|
||||
|
||||
final NBTTagCompound myFluid = data.getCompoundTag( "configuredFluid" );
|
||||
this.configuredFluid = AEFluidStack.fromNBT( myFluid );
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -104,8 +116,15 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
{
|
||||
this.configuredItem.writeToNBT( myItem );
|
||||
}
|
||||
final NBTTagCompound myFluid = new NBTTagCompound();
|
||||
if( this.configuredFluid != null )
|
||||
{
|
||||
this.configuredFluid.writeToNBT( myFluid );
|
||||
}
|
||||
|
||||
data.setTag( "configuredItem", myItem );
|
||||
data.setTag( "configuredFluid", myFluid );
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -114,11 +133,17 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
super.writeToStream( data );
|
||||
|
||||
data.writeBoolean( this.isLocked );
|
||||
data.writeBoolean( this.configuredItem != null );
|
||||
//is configured
|
||||
data.writeBoolean( this.configuredItem != null);
|
||||
data.writeBoolean( this.configuredFluid != null);
|
||||
if( this.configuredItem != null )
|
||||
{
|
||||
this.configuredItem.writeToPacket( data );
|
||||
}
|
||||
else if( this.configuredFluid != null )
|
||||
{
|
||||
this.configuredFluid.writeToPacket( data );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -131,14 +156,22 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
|
||||
this.isLocked = isLocked;
|
||||
|
||||
final boolean val = data.readBoolean();
|
||||
if( val )
|
||||
final boolean isItem = data.readBoolean();
|
||||
final boolean isFluid = data.readBoolean();
|
||||
if( isItem )
|
||||
{
|
||||
this.configuredItem = AEItemStack.fromPacket( data );
|
||||
this.configuredFluid = null;
|
||||
}
|
||||
else if( isFluid )
|
||||
{
|
||||
this.configuredFluid = AEFluidStack.fromPacket( data );
|
||||
this.configuredItem = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.configuredItem = null;
|
||||
this.configuredFluid = null;
|
||||
}
|
||||
|
||||
return needRedraw;
|
||||
@@ -165,7 +198,25 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
if( !this.isLocked )
|
||||
{
|
||||
final ItemStack eq = player.getHeldItem( hand );
|
||||
this.configuredItem = AEItemStack.fromItemStack( eq );
|
||||
FluidStack fluidInTank = null;
|
||||
|
||||
if( eq.hasCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) )
|
||||
{
|
||||
IFluidHandlerItem fluidHandlerItem = ( eq.getCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) );
|
||||
fluidInTank = fluidHandlerItem.drain( Integer.MAX_VALUE, false );
|
||||
}
|
||||
|
||||
if (fluidInTank == null)
|
||||
{
|
||||
this.configuredFluid = null;
|
||||
this.configuredItem = AEItemStack.fromItemStack( eq );
|
||||
}
|
||||
else if( fluidInTank.amount > 0 )
|
||||
{
|
||||
this.configuredFluid = AEFluidStack.fromFluidStack( fluidInTank );
|
||||
this.configuredItem = null;
|
||||
}
|
||||
|
||||
this.configureWatchers();
|
||||
this.getHost().markForSave();
|
||||
this.getHost().markForUpdate();
|
||||
@@ -227,6 +278,16 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
this.updateReportingValue(
|
||||
this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ) );
|
||||
}
|
||||
else if ( this.configuredFluid != null )
|
||||
{
|
||||
if( this.myWatcher != null )
|
||||
{
|
||||
this.myWatcher.add( this.configuredFluid );
|
||||
}
|
||||
|
||||
this.updateReportingValue(
|
||||
this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) ) );
|
||||
}
|
||||
}
|
||||
catch( final GridAccessException e )
|
||||
{
|
||||
@@ -234,11 +295,12 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
}
|
||||
}
|
||||
|
||||
private void updateReportingValue( final IMEMonitor<IAEItemStack> itemInventory )
|
||||
private <T extends IAEStack<T>> void updateReportingValue ( final IMEMonitor<T> monitor )
|
||||
{
|
||||
if( this.configuredItem != null )
|
||||
|
||||
if( this.configuredItem != null)
|
||||
{
|
||||
final IAEItemStack result = itemInventory.getStorageList().findPrecise( this.configuredItem );
|
||||
final IAEItemStack result = (IAEItemStack) monitor.getStorageList().findPrecise( (T) this.configuredItem );
|
||||
if( result == null )
|
||||
{
|
||||
this.configuredItem.setStackSize( 0 );
|
||||
@@ -248,6 +310,18 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
this.configuredItem.setStackSize( result.getStackSize() );
|
||||
}
|
||||
}
|
||||
else if( this.configuredFluid != null)
|
||||
{
|
||||
final IAEFluidStack result = (IAEFluidStack) monitor.getStorageList().findPrecise( (T) this.configuredFluid );
|
||||
if( result == null )
|
||||
{
|
||||
this.configuredFluid.setStackSize( 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
this.configuredFluid.setStackSize( result.getStackSize() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -260,7 +334,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
return;
|
||||
}
|
||||
|
||||
final IAEItemStack ais = this.getDisplayed();
|
||||
IAEStack<?> ais = this.getDisplayed();
|
||||
|
||||
if( ais == null )
|
||||
{
|
||||
@@ -274,8 +348,10 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
|
||||
TesrRenderHelper.moveToFace( facing );
|
||||
TesrRenderHelper.rotateToFace( facing, this.getSpin() );
|
||||
TesrRenderHelper.renderItem2dWithAmount( ais, 0.8f, 0.17f );
|
||||
|
||||
if (ais instanceof IAEItemStack)
|
||||
TesrRenderHelper.renderItem2dWithAmount( (IAEItemStack) ais, 0.8f, 0.17f );
|
||||
if (ais instanceof IAEFluidStack)
|
||||
TesrRenderHelper.renderFluid2dWithAmount( (IAEFluidStack) ais, 0.8f, 0.17f );
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
}
|
||||
@@ -287,9 +363,13 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public IAEItemStack getDisplayed()
|
||||
public IAEStack<?> getDisplayed()
|
||||
{
|
||||
if (this.configuredItem != null)
|
||||
return this.configuredItem;
|
||||
else if (this.configuredFluid != null)
|
||||
return this.configuredFluid;
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -322,6 +402,26 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||
final long stackSize = this.configuredItem.getStackSize();
|
||||
final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize );
|
||||
|
||||
if( !humanReadableText.equals( this.lastHumanReadableText ) )
|
||||
{
|
||||
this.lastHumanReadableText = humanReadableText;
|
||||
this.getHost().markForUpdate();
|
||||
}
|
||||
}
|
||||
else if( this.configuredFluid != null )
|
||||
{
|
||||
if( fullStack == null )
|
||||
{
|
||||
this.configuredFluid.setStackSize( 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
this.configuredFluid.setStackSize( fullStack.getStackSize() );
|
||||
}
|
||||
|
||||
final long stackSize = this.configuredFluid.getStackSize() / 1000;
|
||||
final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize ) + "B";
|
||||
|
||||
if( !humanReadableText.equals( this.lastHumanReadableText ) )
|
||||
{
|
||||
this.lastHumanReadableText = humanReadableText;
|
||||
|
||||
@@ -19,15 +19,31 @@
|
||||
package appeng.parts.reporting;
|
||||
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import appeng.api.config.Actionable;
|
||||
import appeng.api.storage.channels.IFluidStorageChannel;
|
||||
import appeng.api.storage.data.IAEFluidStack;
|
||||
import appeng.api.storage.data.IAEStack;
|
||||
import appeng.core.AELog;
|
||||
import appeng.core.sync.network.NetworkHandler;
|
||||
import appeng.core.sync.packets.PacketInventoryAction;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
import appeng.helpers.InventoryAction;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.EnumHand;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.Vec3d;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
import net.minecraftforge.items.wrapper.PlayerMainInvWrapper;
|
||||
|
||||
@@ -92,6 +108,13 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
||||
}
|
||||
|
||||
final ItemStack eq = player.getHeldItem( hand );
|
||||
FluidStack fluidInTank = null;
|
||||
if( eq.hasCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) )
|
||||
{
|
||||
IFluidHandlerItem fluidHandlerItem = ( eq.getCapability( CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null ) );
|
||||
fluidInTank = fluidHandlerItem.drain( Integer.MAX_VALUE, false );
|
||||
}
|
||||
|
||||
if( this.isLocked() )
|
||||
{
|
||||
if( eq.isEmpty() )
|
||||
@@ -103,18 +126,49 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
||||
// wrench it
|
||||
return super.onPartActivate( player, hand, pos );
|
||||
}
|
||||
else if( fluidInTank != null && fluidInTank.amount > 0 )
|
||||
{
|
||||
if( this.getDisplayed() != null && getDisplayed().equals( AEFluidStack.fromFluidStack( fluidInTank ) ) )
|
||||
{
|
||||
this.drainFluidContainer( player, hand );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this.insertItem( player, hand, false );
|
||||
}
|
||||
|
||||
}
|
||||
else if( this.getDisplayed() != null && this.getDisplayed().equals( eq ) )
|
||||
|
||||
//If its a fluid container, grab its fluidstack. if its empty pass its itemstack;
|
||||
|
||||
if (eq.isEmpty()){
|
||||
return super.onPartActivate( player, hand, pos );
|
||||
}
|
||||
if( fluidInTank != null && fluidInTank.amount > 0 )
|
||||
{
|
||||
this.insertItem( player, hand, false );
|
||||
if( getDisplayed() instanceof IAEItemStack || getDisplayed() == null )
|
||||
{
|
||||
return super.onPartActivate( player, hand, pos );
|
||||
}
|
||||
if( ( (IAEFluidStack) this.getDisplayed() ).equals( AEFluidStack.fromFluidStack( fluidInTank ) ) )
|
||||
{
|
||||
this.drainFluidContainer( player, hand );
|
||||
}
|
||||
else {
|
||||
return super.onPartActivate( player, hand, pos );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return super.onPartActivate( player, hand, pos );
|
||||
if( getDisplayed() instanceof IAEFluidStack || getDisplayed() == null )
|
||||
{
|
||||
return super.onPartActivate( player, hand, pos );
|
||||
}
|
||||
if( ( (IAEItemStack) this.getDisplayed() ).equals( eq ) )
|
||||
{
|
||||
this.insertItem( player, hand, false );
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -138,9 +192,14 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
||||
return false;
|
||||
}
|
||||
|
||||
if( this.getDisplayed() != null )
|
||||
ItemStack eq = player.getHeldItem( hand );
|
||||
if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEItemStack )
|
||||
{
|
||||
this.extractItem( player, this.getDisplayed().getDefinition().getMaxStackSize() );
|
||||
this.extractItem( player, ( (IAEItemStack) this.getDisplayed() ).getDefinition().getMaxStackSize() );
|
||||
}
|
||||
else if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEFluidStack )
|
||||
{
|
||||
this.fillFluidContainer( player,hand );
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -183,9 +242,9 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
||||
|
||||
if( allItems )
|
||||
{
|
||||
if( this.getDisplayed() != null )
|
||||
if( this.getDisplayed() != null && this.getDisplayed() instanceof IAEItemStack)
|
||||
{
|
||||
final IAEItemStack input = this.getDisplayed().copy();
|
||||
final IAEItemStack input = (IAEItemStack) this.getDisplayed().copy();
|
||||
IItemHandler inv = new PlayerMainInvWrapper( player.inventory );
|
||||
|
||||
for( int x = 0; x < inv.getSlots(); x++ )
|
||||
@@ -221,7 +280,9 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
||||
|
||||
private void extractItem( final EntityPlayer player, int count )
|
||||
{
|
||||
final IAEItemStack input = this.getDisplayed();
|
||||
if (!(this.getDisplayed() instanceof IAEItemStack))
|
||||
return;
|
||||
final IAEItemStack input = (IAEItemStack) this.getDisplayed();
|
||||
if( input != null )
|
||||
{
|
||||
try
|
||||
@@ -265,6 +326,141 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
||||
}
|
||||
}
|
||||
|
||||
private void drainFluidContainer( final EntityPlayer player, final EnumHand hand ) {
|
||||
try
|
||||
{
|
||||
final ItemStack held = player.getHeldItem( hand );
|
||||
if( held.getCount() != 1 )
|
||||
{
|
||||
// only support stacksize 1 for now
|
||||
return;
|
||||
}
|
||||
|
||||
final IFluidHandlerItem fh = FluidUtil.getFluidHandler( held );
|
||||
if( fh == null )
|
||||
{
|
||||
// only fluid handlers items
|
||||
return;
|
||||
}
|
||||
|
||||
// See how much we can drain from the item
|
||||
final FluidStack extract = fh.drain( Integer.MAX_VALUE, false );
|
||||
if( extract == null || extract.amount < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if we can push into the system
|
||||
final IEnergySource energy = this.getProxy().getEnergy();
|
||||
final IMEMonitor<IAEFluidStack> cell = this.getProxy()
|
||||
.getStorage()
|
||||
.getInventory(
|
||||
AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||
final IAEFluidStack notStorable = Platform.poweredInsert( energy, cell, AEFluidStack.fromFluidStack( extract ), new PlayerSource( player, this ), Actionable.SIMULATE );
|
||||
|
||||
if( notStorable != null && notStorable.getStackSize() > 0 )
|
||||
{
|
||||
final int toStore = (int) ( extract.amount - notStorable.getStackSize() );
|
||||
final FluidStack storable = fh.drain( toStore, false );
|
||||
|
||||
if( storable == null || storable.amount == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
extract.amount = storable.amount;
|
||||
}
|
||||
}
|
||||
|
||||
// Actually drain
|
||||
final FluidStack drained = fh.drain( extract, true );
|
||||
extract.amount = drained.amount;
|
||||
|
||||
final IAEFluidStack notInserted = Platform.poweredInsert( energy, cell, AEFluidStack.fromFluidStack( extract ), new PlayerSource( player, this ) );
|
||||
|
||||
if( notInserted != null && notInserted.getStackSize() > 0 )
|
||||
{
|
||||
AELog.error( "Fluid item [%s] reported a different possible amount to drain than it actually provided.", held.getDisplayName() );
|
||||
}
|
||||
|
||||
player.setHeldItem( hand, fh.getContainer() );
|
||||
}
|
||||
catch( GridAccessException e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void fillFluidContainer( final EntityPlayer player, final EnumHand hand )
|
||||
{
|
||||
try
|
||||
{
|
||||
final ItemStack held = player.getHeldItem( hand );
|
||||
if( held.getCount() != 1 )
|
||||
{
|
||||
// only support stacksize 1 for now
|
||||
return;
|
||||
}
|
||||
|
||||
final IFluidHandlerItem fh = FluidUtil.getFluidHandler( held );
|
||||
if( fh == null )
|
||||
{
|
||||
// only fluid handlers items
|
||||
return;
|
||||
}
|
||||
|
||||
final IAEFluidStack stack = (IAEFluidStack) this.getDisplayed().copy();
|
||||
|
||||
// Check how much we can store in the item
|
||||
stack.setStackSize( Integer.MAX_VALUE );
|
||||
int amountAllowed = fh.fill( stack.getFluidStack(), false );
|
||||
stack.setStackSize( amountAllowed );
|
||||
|
||||
// Check if we can pull out of the system
|
||||
final IEnergySource energy = this.getProxy().getEnergy();
|
||||
final IMEMonitor<IAEFluidStack> cell = this.getProxy()
|
||||
.getStorage()
|
||||
.getInventory(
|
||||
AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ) );
|
||||
final IAEFluidStack canPull = Platform.poweredExtraction( energy, cell, stack, new PlayerSource( player, this ), Actionable.SIMULATE );
|
||||
if( canPull == null || canPull.getStackSize() < 1 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// How much could fit into the container
|
||||
final int canFill = fh.fill( canPull.getFluidStack(), false );
|
||||
if( canFill == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Now actually pull out of the system
|
||||
stack.setStackSize( canFill );
|
||||
final IAEFluidStack pulled = Platform.poweredExtraction( energy, cell, stack, new PlayerSource( player, this ) );
|
||||
if( pulled == null || pulled.getStackSize() < 1 )
|
||||
{
|
||||
// Something went wrong
|
||||
AELog.error( "Unable to pull fluid out of the ME system even though the simulation said yes " );
|
||||
return;
|
||||
}
|
||||
|
||||
// Actually fill
|
||||
final int used = fh.fill( pulled.getFluidStack(), true );
|
||||
|
||||
if( used != canFill )
|
||||
{
|
||||
AELog.error( "Fluid item [%s] reported a different possible amount than it actually accepted.", held.getDisplayName() );
|
||||
}
|
||||
player.setHeldItem( hand, fh.getContainer() );
|
||||
}
|
||||
catch( GridAccessException e )
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public IPartModel getStaticModels()
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -47,7 +47,7 @@ public abstract class InventoryAdaptor implements Iterable<ItemSlot>
|
||||
{
|
||||
if( te != null )
|
||||
{
|
||||
if( te.hasCapability( ITEM_REPOSITORY_CAPABILITY, d ) )
|
||||
if( ITEM_REPOSITORY_CAPABILITY != null && te.hasCapability( ITEM_REPOSITORY_CAPABILITY, d ) )
|
||||
{
|
||||
IItemRepository itemRepository = te.getCapability( ITEM_REPOSITORY_CAPABILITY, d );
|
||||
if (itemRepository != null){
|
||||
|
||||
@@ -1,4 +1,25 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:part",
|
||||
@@ -25,4 +46,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,11 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 1
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:material",
|
||||
@@ -25,4 +32,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,20 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:charger"
|
||||
@@ -23,4 +39,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,10 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:sky_compass"
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:sky_compass"
|
||||
@@ -23,4 +29,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,35 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:controller"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:controller"
|
||||
@@ -23,4 +54,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,61 @@
|
||||
{
|
||||
"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",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:controller"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 360
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 340
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:crafting_storage_64k"
|
||||
@@ -61,4 +118,4 @@
|
||||
"c64k"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
+37
-1
@@ -1,4 +1,40 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:controller"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 360
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:part",
|
||||
@@ -25,4 +61,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,33 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:facade"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:facade"
|
||||
"item": "appliedenergistics2:facade",
|
||||
"nbt": "{item:\"minecraft:stone\"}"
|
||||
},
|
||||
"title": {
|
||||
"translate": "achievement.ae2.Facade"
|
||||
@@ -23,4 +49,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,20 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:material",
|
||||
@@ -25,4 +41,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+21
-1
@@ -1,4 +1,24 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:quartz_growth_accelerator"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:quartz_growth_accelerator"
|
||||
@@ -23,4 +43,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,29 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:interface"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:interface"
|
||||
@@ -23,4 +48,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:controller"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:io_port"
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:io_port"
|
||||
@@ -23,4 +69,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,25 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:part",
|
||||
@@ -17,4 +38,4 @@
|
||||
"trigger": "appliedenergistics2:network_apprentice"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,25 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:part",
|
||||
@@ -17,4 +38,4 @@
|
||||
"trigger": "appliedenergistics2:network_engineer"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,25 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:part",
|
||||
@@ -17,4 +38,4 @@
|
||||
"trigger": "appliedenergistics2:network_admin"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,39 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:controller"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:network_tool"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:network_tool"
|
||||
@@ -23,4 +58,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,30 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 460
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:part",
|
||||
@@ -18,11 +44,11 @@
|
||||
"conditions": {
|
||||
"items": [
|
||||
{
|
||||
"type": "appliedenergistics2:part",
|
||||
"part": "P2P_TUNNEL_ME"
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 460
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+42
-1
@@ -1,4 +1,45 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:controller"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 360
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 340
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:part",
|
||||
@@ -25,4 +66,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,55 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"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",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:controller"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:portable_cell"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:portable_cell"
|
||||
@@ -23,4 +74,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,31 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:material",
|
||||
@@ -66,4 +93,4 @@
|
||||
"silicon"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,34 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 460
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:quantum_link"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:quantum_link"
|
||||
@@ -23,4 +53,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,4 +27,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+56
-1
@@ -1,4 +1,59 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"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",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 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"
|
||||
@@ -16,4 +71,4 @@
|
||||
"trigger": "appliedenergistics2:spatial_explorer"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+56
-1
@@ -1,4 +1,59 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"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",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 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"
|
||||
@@ -23,4 +78,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,34 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:charger"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 7
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 16
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:interface"
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:part",
|
||||
"data": 220
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:part",
|
||||
@@ -25,4 +55,4 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,51 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "forge:and",
|
||||
"values": [
|
||||
{
|
||||
"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",
|
||||
"data": 13
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 14
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 15
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:material",
|
||||
"data": 19
|
||||
},
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:controller"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"display": {
|
||||
"icon": {
|
||||
"item": "appliedenergistics2:storage_cell_64k"
|
||||
@@ -61,4 +108,4 @@
|
||||
"c64k"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
+19
@@ -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": {
|
||||
|
||||
+6
@@ -1,4 +1,10 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "appliedenergistics2:material_exists",
|
||||
"material": "material.calculation_processor_press"
|
||||
}
|
||||
],
|
||||
"type": "appliedenergistics2:inscriber",
|
||||
"mode": "inscribe",
|
||||
"result": {
|
||||
|
||||
+19
@@ -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": {
|
||||
|
||||
+19
@@ -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": {
|
||||
|
||||
+6
@@ -1,4 +1,10 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "appliedenergistics2:material_exists",
|
||||
"material": "material.engineering_processor_press"
|
||||
}
|
||||
],
|
||||
"type": "appliedenergistics2:inscriber",
|
||||
"mode": "inscribe",
|
||||
"result": {
|
||||
|
||||
+15
@@ -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": {
|
||||
|
||||
+19
@@ -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": {
|
||||
|
||||
+6
@@ -1,4 +1,10 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "appliedenergistics2:material_exists",
|
||||
"material": "material.logic_processor_press"
|
||||
}
|
||||
],
|
||||
"type": "appliedenergistics2:inscriber",
|
||||
"mode": "inscribe",
|
||||
"result": {
|
||||
|
||||
+15
@@ -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"
|
||||
|
||||
+15
@@ -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"
|
||||
|
||||
+6
@@ -1,4 +1,10 @@
|
||||
{
|
||||
"conditions": [
|
||||
{
|
||||
"type": "minecraft:item_exists",
|
||||
"item": "appliedenergistics2:quartz_block"
|
||||
}
|
||||
],
|
||||
"result": {
|
||||
"item": "appliedenergistics2:quartz_block"
|
||||
},
|
||||
|
||||
+15
@@ -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"
|
||||
},
|
||||
|
||||
+15
@@ -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
|
||||
|
||||
+15
@@ -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"
|
||||
},
|
||||
|
||||
+15
@@ -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"
|
||||
},
|
||||
|
||||
+6
@@ -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
|
||||
|
||||
+15
@@ -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"
|
||||
},
|
||||
|
||||
+15
@@ -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"
|
||||
},
|
||||
|
||||
+15
@@ -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"
|
||||
},
|
||||
|
||||
+15
@@ -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,
|
||||
|
||||
+15
@@ -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,
|
||||
|
||||
+15
@@ -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,
|
||||
|
||||
+15
@@ -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,
|
||||
|
||||
+15
@@ -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,
|
||||
|
||||
+15
@@ -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
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user