use of mekanism.api.inventory.IInventorySlot in project Mekanism by mekanism.
the class ItemRecipeData method applyToStack.
@Override
public boolean applyToStack(ItemStack stack) {
if (slots.isEmpty()) {
return true;
}
Item item = stack.getItem();
boolean isBin = item instanceof ItemBlockBin;
Optional<IItemHandler> capability = stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).resolve();
List<IInventorySlot> slots = new ArrayList<>();
if (capability.isPresent()) {
IItemHandler itemHandler = capability.get();
for (int i = 0; i < itemHandler.getSlots(); i++) {
int slot = i;
slots.add(new DummyInventorySlot(itemHandler.getSlotLimit(slot), itemStack -> itemHandler.isItemValid(slot, itemStack), isBin));
}
} else if (item instanceof BlockItem) {
TileEntityMekanism tile = getTileFromBlock(((BlockItem) item).getBlock());
if (tile == null || !tile.persistInventory()) {
// Something went wrong
return false;
}
for (int i = 0; i < tile.getSlots(); i++) {
int slot = i;
slots.add(new DummyInventorySlot(tile.getSlotLimit(slot), itemStack -> tile.isItemValid(slot, itemStack), isBin));
}
} else if (item instanceof ItemRobit) {
// Inventory slots
for (int slotY = 0; slotY < 3; slotY++) {
for (int slotX = 0; slotX < 9; slotX++) {
slots.add(new DummyInventorySlot(BasicInventorySlot.DEFAULT_LIMIT, BasicInventorySlot.alwaysTrue, false));
}
}
// Energy slot
slots.add(new DummyInventorySlot(BasicInventorySlot.DEFAULT_LIMIT, itemStack -> {
if (EnergyCompatUtils.hasStrictEnergyHandler(itemStack)) {
return true;
}
ItemStackToEnergyRecipe foundRecipe = MekanismRecipeType.ENERGY_CONVERSION.getInputCache().findTypeBasedRecipe(null, itemStack);
return foundRecipe != null && !foundRecipe.getOutput(itemStack).isZero();
}, false));
// Smelting input slot
slots.add(new DummyInventorySlot(BasicInventorySlot.DEFAULT_LIMIT, itemStack -> MekanismRecipeType.SMELTING.getInputCache().containsInput(null, itemStack), false));
// Smelting output slot
slots.add(new DummyInventorySlot(BasicInventorySlot.DEFAULT_LIMIT, BasicInventorySlot.alwaysTrue, false));
} else if (item instanceof ISustainedInventory) {
// Fallback just save it all
for (IInventorySlot slot : this.slots) {
if (!slot.isEmpty()) {
// We have no information about what our item supports, but we have at least some stacks we want to transfer
((ISustainedInventory) stack.getItem()).setInventory(DataHandlerUtils.writeContainers(this.slots), stack);
return true;
}
}
return true;
} else {
return false;
}
if (slots.isEmpty()) {
// We don't actually have any tanks in the output
return true;
}
// TODO: Improve the logic so that it maybe tries multiple different slot combinations
IMekanismInventory outputHandler = new IMekanismInventory() {
@Nonnull
@Override
public List<IInventorySlot> getInventorySlots(@Nullable Direction side) {
return slots;
}
@Override
public void onContentsChanged() {
}
};
boolean hasData = false;
for (IInventorySlot slot : this.slots) {
if (!slot.isEmpty()) {
if (!ItemHandlerHelper.insertItemStacked(outputHandler, slot.getStack(), false).isEmpty()) {
// If we have a remainder something failed so bail
return false;
}
hasData = true;
}
}
if (hasData) {
// We managed to transfer it all into valid slots, so save it to the stack
((ISustainedInventory) stack.getItem()).setInventory(DataHandlerUtils.writeContainers(slots), stack);
}
return true;
}
use of mekanism.api.inventory.IInventorySlot in project Mekanism by mekanism.
the class MekanismUtils method redstoneLevelFromContents.
/**
* Calculates the redstone level based on the percentage of amount stored. Like {@link net.minecraftforge.items.ItemHandlerHelper#calcRedstoneFromInventory(IItemHandler)}
* except without limiting slots to the max stack size of the item to allow for better support for bins
*
* @return A redstone level based on the percentage of the amount stored.
*/
public static int redstoneLevelFromContents(List<IInventorySlot> slots) {
long totalCount = 0;
long totalLimit = 0;
for (IInventorySlot slot : slots) {
if (slot.isEmpty()) {
totalLimit += slot.getLimit(ItemStack.EMPTY);
} else {
totalCount += slot.getCount();
totalLimit += slot.getLimit(slot.getStack());
}
}
return redstoneLevelFromContents(totalCount, totalLimit);
}
use of mekanism.api.inventory.IInventorySlot in project Mekanism by mekanism.
the class StackUtils method merge.
public static void merge(@Nonnull List<IInventorySlot> orig, @Nonnull List<IInventorySlot> toAdd) {
for (int i = 0; i < toAdd.size(); i++) {
IInventorySlot toAddSlot = toAdd.get(i);
if (!toAddSlot.isEmpty()) {
IInventorySlot origSlot = orig.get(i);
origSlot.setStack(merge(origSlot.getStack(), toAddSlot.getStack()));
}
}
}
use of mekanism.api.inventory.IInventorySlot in project Mekanism by mekanism.
the class PortableQIODashboardInventory method getInitialInventory.
@Override
protected List<IInventorySlot> getInitialInventory() {
List<IInventorySlot> slots = new ArrayList<>();
craftingWindows = new QIOCraftingWindow[MAX_CRAFTING_WINDOWS];
for (byte tableIndex = 0; tableIndex < craftingWindows.length; tableIndex++) {
QIOCraftingWindow craftingWindow = new QIOCraftingWindow(this, tableIndex);
craftingWindows[tableIndex] = craftingWindow;
for (int slot = 0; slot < 9; slot++) {
slots.add(craftingWindow.getInputSlot(slot));
}
slots.add(craftingWindow.getOutputSlot());
}
return slots;
}
use of mekanism.api.inventory.IInventorySlot in project Mekanism by mekanism.
the class GuiMekanismTile method getFromSlot.
private DataType getFromSlot(Slot slot) {
if (slot.index < tile.getSlots() && slot instanceof InventoryContainerSlot) {
ISideConfiguration config = (ISideConfiguration) tile;
ConfigInfo info = config.getConfig().getConfig(TransmissionType.ITEM);
if (info != null) {
Set<DataType> supportedDataTypes = info.getSupportedDataTypes();
IInventorySlot inventorySlot = ((InventoryContainerSlot) slot).getInventorySlot();
for (DataType type : supportedDataTypes) {
ISlotInfo slotInfo = info.getSlotInfo(type);
if (slotInfo instanceof InventorySlotInfo && ((InventorySlotInfo) slotInfo).hasSlot(inventorySlot)) {
return type;
}
}
}
}
return null;
}
Aggregations