Give Items to a Container

RegisteredServiceProvider<VContainerAPI> provider =
        Bukkit.getServicesManager().getRegistration(VContainerAPI.class);
if (provider == null) return;

VContainerAPI api = provider.getProvider();
api.addItem(player, new ItemStack(Material.DIAMOND, 16));

Withdraw by UUID

ItemStack template = new ItemStack(Material.GOLD_INGOT);
int removed = api.takeItem(targetUuid, template, 32);

Read and Count Stored Items

int totalDiamonds = api.getItems(player).stream()
    .filter(item -> item.getType() == Material.DIAMOND)
    .mapToInt(ItemStack::getAmount)
    .sum();

Open Another Player's Container

RegisteredServiceProvider<VContainerAPI> provider =
        Bukkit.getServicesManager().getRegistration(VContainerAPI.class);
if (provider == null) return;

VContainerAPI api = provider.getProvider();
api.openContainer(staffPlayer, targetPlayer.getUniqueId(), targetPlayer.getName());

Create a Personal Storage Block

Block block = player.getTargetBlockExact(6);
if (block != null && api.canPlacePersonalStorageBlock(block, player)) {
    boolean created = api.createPersonalStorageBlock(block, player);
    if (created) {
        player.sendMessage("Storage block created.");
    }
}

Give a Personal Storage Block Item

RegisteredServiceProvider<VContainerAPI> provider =
        Bukkit.getServicesManager().getRegistration(VContainerAPI.class);
if (provider == null) return;

VContainerAPI api = provider.getProvider();
ItemStack storageBlockItem = api.createPersonalStorageBlockItem(1);
player.getInventory().addItem(storageBlockItem);

Inspect a Storage Block

api.getStorageBlock(block).ifPresent(info -> {
    Bukkit.getLogger().info("Key: " + info.key());
    Bukkit.getLogger().info("Type: " + info.type());
    Bukkit.getLogger().info("Owner: " + info.ownerName());
    Bukkit.getLogger().info("Members: " + info.members().size());
});

Manage Storage Block Members

String storageKey = api.getStorageBlockKey(block);
if (storageKey == null) return;

UUID memberId = memberPlayer.getUniqueId();
boolean added = api.addStorageBlockMember(storageKey, memberId);

if (added && api.canAccessStorageBlock(memberPlayer, storageKey)) {
    memberPlayer.sendMessage("You can now access this storage block.");
}

Flush Pending Container Changes

// Useful after a batch import, reward migration, or maintenance task.
for (Player online : Bukkit.getOnlinePlayers()) {
    api.addItem(online, new ItemStack(Material.EMERALD, 8));
}

api.flush();

Normal saves still happen automatically, but flush() is useful after code-driven batch changes that should be persisted immediately.

API Events

@EventHandler
public void onContainerAdd(ContainerAddItemEvent event) {
    if (event.getItem().getType() == Material.BEDROCK) {
        event.setCancelled(true);
    }
}
@EventHandler
public void onContainerWithdraw(ContainerWithdrawItemEvent event) {
    Bukkit.getLogger().info("Player container " + event.getOwnerId()
            + " requested " + event.getRequestedAmount()
            + " of " + event.getItem().getType());
}
@EventHandler
public void onHopperTransfer(StorageBlockHopperTransferEvent event) {
    if (event.getDirection() == StorageBlockHopperTransferEvent.Direction.OUT_OF_CONTAINER
            && event.getItem().getType() == Material.NETHER_STAR) {
        event.setCancelled(true);
    }
}

The API includes ContainerAddItemEvent, ContainerWithdrawItemEvent, and StorageBlockHopperTransferEvent.