/* * CraftBook Copyright (C) 2010-2017 sk89q <http://www.sk89q.com> * CraftBook Copyright (C) 2011-2017 me4502 <http://www.me4502.com> * CraftBook Copyright (C) Contributors * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public * License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program. If not, * see <http://www.gnu.org/licenses/>. */ package com.sk89q.craftbook.sponge.mechanics.blockbags; import com.google.common.collect.Lists; import org.spongepowered.api.data.DataContainer; import org.spongepowered.api.data.DataQuery; import org.spongepowered.api.data.DataSerializable; import org.spongepowered.api.data.DataView; import org.spongepowered.api.data.MemoryDataContainer; import org.spongepowered.api.data.Queries; import org.spongepowered.api.data.persistence.AbstractDataBuilder; import org.spongepowered.api.data.persistence.InvalidDataException; import org.spongepowered.api.item.inventory.ItemStack; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Optional; public class EmbeddedBlockBag implements DataSerializable, BlockBag { private List<ItemStack> itemStacks; public EmbeddedBlockBag() { super(); itemStacks = new ArrayList<>(); } @Override public boolean has(List<ItemStack> itemStacks) { List<ItemStack> testList = new ArrayList<>(itemStacks); Iterator<ItemStack> testIterator = testList.iterator(); while (testIterator.hasNext()) { ItemStack testStack = testIterator.next(); for (ItemStack itemStack : this.itemStacks) { if (itemStack.getItem() == testStack.getItem()) { int newQuantity = testStack.getQuantity(); newQuantity -= itemStack.getQuantity(); if (newQuantity > 0) { testStack.setQuantity(newQuantity); } else { testIterator.remove(); } } } } return testList.isEmpty(); } @Override public List<ItemStack> add(List<ItemStack> itemStacks) { for (ItemStack itemStack : itemStacks) { itemAdd: { for (ItemStack existingStack : this.itemStacks) { if (itemStack.getItem() == existingStack.getItem()) { existingStack.setQuantity(existingStack.getQuantity() + itemStack.getQuantity()); break itemAdd; } } this.itemStacks.add(itemStack); } } return Lists.newArrayList(); } @Override public List<ItemStack> remove(List<ItemStack> itemStacks) { List<ItemStack> unremovable = new ArrayList<>(itemStacks); Iterator<ItemStack> itemIterator = unremovable.iterator(); while (itemIterator.hasNext()) { ItemStack itemStack = itemIterator.next(); int newQuantity = itemStack.getQuantity(); Iterator<ItemStack> existingIterator = this.itemStacks.iterator(); while (existingIterator.hasNext()) { ItemStack existingStack = existingIterator.next(); if (itemStack.getItem() == existingStack.getItem()) { int numToRemove = Math.min(existingStack.getQuantity(), newQuantity); newQuantity -= numToRemove; if (existingStack.getQuantity() - numToRemove <= 0) { existingIterator.remove(); } else { existingStack.setQuantity(existingStack.getQuantity() - numToRemove); } } } if (newQuantity <= 0) { itemIterator.remove(); } else { itemStack.setQuantity(newQuantity); } } return unremovable; } @Override public int getContentVersion() { return 1; } @Override public DataContainer toContainer() { return new MemoryDataContainer() .set(Queries.CONTENT_VERSION, getContentVersion()) .set(DataQuery.of("Items"), itemStacks); } public static class EmbeddedBlockBagBuilder extends AbstractDataBuilder<EmbeddedBlockBag> { public EmbeddedBlockBagBuilder() { super(EmbeddedBlockBag.class, 1); } @Override protected Optional<EmbeddedBlockBag> buildContent(DataView container) throws InvalidDataException { EmbeddedBlockBag embeddedBlockBag = new EmbeddedBlockBag(); embeddedBlockBag.itemStacks = container.getSerializableList(DataQuery.of("Items"), ItemStack.class).orElse(Lists.newArrayList()); return Optional.of(embeddedBlockBag); } } }