Базовое использование инвентаря

Inventory это базовый интерфейс для инвентарей. Наследуемые от него подинтерфейсы имеют различные специализированные методы для получения/добавления/удаления/выставления/запроса предметов (peek/offer/poll/set/query).

Слоты

Slot это специальный инвентарь вместимостью равной одному. Слоты доступны по индексам, но некоторые инвентари позволяют получать слоты другими способами.

// Returns the slot at a given index
Optional<Slot> slot = inventory.slot(index);
// Returns all the slots in the inventory in order
List<Slot> slots = inventory.slots();
// returns the number of slots in the inventory
int capacity = inventory.capacity();

Получить предметы | peek

 // Returns the first non-empty ItemStack following the order of `slots()`
ItemStack firstStack = inventory.peek();
// Returns the ItemStack at a given index.
// Note that the result is `Optional.empty()` only when the slot does not exist.
// If the slot is empty the stack is `ItemStack.empty()`
Optional<ItemStack> stackAt = inventory.peekAt(index);

// sums total quantity of all stacks in the inventory.
// In combination with a query for a stack this can count the quantity of that stack in the inventory.
int quantity = inventory.totalQuantity();

// checks for an exact match in the inventory.
boolean contains = inventory.contains(stack/type);
// checks for a match ignoring quantity in the inventory.
boolean containsAny = inventory.containsAny(stack);

Добавить предметы | offer

Добавить предметы в инвентарь используя offer методы:

// Adds stacks to the inventory filling it up following the order of `slots()`
InventoryTransactionResult result1 = inventory.offer(stack);
// Adds a stack to the slot at given index.
InventoryTransactionResult result2 = inventory.offer(index, stack);

// Returns whether a `offer(...)` would succeed.
boolean canFit = inventory.canFit(stack);
// Returns the number of empty slots.
// If it is zero `offer(...)` could still succeed if it can stack with an existing stack.
int freeCapacity = inventory.freeCapacity();

// Returns the rejected items if there was not enough space to fit every item.
List<ItemStackSnapshot> rejected = result1.rejectedItems();
// Reverts the transaction
result1.revert();
// InventoryTransactionResults can be combined
InventoryTransactionResult combined = result1.and(result2);
// Reverts the transaction if any of the combined transaction was not successful
combined.revertOnFailure();

Удалить предметы | poll

Удалить предметы из инвентаря используя poll методы:

// Removes the first non-empty (analogous to `peek()`) stack in the inventory
InventoryTransactionResult.Poll result1 = inventory.poll()
// Removes the first non-empty stack in the inventory up the the given limit.
// If the limit is higher than what is in the first empty slot it will continue removing the same item from slots after it up to the limit.
InventoryTransactionResult.Poll result2 = inventory.poll(limit)
// Removes the stack from given index
InventoryTransactionResult.Poll result3 = inventory.pollFrom(index)
// Removes the stack from given index but only up to the given limit
InventoryTransactionResult.Poll result4 = inventory.pollFrom(index, limit)

// Returns the polled item
ItemStackSnapshot polledStack = result1.polledItem();
// InventoryTransactionResults can be combined
InventoryTransactionResult combined = result1.and(result2).and(result3).and(result4);
// Returns the list of polled items - useful when handling combined results
List<ItemStackSnapshot> polledStack = result.polledItems();

Можно заметить, что вы можете комбинировать InventoryTransactionResult и если нужно откатывать его с помощью revert() или revertOnFailure().

Выставление предметов | set

// Sets the content of a single slot at given index replacing the previous item.
inventory.set(index, stack);
// Sets the content of a slot
slot.set(stack);
// Sets all slots to ItemStack.empty()
inventory.clear()

Примечание

Обычно вы можете получить доступ к любым слотам по индексу. Но инвентари из модификаций могут не поддерживать некоторые операции.

Запрос инвентаря | query

Инвентарь может быть доступен не только по индексам.

Например:

PlayerInventory состоит из нескольких частей: PrimaryPlayerInventory (4*9) и EquipmentInventory` (броня + вторая рука)

PrimaryPlayerInventory состоит из Hotbar (1*9) и GridInventory (3*9)

GridInventory состоит из множества InventoryRow и InventoryColumn и т.д.

Имейте в виду, что некоторые из этих реализаций жестко внедрены в код, поэтому могут быть недоступны для модифицированных инвентарей.

Вызов метода #children() дает следующий слой инвентарей в структуре.

Некоторые инвентари предоставляют вспомогательные методы для доступа к часто используемым подинветарям, например PlayerInventory#primary.

Если допустимо, некоторые инвентари предоставляют более специфичные peek/offer/poll/set методы (например GridInventory.peek(x,y)

public static void query() {
    TODO think up some nice query examples
}

Открытие инвентарей

ViewableInventory является подвидом инвентарей которые могут быть открыты игроком. Если это возможно, Sponge отслеживает игроков, которые просматривают инвентарь.

An «open» ViewableInventory is a Container. Usually a container is a view on two inventories:

Т.е. когда открыт сундук вы видите инвентарь сундука и часть PrimaryPlayerInventory из инвентаря игрока.

В События инвентаря, которые включают в себя игрока вы чаще всего встретите именно Container.

// Only ViewableInventory can be opened
Optional<Container> container1 = player.openInventory(inventory);
// Optionally provide a title for the container - not supported for all inventories
Optional<Container> container2 = player.openInventory(inventory, Component.text("My Title"));

Кроме того вы можете воспользоваться Меню инвентаря.

Примечание

Только ViewableInventory может быть просмотрен игроком. Но большинство ванильных инвентарей являются ViewableInventories.