How to manipulate a player's inventory?

Using CustomInventory, here’s what I think you can do

Iterable<Slot> slots = functionToGetSlots();
List<Slot> slotsList = Lists.newArrayList(slots);

CustomInventory inventory = Inventories.customInventoryBuilder()
        .name(someName)
        .size(slotsList.size())
        .build();

for (int i = 0, len = slotsList.size(); i < len; i++) {
    Optional<ItemStack> optStack = slotsList.get(i).peek();
    if (optStack.isPresent()) {
        inventory.set(new SlotIndex(i), optStack.get());
    }
}

Also, looking at my previous post to get all slots, I’m not sure if slots() will return all slots in sub inventories. If not, here’s a recursive function to get all slots:


private Iterable<Slot> getSlots(Inventory inventory) {
    if (inventory instanceof Slot) {
        return Collections.emptyList();
    }
    Iterable<Slot> slots = inventory.slots();
    for (Inventory subInventory : inventory) {
        Iterables.concat(slots, getSlots(subInventory));
    }
    return slots;
}