Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2269c05d98 | |||
| 63616e5730 | |||
| 6ca3e6e696 | |||
| a4b5cfc3b9 | |||
| 38b0a7a153 |
@@ -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> { }
|
||||||
|
}
|
||||||
@@ -387,29 +387,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 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -538,23 +522,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;
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -359,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();
|
||||||
@@ -377,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 )))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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() )
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public abstract class InventoryAdaptor implements Iterable<ItemSlot>
|
|||||||
{
|
{
|
||||||
if( te != null )
|
if( te != null )
|
||||||
{
|
{
|
||||||
if( te.hasCapability( ITEM_REPOSITORY_CAPABILITY, d ) )
|
if( ITEM_REPOSITORY_CAPABILITY != null && te.hasCapability( ITEM_REPOSITORY_CAPABILITY, d ) )
|
||||||
{
|
{
|
||||||
IItemRepository itemRepository = te.getCapability( ITEM_REPOSITORY_CAPABILITY, d );
|
IItemRepository itemRepository = te.getCapability( ITEM_REPOSITORY_CAPABILITY, d );
|
||||||
if (itemRepository != null){
|
if (itemRepository != null){
|
||||||
|
|||||||
Reference in New Issue
Block a user