/* * This file is part of BukkitBridge. * * Copyright (c) 2012 Spout LLC <http://www.spout.org/> * BukkitBridge is licensed under the GNU General Public License. * * BukkitBridge 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. * * BukkitBridge 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 org.spout.bridge.bukkit.inventory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.ListIterator; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.spout.api.inventory.InventoryViewer; import org.spout.bridge.BukkitUtil; import org.spout.vanilla.inventory.window.Window; import org.spout.vanilla.material.VanillaMaterial; import org.spout.vanilla.material.VanillaMaterials; public class BridgeInventory implements Inventory { protected org.spout.api.inventory.Inventory handle; protected final InventoryHolder holder; protected int maxStackSize = 64; protected final String name, title; protected final InventoryType type; public BridgeInventory(org.spout.api.inventory.Inventory handle, InventoryHolder holder, String name, String title, InventoryType type) { this.handle = handle; this.holder = holder; this.name = name; this.title = title; this.type = type; } public org.spout.api.inventory.Inventory getHandle() { return handle; } @Override public int getSize() { return handle.size(); } @Override public int getMaxStackSize() { return maxStackSize; } @Override public void setMaxStackSize(int maxStackSize) { this.maxStackSize = Math.min(maxStackSize, 64); } @Override public String getName() { return name; } @Override public ItemStack getItem(int i) { return BukkitUtil.fromItemStack(handle.get(i)); } @Override public void setItem(int i, ItemStack itemStack) { handle.set(i, BukkitUtil.toItemStack(itemStack)); } @Override public HashMap<Integer, ItemStack> addItem(ItemStack... itemStacks) { HashMap<Integer, ItemStack> map = new HashMap<Integer, ItemStack>(); for (ItemStack item : itemStacks) { org.spout.api.inventory.ItemStack i = BukkitUtil.toItemStack(item); handle.add(i); if (!handle.contains(i)) { map.put(item.getAmount(), item); } } return map; } @Override public HashMap<Integer, ItemStack> removeItem(ItemStack... itemStacks) { HashMap<Integer, ItemStack> map = new HashMap<Integer, ItemStack>(); for (ItemStack item : itemStacks) { org.spout.api.inventory.ItemStack i = BukkitUtil.toItemStack(item); handle.remove(i); if (handle.contains(i)) { map.put(item.getAmount(), item); } } return map; } @Override public ItemStack[] getContents() { org.spout.api.inventory.ItemStack[] contents = handle.toArray(new org.spout.api.inventory.ItemStack[handle.size()]); ItemStack[] newContents = new ItemStack[getSize()]; for (int i = 0; i < newContents.length; i++) { newContents[i] = BukkitUtil.fromItemStack(contents[i]); } return newContents; } @Override public void setContents(ItemStack[] contents) { org.spout.api.inventory.ItemStack[] newContents = new org.spout.api.inventory.ItemStack[contents.length]; for (int i = 0; i < contents.length; i++) { newContents[i] = BukkitUtil.toItemStack(contents[i]); } handle = new org.spout.api.inventory.Inventory(newContents); } @Override public boolean contains(int typeId) { return handle.contains(VanillaMaterials.getMaterial((short) typeId)); } @Override public boolean contains(Material material) { return contains(material.getId()); } @Override public boolean contains(ItemStack itemStack) { return handle.contains(BukkitUtil.toItemStack(itemStack)); } @Override public boolean contains(int typeId, int amount) { return handle.contains(VanillaMaterials.getMaterial((short) typeId), amount); } @Override public boolean contains(Material material, int amount) { return contains(material.getId(), amount); } @Override public boolean contains(ItemStack itemStack, int amount) { itemStack.setAmount(amount); return handle.contains(itemStack); } @Override public boolean containsAtLeast(ItemStack itemStack, int i) { return false; } @Override public HashMap<Integer, ? extends ItemStack> all(int typeId) { HashMap<Integer, ItemStack> map = new HashMap<Integer, ItemStack>(); for (int i = 0; i < handle.size(); i++) { org.spout.api.inventory.ItemStack item = handle.get(i); if (item.getMaterial() instanceof VanillaMaterial && ((VanillaMaterial) item.getMaterial()).getMinecraftId() == typeId) { map.put(i, BukkitUtil.fromItemStack(item)); } } return map; } @Override public HashMap<Integer, ? extends ItemStack> all(Material material) { return all(material.getId()); } @Override public HashMap<Integer, ? extends ItemStack> all(ItemStack itemStack) { HashMap<Integer, ItemStack> map = new HashMap<Integer, ItemStack>(); for (int i = 0; i < handle.size(); i++) { org.spout.api.inventory.ItemStack item = handle.get(i); if (item.equals(BukkitUtil.toItemStack(itemStack))) { map.put(i, BukkitUtil.fromItemStack(item)); } } return map; } @Override public int first(int typeId) { return handle.indexOf(VanillaMaterials.getMaterial((short) typeId)); } @Override public int first(Material material) { return first(material.getId()); } @Override public int first(ItemStack itemStack) { return handle.indexOf(BukkitUtil.toItemStack(itemStack)); } @Override public int firstEmpty() { for (int i = 0; i < handle.size(); i++) { if (handle.get(i) == null) { return i; } } return -1; } @Override public void remove(int typeId) { for (int i = 0; i < handle.size(); i++) { org.spout.api.inventory.ItemStack item = handle.get(i); if (item.getMaterial() instanceof VanillaMaterial && ((VanillaMaterial) item.getMaterial()).getMinecraftId() == typeId) { handle.remove(i); } } } @Override public void remove(Material material) { remove(material.getId()); } @Override public void remove(ItemStack itemStack) { for (int i = 0; i < handle.size(); i++) { org.spout.api.inventory.ItemStack item = handle.get(i); if (item.equals(BukkitUtil.toItemStack(itemStack))) { handle.remove(i); } } } @Override public void clear(int slot) { handle.remove(slot); } @Override public void clear() { handle.clear(); } @Override public List<HumanEntity> getViewers() { List<HumanEntity> humans = new ArrayList<HumanEntity>(); for (InventoryViewer viewer : handle.getViewers()) { if (viewer instanceof Window) { humans.add(Bukkit.getPlayer(((Window) viewer).getPlayer().getName())); } } return humans; } @Override public String getTitle() { return title; } @Override public InventoryType getType() { return type; } @Override public InventoryHolder getHolder() { return holder; } @Override public ListIterator<ItemStack> iterator() { return iterator(0); } @Override public ListIterator<ItemStack> iterator(int i) { List<ItemStack> items = new ArrayList<ItemStack>(); for (org.spout.api.inventory.ItemStack item : handle) { items.add(BukkitUtil.fromItemStack(item)); } return items.listIterator(i); } }