diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java index 647d5e351..2208f01e5 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java @@ -121,7 +121,7 @@ public interface ICraftingManager { * * @param stack the stack */ - int track(ItemStack stack, int size); + int track(@Nonnull ItemStack stack, int size); /** * Tracks an incoming stack. diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java index 6f99db893..1eaf5a335 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java @@ -87,27 +87,27 @@ public interface INetwork { /** * Inserts an item in this network. * - * @param stack the stack prototype to insert, do NOT modify + * @param stack the stack prototype to insert, can be empty, do NOT modify * @param size the amount of that prototype that has to be inserted * @param action the action - * @return null if the insert was successful, or a stack with the remainder + * @return an empty stack if the insert was successful, or a stack with the remainder */ - @Nullable + @Nonnull ItemStack insertItem(@Nonnull ItemStack stack, int size, Action action); /** * Inserts an item and notifies the crafting manager of the incoming item. * - * @param stack the stack prototype to insert, do NOT modify + * @param stack the stack prototype to insert, can be empty, do NOT modify * @param size the amount of that prototype that has to be inserted - * @return null if the insert was successful, or a stack with the remainder + * @return an empty stack if the insert was successful, or a stack with the remainder */ - @Nullable + @Nonnull default ItemStack insertItemTracked(@Nonnull ItemStack stack, int size) { int remainder = getCraftingManager().track(stack, size); if (remainder == 0) { - return null; + return ItemStack.EMPTY; } return insertItem(stack, remainder, Action.PERFORM); @@ -121,9 +121,9 @@ public interface INetwork { * @param flags the flags to compare on, see {@link IComparer} * @param action the action * @param filter a filter for the storage - * @return null if we didn't extract anything, or a stack with the result + * @return an empty stack if nothing was extracted, or a stack with the result */ - @Nullable + @Nonnull ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, Action action, Predicate> filter); /** @@ -133,9 +133,9 @@ public interface INetwork { * @param size the amount of that prototype that has to be extracted * @param flags the flags to compare on, see {@link IComparer} * @param action the action - * @return null if we didn't extract anything, or a stack with the result + * @return an empty stack if nothing was extracted, or a stack with the result */ - @Nullable + @Nonnull default ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, Action action) { return extractItem(stack, size, flags, action, s -> true); } @@ -146,9 +146,9 @@ public interface INetwork { * @param stack the prototype of the stack to extract, do NOT modify * @param size the amount of that prototype that has to be extracted * @param action the action - * @return null if we didn't extract anything, or a stack with the result + * @return an empty stack if nothing was extracted, or a stack with the result */ - @Nullable + @Nonnull default ItemStack extractItem(@Nonnull ItemStack stack, int size, Action action) { return extractItem(stack, size, IComparer.COMPARE_NBT, action); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridBehavior.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridBehavior.java index 4f19fa16c..c1bed7fd7 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridBehavior.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/ICraftingGridBehavior.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.api.network.grid; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.ICraftingRecipe; /** @@ -8,7 +9,7 @@ import net.minecraft.item.crafting.ICraftingRecipe; */ public interface ICraftingGridBehavior { /** - * Default logic for regular crafting. + * Logic for regular crafting. * * @param grid the grid * @param recipe the recipe @@ -17,10 +18,19 @@ public interface ICraftingGridBehavior { void onCrafted(IGridNetworkAware grid, ICraftingRecipe recipe, PlayerEntity player); /** - * Default logic for crafting with shift click (mass crafting). + * Logic for crafting with shift click (mass crafting). * * @param grid the grid - * @param player the layer + * @param player the player */ void onCraftedShift(IGridNetworkAware grid, PlayerEntity player); + + /** + * Logic for when a recipe is transferred to the grid. + * + * @param grid the grid + * @param player the player + * @param recipe the recipe + */ + void onRecipeTransfer(IGridNetworkAware grid, PlayerEntity player, ItemStack[][] recipe); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/handler/IFluidGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/handler/IFluidGridHandler.java index ebc7caa83..9ccd26152 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/handler/IFluidGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/handler/IFluidGridHandler.java @@ -3,7 +3,7 @@ package com.raoulvdberge.refinedstorage.api.network.grid.handler; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; -import javax.annotation.Nullable; +import javax.annotation.Nonnull; import java.util.UUID; /** @@ -24,9 +24,9 @@ public interface IFluidGridHandler { * * @param player the player * @param container a stack with a fluid container we're trying to insert - * @return the remainder, or null if there is no remainder + * @return the remainder, or an empty stack if there is no remainder */ - @Nullable + @Nonnull ItemStack onInsert(ServerPlayerEntity player, ItemStack container); /** @@ -43,6 +43,7 @@ public interface IFluidGridHandler { * @param container the container * @return the remainder container */ + @Nonnull ItemStack onShiftClick(ServerPlayerEntity player, ItemStack container); /** diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/handler/IItemGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/handler/IItemGridHandler.java index 0bf3d7c90..c6f8fa2bd 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/handler/IItemGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/handler/IItemGridHandler.java @@ -29,7 +29,7 @@ public interface IItemGridHandler { * * @param player the player that is attempting the insert * @param stack the item we're trying to insert - * @return the remainder, or null if there is no remainder + * @return the remainder, or an empty stack if there is no remainder */ @Nonnull ItemStack onInsert(ServerPlayerEntity player, ItemStack stack); @@ -47,7 +47,7 @@ public interface IItemGridHandler { * * @param player the player * @param stack the stack - * @return the remainder stack + * @return the remainder, or an empty stack if there is no remainder */ // TODO Maybe remove? @Nonnull diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java index 33cb33d4e..17b0d49b0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java @@ -316,7 +316,11 @@ public class CraftingManager implements ICraftingManager { } @Override - public int track(ItemStack stack, int size) { + public int track(@Nonnull ItemStack stack, int size) { + if (stack.isEmpty()) { + return 0; + } + for (ICraftingTask task : tasks.values()) { size = task.onTrackedInsert(stack, size); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index d7c305813..a441b0b22 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -44,7 +44,7 @@ public class CraftingPattern implements ICraftingPattern { for (int i = 0; i < 9; ++i) { ItemStack input = PatternItem.getInputSlot(stack, i); - if (input == null) { + if (input.isEmpty()) { inputs.add(NonNullList.create()); } else if (oredict) { NonNullList ores = NonNullList.create(); @@ -75,7 +75,7 @@ public class CraftingPattern implements ICraftingPattern { } ItemStack output = PatternItem.getOutputSlot(stack, i); - if (output != null) { + if (!output.isEmpty()) { this.valid = true; // As soon as we have one output, we are valid. outputs.add(output); @@ -101,11 +101,9 @@ public class CraftingPattern implements ICraftingPattern { for (int i = 0; i < 9; ++i) { ItemStack input = PatternItem.getInputSlot(stack, i); - inputs.add(input == null ? NonNullList.create() : NonNullList.from(ItemStack.EMPTY, input)); + inputs.add(input.isEmpty() ? NonNullList.create() : NonNullList.from(ItemStack.EMPTY, input)); - if (input != null) { - inv.setInventorySlotContents(i, input); - } + inv.setInventorySlotContents(i, input); } Optional potentialRecipe = world.getRecipeManager().getRecipe(IRecipeType.CRAFTING, inv, world); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index 3ffb3a3e8..b03e32977 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -546,7 +546,7 @@ public class CraftingTask implements ICraftingTask { for (StackListEntry toExtract : toExtractInitial.getStacks()) { ItemStack result = network.extractItem(toExtract.getStack(), toExtract.getStack().getCount(), Action.PERFORM); - if (result != null) { + if (!result.isEmpty()) { internalStorage.insert(toExtract.getStack(), result.getCount(), Action.PERFORM); toRemove.add(result); @@ -634,9 +634,7 @@ public class CraftingTask implements ICraftingTask { } else { ItemStack remainder = this.network.insertItem(output, output.getCount(), Action.PERFORM); - if (remainder != null) { - this.internalStorage.insert(remainder, remainder.getCount(), Action.PERFORM); - } + this.internalStorage.insert(remainder, remainder.getCount(), Action.PERFORM); } // Byproducts need to always be inserted in the internal storage for later reuse further in the task. @@ -852,13 +850,7 @@ public class CraftingTask implements ICraftingTask { for (ItemStack stack : internalStorage.getStacks()) { ItemStack remainder = network.insertItem(stack, stack.getCount(), Action.PERFORM); - toPerform.add(() -> { - if (remainder == null) { - internalStorage.extract(stack, stack.getCount(), IComparer.COMPARE_NBT, Action.PERFORM); - } else { - internalStorage.extract(stack, stack.getCount() - remainder.getCount(), IComparer.COMPARE_NBT, Action.PERFORM); - } - }); + toPerform.add(() -> internalStorage.extract(stack, stack.getCount() - remainder.getCount(), IComparer.COMPARE_NBT, Action.PERFORM)); } for (FluidStack stack : internalFluidStorage.getStacks()) { @@ -960,9 +952,7 @@ public class CraftingTask implements ICraftingTask { } else { ItemStack remainder = network.insertItem(stack, needed, Action.PERFORM); - if (remainder != null) { - internalStorage.insert(stack, needed, Action.PERFORM); - } + internalStorage.insert(remainder, remainder.getCount(), Action.PERFORM); } if (size == 0) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java index 83032f607..642004917 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/CraftingGridBehavior.java @@ -1,11 +1,13 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.grid; import com.raoulvdberge.refinedstorage.api.network.INetwork; +import com.raoulvdberge.refinedstorage.api.network.grid.GridType; import com.raoulvdberge.refinedstorage.api.network.grid.ICraftingGridBehavior; import com.raoulvdberge.refinedstorage.api.network.grid.IGridNetworkAware; +import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.api.util.Action; +import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.inventory.CraftingInventory; import net.minecraft.inventory.InventoryHelper; @@ -38,7 +40,7 @@ public class CraftingGridBehavior implements ICraftingGridBehavior { ItemStack remainderStack = network == null ? remainder.get(i).copy() : network.insertItem(remainder.get(i).copy(), remainder.get(i).getCount(), Action.PERFORM); // If there is no space in the network, just dump it in the world. - if (remainderStack != null) { + if (!remainderStack.isEmpty()) { InventoryHelper.spawnItemStack(player.getEntityWorld(), player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), remainderStack); } } @@ -49,7 +51,7 @@ public class CraftingGridBehavior implements ICraftingGridBehavior { } } else if (!slot.isEmpty()) { // We don't have a remainder, but the slot is not empty. if (slot.getCount() == 1 && network != null) { // Attempt to refill the slot with the same item from the network, only if we have a network and only if it's the last item. - ItemStack refill = StackUtils.nullToEmpty(network.extractItem(slot, 1, Action.PERFORM)); + ItemStack refill = network.extractItem(slot, 1, Action.PERFORM); matrix.setInventorySlotContents(i, refill); @@ -86,7 +88,7 @@ public class CraftingGridBehavior implements ICraftingGridBehavior { if (!player.inventory.addItemStackToInventory(craftedItem.copy())) { ItemStack remainder = network == null ? craftedItem : network.insertItem(craftedItem, craftedItem.getCount(), Action.PERFORM); - if (remainder != null) { + if (!remainder.isEmpty()) { InventoryHelper.spawnItemStack(player.getEntityWorld(), player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), remainder); } } @@ -98,4 +100,94 @@ public class CraftingGridBehavior implements ICraftingGridBehavior { crafted.onCrafting(player.world, player, amountCrafted); BasicEventHooks.firePlayerCraftingEvent(player, ItemHandlerHelper.copyStackWithSize(crafted, amountCrafted), grid.getCraftingMatrix()); } + + @Override + public void onRecipeTransfer(IGridNetworkAware grid, PlayerEntity player, ItemStack[][] recipe) { + INetwork network = grid.getNetwork(); + + if (network != null && grid.getGridType() == GridType.CRAFTING && !network.getSecurityManager().hasPermission(Permission.EXTRACT, player)) { + return; + } + + // First try to empty the crafting matrix + for (int i = 0; i < grid.getCraftingMatrix().getSizeInventory(); ++i) { + ItemStack slot = grid.getCraftingMatrix().getStackInSlot(i); + + if (!slot.isEmpty()) { + // Only if we are a crafting grid. Pattern grids can just be emptied. + if (grid.getGridType() == GridType.CRAFTING) { + // If we are connected, try to insert into network. If it fails, stop. + if (network != null) { + if (!network.insertItem(slot, slot.getCount(), Action.SIMULATE).isEmpty()) { + return; + } else { + network.insertItem(slot, slot.getCount(), Action.PERFORM); + + network.getItemStorageTracker().changed(player, slot.copy()); + } + } else { + // If we aren't connected, try to insert into player inventory. If it fails, stop. + if (!player.inventory.addItemStackToInventory(slot.copy())) { + return; + } + } + } + + grid.getCraftingMatrix().setInventorySlotContents(i, ItemStack.EMPTY); + } + } + + // Now let's fill the matrix + for (int i = 0; i < grid.getCraftingMatrix().getSizeInventory(); ++i) { + if (recipe[i] != null) { + ItemStack[] possibilities = recipe[i]; + + // If we are a crafting grid + if (grid.getGridType() == GridType.CRAFTING) { + boolean found = false; + + // If we are connected, first try to get the possibilities from the network + if (network != null) { + for (ItemStack possibility : possibilities) { + ItemStack took = network.extractItem(possibility, 1, IComparer.COMPARE_NBT, Action.PERFORM); + + if (!took.isEmpty()) { + grid.getCraftingMatrix().setInventorySlotContents(i, took); + + network.getItemStorageTracker().changed(player, took.copy()); + + found = true; + + break; + } + } + } + + // If we haven't found anything in the network (or we are disconnected), go look in the player inventory + if (!found) { + for (ItemStack possibility : possibilities) { + for (int j = 0; j < player.inventory.getSizeInventory(); ++j) { + if (API.instance().getComparer().isEqual(possibility, player.inventory.getStackInSlot(j), IComparer.COMPARE_NBT)) { + grid.getCraftingMatrix().setInventorySlotContents(i, ItemHandlerHelper.copyStackWithSize(player.inventory.getStackInSlot(j), 1)); + + player.inventory.decrStackSize(j, 1); + + found = true; + + break; + } + } + + if (found) { + break; + } + } + } + } else if (grid.getGridType() == GridType.PATTERN) { + // If we are a pattern grid we can just set the slot + grid.getCraftingMatrix().setInventorySlotContents(i, possibilities.length == 0 ? ItemStack.EMPTY : possibilities[0]); + } + } + } + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/FluidGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/FluidGridHandler.java index 0feac9037..6b9af7d38 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/FluidGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/FluidGridHandler.java @@ -19,7 +19,7 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import org.apache.commons.lang3.tuple.Pair; -import javax.annotation.Nullable; +import javax.annotation.Nonnull; import java.util.UUID; public class FluidGridHandler implements IFluidGridHandler { @@ -52,7 +52,7 @@ public class FluidGridHandler implements IFluidGridHandler { } if (bucket.isEmpty()) { - bucket = StackUtils.nullToEmpty(network.extractItem(StackUtils.EMPTY_BUCKET, 1, Action.PERFORM)); + bucket = network.extractItem(StackUtils.EMPTY_BUCKET, 1, Action.PERFORM); } if (!bucket.isEmpty()) { @@ -79,8 +79,8 @@ public class FluidGridHandler implements IFluidGridHandler { } } - @Nullable @Override + @Nonnull public ItemStack onInsert(ServerPlayerEntity player, ItemStack container) { if (!network.getSecurityManager().hasPermission(Permission.INSERT, player)) { return container; @@ -105,13 +105,14 @@ public class FluidGridHandler implements IFluidGridHandler { @Override public void onInsertHeldContainer(ServerPlayerEntity player) { - player.inventory.setItemStack(StackUtils.nullToEmpty(onInsert(player, player.inventory.getItemStack()))); + player.inventory.setItemStack(onInsert(player, player.inventory.getItemStack())); player.updateHeldItem(); } @Override + @Nonnull public ItemStack onShiftClick(ServerPlayerEntity player, ItemStack container) { - return StackUtils.nullToEmpty(onInsert(player, container)); + return onInsert(player, container); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/ItemGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/ItemGridHandler.java index ae80aca78..888ce3c9b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/ItemGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/ItemGridHandler.java @@ -10,7 +10,6 @@ import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.api.util.Action; import com.raoulvdberge.refinedstorage.api.util.IStackList; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; @@ -78,21 +77,19 @@ public class ItemGridHandler implements IItemGridHandler { ItemStack took = network.extractItem(item, size, Action.SIMULATE); - if (took != null) { + if (!took.isEmpty()) { if ((flags & EXTRACT_SHIFT) == EXTRACT_SHIFT) { IItemHandler playerInventory = player.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, Direction.UP).orElse(null); if (playerInventory != null && ItemHandlerHelper.insertItem(playerInventory, took, true).isEmpty()) { took = network.extractItem(item, size, Action.PERFORM); - if (took != null) { - ItemHandlerHelper.insertItem(playerInventory, took, false); - } + ItemHandlerHelper.insertItem(playerInventory, took, false); } } else { took = network.extractItem(item, size, Action.PERFORM); - if (took != null) { + if (!took.isEmpty()) { if (single && !held.isEmpty()) { held.grow(1); } else { @@ -116,7 +113,7 @@ public class ItemGridHandler implements IItemGridHandler { network.getItemStorageTracker().changed(player, stack.copy()); - ItemStack remainder = StackUtils.nullToEmpty(network.insertItem(stack, stack.getCount(), Action.PERFORM)); + ItemStack remainder = network.insertItem(stack, stack.getCount(), Action.PERFORM); // TODO network.getNetworkItemHandler().drainEnergy(player, RS.INSTANCE.config.wirelessGridInsertUsage); @@ -135,17 +132,18 @@ public class ItemGridHandler implements IItemGridHandler { network.getItemStorageTracker().changed(player, stack.copy()); if (single) { - if (network.insertItem(stack, size, Action.SIMULATE) == null) { + if (network.insertItem(stack, size, Action.SIMULATE).isEmpty()) { network.insertItem(stack, size, Action.PERFORM); stack.shrink(size); - if (stack.getCount() == 0) { + // TODO Is this still needed? + if (stack.isEmpty()) { player.inventory.setItemStack(ItemStack.EMPTY); } } } else { - player.inventory.setItemStack(StackUtils.nullToEmpty(network.insertItem(stack, size, Action.PERFORM))); + player.inventory.setItemStack(network.insertItem(stack, size, Action.PERFORM)); } player.updateHeldItem(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableFluidGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableFluidGridHandler.java index 269366693..42990464a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableFluidGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableFluidGridHandler.java @@ -16,7 +16,7 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import org.apache.commons.lang3.tuple.Pair; -import javax.annotation.Nullable; +import javax.annotation.Nonnull; import java.util.UUID; public class PortableFluidGridHandler implements IFluidGridHandler { @@ -68,8 +68,8 @@ public class PortableFluidGridHandler implements IFluidGridHandler { } } - @Nullable @Override + @Nonnull public ItemStack onInsert(ServerPlayerEntity player, ItemStack container) { Pair result = StackUtils.getFluid(container, true); @@ -90,13 +90,14 @@ public class PortableFluidGridHandler implements IFluidGridHandler { @Override public void onInsertHeldContainer(ServerPlayerEntity player) { - player.inventory.setItemStack(StackUtils.nullToEmpty(onInsert(player, player.inventory.getItemStack()))); + player.inventory.setItemStack(onInsert(player, player.inventory.getItemStack())); player.updateHeldItem(); } @Override + @Nonnull public ItemStack onShiftClick(ServerPlayerEntity player, ItemStack container) { - return StackUtils.nullToEmpty(onInsert(player, container)); + return onInsert(player, container); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java index c9ad79b54..1dcac233c 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/handler/PortableItemGridHandler.java @@ -139,7 +139,7 @@ public class PortableItemGridHandler implements IItemGridHandler { stack.shrink(size); // TODO ??? - if (stack.getCount() == 0) { + if (stack.isEmpty()) { player.inventory.setItemStack(ItemStack.EMPTY); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java index e9eaa1dbe..d7e61ed3f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/GridNetworkNode.java @@ -2,7 +2,6 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSItems; -import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.network.grid.*; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; @@ -10,7 +9,6 @@ import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.api.storage.cache.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.cache.IStorageCacheListener; import com.raoulvdberge.refinedstorage.api.util.Action; -import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IFilter; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.storage.cache.listener.FluidGridStorageCacheListener; @@ -47,7 +45,6 @@ import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import net.minecraftforge.items.wrapper.InvWrapper; @@ -110,17 +107,17 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I if (isPatternProcessing && isProcessingPattern()) { for (int i = 0; i < 9; ++i) { - processingMatrix.setStackInSlot(i, StackUtils.nullToEmpty(PatternItem.getInputSlot(pattern, i))); + processingMatrix.setStackInSlot(i, PatternItem.getInputSlot(pattern, i)); processingMatrixFluids.setFluid(i, PatternItem.getFluidInputSlot(pattern, i)); } for (int i = 0; i < 9; ++i) { - processingMatrix.setStackInSlot(9 + i, StackUtils.nullToEmpty(PatternItem.getOutputSlot(pattern, i))); + processingMatrix.setStackInSlot(9 + i, PatternItem.getOutputSlot(pattern, i)); processingMatrixFluids.setFluid(9 + i, PatternItem.getFluidOutputSlot(pattern, i)); } } else if (!isPatternProcessing && !isProcessingPattern()) { for (int i = 0; i < 9; ++i) { - matrix.setInventorySlotContents(i, StackUtils.nullToEmpty(PatternItem.getInputSlot(pattern, i))); + matrix.setInventorySlotContents(i, PatternItem.getInputSlot(pattern, i)); } } } @@ -341,96 +338,7 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I @Override public void onRecipeTransfer(PlayerEntity player, ItemStack[][] recipe) { - onRecipeTransfer(this, player, recipe); - } - - public static void onRecipeTransfer(IGridNetworkAware grid, PlayerEntity player, ItemStack[][] recipe) { - INetwork network = grid.getNetwork(); - - if (network != null && grid.getGridType() == GridType.CRAFTING && !network.getSecurityManager().hasPermission(Permission.EXTRACT, player)) { - return; - } - - // First try to empty the crafting matrix - for (int i = 0; i < grid.getCraftingMatrix().getSizeInventory(); ++i) { - ItemStack slot = grid.getCraftingMatrix().getStackInSlot(i); - - if (!slot.isEmpty()) { - // Only if we are a crafting grid. Pattern grids can just be emptied. - if (grid.getGridType() == GridType.CRAFTING) { - // If we are connected, try to insert into network. If it fails, stop. - if (network != null) { - if (network.insertItem(slot, slot.getCount(), Action.SIMULATE) != null) { - return; - } else { - network.insertItem(slot, slot.getCount(), Action.PERFORM); - - network.getItemStorageTracker().changed(player, slot.copy()); - } - } else { - // If we aren't connected, try to insert into player inventory. If it fails, stop. - if (!player.inventory.addItemStackToInventory(slot.copy())) { - return; - } - } - } - - grid.getCraftingMatrix().setInventorySlotContents(i, ItemStack.EMPTY); - } - } - - // Now let's fill the matrix - for (int i = 0; i < grid.getCraftingMatrix().getSizeInventory(); ++i) { - if (recipe[i] != null) { - ItemStack[] possibilities = recipe[i]; - - // If we are a crafting grid - if (grid.getGridType() == GridType.CRAFTING) { - boolean found = false; - - // If we are connected, first try to get the possibilities from the network - if (network != null) { - for (ItemStack possibility : possibilities) { - ItemStack took = network.extractItem(possibility, 1, IComparer.COMPARE_NBT, Action.PERFORM); - - if (took != null) { - grid.getCraftingMatrix().setInventorySlotContents(i, StackUtils.nullToEmpty(took)); - - network.getItemStorageTracker().changed(player, took.copy()); - - found = true; - - break; - } - } - } - - // If we haven't found anything in the network (or we are disconnected), go look in the player inventory - if (!found) { - for (ItemStack possibility : possibilities) { - for (int j = 0; j < player.inventory.getSizeInventory(); ++j) { - if (API.instance().getComparer().isEqual(possibility, player.inventory.getStackInSlot(j), IComparer.COMPARE_NBT)) { - grid.getCraftingMatrix().setInventorySlotContents(i, ItemHandlerHelper.copyStackWithSize(player.inventory.getStackInSlot(j), 1)); - - player.inventory.decrStackSize(j, 1); - - found = true; - - break; - } - } - - if (found) { - break; - } - } - } - } else if (grid.getGridType() == GridType.PATTERN) { - // If we are a pattern grid we can just set the slot - grid.getCraftingMatrix().setInventorySlotContents(i, possibilities.length == 0 ? ItemStack.EMPTY : possibilities[0]); - } - } - } + API.instance().getCraftingGridBehavior().onRecipeTransfer(this, player, recipe); } public void clearMatrix() { @@ -469,7 +377,7 @@ public class GridNetworkNode extends NetworkNode implements IGridNetworkAware, I ItemStack slot = matrix.getStackInSlot(i); if (!slot.isEmpty()) { - matrix.setInventorySlotContents(i, StackUtils.nullToEmpty(network.insertItem(slot, slot.getCount(), Action.PERFORM))); + matrix.setInventorySlotContents(i, network.insertItem(slot, slot.getCount(), Action.PERFORM)); network.getItemStorageTracker().changed(player, slot.copy()); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java index c1f23832a..d53369d89 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java @@ -88,7 +88,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable, if (item.getItem() == Items.FIREWORK_ROCKET && !drop) { ItemStack took = network.extractItem(item, 1, Action.PERFORM); - if (took != null) { + if (!took.isEmpty()) { world.addEntity(new FireworkRocketEntity(world, getDispensePositionX(), getDispensePositionY(), getDispensePositionZ(), took)); } } else { @@ -164,7 +164,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable, ItemStack took = network.extractItem(item, 1, compare, Action.SIMULATE); - if (took != null) { + if (!took.isEmpty()) { BlockState state = FilterSlot.getBlockState(world, front, took); // TODO if (state != null && world.isAirBlock(front) && state.getBlock().canPlaceBlockAt(world, front)) { @@ -177,7 +177,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable, took = network.extractItem(item, 1, compare, Action.PERFORM); - if (took != null) { + if (!took.isEmpty()) { if (item.getItem() instanceof BlockItem) { /*((BlockItem) item.getItem()).tryPlace(new BlockItemUseContext( took, @@ -242,7 +242,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable, private void dropItem() { ItemStack took = network.extractItem(itemFilters.getStackInSlot(0), upgrades.getItemInteractCount(), Action.PERFORM); - if (took != null) { + if (!took.isEmpty()) { DefaultDispenseItemBehavior.doDispense(world, took, 6, getDirection(), new Position(getDispensePositionX(), getDispensePositionY(), getDispensePositionZ())); } else if (upgrades.hasUpgrade(UpgradeItem.Type.CRAFTING)) { ItemStack craft = itemFilters.getStackInSlot(0); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java index cb4ee87af..24c99c60a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java @@ -105,7 +105,7 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I if (entity instanceof ItemEntity) { ItemStack droppedItem = ((ItemEntity) entity).getItem(); - if (IWhitelistBlacklist.acceptsItem(itemFilters, mode, compare, droppedItem) && network.insertItem(droppedItem, droppedItem.getCount(), Action.SIMULATE) == null) { + if (IWhitelistBlacklist.acceptsItem(itemFilters, mode, compare, droppedItem) && network.insertItem(droppedItem, droppedItem.getCount(), Action.SIMULATE).isEmpty()) { network.insertItemTracked(droppedItem.copy(), droppedItem.getCount()); // TODO world.removeEntity(entity); @@ -148,7 +148,7 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I }*/ for (ItemStack drop : drops) { - if (network.insertItem(drop, drop.getCount(), Action.SIMULATE) != null) { + if (!network.insertItem(drop, drop.getCount(), Action.SIMULATE).isEmpty()) { return; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java index 3a40e5eb3..0e8854802 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java @@ -79,16 +79,14 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy ItemStack took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, Action.SIMULATE); - if (took == null) { + if (took.isEmpty()) { if (upgrades.hasUpgrade(UpgradeItem.Type.CRAFTING)) { network.getCraftingManager().request(new SlottedCraftingRequest(this, filterSlot), slot, stackSize); } } else if (ItemHandlerHelper.insertItem(handler, took, true).isEmpty()) { took = network.extractItem(slot, Math.min(slot.getMaxStackSize(), stackSize), compare, Action.PERFORM); - if (took != null) { - ItemHandlerHelper.insertItem(handler, took, false); - } + ItemHandlerHelper.insertItem(handler, took, false); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java index 9176c35c1..b48f42836 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java @@ -86,12 +86,10 @@ public class NetworkNodeImporter extends NetworkNode implements IComparable, IWh } else if (ticks % upgrades.getSpeed() == 0) { ItemStack result = handler.extractItem(currentSlot, upgrades.getItemInteractCount(), true); - if (!result.isEmpty() && network.insertItem(result, result.getCount(), Action.SIMULATE) == null) { + if (!result.isEmpty() && network.insertItem(result, result.getCount(), Action.SIMULATE).isEmpty()) { result = handler.extractItem(currentSlot, upgrades.getItemInteractCount(), false); - if (!result.isEmpty()) { - network.insertItemTracked(result, result.getCount()); - } + network.insertItemTracked(result, result.getCount()); } else { currentSlot++; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java index b6086e8bb..9cb164dbb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java @@ -72,13 +72,9 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { ItemStack remainder = network.insertItemTracked(slot, size); - if (remainder == null) { - importItems.extractItem(currentSlot, size, false); - } else if (size - remainder.getCount() > 0) { - importItems.extractItem(currentSlot, size - remainder.getCount(), false); + importItems.extractItem(currentSlot, size - remainder.getCount(), false); - currentSlot++; - } + currentSlot++; } for (int i = 0; i < 9; ++i) { @@ -87,10 +83,10 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { if (wanted.isEmpty()) { if (!got.isEmpty()) { - exportItems.setStackInSlot(i, StackUtils.nullToEmpty(network.insertItemTracked(got, got.getCount()))); + exportItems.setStackInSlot(i, network.insertItemTracked(got, got.getCount())); } } else if (!got.isEmpty() && !API.instance().getComparer().isEqual(wanted, got, getCompare())) { - exportItems.setStackInSlot(i, StackUtils.nullToEmpty(network.insertItemTracked(got, got.getCount()))); + exportItems.setStackInSlot(i, network.insertItemTracked(got, got.getCount())); } else { int delta = got.isEmpty() ? wanted.getCount() : (wanted.getCount() - got.getCount()); @@ -108,7 +104,7 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { return !(s instanceof ItemExternalStorage) || !((ItemExternalStorage) s).isConnectedToInterface(); }); - if (result != null) { + if (!result.isEmpty()) { if (exportItems.getStackInSlot(i).isEmpty()) { exportItems.setStackInSlot(i, result); } else { @@ -118,7 +114,7 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { // Example: our delta is 5, we extracted 3 items. // That means we still have to autocraft 2 items. - delta -= result == null ? 0 : result.getCount(); + delta -= result.isEmpty() ? 0 : result.getCount(); if (delta > 0 && upgrades.hasUpgrade(UpgradeItem.Type.CRAFTING)) { network.getCraftingManager().request(new SlottedCraftingRequest(this, i), wanted, delta); @@ -126,11 +122,7 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { } else if (delta < 0) { ItemStack remainder = network.insertItemTracked(got, Math.abs(delta)); - if (remainder == null) { - exportItems.extractItem(i, Math.abs(delta), false); - } else { - exportItems.extractItem(i, Math.abs(delta) - remainder.getCount(), false); - } + exportItems.extractItem(i, Math.abs(delta) - remainder.getCount(), false); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java index b3989ebd8..a04f47f1f 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java @@ -88,7 +88,7 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl ItemStack toInsert = player.inventory.getStackInSlot(i); if (API.instance().getComparer().isEqual(inserted, toInsert, compare)) { - player.inventory.setInventorySlotContents(i, StackUtils.nullToEmpty(network.insertItemTracked(toInsert, toInsert.getCount()))); + player.inventory.setInventorySlotContents(i, network.insertItemTracked(toInsert, toInsert.getCount())); } } } @@ -108,7 +108,7 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl ItemStack filter = itemFilter.getStackInSlot(0); if (!filter.isEmpty() && API.instance().getComparer().isEqual(filter, toInsert, compare)) { - player.inventory.setInventorySlotContents(player.inventory.currentItem, StackUtils.nullToEmpty(network.insertItemTracked(toInsert, toInsert.getCount()))); + player.inventory.setInventorySlotContents(player.inventory.currentItem, network.insertItemTracked(toInsert, toInsert.getCount())); deposits.put(player.getGameProfile().getName(), Pair.of(toInsert, System.currentTimeMillis())); } @@ -132,10 +132,8 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl if (!filter.isEmpty()) { ItemStack result = network.extractItem(filter, toExtract, compare, Action.PERFORM); - if (result != null) { - if (!player.inventory.addItemStackToInventory(result.copy())) { - InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), result); - } + if (!result.isEmpty() && !player.inventory.addItemStackToInventory(result.copy())) { + InventoryHelper.spawnItemStack(world, player.getPosition().getX(), player.getPosition().getY(), player.getPosition().getZ(), result); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java index 50058c679..93e91c290 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java @@ -187,7 +187,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } ItemStack remainder = network.insertItem(extracted, extracted.getCount(), Action.PERFORM); - if (remainder == null) { + if (remainder.isEmpty()) { break; } @@ -222,7 +222,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } ItemStack remainder = network.insertItem(extracted, extracted.getCount(), Action.SIMULATE); - if (remainder == null) { //An item could be inserted (no remainders when trying to). This disk isn't done. + if (remainder.isEmpty()) { // An item could be inserted (no remainders when trying to). This disk isn't done. return false; } } @@ -230,7 +230,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } private void extractItemFromNetwork(IStorageDisk storage, int slot) { - ItemStack extracted = null; + ItemStack extracted = ItemStack.EMPTY; int i = 0; if (itemFilters.isEmpty()) { @@ -260,16 +260,14 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } } - if (extracted == null) { + if (extracted.isEmpty()) { moveDriveToOutput(slot); return; } ItemStack remainder = storage.insert(extracted, extracted.getCount(), Action.PERFORM); - if (!remainder.isEmpty()) { - network.insertItem(remainder, remainder.getCount(), Action.PERFORM); - } + network.insertItem(remainder, remainder.getCount(), Action.PERFORM); } private void insertFluidIntoNetwork(IStorageDisk storage, int slot) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/PatternItem.java b/src/main/java/com/raoulvdberge/refinedstorage/item/PatternItem.java index 28e0aa2a7..a1bc6691a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/PatternItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/PatternItem.java @@ -120,20 +120,15 @@ public class PatternItem extends Item implements ICraftingPatternProvider { pattern.getTag().put(String.format(NBT_INPUT_SLOT, slot), stack.serializeNBT()); } - @Nullable + @Nonnull public static ItemStack getInputSlot(ItemStack pattern, int slot) { String id = String.format(NBT_INPUT_SLOT, slot); if (!pattern.hasTag() || !pattern.getTag().contains(id)) { - return null; + return ItemStack.EMPTY; } - ItemStack stack = ItemStack.read(pattern.getTag().getCompound(id)); - if (stack.isEmpty()) { - return null; - } - - return stack; + return ItemStack.read(pattern.getTag().getCompound(id)); } public static void setOutputSlot(ItemStack pattern, int slot, ItemStack stack) { @@ -144,20 +139,15 @@ public class PatternItem extends Item implements ICraftingPatternProvider { pattern.getTag().put(String.format(NBT_OUTPUT_SLOT, slot), stack.serializeNBT()); } - @Nullable + @Nonnull public static ItemStack getOutputSlot(ItemStack pattern, int slot) { String id = String.format(NBT_OUTPUT_SLOT, slot); if (!pattern.hasTag() || !pattern.getTag().contains(id)) { - return null; + return ItemStack.EMPTY; } - ItemStack stack = ItemStack.read(pattern.getTag().getCompound(id)); - if (stack.isEmpty()) { - return null; - } - - return stack; + return ItemStack.read(pattern.getTag().getCompound(id)); } public static void setFluidInputSlot(ItemStack pattern, int slot, FluidStack stack) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/ControllerTile.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/ControllerTile.java index a58669bfe..6c51ad795 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/ControllerTile.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/ControllerTile.java @@ -292,8 +292,13 @@ public class ControllerTile extends BaseTile implements ITickableTileEntity, INe } @Override + @Nonnull public ItemStack insertItem(@Nonnull ItemStack stack, int size, Action action) { - if (stack.isEmpty() || itemStorage.getStorages().isEmpty()) { + if (stack.isEmpty()) { + return stack; + } + + if (itemStorage.getStorages().isEmpty()) { return ItemHandlerHelper.copyStackWithSize(stack, size); } @@ -340,16 +345,16 @@ public class ControllerTile extends BaseTile implements ITickableTileEntity, INe itemStorage.add(stack, inserted - insertedExternally, false, false); } - // TODO Remove. - if (remainder.isEmpty()) { - remainder = null; - } - return remainder; } @Override + @Nonnull public ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, Action action, Predicate> filter) { + if (stack.isEmpty()) { + return stack; + } + int requested = size; int received = 0; @@ -390,11 +395,6 @@ public class ControllerTile extends BaseTile implements ITickableTileEntity, INe itemStorage.remove(newStack, newStack.getCount() - extractedExternally, false); } - // TODO Remove. - if (newStack.isEmpty()) { - newStack = null; - } - return newStack; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java index 7cb35a34a..ec24c6193 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java @@ -150,15 +150,6 @@ public final class StackUtils { return new FluidGridStack(id, stack, entry, craftable, displayCraftText); } - public static ItemStack nullToEmpty(@Nullable ItemStack stack) { - return stack == null ? ItemStack.EMPTY : stack; - } - - @Nullable - public static ItemStack emptyToNull(@Nonnull ItemStack stack) { - return stack.isEmpty() ? null : stack; - } - @SuppressWarnings("unchecked") public static void createStorages(ServerWorld world, ItemStack diskStack, int slot, IStorageDisk[] itemDisks, IStorageDisk[] fluidDisks, Function, IStorageDisk> itemDiskWrapper, Function, IStorageDisk> fluidDiskWrapper) { if (diskStack.isEmpty()) {