VCONTAINER API
Examples
Small Java snippets for adding items, opening containers, working with storage blocks, managing members, flushing data, and reacting to API events.
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.