/** * Returns whether a block has a valid ID. * * @param type * @return */ @Override public boolean isValidBlockType(int type) { return MaterialData.getBlock((short) type) != null; }
/** * Store a block. * * @param item */ @Override public void storeItem(BaseItem item) throws BlockBagException { final int id = item.getType(); final int damage = item.getDamage(); int amount = (item instanceof BaseItemStack) ? ((BaseItemStack) item).getAmount() : 1; assert (amount <= 64); boolean usesDamageValue = ItemType.usesDamageValue(id); if (id == BlockID.AIR) { throw new IllegalArgumentException("Can't store air block"); } loadInventory(); int freeSlot = -1; for (int slot = 0; slot < items.length; ++slot) { ItemStack bukkitItem = items[slot]; if (bukkitItem == null) { // Delay using up a free slot until we know there are no stacks // of this item to merge into if (freeSlot == -1) { freeSlot = slot; } continue; } if (bukkitItem.getMaterial().getId() != id) { // Type id doesn't fit continue; } if (usesDamageValue && bukkitItem.getDamage() != damage) { // Damage value doesn't fit. continue; } int currentAmount = bukkitItem.getAmount(); if (currentAmount < 0) { // Unlimited return; } if (currentAmount >= 64) { // Full stack continue; } int spaceLeft = 64 - currentAmount; if (spaceLeft >= amount) { bukkitItem.setAmount(currentAmount + amount); return; } bukkitItem.setAmount(64); amount -= spaceLeft; } if (freeSlot > -1) { items[freeSlot] = new ItemStack(MaterialData.getMaterial((short) id), amount); return; } throw new OutOfSpaceException(id); }