diff --git a/src/main/java/org/terasology/economy/handler/MultiInvStorageHandler.java b/src/main/java/org/terasology/economy/handler/MultiInvStorageHandler.java index f838c14..2ad954b 100644 --- a/src/main/java/org/terasology/economy/handler/MultiInvStorageHandler.java +++ b/src/main/java/org/terasology/economy/handler/MultiInvStorageHandler.java @@ -41,15 +41,14 @@ @RegisterSystem(RegisterMode.AUTHORITY) public class MultiInvStorageHandler extends BaseComponentSystem implements StorageComponentHandler { + private static final Logger logger = LoggerFactory.getLogger(MultiInvStorageHandler.class); + @In private AssetManager assetManager; @In private EntityManager entityManager; - @In - private BlockCommands blockCommands; - @In private BlockManager blockManager; @@ -57,7 +56,7 @@ public class MultiInvStorageHandler extends BaseComponentSystem implements Stora private InventoryManager inventoryManager; private BlockItemFactory blockItemFactory; - private Logger logger = LoggerFactory.getLogger(MultiInvStorageHandler.class); + private ResourceUrn blockItemBase; @Override @@ -73,55 +72,56 @@ public void postBegin() { @Override public int store(MultiInvStorageComponent multiInvStorageComponent, String resource, int amount) { EntityRef item = getItemEntity(resource); - byte byteAmount; + if (item == EntityRef.NULL) { return amount; } - - - - for (EntityRef entityRef : multiInvStorageComponent.chests) { - int amountForChest = getItemCapacityForChest(entityRef, item); - amountForChest = (amountForChest > amount) ? amount : amountForChest; + int remaining = amount; + for (EntityRef chest : multiInvStorageComponent.chests) { + final int amountForChest = Math.min(getItemCapacityForChest(chest, item), amount); + final byte byteAmount; if (amountForChest >= Byte.MAX_VALUE) { byteAmount = Byte.MAX_VALUE; } else { byteAmount = (byte) amountForChest; } + ItemComponent itemComponent = item.getComponent(ItemComponent.class); itemComponent.stackCount = byteAmount; item.saveComponent(itemComponent); - inventoryManager.giveItem(entityRef, EntityRef.NULL, item); - amount -= amountForChest; - if (amount == 0) { + inventoryManager.giveItem(chest, EntityRef.NULL, item); + + remaining -= byteAmount; + + if (remaining <= 0) { return 0; } } - return amount; - + return remaining; } @Override public int draw(MultiInvStorageComponent multiInvStorageComponent, String resource, int amount) { EntityRef item = getItemEntity(resource); - for (EntityRef entityRef : multiInvStorageComponent.chests) { - int amountForChest = getItemCountForChest(entityRef, item); + int remaining = amount; + for (EntityRef chest : multiInvStorageComponent.chests) { + int amountForChest = getItemCountForChest(chest, item); while (amountForChest != 0) { - int slot = getSlotWithItem(entityRef, item); + int slot = getSlotWithItem(chest, item); if (slot == -1) { break; } - int amountForSlot = InventoryUtils.getStackCount(InventoryUtils.getItemAt(entityRef, slot)); - if (inventoryManager.removeItem(entityRef, EntityRef.NULL, slot, true, amountForSlot) != null) { - amount -= amountForSlot; + int amountForSlot = InventoryUtils.getStackCount(InventoryUtils.getItemAt(chest, slot)); + if (inventoryManager.removeItem(chest, EntityRef.NULL, slot, true, amountForSlot) != null) { + remaining -= amountForSlot; } } } - return amount; + return remaining; } @Override @@ -137,13 +137,8 @@ public int availableResourceAmount(MultiInvStorageComponent multiInvStorageCompo @Override public Set availableResourceTypes(MultiInvStorageComponent multiInvStorageComponent) { Set result = new HashSet<>(); - int amount = 0; for (EntityRef entityRef : multiInvStorageComponent.chests) { - for (String resource : getResourceTypesOfInventory(entityRef)) { - if (!result.contains(resource)) { - result.add(resource); - } - } + result.addAll(getResourceTypesOfInventory(entityRef)); } return result; } @@ -256,7 +251,7 @@ private Set getResourceTypesOfInventory(EntityRef entity) { if (!entity.exists() || !entity.isActive()) { return set; } - for(EntityRef item : inventoryComponent.itemSlots) { + for (EntityRef item : inventoryComponent.itemSlots) { ItemComponent itemComponent = item.getComponent(ItemComponent.class); if (itemComponent != null && !set.contains(itemComponent.stackId)) { ResourceUrn uri = item.getParentPrefab().getUrn();