Advertisement
Guest User

Untitled

a guest
Aug 7th, 2014
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.85 KB | None | 0 0
  1. package eu.th3game.chestkeeper;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.ListIterator;
  7. import java.util.Map;
  8.  
  9. import org.apache.commons.lang.Validate;
  10. import org.bukkit.Material;
  11. import org.bukkit.craftbukkit.inventory.InventoryIterator;
  12. import org.bukkit.entity.HumanEntity;
  13. import org.bukkit.event.inventory.InventoryType;
  14. import org.bukkit.inventory.Inventory;
  15. import org.bukkit.inventory.InventoryHolder;
  16. import org.bukkit.inventory.ItemStack;
  17.  
  18.  
  19. public class MyInventory implements Inventory {
  20.    
  21.     private Map <Integer, ItemStack> inventory;
  22.     private final String name;
  23.     private final int size;
  24.     private final String title;
  25.    
  26.     public MyInventory(String name, int size, String title) {
  27.         Validate.isTrue(size > 0 && size <= 54, "Size out of bounds");
  28.         Validate.isTrue(size % 9 == 0, "Size is not a multiple of 9");
  29.        
  30.         this.name = name;
  31.         this.size = size;
  32.         this.title = title;
  33.         this.inventory = new HashMap<Integer, ItemStack>();
  34.     }
  35.  
  36.     private int firstPartial(Material material) {
  37.         Validate.notNull(material, "Material cannot be null");
  38.        
  39.         ItemStack[] inventory = getContents();
  40.         for (int i = 0; i < inventory.length; i++) {
  41.             ItemStack item = inventory[i];
  42.             if (item != null && item.getType() == material && item.getAmount() < item.getMaxStackSize()) {
  43.                 return i;
  44.             }
  45.         }
  46.         return -1;
  47.     }
  48.    
  49.     private int firstPartial(ItemStack item) {
  50.         ItemStack[] inventory = getContents();
  51.  
  52.         if (item == null) {
  53.             return -1;
  54.         }
  55.         for (int i = 0; i < inventory.length; i++) {
  56.             ItemStack cItem = inventory[i];
  57.             if (cItem != null && cItem.getAmount() < cItem.getMaxStackSize() && cItem.isSimilar(item)) {
  58.                 return i;
  59.             }
  60.         }
  61.         return -1;
  62.     }
  63.  
  64.     @Override
  65.     public HashMap<Integer, ItemStack> addItem(ItemStack... items) {
  66.         Validate.noNullElements(items, "Item cannot be null");
  67.         HashMap<Integer, ItemStack> leftover = new HashMap<Integer, ItemStack>();
  68.  
  69.         ItemStack[] inv = getContents();
  70.         for (int i = 0; i < inv.length; i++) {
  71.             ItemStack item = inv[i];
  72.             while (true) {
  73.                 // Do we already have a stack of it?
  74.                 int firstPartial = firstPartial(item);
  75.  
  76.                 // Drat! no partial stack
  77.                 if (firstPartial == -1) {
  78.                     // Find a free spot!
  79.                     int firstFree = firstEmpty();
  80.  
  81.                     if (firstFree == -1) {
  82.                         // No space at all!
  83.                         leftover.put(i, item);
  84.                         break;
  85.                     } else {
  86.                         // More than a single stack!
  87.                         if (item.getAmount() > getMaxStackSize()) {
  88.                             ItemStack stack = new ItemStack(item);
  89.                             stack.setAmount(getMaxStackSize());
  90.                             setItem(firstFree, stack);
  91.                             item.setAmount(item.getAmount() - getMaxStackSize());
  92.                         } else {
  93.                             // Just store it
  94.                             setItem(firstFree, item);
  95.                             break;
  96.                         }
  97.                     }
  98.                 } else {
  99.                     // So, apparently it might only partially fit, well lets do just that
  100.                     ItemStack partialItem = getItem(firstPartial);
  101.  
  102.                     int amount = item.getAmount();
  103.                     int partialAmount = partialItem.getAmount();
  104.                     int maxAmount = partialItem.getMaxStackSize();
  105.  
  106.                     // Check if it fully fits
  107.                     if (amount + partialAmount <= maxAmount) {
  108.                         partialItem.setAmount(amount + partialAmount);
  109.                         break;
  110.                     }
  111.  
  112.                     // It fits partially
  113.                     partialItem.setAmount(maxAmount);
  114.                     item.setAmount(amount + partialAmount - maxAmount);
  115.                 }
  116.             }
  117.         }
  118.         return leftover;
  119.     }
  120.  
  121.     @Deprecated
  122.     @Override
  123.     public HashMap<Integer, ItemStack> all(int materialId) {
  124.         return all(Material.getMaterial(materialId));
  125.     }
  126.  
  127.     @Override
  128.     public HashMap<Integer, ItemStack> all(Material material) {
  129.         Validate.notNull(material, "Material cannot be null");
  130.         HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
  131.  
  132.         ItemStack[] inventory = getContents();
  133.         for (int i = 0; i < inventory.length; i++) {
  134.             ItemStack item = inventory[i];
  135.             if (item != null && item.getType() == material) {
  136.                 slots.put(i, item);
  137.             }
  138.         }
  139.         return slots;
  140.     }
  141.  
  142.     @Override
  143.     public HashMap<Integer, ItemStack> all(ItemStack item) {
  144.         HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
  145.         if (item != null) {
  146.             ItemStack[] inventory = getContents();
  147.             for (int i = 0; i < inventory.length; i++) {
  148.                 if (item.equals(inventory[i])) {
  149.                     slots.put(i, inventory[i]);
  150.                 }
  151.             }
  152.         }
  153.         return slots;
  154.     }
  155.  
  156.     @Override
  157.     public void clear() {
  158.         inventory.clear();
  159.     }
  160.  
  161.     @Override
  162.     public void clear(int index) {
  163.         inventory.put(index, null);
  164.     }
  165.  
  166.     @Deprecated
  167.     @Override
  168.     public boolean contains(int materialId) {
  169.         return contains(Material.getMaterial(materialId));
  170.     }
  171.  
  172.     @Override
  173.     public boolean contains(Material material) throws IllegalArgumentException {
  174.         if (material == null) {
  175.             throw new IllegalArgumentException("Material cannot be null");
  176.         }
  177.        
  178.         for (ItemStack item : getContents()) {
  179.             if (item != null && item.getType() == material) {
  180.                 return true;
  181.             }
  182.         }
  183.         return false;
  184.     }
  185.  
  186.     @Override
  187.     public boolean contains(ItemStack item) {
  188.         Validate.notNull(item, "Item cannot be null");
  189.        
  190.         for (ItemStack i : getContents()) {
  191.             if (item.equals(i)) {
  192.                 return true;
  193.             }
  194.         }
  195.         return false;
  196.     }
  197.  
  198.     @Deprecated
  199.     @Override
  200.     public boolean contains(int materialId, int amount) {
  201.         return contains(Material.getMaterial(materialId), amount);
  202.     }
  203.  
  204.     @Override
  205.     public boolean contains(Material material, int amount) throws IllegalArgumentException {
  206.         Validate.notNull(material, "Material cannot be null");
  207.        
  208.         if (amount <= 0) {
  209.             return true;
  210.         }
  211.        
  212.         for (ItemStack item : getContents()) {
  213.             if (item != null && item.getType() == material) {
  214.                 if ((amount -= item.getAmount()) <= 0)
  215.                 {
  216.                     return true;
  217.                 }
  218.             }
  219.         }
  220.         return false;
  221.     }
  222.  
  223.     @Override
  224.     public boolean contains(ItemStack item, int amount) {
  225.         Validate.notNull(item, "Item cannot be null");
  226.        
  227.         if (amount <= 0) {
  228.             return true;
  229.         }
  230.        
  231.         for (ItemStack i : getContents()) {
  232.             if (item.equals(i) && --amount <= 0) {
  233.                 return true;
  234.             }
  235.         }
  236.         return false;
  237.     }
  238.  
  239.     @Override
  240.     public boolean containsAtLeast(ItemStack item, int amount) {
  241.         return contains(item.getType(), amount);
  242.     }
  243.  
  244.     @Deprecated
  245.     @Override
  246.     public int first(int materialId) {
  247.         return first(Material.getMaterial(materialId));
  248.     }
  249.  
  250.     @Override
  251.     public int first(Material material) throws IllegalArgumentException {
  252.         Validate.notNull(material, "Material cannot be null");
  253.        
  254.         ItemStack[] inventory = getContents();
  255.         for (int i = 0; i < inventory.length; i++) {
  256.             if (inventory[i] != null && inventory[i].getType() == material) {
  257.                 return i;
  258.             }
  259.         }
  260.         return -1;
  261.     }
  262.    
  263.     @Override
  264.     public int first(ItemStack item) {
  265.         return first(item, true);
  266.     }
  267.  
  268.     private int first(ItemStack item, boolean withAmount) {
  269.         Validate.notNull(item, "Item cannot be null");
  270.        
  271.         ItemStack[] inventory = getContents();
  272.         for (int i = 0; i < inventory.length; i++) {
  273.             ItemStack eitem = inventory[i];
  274.             if (eitem != null && (withAmount ? item.equals(eitem) : item.isSimilar(eitem))) {
  275.                 return i;
  276.             }
  277.         }
  278.         return -1;
  279.     }
  280.  
  281.     @Override
  282.     public int firstEmpty() {
  283.         ItemStack[] inventory = getContents();
  284.         for (int i = 0; i < inventory.length; i++) {
  285.             ItemStack item = inventory[i];
  286.             if (item == null) {
  287.                 return i;
  288.             }
  289.         }
  290.         return -1;
  291.     }
  292.  
  293.     @Override
  294.     public ItemStack[] getContents() {
  295.         ItemStack[] inv = new ItemStack[getSize()];
  296.        
  297.         for (Map.Entry<Integer, ItemStack> item : inventory.entrySet())
  298.         {
  299.             inv[item.getKey()] = item.getValue();
  300.         }
  301.        
  302.         return inv;
  303.     }
  304.  
  305.     @Override
  306.     public InventoryHolder getHolder() {
  307.         return new InventoryHolder() {
  308.             private Inventory inventory;
  309.            
  310.             @Override
  311.             public Inventory getInventory()
  312.             {
  313.                 return inventory;
  314.             }
  315.            
  316.             private InventoryHolder init(Inventory inventory)
  317.             {
  318.                 this.inventory = inventory;
  319.                 return this;
  320.             }
  321.         }.init((Inventory) this);
  322.     }
  323.  
  324.     @Override
  325.     public ItemStack getItem(int index) {
  326.         return inventory.get(index);
  327.     }
  328.  
  329.     @Override
  330.     public String getName() {
  331.         return name;
  332.     }
  333.  
  334.     @Override
  335.     public int getSize() {
  336.         return size;
  337.     }
  338.  
  339.     @Override
  340.     public String getTitle() {
  341.         return title;
  342.     }
  343.  
  344.     @Override
  345.     public InventoryType getType() {
  346.         return InventoryType.CHEST;
  347.     }
  348.  
  349.     @Override
  350.     public List<HumanEntity> getViewers() {
  351.         return new ArrayList<HumanEntity>();
  352.     }
  353.  
  354.     @Override
  355.     public ListIterator<ItemStack> iterator() {
  356.         return iterator(0);
  357.     }
  358.  
  359.     @Override
  360.     public ListIterator<ItemStack> iterator(int index) {
  361.         return new InventoryIterator(this, index);
  362.     }
  363.  
  364.     @Deprecated
  365.     @Override
  366.     public void remove(int materialId) {
  367.         remove(Material.getMaterial(materialId));
  368.     }
  369.  
  370.     @Override
  371.     public void remove(Material material) throws IllegalArgumentException {
  372.         Validate.notNull(material, "Material cannot be null");
  373.        
  374.         ItemStack[] inv = getContents();
  375.         for (int i = 0; i < inv.length; i++) {
  376.             ItemStack item = inv[i];
  377.             if (item != null && item.getType() == material) {
  378.                 clear(i);
  379.             }
  380.         }
  381.     }
  382.  
  383.     @Override
  384.     public void remove(ItemStack item) {
  385.         Validate.notNull(item, "Item cannot be null");
  386.        
  387.         ItemStack[] inv = getContents();
  388.         for (int i = 0; i < inv.length; i++) {
  389.             ItemStack eitem = inv[i];
  390.             if (eitem != null && eitem.equals(item)) {
  391.                 clear(i);
  392.             }
  393.         }
  394.     }
  395.  
  396.     @Override
  397.     public HashMap<Integer, ItemStack> removeItem(ItemStack... items) throws IllegalArgumentException {
  398.         Validate.notNull(items, "Items cannot be null");
  399.         HashMap<Integer, ItemStack> leftover = new HashMap<Integer, ItemStack>();
  400.  
  401.         for (int i = 0; i < items.length; i++) {
  402.             ItemStack item = items[i];
  403.             int toDelete = item.getAmount();
  404.  
  405.             while (true) {
  406.                 int first = first(item, false);
  407.  
  408.                 // Drat! we don't have this type in the inventory
  409.                 if (first == -1) {
  410.                     item.setAmount(toDelete);
  411.                     leftover.put(i, item);
  412.                     break;
  413.                 } else {
  414.                     ItemStack itemStack = getItem(first);
  415.                     int amount = itemStack.getAmount();
  416.  
  417.                     if (amount <= toDelete) {
  418.                         toDelete -= amount;
  419.                         // clear the slot, all used up
  420.                         clear(first);
  421.                     } else {
  422.                         // split the stack and store
  423.                         itemStack.setAmount(amount - toDelete);
  424.                         setItem(first, itemStack);
  425.                         toDelete = 0;
  426.                     }
  427.                 }
  428.  
  429.                 // Bail when done
  430.                 if (toDelete <= 0) {
  431.                     break;
  432.                 }
  433.             }
  434.         }
  435.         return leftover;
  436.     }
  437.  
  438.     @Override
  439.     public void setContents(ItemStack[] items) throws IllegalArgumentException {
  440.         Validate.notNull(items, "Items cannot be null");
  441.         Validate.isTrue(items.length < getSize(), "Items must be shorter than Inventory.getSize()");
  442.        
  443.         clear();
  444.        
  445.         int length = Math.min(getSize(), items.length);
  446.        
  447.         for (int i = 0; i < length; i++) {
  448.             setItem(i, items[i]);
  449.         }
  450.     }
  451.  
  452.     @Override
  453.     public void setItem(int index, ItemStack item) {
  454.         inventory.put(index, item);
  455.     }
  456.  
  457.     @Override
  458.     public void setMaxStackSize(int size) {}
  459.  
  460.     @Override
  461.     public int getMaxStackSize() {
  462.         return 64;
  463.     }
  464.  
  465. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement