Compare commits
33 Commits
om
...
omni-fixes-v39
| Author | SHA1 | Date | |
|---|---|---|---|
| f3877aa1ec | |||
| 366b31b3aa | |||
| 533fb5c34b | |||
| 62d1d904c6 | |||
| 03fb43db16 | |||
| 9576bec855 | |||
| b5da6730a1 | |||
| 039bab4811 | |||
| 4b5bdf9893 | |||
| 3c3c23712d | |||
| af91c04ea1 | |||
| 0240a5d76a | |||
| 0c0aafba2f | |||
| b541025738 | |||
| 62f842d4ef | |||
| fc154d8568 | |||
| 4641e48529 | |||
| 0fae87afc7 | |||
| ee1b6bb0d7 | |||
| 36ca8b9f0a | |||
| 9c94c7342b | |||
| 399d67b42c | |||
| 10761a1e9d | |||
| d1ddf53d99 | |||
| f776b4d548 | |||
| 41180792e1 | |||
| 2269c05d98 | |||
| 63616e5730 | |||
| 6ca3e6e696 | |||
| a4b5cfc3b9 | |||
| 38b0a7a153 | |||
| aa4863a979 | |||
| 44c7a46315 |
@@ -85,7 +85,6 @@ configurations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly "com.jaquadro.minecraft.storagedrawers:StorageDrawers:1.12.2-5.4.2:api"
|
|
||||||
compileOnly "gregtechce:gregtech:1.12.2:1.12.0.662"
|
compileOnly "gregtechce:gregtech:1.12.2:1.12.0.662"
|
||||||
|
|
||||||
// installable runtime dependencies
|
// installable runtime dependencies
|
||||||
@@ -106,8 +105,6 @@ dependencies {
|
|||||||
|
|
||||||
// at runtime, use the full JEI jar
|
// at runtime, use the full JEI jar
|
||||||
runtime "mezz.jei:jei_${minecraft_version}:${jei_version}"
|
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
|
// unit test dependencies
|
||||||
testCompile "junit:junit:4.12"
|
testCompile "junit:junit:4.12"
|
||||||
|
|||||||
+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> { }
|
||||||
|
}
|
||||||
@@ -25,8 +25,11 @@ import java.util.EnumMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
|
import appeng.client.gui.AEBaseGui;
|
||||||
|
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||||
import appeng.helpers.HighlighterHandler;
|
import appeng.helpers.HighlighterHandler;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.client.settings.KeyBinding;
|
import net.minecraft.client.settings.KeyBinding;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
@@ -36,10 +39,7 @@ import net.minecraft.util.EnumHand;
|
|||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.util.math.Vec3d;
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.client.event.MouseEvent;
|
import net.minecraftforge.client.event.*;
|
||||||
import net.minecraftforge.client.event.RenderLivingEvent;
|
|
||||||
import net.minecraftforge.client.event.RenderWorldLastEvent;
|
|
||||||
import net.minecraftforge.client.event.TextureStitchEvent;
|
|
||||||
import net.minecraftforge.client.model.ModelLoaderRegistry;
|
import net.minecraftforge.client.model.ModelLoaderRegistry;
|
||||||
import net.minecraftforge.common.ForgeModContainer;
|
import net.minecraftforge.common.ForgeModContainer;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
@@ -75,6 +75,7 @@ import appeng.hooks.TickHandler;
|
|||||||
import appeng.hooks.TickHandler.PlayerColor;
|
import appeng.hooks.TickHandler.PlayerColor;
|
||||||
import appeng.server.ServerHelper;
|
import appeng.server.ServerHelper;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
|
|
||||||
public class ClientHelper extends ServerHelper
|
public class ClientHelper extends ServerHelper
|
||||||
@@ -315,6 +316,28 @@ public class ClientHelper extends ServerHelper
|
|||||||
Minecraft.getMinecraft().effectRenderer.addEffect( fx );
|
Minecraft.getMinecraft().effectRenderer.addEffect( fx );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void MouseClickEvent( final GuiScreenEvent.MouseInputEvent.Pre me )
|
||||||
|
{
|
||||||
|
final Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
if( mc.currentScreen instanceof IJEIGhostIngredients )
|
||||||
|
{
|
||||||
|
AEBaseGui gui = ( (AEBaseGui) mc.currentScreen );
|
||||||
|
Object ingredient = gui.getBookmarkedIngredient();
|
||||||
|
if( ingredient != null )
|
||||||
|
{
|
||||||
|
if( GuiScreen.isShiftKeyDown() )
|
||||||
|
{
|
||||||
|
me.setCanceled( true );
|
||||||
|
}
|
||||||
|
else if( Mouse.isButtonDown( 0 ) )
|
||||||
|
{
|
||||||
|
me.setCanceled( true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void wheelEvent( final MouseEvent me )
|
public void wheelEvent( final MouseEvent me )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
package appeng.client.gui;
|
package appeng.client.gui;
|
||||||
|
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
@@ -31,13 +32,16 @@ import java.util.List;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import appeng.tile.inventory.AppEngInternalInventory;
|
import appeng.container.slot.*;
|
||||||
import com.google.common.base.Joiner;
|
import com.google.common.base.Joiner;
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
|
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||||
|
import net.minecraft.client.gui.Gui;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
import net.minecraftforge.fluids.FluidUtil;
|
||||||
import net.minecraftforge.fml.common.Optional;
|
import net.minecraftforge.fml.common.Optional;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
|
||||||
import org.lwjgl.input.Keyboard;
|
import org.lwjgl.input.Keyboard;
|
||||||
import org.lwjgl.input.Mouse;
|
import org.lwjgl.input.Mouse;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
@@ -71,17 +75,7 @@ import appeng.client.me.SlotDisconnected;
|
|||||||
import appeng.client.me.SlotME;
|
import appeng.client.me.SlotME;
|
||||||
import appeng.client.render.StackSizeRenderer;
|
import appeng.client.render.StackSizeRenderer;
|
||||||
import appeng.container.AEBaseContainer;
|
import appeng.container.AEBaseContainer;
|
||||||
import appeng.container.slot.AppEngCraftingSlot;
|
|
||||||
import appeng.container.slot.AppEngSlot;
|
|
||||||
import appeng.container.slot.AppEngSlot.hasCalculatedValidness;
|
import appeng.container.slot.AppEngSlot.hasCalculatedValidness;
|
||||||
import appeng.container.slot.IOptionalSlot;
|
|
||||||
import appeng.container.slot.SlotCraftingTerm;
|
|
||||||
import appeng.container.slot.SlotDisabled;
|
|
||||||
import appeng.container.slot.SlotFake;
|
|
||||||
import appeng.container.slot.SlotInaccessible;
|
|
||||||
import appeng.container.slot.SlotOutput;
|
|
||||||
import appeng.container.slot.SlotPatternTerm;
|
|
||||||
import appeng.container.slot.SlotRestrictedInput;
|
|
||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import appeng.core.AppEng;
|
import appeng.core.AppEng;
|
||||||
import appeng.core.sync.network.NetworkHandler;
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
@@ -92,6 +86,9 @@ import appeng.fluids.container.slots.IMEFluidSlot;
|
|||||||
import appeng.helpers.InventoryAction;
|
import appeng.helpers.InventoryAction;
|
||||||
import yalter.mousetweaks.api.IMTModGuiContainer2;
|
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" )
|
@Optional.Interface( iface = "yalter.mousetweaks.api.IMTModGuiContainer2", modid = "mousetweaks" )
|
||||||
public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContainer2
|
public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContainer2
|
||||||
@@ -106,6 +103,28 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
private Stopwatch dbl_clickTimer = Stopwatch.createStarted();
|
private Stopwatch dbl_clickTimer = Stopwatch.createStarted();
|
||||||
private ItemStack dbl_whichItem = ItemStack.EMPTY;
|
private ItemStack dbl_whichItem = ItemStack.EMPTY;
|
||||||
private Slot bl_clicked;
|
private Slot bl_clicked;
|
||||||
|
private Stopwatch lastClicked = Stopwatch.createStarted();
|
||||||
|
private List<IGhostIngredientHandler.Target<Object>> hoveredIngredientTargets = new ArrayList<>();
|
||||||
|
private Object bookmarkedIngredient;
|
||||||
|
private boolean isDraggingJeiGhostItem;
|
||||||
|
|
||||||
|
public void setJeiGhostItem( boolean jeiGhostItem )
|
||||||
|
{
|
||||||
|
isJeiGhostItem = jeiGhostItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isJeiGhostItem;
|
||||||
|
|
||||||
|
public Object getBookmarkedIngredient()
|
||||||
|
{
|
||||||
|
return bookmarkedIngredient;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<GuiCustomSlot> getGuiSlots()
|
||||||
|
{
|
||||||
|
return guiSlots;
|
||||||
|
}
|
||||||
|
|
||||||
protected final List<GuiCustomSlot> guiSlots = new ArrayList<>();
|
protected final List<GuiCustomSlot> guiSlots = new ArrayList<>();
|
||||||
|
|
||||||
public AEBaseGui( final Container container )
|
public AEBaseGui( final Container container )
|
||||||
@@ -188,6 +207,65 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
this.drawTooltip( (ITooltip) c, mouseX, mouseY );
|
this.drawTooltip( (ITooltip) c, mouseX, mouseY );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GlStateManager.enableDepth();
|
||||||
|
bookmarkedJEIghostItem(mouseX,mouseY);
|
||||||
|
GlStateManager.disableDepth();
|
||||||
|
}
|
||||||
|
|
||||||
|
void bookmarkedJEIghostItem(final int mouseX, final int mouseY) {
|
||||||
|
|
||||||
|
if (!isJeiGhostItem)
|
||||||
|
{
|
||||||
|
bookmarkedIngredient = runtime.getBookmarkOverlay().getIngredientUnderMouse();
|
||||||
|
}
|
||||||
|
|
||||||
|
if( bookmarkedIngredient != null )
|
||||||
|
{
|
||||||
|
hoveredIngredientTargets = aeGuiHandler.getTargets( this, bookmarkedIngredient, false );
|
||||||
|
ItemStack dragItem = ItemStack.EMPTY;
|
||||||
|
if( hoveredIngredientTargets.size() > 0 )
|
||||||
|
{
|
||||||
|
if( isShiftKeyDown() && Mouse.isButtonDown( 0 ) && this.lastClicked.elapsed( TimeUnit.MILLISECONDS ) > 200 )
|
||||||
|
{
|
||||||
|
this.lastClicked = Stopwatch.createStarted();
|
||||||
|
aeGuiHandler.getTargets( this, bookmarkedIngredient, true );
|
||||||
|
}
|
||||||
|
else if( Mouse.isButtonDown( 0 ) && this.lastClicked.elapsed( TimeUnit.MILLISECONDS ) > 200 )
|
||||||
|
{
|
||||||
|
this.lastClicked = Stopwatch.createStarted();
|
||||||
|
if( bookmarkedIngredient instanceof ItemStack )
|
||||||
|
{
|
||||||
|
dragItem = ( (ItemStack) bookmarkedIngredient );
|
||||||
|
}
|
||||||
|
else if( bookmarkedIngredient instanceof FluidStack )
|
||||||
|
{
|
||||||
|
dragItem = FluidUtil.getFilledBucket( ( (FluidStack) bookmarkedIngredient ) );
|
||||||
|
}
|
||||||
|
mc.player.inventory.setItemStack( dragItem.copy() );
|
||||||
|
this.isJeiGhostItem = true;
|
||||||
|
}
|
||||||
|
drawTargets( mouseX, mouseY );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void drawTargets(int mouseX, int mouseY) {
|
||||||
|
GlStateManager.disableLighting();
|
||||||
|
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 );
|
||||||
|
GlStateManager.enableDepth();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void drawGuiSlot( GuiCustomSlot slot, int mouseX, int mouseY, float partialTicks )
|
protected void drawGuiSlot( GuiCustomSlot slot, int mouseX, int mouseY, float partialTicks )
|
||||||
@@ -320,7 +398,6 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
{
|
{
|
||||||
slot.drawBackground( ox, oy );
|
slot.drawBackground( ox, oy );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -387,29 +464,13 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
{
|
{
|
||||||
if( !itemstack.isEmpty() )
|
if( !itemstack.isEmpty() )
|
||||||
{
|
{
|
||||||
Set<IItemHandler> visitedInterfaces = new HashSet<>();
|
|
||||||
for( final Slot dr : this.drag_click )
|
for( final Slot dr : this.drag_click )
|
||||||
{
|
{
|
||||||
IItemHandler interfaceHandler = ( (SlotDisconnected) slot ).getSlot().getInventory();
|
if( slot.getStack().isEmpty() )
|
||||||
if (visitedInterfaces.contains( interfaceHandler )) break;
|
|
||||||
visitedInterfaces.add( interfaceHandler );
|
|
||||||
boolean canInsert = true;
|
|
||||||
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
|
|
||||||
{
|
{
|
||||||
if( ItemStack.areItemStacksEqual( interfaceHandler.getStackInSlot( s ), itemstack ) )
|
InventoryAction action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
||||||
{
|
final PacketInventoryAction p = new PacketInventoryAction( action, dr.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
||||||
canInsert = false;
|
NetworkHandler.instance().sendToServer( p );
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( canInsert )
|
|
||||||
{
|
|
||||||
if( slot.getStack().isEmpty() )
|
|
||||||
{
|
|
||||||
InventoryAction action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
|
||||||
final PacketInventoryAction p = new PacketInventoryAction( action, dr.getSlotIndex(), ( (SlotDisconnected) slot ).getSlot().getId() );
|
|
||||||
NetworkHandler.instance().sendToServer( p );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -445,18 +506,56 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
{
|
{
|
||||||
final EntityPlayer player = Minecraft.getMinecraft().player;
|
final EntityPlayer player = Minecraft.getMinecraft().player;
|
||||||
|
|
||||||
if( slot instanceof SlotFake )
|
if( this.isJeiGhostItem && isDraggingJeiGhostItem)
|
||||||
{
|
{
|
||||||
final InventoryAction action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
for( IGhostIngredientHandler.Target target : hoveredIngredientTargets )
|
||||||
|
{
|
||||||
|
Rectangle area = target.getArea();
|
||||||
|
final int x = Mouse.getEventX() * this.width / this.mc.displayWidth;
|
||||||
|
final int y = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1;
|
||||||
|
|
||||||
|
if( area.contains( x, y ) )
|
||||||
|
{
|
||||||
|
target.accept( bookmarkedIngredient );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.isJeiGhostItem = false;
|
||||||
|
this.isDraggingJeiGhostItem = false;
|
||||||
|
|
||||||
|
ItemStack dragItem = ItemStack.EMPTY;
|
||||||
|
if( runtime.getBookmarkOverlay().getIngredientUnderMouse() != null )
|
||||||
|
{
|
||||||
|
bookmarkedJEIghostItem( Mouse.getX(), this.mc.displayHeight - Mouse.getY() );
|
||||||
|
if( bookmarkedIngredient instanceof ItemStack )
|
||||||
|
{
|
||||||
|
dragItem = ( (ItemStack) bookmarkedIngredient );
|
||||||
|
}
|
||||||
|
else if( bookmarkedIngredient instanceof FluidStack )
|
||||||
|
{
|
||||||
|
dragItem = FluidUtil.getFilledBucket( ( (FluidStack) bookmarkedIngredient ) );
|
||||||
|
}
|
||||||
|
mc.player.inventory.setItemStack( dragItem.copy() );
|
||||||
|
this.isJeiGhostItem = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mc.player.inventory.setItemStack( dragItem );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( slot instanceof SlotFake )
|
||||||
|
{
|
||||||
|
final InventoryAction action;
|
||||||
|
action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
||||||
|
|
||||||
if( this.drag_click.size() > 1 )
|
if( this.drag_click.size() > 1 )
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, 0 );
|
PacketInventoryAction p = new PacketInventoryAction( action, slotIdx, 0 );
|
||||||
NetworkHandler.instance().sendToServer( p );
|
NetworkHandler.instance().sendToServer( p );
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -538,23 +637,12 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
case PICKUP: // pickup / set-down.
|
case PICKUP: // pickup / set-down.
|
||||||
if( slot.getStack().isEmpty() && !player.inventory.getItemStack().isEmpty() )
|
if( slot.getStack().isEmpty() && !player.inventory.getItemStack().isEmpty() )
|
||||||
{
|
{
|
||||||
boolean canInsert = true;
|
action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
||||||
IItemHandler interfaceHandler = ( (SlotDisconnected) slot ).getSlot().getInventory();
|
}
|
||||||
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
|
if( !slot.getStack().isEmpty() && player.inventory.getItemStack().getCount() <= 1 )
|
||||||
{
|
{
|
||||||
if( ItemStack.areItemStacksEqual( interfaceHandler.getStackInSlot( s ), player.inventory.getItemStack() ) )
|
action = InventoryAction.PICKUP_OR_SET_DOWN;
|
||||||
{
|
|
||||||
canInsert = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( canInsert )
|
|
||||||
{
|
|
||||||
action = InventoryAction.SPLIT_OR_PLACE_SINGLE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
if( !slot.getStack().isEmpty() && player.inventory.getItemStack().getCount() <= 1 ) action = InventoryAction.PICKUP_OR_SET_DOWN;
|
|
||||||
break;
|
break;
|
||||||
case QUICK_MOVE:
|
case QUICK_MOVE:
|
||||||
action = ( mouseButton == 1 ) ? InventoryAction.PICKUP_SINGLE : InventoryAction.SHIFT_CLICK;
|
action = ( mouseButton == 1 ) ? InventoryAction.PICKUP_SINGLE : InventoryAction.SHIFT_CLICK;
|
||||||
@@ -587,14 +675,13 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
InventoryAction action = null;
|
InventoryAction action = null;
|
||||||
IAEItemStack stack = null;
|
IAEItemStack stack = null;
|
||||||
|
|
||||||
switch( clickType )
|
switch ( clickType )
|
||||||
{
|
{
|
||||||
case PICKUP: // pickup / set-down.
|
case PICKUP: // pickup / set-down.
|
||||||
action = ( mouseButton == 1 ) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
action = ( mouseButton == 1 ) ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN;
|
||||||
stack = ( (SlotME) slot ).getAEStack();
|
stack = ( (SlotME) slot ).getAEStack();
|
||||||
|
|
||||||
if( stack != null && action == InventoryAction.PICKUP_OR_SET_DOWN && stack.getStackSize() == 0 && player.inventory.getItemStack()
|
if( stack != null && action == InventoryAction.PICKUP_OR_SET_DOWN && stack.getStackSize() == 0 && player.inventory.getItemStack().isEmpty() )
|
||||||
.isEmpty() )
|
|
||||||
{
|
{
|
||||||
action = InventoryAction.AUTO_CRAFT;
|
action = InventoryAction.AUTO_CRAFT;
|
||||||
}
|
}
|
||||||
@@ -661,9 +748,7 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
final List<Slot> slots = this.getInventorySlots();
|
final List<Slot> slots = this.getInventorySlots();
|
||||||
for( final Slot inventorySlot : slots )
|
for( final Slot inventorySlot : slots )
|
||||||
{
|
{
|
||||||
if( inventorySlot != null && inventorySlot.canTakeStack(
|
if( inventorySlot != null && inventorySlot.canTakeStack( this.mc.player ) && inventorySlot.getHasStack() && inventorySlot.isSameInventory( slot ) && Container.canAddItemToSlot( inventorySlot, this.dbl_whichItem, true ) )
|
||||||
this.mc.player ) && inventorySlot.getHasStack() && inventorySlot.isSameInventory( slot ) && Container.canAddItemToSlot(
|
|
||||||
inventorySlot, this.dbl_whichItem, true ) )
|
|
||||||
{
|
{
|
||||||
this.handleMouseClick( inventorySlot, inventorySlot.slotNumber, 0, ClickType.QUICK_MOVE );
|
this.handleMouseClick( inventorySlot, inventorySlot.slotNumber, 0, ClickType.QUICK_MOVE );
|
||||||
}
|
}
|
||||||
@@ -674,6 +759,11 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
this.disableShiftClick = false;
|
this.disableShiftClick = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (clickType == ClickType.PICKUP && isJeiGhostItem && !isDraggingJeiGhostItem) {
|
||||||
|
this.isDraggingJeiGhostItem = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
super.handleMouseClick( slot, slotIdx, mouseButton, clickType );
|
super.handleMouseClick( slot, slotIdx, mouseButton, clickType );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1101,4 +1191,5 @@ public abstract class AEBaseGui extends GuiContainer implements IMTModGuiContain
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,26 +2,23 @@ package appeng.client.gui;
|
|||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.client.gui.implementations.GuiCraftAmount;
|
import appeng.client.gui.implementations.*;
|
||||||
import appeng.client.gui.implementations.GuiCraftConfirm;
|
import appeng.container.interfaces.IJEIGhostIngredients;
|
||||||
import appeng.client.gui.implementations.GuiCraftingCPU;
|
import appeng.container.slot.SlotFake;
|
||||||
import appeng.client.gui.widgets.GuiCustomSlot;
|
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||||
import appeng.container.implementations.ContainerCraftAmount;
|
|
||||||
import mezz.jei.api.gui.IAdvancedGuiHandler;
|
import mezz.jei.api.gui.IAdvancedGuiHandler;
|
||||||
import net.minecraft.client.renderer.RenderItem;
|
import mezz.jei.api.gui.IGhostIngredientHandler;
|
||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.client.gui.GuiScreen;
|
||||||
import net.minecraft.item.ItemStack;
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>
|
public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>, IGhostIngredientHandler<AEBaseGui>
|
||||||
{
|
{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<AEBaseGui> getGuiContainerClass()
|
public Class<AEBaseGui> getGuiContainerClass()
|
||||||
{
|
{
|
||||||
@@ -39,8 +36,8 @@ public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>
|
|||||||
@Override
|
@Override
|
||||||
public Object getIngredientUnderMouse( AEBaseGui guiContainer, int mouseX, int mouseY )
|
public Object getIngredientUnderMouse( AEBaseGui guiContainer, int mouseX, int mouseY )
|
||||||
{
|
{
|
||||||
List<IAEItemStack> visual = new ArrayList<>();
|
List<IAEItemStack> visual;
|
||||||
int guiSlotIdx = 0;
|
int guiSlotIdx;
|
||||||
Object result = null;
|
Object result = null;
|
||||||
if( guiContainer instanceof GuiCraftConfirm )
|
if( guiContainer instanceof GuiCraftConfirm )
|
||||||
{
|
{
|
||||||
@@ -94,4 +91,54 @@ public class AEGuiHandler implements IAdvancedGuiHandler<AEBaseGui>
|
|||||||
if( guiSloty > ( rows - 1 ) || mouseY < guitop + yo ) return -1;
|
if( guiSloty > ( rows - 1 ) || mouseY < guitop + yo ) return -1;
|
||||||
return ( guiSloty * 3 ) + guiSlotx + ( currentScroll * 3 );
|
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() && Mouse.isButtonDown( 0 ) )
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ import appeng.util.Platform;
|
|||||||
import net.minecraft.nbt.NBTUtil;
|
import net.minecraft.nbt.NBTUtil;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.text.TextComponentString;
|
import net.minecraft.util.text.TextComponentString;
|
||||||
|
import org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
|
|
||||||
import static appeng.client.render.BlockPosHighlighter.hilightBlock;
|
import static appeng.client.render.BlockPosHighlighter.hilightBlock;
|
||||||
@@ -68,6 +69,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
private final HashMap<GuiButton,ClientDCInternalInv> guiButtonHashMap = new HashMap<>();
|
private final HashMap<GuiButton,ClientDCInternalInv> guiButtonHashMap = new HashMap<>();
|
||||||
private final ArrayList<String> names = new ArrayList<>();
|
private final ArrayList<String> names = new ArrayList<>();
|
||||||
private final ArrayList<Object> lines = new ArrayList<>();
|
private final ArrayList<Object> lines = new ArrayList<>();
|
||||||
|
private final Set<Object> matchedStacks = new HashSet<>();
|
||||||
|
|
||||||
private final Map<String, Set<Object>> cachedSearches = new WeakHashMap<>();
|
private final Map<String, Set<Object>> cachedSearches = new WeakHashMap<>();
|
||||||
|
|
||||||
@@ -123,14 +125,6 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
super.onGuiClosed();
|
super.onGuiClosed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isPointInRegion( int rectX, int rectY, int rectWidth, int rectHeight, int pointX, int pointY )
|
|
||||||
{
|
|
||||||
if( searchFieldInputs.isMouseIn( pointX, pointY ) ) drawTooltip( pointX - guiLeft - offsetX, pointY - guiTop , "Inputs OR names" );
|
|
||||||
else if( searchFieldOutputs.isMouseIn( pointX, pointY ) ) drawTooltip( pointX - guiLeft - offsetX, pointY - guiTop, "Outputs OR names" );
|
|
||||||
return super.isPointInRegion( rectX, rectY, rectWidth, rectHeight, pointX, pointY );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawFG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
public void drawFG( final int offsetX, final int offsetY, final int mouseX, final int mouseY )
|
||||||
{
|
{
|
||||||
@@ -161,6 +155,8 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
for( int z = 0; z < inv.getInventory().getSlots(); z++ )
|
for( int z = 0; z < inv.getInventory().getSlots(); z++ )
|
||||||
{
|
{
|
||||||
this.inventorySlots.inventorySlots.add( new SlotDisconnected( inv, z, z * 18 + 22, 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 GuiImgButton(guiLeft + 4, guiTop + offset + 1, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE);
|
GuiButton guiButton = new GuiImgButton(guiLeft + 4, guiTop + offset + 1, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE);
|
||||||
@@ -186,6 +182,10 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
}
|
}
|
||||||
offset += 18;
|
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
|
@Override
|
||||||
@@ -217,7 +217,8 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
{
|
{
|
||||||
BlockPos blockPos = blockPosHashMap.get( guiButtonHashMap.get( this.selectedButton ) );
|
BlockPos blockPos = blockPosHashMap.get( guiButtonHashMap.get( this.selectedButton ) );
|
||||||
BlockPos blockPos2 = mc.player.getPosition();
|
BlockPos blockPos2 = mc.player.getPosition();
|
||||||
hilightBlock( blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance(blockPos, blockPos2) );
|
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.sendStatusMessage( new TextComponentString( "The interface is now highlighted at " + "X: " + blockPos.getX() + " Y: " + blockPos.getY() + " Z: " + blockPos.getZ() ), false );
|
||||||
mc.player.closeScreen();
|
mc.player.closeScreen();
|
||||||
}
|
}
|
||||||
@@ -358,6 +359,7 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
{
|
{
|
||||||
this.byName.clear();
|
this.byName.clear();
|
||||||
this.buttonList.clear();
|
this.buttonList.clear();
|
||||||
|
this.matchedStacks.clear();
|
||||||
|
|
||||||
final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase();
|
final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase();
|
||||||
final String searchFieldOutputs = this.searchFieldOutputs.getText().toLowerCase();
|
final String searchFieldOutputs = this.searchFieldOutputs.getText().toLowerCase();
|
||||||
@@ -376,37 +378,36 @@ public class GuiInterfaceTerminal extends AEBaseGui
|
|||||||
// Shortcut to skip any filter if search term is ""/empty
|
// Shortcut to skip any filter if search term is ""/empty
|
||||||
|
|
||||||
boolean found = (searchFieldInputs.isEmpty() && searchFieldOutputs.isEmpty() && !partInterfaceTerminal.onlyInterfacesWithFreeSlots);
|
boolean found = (searchFieldInputs.isEmpty() && searchFieldOutputs.isEmpty() && !partInterfaceTerminal.onlyInterfacesWithFreeSlots);
|
||||||
|
boolean interfaceHasFreeSlots = false;
|
||||||
|
|
||||||
// Search if the current inventory holds a pattern containing the search term.
|
// Search if the current inventory holds a pattern containing the search term.
|
||||||
if( !found )
|
if( !found )
|
||||||
{
|
{
|
||||||
for( final ItemStack itemStack : entry.getInventory() )
|
for( final ItemStack itemStack : entry.getInventory() )
|
||||||
{
|
{
|
||||||
if( !searchFieldInputs.isEmpty() && !searchFieldOutputs.isEmpty() )
|
if( !searchFieldInputs.isEmpty() && !searchFieldOutputs.isEmpty() ) {
|
||||||
found = ( this.itemStackMatchesSearchTerm( itemStack, searchFieldInputs, 0 ) || this.itemStackMatchesSearchTerm( itemStack, searchFieldOutputs, 1 ) );
|
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldInputs, 0) || this.itemStackMatchesSearchTerm(itemStack, searchFieldOutputs, 1)) {
|
||||||
else if( !searchFieldInputs.isEmpty() )
|
found = true;
|
||||||
found = ( this.itemStackMatchesSearchTerm( itemStack, searchFieldInputs, 0 ) );
|
matchedStacks.add(itemStack);
|
||||||
else if( !searchFieldOutputs.isEmpty() )
|
}
|
||||||
found = ( this.itemStackMatchesSearchTerm( itemStack, searchFieldOutputs, 1 ) );
|
|
||||||
if( found )
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
else if( !searchFieldInputs.isEmpty() ) {
|
||||||
}
|
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldInputs, 0)) {
|
||||||
|
found = true;
|
||||||
// If only Interfaces with empty slots should be shown, check that here
|
matchedStacks.add(itemStack);
|
||||||
boolean interfaceHasFreeSlots = false;
|
}
|
||||||
if (partInterfaceTerminal.onlyInterfacesWithFreeSlots) {
|
}
|
||||||
for( final ItemStack itemStack : entry.getInventory() )
|
else if( !searchFieldOutputs.isEmpty() ) {
|
||||||
{
|
if (this.itemStackMatchesSearchTerm(itemStack, searchFieldOutputs, 1)) {
|
||||||
if(itemStack.isEmpty()){
|
found = true;
|
||||||
|
matchedStacks.add(itemStack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If only Interfaces with empty slots should be shown, check that here
|
||||||
|
if(itemStack.isEmpty())
|
||||||
interfaceHasFreeSlots = true;
|
interfaceHasFreeSlots = true;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if found, filter skipped or machine name matching the search term, add it
|
// if found, filter skipped or machine name matching the search term, add it
|
||||||
if( found || (entry.getName().toLowerCase().contains( searchFieldInputs ) && entry.getName().toLowerCase().contains( searchFieldOutputs )))
|
if( found || (entry.getName().toLowerCase().contains( searchFieldInputs ) && entry.getName().toLowerCase().contains( searchFieldOutputs )))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -19,11 +19,21 @@
|
|||||||
package appeng.client.gui.implementations;
|
package appeng.client.gui.implementations;
|
||||||
|
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.IOException;
|
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.client.gui.GuiButton;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.init.Blocks;
|
import net.minecraft.init.Blocks;
|
||||||
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
import appeng.api.config.ActionItems;
|
import appeng.api.config.ActionItems;
|
||||||
@@ -40,7 +50,7 @@ import appeng.core.sync.network.NetworkHandler;
|
|||||||
import appeng.core.sync.packets.PacketValueConfig;
|
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";
|
private static final String BACKGROUND_CRAFTING_MODE = "guis/pattern.png";
|
||||||
@@ -67,6 +77,7 @@ public class GuiPatternTerm extends GuiMEMonitorable
|
|||||||
private GuiImgButton divThreeBtn;
|
private GuiImgButton divThreeBtn;
|
||||||
private GuiImgButton minusOneBtn;
|
private GuiImgButton minusOneBtn;
|
||||||
private GuiImgButton maxCountBtn;
|
private GuiImgButton maxCountBtn;
|
||||||
|
public Map<Target<?>,Object> mapTargetSlot = new HashMap<>();
|
||||||
|
|
||||||
public GuiPatternTerm( final InventoryPlayer inventoryPlayer, final ITerminalHost te )
|
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;
|
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,24 @@
|
|||||||
package appeng.client.gui.implementations;
|
package appeng.client.gui.implementations;
|
||||||
|
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
import java.io.IOException;
|
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.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 org.lwjgl.input.Mouse;
|
||||||
|
|
||||||
import net.minecraft.client.gui.GuiButton;
|
import net.minecraft.client.gui.GuiButton;
|
||||||
@@ -43,9 +59,9 @@ import appeng.parts.automation.PartExportBus;
|
|||||||
import appeng.parts.automation.PartImportBus;
|
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 ContainerUpgradeable cvb;
|
||||||
protected final IUpgradeableHost bc;
|
protected final IUpgradeableHost bc;
|
||||||
|
|
||||||
@@ -200,4 +216,108 @@ public class GuiUpgradeable extends AEBaseGui
|
|||||||
NetworkHandler.instance().sendToServer( new PacketConfigButton( this.schedulingMode.getSetting(), backwards ) );
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,9 +8,14 @@ public class BlockPosHighlighter
|
|||||||
private static BlockPos hilightedBlock;
|
private static BlockPos hilightedBlock;
|
||||||
private static long expireHilight;
|
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;
|
hilightedBlock = c;
|
||||||
BlockPosHighlighter.expireHilight = expireHilight;
|
BlockPosHighlighter.expireHilight = expireHilight;
|
||||||
|
BlockPosHighlighter.dimension = dimension;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BlockPos getHilightedBlock() {
|
public static BlockPos getHilightedBlock() {
|
||||||
@@ -21,5 +26,9 @@ public class BlockPosHighlighter
|
|||||||
return expireHilight;
|
return expireHilight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int getDimension()
|
||||||
|
{
|
||||||
|
return dimension;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
package appeng.client.render;
|
package appeng.client.render;
|
||||||
|
|
||||||
|
|
||||||
|
import appeng.api.storage.data.IAEFluidStack;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.gui.FontRenderer;
|
import net.minecraft.client.gui.FontRenderer;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
@@ -30,6 +31,7 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.util.IWideReadableNumberConverter;
|
import appeng.util.IWideReadableNumberConverter;
|
||||||
import appeng.util.ReadableNumberConverter;
|
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 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 IItemHandler theSlot = new WrapperFilteredItemHandler( new WrapperRangeItemHandler( inv.server, slot, slot + 1 ), new PatternSlotFilter() );
|
||||||
final InventoryAdaptor interfaceSlot = new AdaptorItemHandler( theSlot );
|
final InventoryAdaptor interfaceSlot = new AdaptorItemHandler( theSlot );
|
||||||
|
|
||||||
switch( action )
|
IItemHandler interfaceHandler = inv.server;
|
||||||
|
boolean canInsert = true;
|
||||||
|
|
||||||
|
switch ( action )
|
||||||
{
|
{
|
||||||
case PICKUP_OR_SET_DOWN:
|
case PICKUP_OR_SET_DOWN:
|
||||||
|
|
||||||
if( hasItemInHand )
|
if( hasItemInHand )
|
||||||
{
|
{
|
||||||
ItemStack inSlot = theSlot.getStackInSlot( 0 );
|
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
|
||||||
if( inSlot.isEmpty() )
|
|
||||||
{
|
{
|
||||||
player.inventory.setItemStack( interfaceSlot.addItems( player.inventory.getItemStack() ) );
|
if( Platform.itemComparisons().isSameItem( interfaceHandler.getStackInSlot( s ), 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() )
|
|
||||||
{
|
{
|
||||||
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
|
else
|
||||||
{
|
{
|
||||||
player.inventory.setItemStack( inHand );
|
inSlot = inSlot.copy();
|
||||||
ItemHandlerUtil.setStackInSlot( theSlot, 0, inSlot );
|
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;
|
break;
|
||||||
case SPLIT_OR_PLACE_SINGLE:
|
case SPLIT_OR_PLACE_SINGLE:
|
||||||
|
|
||||||
if( hasItemInHand )
|
if( hasItemInHand )
|
||||||
{
|
{
|
||||||
ItemStack extra = playerHand.removeItems( 1, ItemStack.EMPTY, null );
|
for( int s = 0; s < interfaceHandler.getSlots(); s++ )
|
||||||
if( !extra.isEmpty() && !interfaceSlot.containsItems())
|
|
||||||
{
|
{
|
||||||
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() )
|
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;
|
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 )
|
public SlotFake( final IItemHandler inv, final int idx, final int x, final int y )
|
||||||
|
|||||||
@@ -164,7 +164,6 @@ public enum AEFeature
|
|||||||
PATTERNS( "Patterns", Constants.CATEGORY_CRAFTING_FEATURES ),
|
PATTERNS( "Patterns", Constants.CATEGORY_CRAFTING_FEATURES ),
|
||||||
CRAFTING_CPU( "CraftingCPU", Constants.CATEGORY_CRAFTING_FEATURES ),
|
CRAFTING_CPU( "CraftingCPU", Constants.CATEGORY_CRAFTING_FEATURES ),
|
||||||
CRAFTING_MANAGER_FALLBACK( "CraftingManagerFallback", Constants.CATEGORY_CRAFTING_FEATURES, "Use CraftingManager to find an alternative recipe, after a pattern rejected an ingredient. Should be enabled to avoid issues, but can have a minor performance impact." ),
|
CRAFTING_MANAGER_FALLBACK( "CraftingManagerFallback", Constants.CATEGORY_CRAFTING_FEATURES, "Use CraftingManager to find an alternative recipe, after a pattern rejected an ingredient. Should be enabled to avoid issues, but can have a minor performance impact." ),
|
||||||
INSANE_BLOCKING_MODE( "InsaneBlockingMode", Constants.CATEGORY_CRAFTING_FEATURES, "Use the default AE2 blocking mode that doesn't work on any machines" ),
|
|
||||||
|
|
||||||
BASIC_CARDS( "BasicCards", Constants.CATEGORY_UPGRADES ),
|
BASIC_CARDS( "BasicCards", Constants.CATEGORY_UPGRADES ),
|
||||||
ADVANCED_CARDS( "AdvancedCards", Constants.CATEGORY_UPGRADES ),
|
ADVANCED_CARDS( "AdvancedCards", Constants.CATEGORY_UPGRADES ),
|
||||||
|
|||||||
@@ -21,6 +21,14 @@ package appeng.core.sync.packets;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import appeng.api.storage.data.IAEFluidStack;
|
||||||
|
import appeng.container.slot.IJEITargetSlot;
|
||||||
|
import appeng.container.slot.SlotFake;
|
||||||
|
import appeng.core.AELog;
|
||||||
|
import appeng.core.sync.network.NetworkHandler;
|
||||||
|
import appeng.fluids.client.gui.widgets.GuiFluidSlot;
|
||||||
|
import appeng.fluids.container.ContainerFluidConfigurable;
|
||||||
|
import appeng.fluids.util.AEFluidStack;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
@@ -40,6 +48,7 @@ import appeng.core.sync.network.INetworkInfo;
|
|||||||
import appeng.helpers.InventoryAction;
|
import appeng.helpers.InventoryAction;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
|
||||||
|
|
||||||
public class PacketInventoryAction extends AppEngPacket
|
public class PacketInventoryAction extends AppEngPacket
|
||||||
@@ -57,6 +66,7 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
this.slot = stream.readInt();
|
this.slot = stream.readInt();
|
||||||
this.id = stream.readLong();
|
this.id = stream.readLong();
|
||||||
final boolean hasItem = stream.readBoolean();
|
final boolean hasItem = stream.readBoolean();
|
||||||
|
|
||||||
if( hasItem )
|
if( hasItem )
|
||||||
{
|
{
|
||||||
this.slotItem = AEItemStack.fromPacket( stream );
|
this.slotItem = AEItemStack.fromPacket( stream );
|
||||||
@@ -70,7 +80,6 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
// api
|
// api
|
||||||
public PacketInventoryAction( final InventoryAction action, final int slot, final IAEItemStack slotItem ) throws IOException
|
public PacketInventoryAction( final InventoryAction action, final int slot, final IAEItemStack slotItem ) throws IOException
|
||||||
{
|
{
|
||||||
|
|
||||||
if( Platform.isClient() )
|
if( Platform.isClient() )
|
||||||
{
|
{
|
||||||
throw new IllegalStateException( "invalid packet, client cannot post inv actions with stacks." );
|
throw new IllegalStateException( "invalid packet, client cannot post inv actions with stacks." );
|
||||||
@@ -101,6 +110,36 @@ public class PacketInventoryAction extends AppEngPacket
|
|||||||
this.configureWrite( data );
|
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
|
// api
|
||||||
public PacketInventoryAction( final InventoryAction action, final int slot, final long id )
|
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.createItemStack() );
|
||||||
|
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 );
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NetworkHandler.instance().sendTo( new PacketInventoryAction( InventoryAction.UPDATE_HAND, 0, AEItemStack.fromItemStack( ItemStack.EMPTY ) ), sender );
|
||||||
|
}
|
||||||
|
catch( final IOException e )
|
||||||
|
{
|
||||||
|
AELog.debug( e );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sender.openContainer instanceof ContainerFluidConfigurable )
|
||||||
|
{
|
||||||
|
if( this.slotItem != null )
|
||||||
|
{
|
||||||
|
IAEFluidStack aefs = AEFluidStack.fromNBT( this.slotItem.getDefinition().getTagCompound() );
|
||||||
|
if( aefs != null )
|
||||||
|
{
|
||||||
|
( (ContainerFluidConfigurable) sender.openContainer ).getFluidConfigInventory().setFluidInSlot( this.slot, aefs );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
baseContainer.doAction( sender, this.action, this.slot, this.id );
|
baseContainer.doAction( sender, this.action, this.slot, this.id );
|
||||||
|
|||||||
@@ -303,7 +303,7 @@ public class PacketJEIRecipe extends AppEngPacket
|
|||||||
{
|
{
|
||||||
for( ItemStack option : this.recipe[slot] )
|
for( ItemStack option : this.recipe[slot] )
|
||||||
{
|
{
|
||||||
if( is.isItemEqual( option ) )
|
if( ItemStack.areItemStacksEqual( is, option ) )
|
||||||
{
|
{
|
||||||
return is;
|
return is;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,6 +90,13 @@ public class GuiFluidLevelEmitter extends GuiUpgradeable
|
|||||||
this.level.drawTextBox();
|
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
|
@Override
|
||||||
protected boolean drawUpgrades()
|
protected boolean drawUpgrades()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package appeng.fluids.client.gui.widgets;
|
|||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import appeng.container.slot.IJEITargetSlot;
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
@@ -23,7 +24,7 @@ import appeng.fluids.util.AEFluidStack;
|
|||||||
import appeng.fluids.util.IAEFluidTank;
|
import appeng.fluids.util.IAEFluidTank;
|
||||||
|
|
||||||
|
|
||||||
public class GuiFluidSlot extends GuiCustomSlot
|
public class GuiFluidSlot extends GuiCustomSlot implements IJEITargetSlot
|
||||||
{
|
{
|
||||||
private final IAEFluidTank fluids;
|
private final IAEFluidTank fluids;
|
||||||
private final int slot;
|
private final int slot;
|
||||||
|
|||||||
@@ -19,18 +19,14 @@
|
|||||||
package appeng.helpers;
|
package appeng.helpers;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
import java.util.stream.Collectors;
|
||||||
import java.util.EnumSet;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import appeng.integration.modules.gregtech.GTCEInventoryAdaptor;
|
import appeng.integration.modules.gregtech.GTCEInventoryAdaptor;
|
||||||
import appeng.util.*;
|
import appeng.util.*;
|
||||||
|
import appeng.util.inv.*;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
import gregtech.api.block.machines.BlockMachine;
|
import gregtech.api.block.machines.BlockMachine;
|
||||||
@@ -93,8 +89,6 @@ import appeng.api.util.AEPartLocation;
|
|||||||
import appeng.api.util.DimensionalCoord;
|
import appeng.api.util.DimensionalCoord;
|
||||||
import appeng.api.util.IConfigManager;
|
import appeng.api.util.IConfigManager;
|
||||||
import appeng.capabilities.Capabilities;
|
import appeng.capabilities.Capabilities;
|
||||||
import appeng.core.AEConfig;
|
|
||||||
import appeng.core.features.AEFeature;
|
|
||||||
import appeng.core.settings.TickRates;
|
import appeng.core.settings.TickRates;
|
||||||
import appeng.me.GridAccessException;
|
import appeng.me.GridAccessException;
|
||||||
import appeng.me.helpers.AENetworkProxy;
|
import appeng.me.helpers.AENetworkProxy;
|
||||||
@@ -106,10 +100,6 @@ import appeng.parts.automation.StackUpgradeInventory;
|
|||||||
import appeng.parts.automation.UpgradeInventory;
|
import appeng.parts.automation.UpgradeInventory;
|
||||||
import appeng.tile.inventory.AppEngInternalAEInventory;
|
import appeng.tile.inventory.AppEngInternalAEInventory;
|
||||||
import appeng.tile.inventory.AppEngInternalInventory;
|
import appeng.tile.inventory.AppEngInternalInventory;
|
||||||
import appeng.util.inv.AdaptorItemHandler;
|
|
||||||
import appeng.util.inv.IAEAppEngInventory;
|
|
||||||
import appeng.util.inv.IInventoryDestination;
|
|
||||||
import appeng.util.inv.InvOperation;
|
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
|
||||||
import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
|
import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
|
||||||
@@ -117,8 +107,6 @@ import static gregtech.api.block.machines.BlockMachine.getMetaTileEntity;
|
|||||||
|
|
||||||
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
|
public class DualityInterface implements IGridTickable, IStorageMonitorable, IInventoryDestination, IAEAppEngInventory, IConfigManagerHost, ICraftingProvider, IUpgradeableHost
|
||||||
{
|
{
|
||||||
private int[] failedCraftTriesSlot = {0,0,0,0,0,0,0,0,0};
|
|
||||||
|
|
||||||
public static final int NUMBER_OF_STORAGE_SLOTS = 9;
|
public static final int NUMBER_OF_STORAGE_SLOTS = 9;
|
||||||
public static final int NUMBER_OF_CONFIG_SLOTS = 9;
|
public static final int NUMBER_OF_CONFIG_SLOTS = 9;
|
||||||
public static final int NUMBER_OF_PATTERN_SLOTS = 9;
|
public static final int NUMBER_OF_PATTERN_SLOTS = 9;
|
||||||
@@ -148,6 +136,8 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
private IMEInventory<IAEItemStack> destination;
|
private IMEInventory<IAEItemStack> destination;
|
||||||
private int isWorking = -1;
|
private int isWorking = -1;
|
||||||
private final Accessor accessor = new Accessor();
|
private final Accessor accessor = new Accessor();
|
||||||
|
private EnumSet<EnumFacing> visitedFaces = EnumSet.noneOf( EnumFacing.class );
|
||||||
|
private EnumMap<EnumFacing,List<ItemStack>> waitingToSendFacing = new EnumMap<>(EnumFacing.class);
|
||||||
private GTCEInventoryAdaptor GTad;
|
private GTCEInventoryAdaptor GTad;
|
||||||
|
|
||||||
public DualityInterface( final AENetworkProxy networkProxy, final IInterfaceHost ih )
|
public DualityInterface( final AENetworkProxy networkProxy, final IInterfaceHost ih )
|
||||||
@@ -242,6 +232,27 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
data.setTag( "waitingToSend", waitingToSend );
|
data.setTag( "waitingToSend", waitingToSend );
|
||||||
|
|
||||||
|
NBTTagCompound sidedWaitList = new NBTTagCompound();
|
||||||
|
|
||||||
|
if (this.waitingToSendFacing != null)
|
||||||
|
{
|
||||||
|
for( EnumFacing s : this.iHost.getTargets() )
|
||||||
|
{
|
||||||
|
NBTTagList waitingListSided = new NBTTagList();
|
||||||
|
if (this.waitingToSendFacing.containsKey( s ))
|
||||||
|
{
|
||||||
|
for( final ItemStack is : this.waitingToSendFacing.get( s ) )
|
||||||
|
{
|
||||||
|
final NBTTagCompound item = new NBTTagCompound();
|
||||||
|
is.writeToNBT( item );
|
||||||
|
waitingListSided.appendTag( item );
|
||||||
|
}
|
||||||
|
sidedWaitList.setTag( s.name(), waitingListSided );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data.setTag( "sidedWaitList", sidedWaitList );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readFromNBT( final NBTTagCompound data )
|
public void readFromNBT( final NBTTagCompound data )
|
||||||
@@ -261,6 +272,23 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.waitingToSendFacing = null;
|
||||||
|
final NBTTagCompound waitingListSided = data.getCompoundTag("sidedWaitList");
|
||||||
|
|
||||||
|
for (EnumFacing s : EnumFacing.values())
|
||||||
|
if (waitingListSided.hasKey( s.name() )) {
|
||||||
|
NBTTagList w = waitingListSided.getTagList( s.name(), 10 );
|
||||||
|
for( int x = 0; x < w.tagCount(); x++ )
|
||||||
|
{
|
||||||
|
final NBTTagCompound c = w.getCompoundTagAt( x );
|
||||||
|
if( c != null )
|
||||||
|
{
|
||||||
|
final ItemStack is = new ItemStack( c );
|
||||||
|
this.addToSendListFacing( is , EnumFacing.getFront( s.getIndex() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.craftingTracker.readFromNBT( data );
|
this.craftingTracker.readFromNBT( data );
|
||||||
this.upgrades.readFromNBT( data, "upgrades" );
|
this.upgrades.readFromNBT( data, "upgrades" );
|
||||||
this.config.readFromNBT( data, "config" );
|
this.config.readFromNBT( data, "config" );
|
||||||
@@ -296,6 +324,30 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addToSendListFacing( final ItemStack is, EnumFacing f )
|
||||||
|
{
|
||||||
|
if( is.isEmpty() )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this.waitingToSendFacing == null){
|
||||||
|
this.waitingToSendFacing = new EnumMap<>(EnumFacing.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.waitingToSendFacing.computeIfAbsent( f, k -> new ArrayList<>() );
|
||||||
|
|
||||||
|
this.waitingToSendFacing.get( f ).add( is );
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
this.gridProxy.getTick().wakeDevice( this.gridProxy.getNode() );
|
||||||
|
}
|
||||||
|
catch( final GridAccessException e )
|
||||||
|
{
|
||||||
|
// :P
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void readConfig()
|
private void readConfig()
|
||||||
{
|
{
|
||||||
this.hasConfig = false;
|
this.hasConfig = false;
|
||||||
@@ -393,24 +445,22 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasWorkToDo()
|
private boolean hasWorkToDo() {
|
||||||
{
|
|
||||||
if( this.hasItemsToSend() )
|
if (hasItemsToSend()){
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
for( final IAEItemStack requiredWork : this.requireWork )
|
|
||||||
{
|
|
||||||
if( requiredWork != null )
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
if(hasItemsToSendFacing()){
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (final IAEItemStack requiredWork : this.requireWork) {
|
||||||
|
if (requiredWork != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePlan( final int slot )
|
private void updatePlan( final int slot )
|
||||||
@@ -515,6 +565,21 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
return this.waitingToSend != null && !this.waitingToSend.isEmpty();
|
return this.waitingToSend != null && !this.waitingToSend.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean hasItemsToSendFacing()
|
||||||
|
{
|
||||||
|
if (waitingToSendFacing != null)
|
||||||
|
{
|
||||||
|
for( EnumFacing enumFacing : waitingToSendFacing.keySet() )
|
||||||
|
{
|
||||||
|
if( !waitingToSendFacing.get( enumFacing ).isEmpty() )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canInsert( final ItemStack stack )
|
public boolean canInsert( final ItemStack stack )
|
||||||
{
|
{
|
||||||
@@ -586,11 +651,21 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
return TickRateModulation.SLEEP;
|
return TickRateModulation.SLEEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Previous version might have items saved in this list
|
||||||
|
//recover them
|
||||||
if( this.hasItemsToSend() )
|
if( this.hasItemsToSend() )
|
||||||
{
|
{
|
||||||
this.pushItemsOut( this.iHost.getTargets() );
|
this.pushItemsOut( this.iHost.getTargets() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hasItemsToSendFacing())
|
||||||
|
{
|
||||||
|
for( EnumFacing enumFacing : waitingToSendFacing.keySet() )
|
||||||
|
{
|
||||||
|
this.pushItemsOut( enumFacing );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final boolean couldDoWork = this.updateStorage();
|
final boolean couldDoWork = this.updateStorage();
|
||||||
return this.hasWorkToDo() ? ( couldDoWork ? TickRateModulation.URGENT : TickRateModulation.SLOWER ) : TickRateModulation.SLEEP;
|
return this.hasWorkToDo() ? ( couldDoWork ? TickRateModulation.URGENT : TickRateModulation.SLOWER ) : TickRateModulation.SLEEP;
|
||||||
}
|
}
|
||||||
@@ -651,6 +726,47 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void pushItemsOut( final EnumFacing s )
|
||||||
|
{
|
||||||
|
if (!this.waitingToSendFacing.containsKey(s) ||
|
||||||
|
(this.waitingToSendFacing.containsKey(s) && this.waitingToSendFacing.get( s ).isEmpty())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final TileEntity tile = this.iHost.getTileEntity();
|
||||||
|
final World w = tile.getWorld();
|
||||||
|
|
||||||
|
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
||||||
|
if( te == null )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Iterator<ItemStack> i = this.waitingToSendFacing.get( s ).iterator();
|
||||||
|
while ( i.hasNext() )
|
||||||
|
{
|
||||||
|
ItemStack whatToSend = i.next();
|
||||||
|
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
|
if( ad != null )
|
||||||
|
{
|
||||||
|
final ItemStack result = ad.addItems( whatToSend );
|
||||||
|
if( !result.isEmpty() )
|
||||||
|
{
|
||||||
|
whatToSend.setCount( whatToSend.getCount() - ( whatToSend.getCount() - result.getCount() ) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.waitingToSendFacing.get( s ).isEmpty() )
|
||||||
|
{
|
||||||
|
this.waitingToSendFacing.remove( s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private boolean updateStorage()
|
private boolean updateStorage()
|
||||||
{
|
{
|
||||||
boolean didSomething = false;
|
boolean didSomething = false;
|
||||||
@@ -770,17 +886,8 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
{
|
{
|
||||||
if( this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0 && itemStack != null )
|
if( this.getInstalledUpgrades( Upgrades.CRAFTING ) > 0 && itemStack != null )
|
||||||
{
|
{
|
||||||
if (this.failedCraftTriesSlot[x] <= 0)
|
return this.craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, this.iHost.getTileEntity().getWorld(),
|
||||||
{
|
|
||||||
boolean crafted = this.craftingTracker.handleCrafting( x, itemStack.getStackSize(), itemStack, d, this.iHost.getTileEntity().getWorld(),
|
|
||||||
this.gridProxy.getGrid(), this.gridProxy.getCrafting(), this.mySource );
|
this.gridProxy.getGrid(), this.gridProxy.getCrafting(), this.mySource );
|
||||||
|
|
||||||
if (crafted) this.failedCraftTriesSlot[x] = 0;
|
|
||||||
else{
|
|
||||||
this.failedCraftTriesSlot[x] += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.failedCraftTriesSlot[x] -= 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
@@ -913,13 +1020,9 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean invIsBlocked( InventoryAdaptor inv )
|
private boolean invIsBlocked( InventoryAdaptor inv )
|
||||||
{
|
{
|
||||||
if( AEConfig.instance().isFeatureEnabled( AEFeature.INSANE_BLOCKING_MODE ) )
|
return (inv.containsItems());
|
||||||
{
|
|
||||||
return !inv.simulateRemove( 1, ItemStack.EMPTY, null ).isEmpty();
|
|
||||||
}
|
|
||||||
else return inv.containsItems();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean invIsBlockedGTCE( GTCEInventoryAdaptor inv )
|
private static boolean invIsBlockedGTCE( GTCEInventoryAdaptor inv )
|
||||||
@@ -930,7 +1033,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
@Override
|
@Override
|
||||||
public boolean pushPattern( final ICraftingPatternDetails patternDetails, final InventoryCrafting table )
|
public boolean pushPattern( final ICraftingPatternDetails patternDetails, final InventoryCrafting table )
|
||||||
{
|
{
|
||||||
if( this.hasItemsToSend() || !this.gridProxy.isActive() || !this.craftingList.contains( patternDetails ) )
|
if( this.hasItemsToSend() || this.hasItemsToSendFacing() || !this.gridProxy.isActive() || !this.craftingList.contains( patternDetails ) )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -938,8 +1041,12 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final TileEntity tile = this.iHost.getTileEntity();
|
final TileEntity tile = this.iHost.getTileEntity();
|
||||||
final World w = tile.getWorld();
|
final World w = tile.getWorld();
|
||||||
|
|
||||||
final EnumSet<EnumFacing> possibleDirections = this.iHost.getTargets();
|
if( this.visitedFaces.isEmpty() )
|
||||||
for( final EnumFacing s : possibleDirections )
|
{
|
||||||
|
this.visitedFaces = this.iHost.getTargets();
|
||||||
|
}
|
||||||
|
|
||||||
|
for( final EnumFacing s : visitedFaces )
|
||||||
{
|
{
|
||||||
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
final TileEntity te = w.getTileEntity( tile.getPos().offset( s ) );
|
||||||
if( te instanceof IInterfaceHost )
|
if( te instanceof IInterfaceHost )
|
||||||
@@ -948,6 +1055,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
{
|
{
|
||||||
if( ( (IInterfaceHost) te ).getInterfaceDuality().sameGrid( this.gridProxy.getGrid() ) )
|
if( ( (IInterfaceHost) te ).getInterfaceDuality().sameGrid( this.gridProxy.getGrid() ) )
|
||||||
{
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -962,6 +1070,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final ICraftingMachine cm = (ICraftingMachine) te;
|
final ICraftingMachine cm = (ICraftingMachine) te;
|
||||||
if( cm.acceptsPlans() )
|
if( cm.acceptsPlans() )
|
||||||
{
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
if( cm.pushPattern( patternDetails, table, s.getOpposite() ) )
|
if( cm.pushPattern( patternDetails, table, s.getOpposite() ) )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@@ -973,6 +1082,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
if( ad != null )
|
if( ad != null )
|
||||||
{
|
{
|
||||||
|
boolean isDrawer = te.getBlockType().getRegistryName().getResourceDomain().equals( "storagedrawers" );
|
||||||
if( this.isBlocking() )
|
if( this.isBlocking() )
|
||||||
{
|
{
|
||||||
if( te.getBlockType().getRegistryName().getResourceDomain().equals( "gregtech" ) )
|
if( te.getBlockType().getRegistryName().getResourceDomain().equals( "gregtech" ) )
|
||||||
@@ -980,48 +1090,47 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
GTad = GTCEInventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
GTad = GTCEInventoryAdaptor.getAdaptor( te, s.getOpposite() );
|
||||||
if( invIsBlockedGTCE( GTad ) )
|
if( invIsBlockedGTCE( GTad ) )
|
||||||
{
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if ( invIsBlocked( ad ) )
|
||||||
{
|
{
|
||||||
if( invIsBlocked( ad ) )
|
visitedFaces.remove( s );
|
||||||
{
|
continue;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.acceptsItems( ad, table ) )
|
if( this.acceptsItems( ad, patternDetails, isDrawer ) )
|
||||||
{
|
{
|
||||||
|
visitedFaces.remove( s );
|
||||||
for( int x = 0; x < table.getSizeInventory(); x++ )
|
for( int x = 0; x < table.getSizeInventory(); x++ )
|
||||||
{
|
{
|
||||||
final ItemStack is = table.getStackInSlot( x );
|
final ItemStack is = table.getStackInSlot( x );
|
||||||
if( !is.isEmpty() )
|
if( !is.isEmpty() )
|
||||||
{
|
{
|
||||||
final ItemStack added = ad.addItems( is );
|
addToSendListFacing( is, s );
|
||||||
this.addToSendList( added );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.pushItemsOut( possibleDirections );
|
pushItemsOut( s );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
visitedFaces.remove( s );
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isBusy()
|
public boolean isBusy()
|
||||||
{
|
{
|
||||||
if( this.hasItemsToSend() )
|
boolean busy = false;
|
||||||
|
|
||||||
|
if( this.hasItemsToSend() || hasItemsToSendFacing() )
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean busy = false;
|
|
||||||
|
|
||||||
if( this.isBlocking() )
|
if( this.isBlocking() )
|
||||||
{
|
{
|
||||||
final EnumSet<EnumFacing> possibleDirections = this.iHost.getTargets();
|
final EnumSet<EnumFacing> possibleDirections = this.iHost.getTargets();
|
||||||
@@ -1046,14 +1155,10 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if( !invIsBlocked( ad ) )
|
||||||
{
|
{
|
||||||
if( !invIsBlocked( ad ) )
|
allAreBusy = false;
|
||||||
{
|
break;
|
||||||
allAreBusy = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1072,23 +1177,75 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
return this.cm.getSetting( Settings.BLOCK ) == YesNo.YES;
|
return this.cm.getSetting( Settings.BLOCK ) == YesNo.YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean acceptsItems( final InventoryAdaptor ad, final InventoryCrafting table )
|
private boolean acceptsItems( final InventoryAdaptor ad, final ICraftingPatternDetails patternDetails, boolean isDrawer )
|
||||||
{
|
{
|
||||||
for( int x = 0; x < table.getSizeInventory(); x++ )
|
List<ItemStack> patternedStacks = Arrays.stream( patternDetails.getCondensedInputs() ).map( IAEItemStack::createItemStack ).collect( Collectors.toList() );
|
||||||
|
List<ItemSlot> copiedItemSlots = new ArrayList<>();
|
||||||
|
|
||||||
|
if( patternedStacks.size() == 1 )
|
||||||
{
|
{
|
||||||
final ItemStack is = table.getStackInSlot( x );
|
return ad.simulateAdd( patternedStacks.get( 0 ) ).isEmpty();
|
||||||
if( is.isEmpty() )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !ad.simulateAdd( is.copy() ).isEmpty() )
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for ( ItemSlot itemSlot : ad )
|
||||||
|
{
|
||||||
|
//skip storage drawers slot 0 to avoid voiding items due to broken itemhandler implementation
|
||||||
|
if( isDrawer && itemSlot.getSlot() == 0 ){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//some inventory may expose their special slots ( for upgrades, etc )
|
||||||
|
//if its empty AND we cant fit any of the items in the recipes, skip it.
|
||||||
|
ItemStack stackInSlot = itemSlot.getItemStack();
|
||||||
|
for ( IAEItemStack aeItemStack : patternDetails.getCondensedInputs() )
|
||||||
|
{
|
||||||
|
if( stackInSlot.isEmpty() )
|
||||||
|
{
|
||||||
|
if( itemSlot.simulateInsertItem( aeItemStack.getDefinition() ).isEmpty() )
|
||||||
|
{
|
||||||
|
copiedItemSlots.add( itemSlot.copy() );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// copy partially filled slots for merging logic
|
||||||
|
else if( stackInSlot.getCount() < Math.min( itemSlot.getSlotLimit(), stackInSlot.getMaxStackSize() ) )
|
||||||
|
{
|
||||||
|
if( aeItemStack.isSameType( stackInSlot ) )
|
||||||
|
{
|
||||||
|
copiedItemSlots.add( itemSlot.copy() );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
// start merging in order of slots, left to right.
|
||||||
|
for ( ItemSlot copiedItemSlot : copiedItemSlots )
|
||||||
|
{
|
||||||
|
Iterator<ItemStack> patStackIterator = patternedStacks.iterator();
|
||||||
|
while ( patStackIterator.hasNext() )
|
||||||
|
{
|
||||||
|
ItemStack patStack = patStackIterator.next();
|
||||||
|
ItemStack remainder = copiedItemSlot.simulateInsertItem( patStack );
|
||||||
|
|
||||||
|
if( !remainder.isEmpty() )
|
||||||
|
{
|
||||||
|
patStack.setCount( patStack.getCount() - ( patStack.getCount() - remainder.getCount() ) );
|
||||||
|
}
|
||||||
|
else //entire stack got injected
|
||||||
|
{
|
||||||
|
patStackIterator.remove();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// if we merged EVERYTHING successfully , return true.
|
||||||
|
if( patternedStacks.size() == 0 )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1117,6 +1274,20 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( this.waitingToSendFacing != null )
|
||||||
|
{
|
||||||
|
for (List<ItemStack> itemList : waitingToSendFacing.values())
|
||||||
|
{
|
||||||
|
for (final ItemStack is : itemList)
|
||||||
|
{
|
||||||
|
if (!is.isEmpty())
|
||||||
|
{
|
||||||
|
drops.add(is);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for( final ItemStack is : this.upgrades )
|
for( final ItemStack is : this.upgrades )
|
||||||
{
|
{
|
||||||
if( !is.isEmpty() )
|
if( !is.isEmpty() )
|
||||||
|
|||||||
@@ -26,10 +26,11 @@ public class HighlighterHandler
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Minecraft mc = Minecraft.getMinecraft();
|
Minecraft mc = Minecraft.getMinecraft();
|
||||||
|
int dimension = mc.world.provider.getDimension();
|
||||||
long time = System.currentTimeMillis();
|
long time = System.currentTimeMillis();
|
||||||
|
|
||||||
if (time > BlockPosHighlighter.getExpireHilight()) {
|
if (time > BlockPosHighlighter.getExpireHilight() || dimension != BlockPosHighlighter.getDimension()) {
|
||||||
BlockPosHighlighter.hilightBlock(null, -1);
|
BlockPosHighlighter.hilightBlock(null, -1, BlockPosHighlighter.getDimension() );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,5 +43,6 @@ public enum InventoryAction
|
|||||||
ROLL_UP,
|
ROLL_UP,
|
||||||
ROLL_DOWN,
|
ROLL_DOWN,
|
||||||
AUTO_CRAFT,
|
AUTO_CRAFT,
|
||||||
PLACE_SINGLE
|
PLACE_SINGLE,
|
||||||
|
PLACE_JEI_GHOST_ITEM
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package appeng.integration.modules.gregtech;
|
package appeng.integration.modules.gregtech;
|
||||||
|
|
||||||
|
import appeng.util.inv.ItemHandlerIterator;
|
||||||
import appeng.util.inv.ItemSlot;
|
import appeng.util.inv.ItemSlot;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -52,6 +53,6 @@ public class GTCEItemHandler extends GTCEInventoryAdaptor
|
|||||||
@Override
|
@Override
|
||||||
public Iterator<ItemSlot> iterator()
|
public Iterator<ItemSlot> iterator()
|
||||||
{
|
{
|
||||||
return null;
|
return new ItemHandlerIterator( this.itemHandler );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,6 +19,8 @@
|
|||||||
package appeng.integration.modules.jei;
|
package appeng.integration.modules.jei;
|
||||||
|
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -27,14 +29,11 @@ import appeng.client.gui.AEGuiHandler;
|
|||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
|
import mezz.jei.api.*;
|
||||||
import mezz.jei.config.Constants;
|
import mezz.jei.config.Constants;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
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.IRecipeCategoryRegistration;
|
||||||
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
|
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
|
||||||
|
|
||||||
@@ -57,6 +56,9 @@ import appeng.items.parts.ItemFacade;
|
|||||||
@mezz.jei.api.JEIPlugin
|
@mezz.jei.api.JEIPlugin
|
||||||
public class JEIPlugin implements IModPlugin
|
public class JEIPlugin implements IModPlugin
|
||||||
{
|
{
|
||||||
|
public static IJeiRuntime runtime;
|
||||||
|
public static AEGuiHandler aeGuiHandler;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerItemSubtypes( ISubtypeRegistry subtypeRegistry )
|
public void registerItemSubtypes( ISubtypeRegistry subtypeRegistry )
|
||||||
{
|
{
|
||||||
@@ -95,8 +97,9 @@ public class JEIPlugin implements IModPlugin
|
|||||||
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ),
|
.addRecipeTransferHandler( new RecipeTransferHandler<>( ContainerPatternTerm.class ),
|
||||||
Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
Constants.UNIVERSAL_RECIPE_TRANSFER_UID );
|
||||||
|
|
||||||
AEGuiHandler aeGuiHandler = new AEGuiHandler();
|
aeGuiHandler = new AEGuiHandler();
|
||||||
registry.addAdvancedGuiHandlers(aeGuiHandler);
|
registry.addAdvancedGuiHandlers(aeGuiHandler);
|
||||||
|
registry.addGhostIngredientHandler( aeGuiHandler.getGuiContainerClass(), aeGuiHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
private void registerDescriptions( IDefinitions definitions, IModRegistry registry )
|
||||||
@@ -219,5 +222,6 @@ public class JEIPlugin implements IModPlugin
|
|||||||
{
|
{
|
||||||
JEIModule jeiModule = (JEIModule) Integrations.jei();
|
JEIModule jeiModule = (JEIModule) Integrations.jei();
|
||||||
jeiModule.setJei( new JeiRuntimeAdapter( jeiRuntime ) );
|
jeiModule.setJei( new JeiRuntimeAdapter( jeiRuntime ) );
|
||||||
|
runtime = jeiRuntime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,13 +19,9 @@
|
|||||||
package appeng.me.cluster.implementations;
|
package appeng.me.cluster.implementations;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
@@ -34,8 +30,6 @@ import net.minecraft.item.ItemStack;
|
|||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraft.nbt.NBTTagList;
|
import net.minecraft.nbt.NBTTagList;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.WorldServer;
|
|
||||||
import net.minecraftforge.fml.common.FMLCommonHandler;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
@@ -93,6 +87,7 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
private final List<TileCraftingTile> storage = new ArrayList<>();
|
private final List<TileCraftingTile> storage = new ArrayList<>();
|
||||||
private final List<TileCraftingMonitorTile> status = new ArrayList<>();
|
private final List<TileCraftingMonitorTile> status = new ArrayList<>();
|
||||||
private final HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<>();
|
private final HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<>();
|
||||||
|
private final Map<ICraftingPatternDetails, Queue<ICraftingMedium>> visitedMediums = new HashMap<>();
|
||||||
private ICraftingLink myLastLink;
|
private ICraftingLink myLastLink;
|
||||||
private String myName = "";
|
private String myName = "";
|
||||||
private boolean isDestroyed = false;
|
private boolean isDestroyed = false;
|
||||||
@@ -646,14 +641,22 @@ public final class CraftingCPUCluster implements IAECluster, ICraftingCPU
|
|||||||
{
|
{
|
||||||
InventoryCrafting ic = null;
|
InventoryCrafting ic = null;
|
||||||
|
|
||||||
for( final ICraftingMedium m : cc.getMediums( e.getKey() ) )
|
if (!visitedMediums.containsKey( details ) || visitedMediums.get( details ).isEmpty())
|
||||||
{
|
{
|
||||||
|
visitedMediums.put( details, new ArrayDeque<>( cc.getMediums( details ).stream().filter( Objects::nonNull ).collect( Collectors.toList()) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!visitedMediums.get( details ).isEmpty())
|
||||||
|
{
|
||||||
|
|
||||||
|
ICraftingMedium m = visitedMediums.get( details ).poll();
|
||||||
|
|
||||||
if( e.getValue().value <= 0 )
|
if( e.getValue().value <= 0 )
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !m.isBusy() )
|
if( m != null && !m.isBusy() )
|
||||||
{
|
{
|
||||||
if( ic == null )
|
if( ic == null )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -70,8 +70,6 @@ import appeng.util.item.AEItemStack;
|
|||||||
|
|
||||||
public class PartExportBus extends PartSharedItemBus implements ICraftingRequester
|
public class PartExportBus extends PartSharedItemBus implements ICraftingRequester
|
||||||
{
|
{
|
||||||
private final int[] failedCraftTriesSlot = {0,0,0,0,0,0,0,0,0};
|
|
||||||
|
|
||||||
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/export_bus_base" );
|
public static final ResourceLocation MODEL_BASE = new ResourceLocation( AppEng.MOD_ID, "part/export_bus_base" );
|
||||||
|
|
||||||
@PartModels
|
@PartModels
|
||||||
@@ -142,7 +140,7 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
|
|
||||||
if( destination != null )
|
if( destination != null )
|
||||||
{
|
{
|
||||||
int x = 0;
|
int x;
|
||||||
|
|
||||||
for( x = 0; x < this.availableSlots() && this.itemToSend > 0; x++ )
|
for( x = 0; x < this.availableSlots() && this.itemToSend > 0; x++ )
|
||||||
{
|
{
|
||||||
@@ -153,16 +151,8 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
if( ais == null || this.itemToSend <= 0 ) continue;
|
if( ais == null || this.itemToSend <= 0 ) continue;
|
||||||
|
|
||||||
if ( this.craftOnly() ) {
|
if ( this.craftOnly() ) {
|
||||||
if (this.failedCraftTriesSlot[x] <= 0) {
|
this.didSomething = this.craftingTracker.handleCrafting(slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
||||||
|
this.getProxy().getGrid(), cg, this.mySrc) || this.didSomething;
|
||||||
this.didSomething = this.craftingTracker.handleCrafting(slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
|
||||||
this.getProxy().getGrid(), cg, this.mySrc) || this.didSomething;
|
|
||||||
|
|
||||||
if (this.didSomething) this.failedCraftTriesSlot[x] = 0;
|
|
||||||
else this.failedCraftTriesSlot[x] += 2;
|
|
||||||
}
|
|
||||||
this.failedCraftTriesSlot[x] -= 1;
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final long before = this.itemToSend;
|
final long before = this.itemToSend;
|
||||||
@@ -185,15 +175,8 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
|||||||
|
|
||||||
if( this.itemToSend == before && this.isCraftingEnabled() )
|
if( this.itemToSend == before && this.isCraftingEnabled() )
|
||||||
{
|
{
|
||||||
if (this.failedCraftTriesSlot[x] <= 0) {
|
this.didSomething = this.craftingTracker.handleCrafting(slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
||||||
|
|
||||||
this.didSomething = this.craftingTracker.handleCrafting(slotToExport, this.itemToSend, ais, destination, this.getTile().getWorld(),
|
|
||||||
this.getProxy().getGrid(), cg, this.mySrc) || this.didSomething;
|
this.getProxy().getGrid(), cg, this.mySrc) || this.didSomething;
|
||||||
|
|
||||||
if (this.didSomething) this.failedCraftTriesSlot[x] = 0;
|
|
||||||
else this.failedCraftTriesSlot[x] += 2;
|
|
||||||
}
|
|
||||||
this.failedCraftTriesSlot[x] -= 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -218,6 +218,12 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin
|
|||||||
private boolean importStuff( final InventoryAdaptor myAdaptor, final IAEItemStack whatToImport, final IMEMonitor<IAEItemStack> inv, final IEnergySource energy, final FuzzyMode fzMode )
|
private boolean importStuff( final InventoryAdaptor myAdaptor, final IAEItemStack whatToImport, final IMEMonitor<IAEItemStack> inv, final IEnergySource energy, final FuzzyMode fzMode )
|
||||||
{
|
{
|
||||||
final int toSend = this.calculateMaximumAmountToImport( myAdaptor, whatToImport, inv, fzMode );
|
final int toSend = this.calculateMaximumAmountToImport( myAdaptor, whatToImport, inv, fzMode );
|
||||||
|
|
||||||
|
if( toSend == 0 )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
final ItemStack newItems;
|
final ItemStack newItems;
|
||||||
|
|
||||||
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
if( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
|
||||||
@@ -286,8 +292,17 @@ public class PartImportBus extends PartSharedItemBus implements IInventoryDestin
|
|||||||
itemAmountNotStorable = inv.injectItems( AEItemStack.fromItemStack( simResult ), Actionable.SIMULATE, this.source );
|
itemAmountNotStorable = inv.injectItems( AEItemStack.fromItemStack( simResult ), Actionable.SIMULATE, this.source );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( simResult.isEmpty() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if( itemAmountNotStorable != null )
|
if( itemAmountNotStorable != null )
|
||||||
{
|
{
|
||||||
|
if( simResult.getCount() == itemAmountNotStorable.getStackSize() )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return (int) Math.min( simResult.getCount() - itemAmountNotStorable.getStackSize(), toSend );
|
return (int) Math.min( simResult.getCount() - itemAmountNotStorable.getStackSize(), toSend );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,7 @@
|
|||||||
package appeng.parts.misc;
|
package appeng.parts.misc;
|
||||||
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import appeng.api.config.Settings;
|
import appeng.api.config.Settings;
|
||||||
import appeng.api.config.StorageFilter;
|
import appeng.api.config.StorageFilter;
|
||||||
@@ -42,11 +37,11 @@ import appeng.api.storage.channels.IItemStorageChannel;
|
|||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import appeng.me.GridAccessException;
|
|
||||||
import appeng.me.helpers.IGridProxyable;
|
import appeng.me.helpers.IGridProxyable;
|
||||||
import appeng.me.storage.ITickingMonitor;
|
import appeng.me.storage.ITickingMonitor;
|
||||||
import appeng.util.Platform;
|
import appeng.util.Platform;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -81,11 +76,19 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
|
|
||||||
int slotCount = this.itemHandler.getSlots();
|
int slotCount = this.itemHandler.getSlots();
|
||||||
boolean simulate = ( type == Actionable.SIMULATE );
|
boolean simulate = ( type == Actionable.SIMULATE );
|
||||||
|
List<Pair<Integer,Integer>> injectedList = new ArrayList<>();
|
||||||
// This uses a brute force approach and tries to jam it in every slot the inventory exposes.
|
// This uses a brute force approach and tries to jam it in every slot the inventory exposes.
|
||||||
for( int i = 0; i < slotCount && !remaining.isEmpty(); i++ )
|
for( int i = 0; i < slotCount && !remaining.isEmpty(); i++ )
|
||||||
{
|
{
|
||||||
|
int countPre = remaining.getCount();
|
||||||
remaining = this.itemHandler.insertItem( i, remaining, simulate );
|
remaining = this.itemHandler.insertItem( i, remaining, simulate );
|
||||||
|
int countPos = remaining.getCount();
|
||||||
|
if (remaining.isEmpty()){
|
||||||
|
injectedList.add( Pair.of( i,countPre ) );
|
||||||
|
}
|
||||||
|
else if (countPos > countPre) {
|
||||||
|
injectedList.add( Pair.of( i,countPos - countPre ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// At this point, we still have some items left...
|
// At this point, we still have some items left...
|
||||||
@@ -97,13 +100,17 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
|
|
||||||
if( type == Actionable.MODULATE )
|
if( type == Actionable.MODULATE )
|
||||||
{
|
{
|
||||||
try
|
if (this.cache.cachedAeStacks.length == 0) this.cache.update();
|
||||||
|
for ( Pair<Integer, Integer> pair : injectedList )
|
||||||
{
|
{
|
||||||
this.proxyable.getProxy().getTick().alertDevice( this.proxyable.getProxy().getNode() );
|
if( this.cache.cachedAeStacks[pair.getKey()] == null )
|
||||||
}
|
{
|
||||||
catch( GridAccessException ex )
|
this.cache.cachedAeStacks[pair.getKey()] = iox.copy().setStackSize( pair.getValue() );
|
||||||
{
|
}
|
||||||
// meh
|
else
|
||||||
|
{
|
||||||
|
this.cache.cachedAeStacks[pair.getKey()].incStackSize( pair.getValue() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,8 +128,10 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
ItemStack gathered = ItemStack.EMPTY;
|
ItemStack gathered = ItemStack.EMPTY;
|
||||||
|
|
||||||
final boolean simulate = ( mode == Actionable.SIMULATE );
|
final boolean simulate = ( mode == Actionable.SIMULATE );
|
||||||
|
List<Pair<Integer, Integer>> extractedList = new ArrayList<>();
|
||||||
|
|
||||||
for( int i = 0; i < this.itemHandler.getSlots(); i++ )
|
|
||||||
|
for ( int i = 0; i < this.itemHandler.getSlots(); i++ )
|
||||||
{
|
{
|
||||||
ItemStack stackInInventorySlot = this.itemHandler.getStackInSlot( i );
|
ItemStack stackInInventorySlot = this.itemHandler.getStackInSlot( i );
|
||||||
|
|
||||||
@@ -140,16 +149,9 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
extracted = this.itemHandler.extractItem( i, remainingCurrentSlot, simulate );
|
extracted = this.itemHandler.extractItem( i, remainingCurrentSlot, simulate );
|
||||||
|
|
||||||
if( !extracted.isEmpty() )
|
if( !extracted.isEmpty() )
|
||||||
{
|
{
|
||||||
// In order to guard against broken IItemHandler implementations, we'll try to guess if the returned
|
|
||||||
// stack (especially in simulate mode) is the same that was returned by getStackInSlot. This is
|
|
||||||
// obviously not a precise science, but it would catch the previous Forge bug:
|
|
||||||
// https://github.com/MinecraftForge/MinecraftForge/pull/6580
|
|
||||||
if (extracted == stackInInventorySlot) {
|
|
||||||
extracted = extracted.copy();
|
|
||||||
}
|
|
||||||
|
|
||||||
if( extracted.getCount() > remainingCurrentSlot )
|
if( extracted.getCount() > remainingCurrentSlot )
|
||||||
{
|
{
|
||||||
// Something broke. It should never return more than we requested...
|
// Something broke. It should never return more than we requested...
|
||||||
@@ -159,17 +161,14 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
extracted.setCount( remainingCurrentSlot );
|
extracted.setCount( remainingCurrentSlot );
|
||||||
}
|
}
|
||||||
|
|
||||||
// Heuristic for simulation: looping in case of simulations is pointless, since the state of the
|
extractedList.add( Pair.of( i, extracted.getCount() ) );
|
||||||
// underlying inventory does not change after a simulated extraction. To still support inventories
|
|
||||||
// that report stacks that are larger than maxStackSize, we use this heuristic
|
|
||||||
if (simulate && extracted.getCount() == extracted.getMaxStackSize()
|
|
||||||
&& remainingCurrentSlot > extracted.getMaxStackSize()) {
|
|
||||||
extracted.setCount(remainingCurrentSlot);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// We're just gonna use the first stack we get our hands on as the template for the rest.
|
||||||
|
// In case some stupid itemhandler (aka forge) returns an internal state we have to do a second
|
||||||
|
// expensive copy again.
|
||||||
if( gathered.isEmpty() )
|
if( gathered.isEmpty() )
|
||||||
{
|
{
|
||||||
gathered = extracted;
|
gathered = extracted.copy();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -178,7 +177,7 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
remainingCurrentSlot -= extracted.getCount();
|
remainingCurrentSlot -= extracted.getCount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while( !simulate && !extracted.isEmpty() && remainingCurrentSlot > 0 );
|
while ( !extracted.isEmpty() && remainingCurrentSlot > 0 );
|
||||||
|
|
||||||
remainingSize -= stackSizeCurrentSlot - remainingCurrentSlot;
|
remainingSize -= stackSizeCurrentSlot - remainingCurrentSlot;
|
||||||
|
|
||||||
@@ -193,13 +192,14 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
|||||||
{
|
{
|
||||||
if( mode == Actionable.MODULATE )
|
if( mode == Actionable.MODULATE )
|
||||||
{
|
{
|
||||||
try
|
if (this.cache.cachedAeStacks.length == 0) this.cache.update();
|
||||||
|
for ( Pair<Integer, Integer> pair : extractedList )
|
||||||
{
|
{
|
||||||
this.proxyable.getProxy().getTick().alertDevice( this.proxyable.getProxy().getNode() );
|
this.cache.cachedAeStacks[pair.getKey()].decStackSize( pair.getValue() );
|
||||||
}
|
if( this.cache.cachedAeStacks[pair.getKey()].getStackSize() == 0 )
|
||||||
catch( GridAccessException ex )
|
{
|
||||||
{
|
this.cache.cachedAeStacks[pair.getKey()] = null;
|
||||||
// meh
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import java.util.HashMap;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Predicate;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import appeng.api.storage.IStorageChannel;
|
import appeng.api.storage.IStorageChannel;
|
||||||
@@ -14,7 +13,6 @@ import appeng.api.storage.IStorageChannel;
|
|||||||
import appeng.core.AELog;
|
import appeng.core.AELog;
|
||||||
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.NonNullList;
|
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
@@ -73,13 +71,24 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
|||||||
|
|
||||||
if( type == Actionable.MODULATE )
|
if( type == Actionable.MODULATE )
|
||||||
{
|
{
|
||||||
try
|
if (this.cache.cachedAeStacks.length == 0) this.cache.update();
|
||||||
|
boolean found = false;
|
||||||
|
for (IAEItemStack iaeItemStack : this.cache.cachedAeStacks)
|
||||||
{
|
{
|
||||||
this.proxyable.getProxy().getTick().alertDevice( this.proxyable.getProxy().getNode() );
|
if( iaeItemStack == null )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( iaeItemStack.equals( iox ) )
|
||||||
|
{
|
||||||
|
found = true;
|
||||||
|
iaeItemStack.incStackSize( iox.getStackSize() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch( GridAccessException ex )
|
if (!found)
|
||||||
{
|
{
|
||||||
// meh
|
this.cache.cachedAeStacks = Arrays.copyOf( this.cache.cachedAeStacks, this.cache.cachedAeStacks.length + 1 );
|
||||||
|
this.cache.cachedAeStacks[this.cache.cachedAeStacks.length - 1] = iox.copy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,15 +118,27 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
|||||||
|
|
||||||
if( !extracted.isEmpty() )
|
if( !extracted.isEmpty() )
|
||||||
{
|
{
|
||||||
|
if (this.cache.cachedAeStacks.length == 0) this.cache.update();
|
||||||
|
IAEItemStack iaeExtracted = AEItemStack.fromItemStack( extracted );
|
||||||
|
|
||||||
if( mode == Actionable.MODULATE )
|
if( mode == Actionable.MODULATE )
|
||||||
{
|
{
|
||||||
try
|
for ( int i = 0; i < this.cache.cachedAeStacks.length; i++ )
|
||||||
{
|
{
|
||||||
this.proxyable.getProxy().getTick().alertDevice( this.proxyable.getProxy().getNode() );
|
IAEItemStack iaeItemStack = this.cache.cachedAeStacks[i];
|
||||||
}
|
if( iaeExtracted.equals( iaeItemStack ) )
|
||||||
catch( GridAccessException ex )
|
{
|
||||||
{
|
if( iaeExtracted.getStackSize() >= iaeItemStack.getStackSize() )
|
||||||
// meh
|
{
|
||||||
|
iaeExtracted.decStackSize( iaeItemStack.getStackSize() );
|
||||||
|
this.cache.cachedAeStacks[i] = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iaeItemStack.decStackSize( iaeExtracted.getStackSize() );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -401,10 +401,13 @@ public class PartStorageBus extends PartUpgradeable implements IGridTickable, IC
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check via cap for IItemRepository
|
// Check via cap for IItemRepository
|
||||||
IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
if (ITEM_REPOSITORY_CAPABILITY != null && target.hasCapability( ITEM_REPOSITORY_CAPABILITY, targetSide ))
|
||||||
if( handlerRepo != null )
|
|
||||||
{
|
{
|
||||||
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
|
// Check via cap for IItemHandler
|
||||||
IItemHandler handlerExt = target.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetSide );
|
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 ) );
|
return Objects.hash( target, target.getCapability( Capabilities.STORAGE_MONITORABLE_ACCESSOR, targetSide ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
final IItemRepository handlerRepo = target.getCapability( ITEM_REPOSITORY_CAPABILITY, targetSide );
|
if (ITEM_REPOSITORY_CAPABILITY != null && target.hasCapability( ITEM_REPOSITORY_CAPABILITY, targetSide ))
|
||||||
|
|
||||||
if( handlerRepo != null )
|
|
||||||
{
|
{
|
||||||
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 );
|
final IItemHandler itemHandler = target.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, targetSide );
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ package appeng.parts.reporting;
|
|||||||
|
|
||||||
import java.io.IOException;
|
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 io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.GlStateManager;
|
import net.minecraft.client.renderer.GlStateManager;
|
||||||
@@ -31,6 +35,9 @@ import net.minecraft.util.EnumFacing;
|
|||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
import net.minecraft.util.math.RayTraceResult;
|
import net.minecraft.util.math.RayTraceResult;
|
||||||
import net.minecraft.util.math.Vec3d;
|
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.Side;
|
||||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
@@ -70,7 +77,9 @@ import appeng.util.item.AEItemStack;
|
|||||||
public abstract class AbstractPartMonitor extends AbstractPartDisplay implements IPartStorageMonitor, IStackWatcherHost
|
public abstract class AbstractPartMonitor extends AbstractPartDisplay implements IPartStorageMonitor, IStackWatcherHost
|
||||||
{
|
{
|
||||||
private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE;
|
private static final IWideReadableNumberConverter NUMBER_CONVERTER = ReadableNumberConverter.INSTANCE;
|
||||||
|
|
||||||
private IAEItemStack configuredItem;
|
private IAEItemStack configuredItem;
|
||||||
|
private IAEFluidStack configuredFluid;
|
||||||
private String lastHumanReadableText;
|
private String lastHumanReadableText;
|
||||||
private boolean isLocked;
|
private boolean isLocked;
|
||||||
private IStackWatcher myWatcher;
|
private IStackWatcher myWatcher;
|
||||||
@@ -90,6 +99,9 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
|
|
||||||
final NBTTagCompound myItem = data.getCompoundTag( "configuredItem" );
|
final NBTTagCompound myItem = data.getCompoundTag( "configuredItem" );
|
||||||
this.configuredItem = AEItemStack.fromNBT( myItem );
|
this.configuredItem = AEItemStack.fromNBT( myItem );
|
||||||
|
|
||||||
|
final NBTTagCompound myFluid = data.getCompoundTag( "configuredFluid" );
|
||||||
|
this.configuredFluid = AEFluidStack.fromNBT( myFluid );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -104,8 +116,15 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
{
|
{
|
||||||
this.configuredItem.writeToNBT( myItem );
|
this.configuredItem.writeToNBT( myItem );
|
||||||
}
|
}
|
||||||
|
final NBTTagCompound myFluid = new NBTTagCompound();
|
||||||
|
if( this.configuredFluid != null )
|
||||||
|
{
|
||||||
|
this.configuredFluid.writeToNBT( myFluid );
|
||||||
|
}
|
||||||
|
|
||||||
data.setTag( "configuredItem", myItem );
|
data.setTag( "configuredItem", myItem );
|
||||||
|
data.setTag( "configuredFluid", myFluid );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -114,11 +133,17 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
super.writeToStream( data );
|
super.writeToStream( data );
|
||||||
|
|
||||||
data.writeBoolean( this.isLocked );
|
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 )
|
if( this.configuredItem != null )
|
||||||
{
|
{
|
||||||
this.configuredItem.writeToPacket( data );
|
this.configuredItem.writeToPacket( data );
|
||||||
}
|
}
|
||||||
|
else if( this.configuredFluid != null )
|
||||||
|
{
|
||||||
|
this.configuredFluid.writeToPacket( data );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -131,14 +156,22 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
|
|
||||||
this.isLocked = isLocked;
|
this.isLocked = isLocked;
|
||||||
|
|
||||||
final boolean val = data.readBoolean();
|
final boolean isItem = data.readBoolean();
|
||||||
if( val )
|
final boolean isFluid = data.readBoolean();
|
||||||
|
if( isItem )
|
||||||
{
|
{
|
||||||
this.configuredItem = AEItemStack.fromPacket( data );
|
this.configuredItem = AEItemStack.fromPacket( data );
|
||||||
|
this.configuredFluid = null;
|
||||||
|
}
|
||||||
|
else if( isFluid )
|
||||||
|
{
|
||||||
|
this.configuredFluid = AEFluidStack.fromPacket( data );
|
||||||
|
this.configuredItem = null;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.configuredItem = null;
|
this.configuredItem = null;
|
||||||
|
this.configuredFluid = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return needRedraw;
|
return needRedraw;
|
||||||
@@ -165,7 +198,25 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
if( !this.isLocked )
|
if( !this.isLocked )
|
||||||
{
|
{
|
||||||
final ItemStack eq = player.getHeldItem( hand );
|
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.configureWatchers();
|
||||||
this.getHost().markForSave();
|
this.getHost().markForSave();
|
||||||
this.getHost().markForUpdate();
|
this.getHost().markForUpdate();
|
||||||
@@ -227,6 +278,16 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
this.updateReportingValue(
|
this.updateReportingValue(
|
||||||
this.getProxy().getStorage().getInventory( AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ) ) );
|
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 )
|
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 )
|
if( result == null )
|
||||||
{
|
{
|
||||||
this.configuredItem.setStackSize( 0 );
|
this.configuredItem.setStackSize( 0 );
|
||||||
@@ -248,6 +310,18 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
this.configuredItem.setStackSize( result.getStackSize() );
|
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
|
@Override
|
||||||
@@ -260,7 +334,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final IAEItemStack ais = this.getDisplayed();
|
IAEStack<?> ais = this.getDisplayed();
|
||||||
|
|
||||||
if( ais == null )
|
if( ais == null )
|
||||||
{
|
{
|
||||||
@@ -274,8 +348,10 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
|
|
||||||
TesrRenderHelper.moveToFace( facing );
|
TesrRenderHelper.moveToFace( facing );
|
||||||
TesrRenderHelper.rotateToFace( facing, this.getSpin() );
|
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();
|
GlStateManager.popMatrix();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -287,9 +363,13 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IAEItemStack getDisplayed()
|
public IAEStack<?> getDisplayed()
|
||||||
{
|
{
|
||||||
|
if (this.configuredItem != null)
|
||||||
return this.configuredItem;
|
return this.configuredItem;
|
||||||
|
else if (this.configuredFluid != null)
|
||||||
|
return this.configuredFluid;
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -322,6 +402,26 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
|||||||
final long stackSize = this.configuredItem.getStackSize();
|
final long stackSize = this.configuredItem.getStackSize();
|
||||||
final String humanReadableText = NUMBER_CONVERTER.toWideReadableForm( stackSize );
|
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 ) )
|
if( !humanReadableText.equals( this.lastHumanReadableText ) )
|
||||||
{
|
{
|
||||||
this.lastHumanReadableText = humanReadableText;
|
this.lastHumanReadableText = humanReadableText;
|
||||||
|
|||||||
@@ -19,15 +19,31 @@
|
|||||||
package appeng.parts.reporting;
|
package appeng.parts.reporting;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
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.EntityPlayer;
|
||||||
|
import net.minecraft.entity.player.EntityPlayerMP;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumHand;
|
import net.minecraft.util.EnumHand;
|
||||||
import net.minecraft.util.ResourceLocation;
|
import net.minecraft.util.ResourceLocation;
|
||||||
import net.minecraft.util.math.Vec3d;
|
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.IItemHandler;
|
||||||
import net.minecraftforge.items.wrapper.PlayerMainInvWrapper;
|
import net.minecraftforge.items.wrapper.PlayerMainInvWrapper;
|
||||||
|
|
||||||
@@ -92,6 +108,13 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
}
|
}
|
||||||
|
|
||||||
final ItemStack eq = player.getHeldItem( hand );
|
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( this.isLocked() )
|
||||||
{
|
{
|
||||||
if( eq.isEmpty() )
|
if( eq.isEmpty() )
|
||||||
@@ -103,18 +126,49 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
// wrench it
|
// wrench it
|
||||||
return super.onPartActivate( player, hand, pos );
|
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
|
else
|
||||||
{
|
{
|
||||||
this.insertItem( player, hand, false );
|
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
|
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;
|
return true;
|
||||||
@@ -138,9 +192,14 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
return false;
|
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;
|
return true;
|
||||||
@@ -183,9 +242,9 @@ public class PartConversionMonitor extends AbstractPartMonitor
|
|||||||
|
|
||||||
if( allItems )
|
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 );
|
IItemHandler inv = new PlayerMainInvWrapper( player.inventory );
|
||||||
|
|
||||||
for( int x = 0; x < inv.getSlots(); x++ )
|
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 )
|
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 )
|
if( input != null )
|
||||||
{
|
{
|
||||||
try
|
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
|
@Override
|
||||||
public IPartModel getStaticModels()
|
public IPartModel getStaticModels()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,13 +20,10 @@ package appeng.util;
|
|||||||
|
|
||||||
|
|
||||||
import appeng.util.inv.*;
|
import appeng.util.inv.*;
|
||||||
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.EnumFacing;
|
import net.minecraft.util.EnumFacing;
|
||||||
import net.minecraftforge.common.capabilities.Capability;
|
|
||||||
import net.minecraftforge.common.capabilities.CapabilityInject;
|
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
import net.minecraftforge.items.CapabilityItemHandler;
|
||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
@@ -40,23 +37,12 @@ import appeng.api.config.FuzzyMode;
|
|||||||
*/
|
*/
|
||||||
public abstract class InventoryAdaptor implements Iterable<ItemSlot>
|
public abstract class InventoryAdaptor implements Iterable<ItemSlot>
|
||||||
{
|
{
|
||||||
@CapabilityInject( IItemRepository.class)
|
|
||||||
public static Capability<IItemRepository> ITEM_REPOSITORY_CAPABILITY = null;
|
|
||||||
|
|
||||||
public static InventoryAdaptor getAdaptor( final TileEntity te, final EnumFacing d )
|
public static InventoryAdaptor getAdaptor( final TileEntity te, final EnumFacing d )
|
||||||
{
|
{
|
||||||
if( te != null )
|
if( te != null )
|
||||||
{
|
{
|
||||||
if( te.hasCapability( ITEM_REPOSITORY_CAPABILITY, d ) )
|
if( te.hasCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d ) )
|
||||||
{
|
{
|
||||||
IItemRepository itemRepository = te.getCapability( ITEM_REPOSITORY_CAPABILITY, d );
|
|
||||||
if (itemRepository != null){
|
|
||||||
return new AdaptorItemRepository( itemRepository );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if( te.hasCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d ) )
|
|
||||||
{
|
|
||||||
|
|
||||||
// Attempt getting an IItemHandler for the given side via caps
|
// Attempt getting an IItemHandler for the given side via caps
|
||||||
IItemHandler itemHandler = te.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d );
|
IItemHandler itemHandler = te.getCapability( CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d );
|
||||||
if( itemHandler != null )
|
if( itemHandler != null )
|
||||||
|
|||||||
@@ -1,208 +0,0 @@
|
|||||||
package appeng.util.inv;
|
|
||||||
|
|
||||||
import appeng.api.config.FuzzyMode;
|
|
||||||
import appeng.util.InventoryAdaptor;
|
|
||||||
|
|
||||||
import appeng.util.Platform;
|
|
||||||
import com.jaquadro.minecraft.storagedrawers.api.capabilities.IItemRepository;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
|
|
||||||
import java.util.Iterator;
|
|
||||||
|
|
||||||
|
|
||||||
public class AdaptorItemRepository extends InventoryAdaptor
|
|
||||||
{
|
|
||||||
protected final IItemRepository itemRepository;
|
|
||||||
|
|
||||||
public AdaptorItemRepository( IItemRepository itemRepository )
|
|
||||||
{
|
|
||||||
this.itemRepository = itemRepository;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack removeItems( int amount, ItemStack filter, IInventoryDestination destination )
|
|
||||||
{
|
|
||||||
ItemStack rv = ItemStack.EMPTY;
|
|
||||||
ItemStack extracted = ItemStack.EMPTY;
|
|
||||||
|
|
||||||
if( !filter.isEmpty() )
|
|
||||||
{
|
|
||||||
extracted = this.itemRepository.extractItem( filter, amount, true );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
|
|
||||||
{
|
|
||||||
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
|
|
||||||
if( !extracted.isEmpty() )
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( destination != null )
|
|
||||||
{
|
|
||||||
|
|
||||||
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
|
|
||||||
{
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
extracted = this.itemRepository.extractItem( filter, amount, false );
|
|
||||||
|
|
||||||
return extracted;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack simulateRemove( int amount, ItemStack filter, IInventoryDestination destination )
|
|
||||||
{
|
|
||||||
ItemStack rv = ItemStack.EMPTY;
|
|
||||||
ItemStack extracted = ItemStack.EMPTY;
|
|
||||||
|
|
||||||
if( !filter.isEmpty() )
|
|
||||||
{
|
|
||||||
extracted = this.itemRepository.extractItem( filter, amount, true );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
|
|
||||||
{
|
|
||||||
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
|
|
||||||
if( !extracted.isEmpty() )
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( destination != null )
|
|
||||||
{
|
|
||||||
|
|
||||||
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
|
|
||||||
{
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return extracted;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack removeSimilarItems( int amount, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination )
|
|
||||||
{
|
|
||||||
ItemStack rv = ItemStack.EMPTY;
|
|
||||||
ItemStack extracted = ItemStack.EMPTY;
|
|
||||||
|
|
||||||
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
|
|
||||||
{
|
|
||||||
if( Platform.itemComparisons().isFuzzyEqualItem( record.itemPrototype, filter, fuzzyMode ) )
|
|
||||||
{
|
|
||||||
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !extracted.isEmpty() )
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( destination != null )
|
|
||||||
{
|
|
||||||
|
|
||||||
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
|
|
||||||
{
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
extracted = this.itemRepository.extractItem( extracted, amount, false );
|
|
||||||
|
|
||||||
return extracted;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack simulateSimilarRemove( int amount, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination )
|
|
||||||
{
|
|
||||||
ItemStack rv = ItemStack.EMPTY;
|
|
||||||
ItemStack extracted = ItemStack.EMPTY;
|
|
||||||
|
|
||||||
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
|
|
||||||
{
|
|
||||||
if( Platform.itemComparisons().isFuzzyEqualItem( record.itemPrototype, filter, fuzzyMode ) )
|
|
||||||
{
|
|
||||||
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !extracted.isEmpty() )
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( destination != null )
|
|
||||||
{
|
|
||||||
|
|
||||||
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
|
|
||||||
{
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return extracted;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack addItems( ItemStack toBeAdded )
|
|
||||||
{
|
|
||||||
return this.addItems( toBeAdded, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ItemStack addItems( final ItemStack itemsToAdd, final boolean simulate )
|
|
||||||
{
|
|
||||||
if( itemsToAdd.isEmpty() )
|
|
||||||
{
|
|
||||||
return ItemStack.EMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemStack left = itemsToAdd.copy();
|
|
||||||
|
|
||||||
left = this.itemRepository.insertItem( left, simulate );
|
|
||||||
|
|
||||||
if( left.isEmpty() )
|
|
||||||
{
|
|
||||||
return ItemStack.EMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
return left;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack simulateAdd( ItemStack toBeSimulated )
|
|
||||||
{
|
|
||||||
return this.addItems( toBeSimulated, true );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean containsItems()
|
|
||||||
{
|
|
||||||
return !this.itemRepository.getAllItems().isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasSlots()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterator<ItemSlot> iterator()
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -25,7 +25,7 @@ import java.util.NoSuchElementException;
|
|||||||
import net.minecraftforge.items.IItemHandler;
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
|
||||||
class ItemHandlerIterator implements Iterator<ItemSlot>
|
public class ItemHandlerIterator implements Iterator<ItemSlot>
|
||||||
{
|
{
|
||||||
|
|
||||||
private final IItemHandler itemHandler;
|
private final IItemHandler itemHandler;
|
||||||
@@ -34,7 +34,7 @@ class ItemHandlerIterator implements Iterator<ItemSlot>
|
|||||||
|
|
||||||
private int slot = 0;
|
private int slot = 0;
|
||||||
|
|
||||||
ItemHandlerIterator( IItemHandler itemHandler )
|
public ItemHandlerIterator( IItemHandler itemHandler )
|
||||||
{
|
{
|
||||||
this.itemHandler = itemHandler;
|
this.itemHandler = itemHandler;
|
||||||
}
|
}
|
||||||
@@ -55,6 +55,8 @@ class ItemHandlerIterator implements Iterator<ItemSlot>
|
|||||||
this.itemSlot.setExtractable( !this.itemHandler.extractItem( this.slot, 1, true ).isEmpty() );
|
this.itemSlot.setExtractable( !this.itemHandler.extractItem( this.slot, 1, true ).isEmpty() );
|
||||||
this.itemSlot.setItemStack( this.itemHandler.getStackInSlot( this.slot ) );
|
this.itemSlot.setItemStack( this.itemHandler.getStackInSlot( this.slot ) );
|
||||||
this.itemSlot.setSlot( this.slot );
|
this.itemSlot.setSlot( this.slot );
|
||||||
|
this.itemSlot.setSlotLimit( this.itemHandler.getSlotLimit( this.slot ) );
|
||||||
|
this.itemSlot.setItemHandler( this.itemHandler );
|
||||||
this.slot++;
|
this.slot++;
|
||||||
return this.itemSlot;
|
return this.itemSlot;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import net.minecraft.item.ItemStack;
|
|||||||
|
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.util.item.AEItemStack;
|
import appeng.util.item.AEItemStack;
|
||||||
|
import net.minecraftforge.items.IItemHandler;
|
||||||
|
|
||||||
|
|
||||||
public class ItemSlot
|
public class ItemSlot
|
||||||
@@ -34,6 +35,25 @@ public class ItemSlot
|
|||||||
private IAEItemStack aeItemStack;
|
private IAEItemStack aeItemStack;
|
||||||
private ItemStack itemStack;
|
private ItemStack itemStack;
|
||||||
|
|
||||||
|
public void setItemHandler( IItemHandler itemHandler )
|
||||||
|
{
|
||||||
|
this.itemHandler = itemHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IItemHandler itemHandler;
|
||||||
|
|
||||||
|
public int getSlotLimit()
|
||||||
|
{
|
||||||
|
return slotLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSlotLimit( int slotLimit )
|
||||||
|
{
|
||||||
|
this.slotLimit = slotLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int slotLimit;
|
||||||
|
|
||||||
public ItemStack getItemStack()
|
public ItemStack getItemStack()
|
||||||
{
|
{
|
||||||
return this.itemStack
|
return this.itemStack
|
||||||
@@ -77,4 +97,19 @@ public class ItemSlot
|
|||||||
{
|
{
|
||||||
this.slot = slot;
|
this.slot = slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ItemSlot copy()
|
||||||
|
{
|
||||||
|
ItemSlot copy = new ItemSlot();
|
||||||
|
copy.setSlot( this.slot );
|
||||||
|
copy.setSlotLimit( this.slotLimit );
|
||||||
|
copy.setItemStack( this.getItemStack() );
|
||||||
|
copy.setExtractable( this.isExtractable );
|
||||||
|
copy.setItemHandler( this.itemHandler );
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemStack simulateInsertItem( ItemStack sourceItemStack){
|
||||||
|
return this.itemHandler.insertItem( this.slot, sourceItemStack , true );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,11 +9,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
"conditions": [
|
"conditions": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:1"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"display": {
|
"display": {
|
||||||
|
|||||||
@@ -9,7 +9,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:1"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 1
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,19 +5,23 @@
|
|||||||
"values": [
|
"values": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:13"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:14"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:19"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
|
|||||||
@@ -21,19 +21,23 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:13"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:14"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:19"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
@@ -41,11 +45,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:360"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 360
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:340"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 340
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-5
@@ -5,19 +5,23 @@
|
|||||||
"values": [
|
"values": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:13"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:14"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:19"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
@@ -25,7 +29,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:360"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 360
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,11 +9,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
@@ -24,7 +26,8 @@
|
|||||||
],
|
],
|
||||||
"display": {
|
"display": {
|
||||||
"icon": {
|
"icon": {
|
||||||
"item": "appliedenergistics2:facade"
|
"item": "appliedenergistics2:facade",
|
||||||
|
"nbt": "{item:\"minecraft:stone\"}"
|
||||||
},
|
},
|
||||||
"title": {
|
"title": {
|
||||||
"translate": "achievement.ae2.Facade"
|
"translate": "achievement.ae2.Facade"
|
||||||
|
|||||||
@@ -9,7 +9,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -9,7 +9,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
|
|||||||
@@ -9,11 +9,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
|
|||||||
@@ -18,19 +18,23 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:13"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:14"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:19"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
|
|||||||
@@ -9,11 +9,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,11 +9,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,11 +9,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,19 +5,23 @@
|
|||||||
"values": [
|
"values": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:13"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:14"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:19"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
|
|||||||
@@ -9,15 +9,18 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:460"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 460
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -41,8 +44,8 @@
|
|||||||
"conditions": {
|
"conditions": {
|
||||||
"items": [
|
"items": [
|
||||||
{
|
{
|
||||||
"type": "appliedenergistics2:part",
|
"item": "appliedenergistics2:part",
|
||||||
"part": "P2P_TUNNEL_ME"
|
"data": 460
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-6
@@ -5,19 +5,23 @@
|
|||||||
"values": [
|
"values": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:13"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:14"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:19"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
@@ -25,11 +29,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:360"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 360
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:340"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 340
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
+47
-38
@@ -1,44 +1,53 @@
|
|||||||
{
|
{
|
||||||
"conditions": [
|
"conditions": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "forge:and",
|
||||||
"item": "appliedenergistics2:storage_cell_1k"
|
"values": [
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_1k"
|
||||||
"item": "appliedenergistics2:storage_cell_4k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_4k"
|
||||||
"item": "appliedenergistics2:storage_cell_16k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_16k"
|
||||||
"item": "appliedenergistics2:storage_cell_64k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_64k"
|
||||||
"item": "appliedenergistics2:material:13"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:material",
|
||||||
"item": "appliedenergistics2:material:14"
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
},
|
"data": 14
|
||||||
{
|
},
|
||||||
"type": "minecraft:item_exists",
|
{
|
||||||
"item": "appliedenergistics2:material:19"
|
"type": "minecraft:item_exists",
|
||||||
},
|
"item": "appliedenergistics2:material",
|
||||||
{
|
"data": 15
|
||||||
"type": "minecraft:item_exists",
|
},
|
||||||
"item": "appliedenergistics2:controller"
|
{
|
||||||
},
|
"type": "minecraft:item_exists",
|
||||||
{
|
"item": "appliedenergistics2:material",
|
||||||
"type": "minecraft:item_exists",
|
"data": 19
|
||||||
"item": "appliedenergistics2:portable_cell"
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:controller"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:portable_cell"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"display": {
|
"display": {
|
||||||
|
|||||||
@@ -5,19 +5,23 @@
|
|||||||
"values": [
|
"values": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:13"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:14"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 14
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 15
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:19"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,15 +9,18 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:460"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 460
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
|
|||||||
+51
-42
@@ -1,48 +1,57 @@
|
|||||||
{
|
{
|
||||||
"conditions": [
|
"conditions": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "forge:and",
|
||||||
"item": "appliedenergistics2:storage_cell_1k"
|
"values": [
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_1k"
|
||||||
"item": "appliedenergistics2:storage_cell_4k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_4k"
|
||||||
"item": "appliedenergistics2:storage_cell_16k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_16k"
|
||||||
"item": "appliedenergistics2:storage_cell_64k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_64k"
|
||||||
"item": "appliedenergistics2:material:13"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:material",
|
||||||
"item": "appliedenergistics2:material:14"
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
},
|
"data": 14
|
||||||
{
|
},
|
||||||
"type": "minecraft:item_exists",
|
{
|
||||||
"item": "appliedenergistics2:material:19"
|
"type": "minecraft:item_exists",
|
||||||
},
|
"item": "appliedenergistics2:material",
|
||||||
{
|
"data": 15
|
||||||
"type": "minecraft:item_exists",
|
},
|
||||||
"item": "appliedenergistics2:controller"
|
{
|
||||||
},
|
"type": "minecraft:item_exists",
|
||||||
{
|
"item": "appliedenergistics2:material",
|
||||||
"type": "minecraft:item_exists",
|
"data": 19
|
||||||
"item": "appliedenergistics2:io_port"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:controller"
|
||||||
"item": "appliedenergistics2:spatial_io_port"
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:io_port"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:spatial_io_port"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"display": {
|
"display": {
|
||||||
|
|||||||
+51
-42
@@ -1,48 +1,57 @@
|
|||||||
{
|
{
|
||||||
"conditions": [
|
"conditions": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "forge:and",
|
||||||
"item": "appliedenergistics2:storage_cell_1k"
|
"values": [
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_1k"
|
||||||
"item": "appliedenergistics2:storage_cell_4k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_4k"
|
||||||
"item": "appliedenergistics2:storage_cell_16k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_16k"
|
||||||
"item": "appliedenergistics2:storage_cell_64k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_64k"
|
||||||
"item": "appliedenergistics2:material:13"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:material",
|
||||||
"item": "appliedenergistics2:material:14"
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
},
|
"data": 14
|
||||||
{
|
},
|
||||||
"type": "minecraft:item_exists",
|
{
|
||||||
"item": "appliedenergistics2:material:19"
|
"type": "minecraft:item_exists",
|
||||||
},
|
"item": "appliedenergistics2:material",
|
||||||
{
|
"data": 15
|
||||||
"type": "minecraft:item_exists",
|
},
|
||||||
"item": "appliedenergistics2:controller"
|
{
|
||||||
},
|
"type": "minecraft:item_exists",
|
||||||
{
|
"item": "appliedenergistics2:material",
|
||||||
"type": "minecraft:item_exists",
|
"data": 19
|
||||||
"item": "appliedenergistics2:io_port"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:controller"
|
||||||
"item": "appliedenergistics2:spatial_io_port"
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:io_port"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:spatial_io_port"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"display": {
|
"display": {
|
||||||
|
|||||||
@@ -9,11 +9,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:7"
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 7
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:16"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 16
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
@@ -21,7 +23,8 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:part:220"
|
"item": "appliedenergistics2:part",
|
||||||
|
"data": 220
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +1,49 @@
|
|||||||
{
|
{
|
||||||
"conditions": [
|
"conditions": [
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "forge:and",
|
||||||
"item": "appliedenergistics2:storage_cell_1k"
|
"values": [
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_1k"
|
||||||
"item": "appliedenergistics2:storage_cell_4k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_4k"
|
||||||
"item": "appliedenergistics2:storage_cell_16k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_16k"
|
||||||
"item": "appliedenergistics2:storage_cell_64k"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:storage_cell_64k"
|
||||||
"item": "appliedenergistics2:material:13"
|
},
|
||||||
},
|
{
|
||||||
{
|
"type": "minecraft:item_exists",
|
||||||
"type": "minecraft:item_exists",
|
"item": "appliedenergistics2:material",
|
||||||
"item": "appliedenergistics2:material:14"
|
"data": 13
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "minecraft:item_exists",
|
"type": "minecraft:item_exists",
|
||||||
"item": "appliedenergistics2:material:15"
|
"item": "appliedenergistics2:material",
|
||||||
},
|
"data": 14
|
||||||
{
|
},
|
||||||
"type": "minecraft:item_exists",
|
{
|
||||||
"item": "appliedenergistics2:material:19"
|
"type": "minecraft:item_exists",
|
||||||
},
|
"item": "appliedenergistics2:material",
|
||||||
{
|
"data": 15
|
||||||
"type": "minecraft:item_exists",
|
},
|
||||||
"item": "appliedenergistics2:controller"
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:material",
|
||||||
|
"data": 19
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "minecraft:item_exists",
|
||||||
|
"item": "appliedenergistics2:controller"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"display": {
|
"display": {
|
||||||
|
|||||||
Reference in New Issue
Block a user