package com.comphenix.xp.rewards.items;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.inventory.ItemStack;
import com.comphenix.xp.rewards.ResourceHolder;
import com.google.common.base.Objects;
public class ItemsHolder implements ResourceHolder {
/**
* Unique enum name of the items resource.
*/
public static final String RESOURCE_NAME = "ITEMS";
private List<ItemStack> rewards;
public ItemsHolder() {
this.rewards = new ArrayList<ItemStack>();
}
public ItemsHolder(List<ItemStack> items) {
this.rewards = items;
}
public ItemsHolder(ItemStack item) {
this();
rewards.add(item);
}
@Override
public int getAmount() {
int count = 0;
// Count the number of items in each stack
for (ItemStack stack : rewards) {
if (stack != null)
count += stack.getAmount();
}
return count;
}
/**
* Get the current list of rewards.
* @return List of rewards.
*/
public List<ItemStack> getRewards() {
return rewards;
}
@Override
public String getName() {
return RESOURCE_NAME;
}
@Override
public ResourceHolder add(ResourceHolder other) {
if (!(other instanceof ItemsHolder))
throw new IllegalArgumentException("Must be of the same type.");
List<ItemStack> combined = new ArrayList<ItemStack>(getRewards());
ItemsHolder otherItems = (ItemsHolder) other;
// Now, merge items correctly
top:
for (ItemStack stack : otherItems.getRewards()) {
// Find the next same item
for (ItemStack existing : combined) {
if (hasSameItem(stack, existing)) {
existing.setAmount(existing.getAmount() + stack.getAmount());
// Exit the current for-loop and skip ahead in the topmost for-loop.
continue top;
}
}
// Just add it to the end
combined.add(stack);
}
return new ItemsHolder(combined);
}
private boolean hasSameItem(ItemStack a, ItemStack b) {
return a.getTypeId() == b.getTypeId() &&
a.getDurability() == b.getDurability() &&
Objects.equal(a.getEnchantments(), b.getEnchantments());
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
for (ItemStack reward : rewards) {
if (reward != null)
result.append(reward.getType().name() + " x " + reward.getAmount());
else
result.append("NULL");
result.append(", ");
}
// Remvoe the last two characters
if (result.length() >= 2) {
result.setLength(result.length() - 2);
}
return result.toString();
}
}