InventoryUtils.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package me.km.inventory;
  2. import net.minecraft.entity.passive.EntityVillager;
  3. import net.minecraft.inventory.IInventory;
  4. import net.minecraft.inventory.InventoryBasic;
  5. import net.minecraft.item.Item;
  6. import net.minecraft.item.ItemStack;
  7. public class InventoryUtils
  8. {
  9. public static InventoryBasic getInventory(EntityVillager v)
  10. {
  11. InventoryBase real = new InventoryBase("Villager", 9, v);
  12. InventoryBasic old = v.getVillagerInventory();
  13. for(int i = 0; i < 9; i++)
  14. {
  15. real.setInventorySlotContents(i, old.getStackInSlot(i).copy());
  16. }
  17. return real;
  18. }
  19. public static void setInventory(InventoryBase inv)
  20. {
  21. if(inv.getOwner() instanceof EntityVillager)
  22. {
  23. EntityVillager v = (EntityVillager) inv.getOwner();
  24. InventoryBasic vInv = v.getVillagerInventory();
  25. for(int i = 0; i < 8; i++)
  26. {
  27. vInv.setInventorySlotContents(i, inv.getStackInSlot(i).copy());
  28. }
  29. }
  30. }
  31. public static int searchInventoryFor(IInventory inv, ItemStack searchfor, boolean useData)
  32. {
  33. if(searchfor.isEmpty())
  34. {
  35. return 0;
  36. }
  37. int counter = 0;
  38. if(useData)
  39. {
  40. int size = inv.getSizeInventory();
  41. ItemStack stack;
  42. for(int i = 0; i < size; i++)
  43. {
  44. stack = inv.getStackInSlot(i);
  45. if(stackEqualExact(stack, searchfor))
  46. {
  47. counter += stack.getCount();
  48. }
  49. }
  50. }
  51. else
  52. {
  53. int size = inv.getSizeInventory();
  54. Item item = searchfor.getItem();
  55. ItemStack stack;
  56. for(int i = 0; i < size; i++)
  57. {
  58. stack = inv.getStackInSlot(i);
  59. if(stack.getItem() == item)
  60. {
  61. counter += stack.getCount();
  62. }
  63. }
  64. }
  65. return counter;
  66. }
  67. public static int removeFromInventory(IInventory inv, ItemStack remove)
  68. {
  69. if(remove.isEmpty())
  70. {
  71. return 0;
  72. }
  73. ItemStack stack;
  74. int sub;
  75. int amount = remove.getCount();
  76. for(int i = 0; i < inv.getSizeInventory(); i++)
  77. {
  78. stack = inv.getStackInSlot(i);
  79. if(stackEqualExact(stack, remove))
  80. {
  81. sub = stack.getCount();
  82. if(amount > sub)
  83. {
  84. amount -= sub;
  85. inv.setInventorySlotContents(i, ItemStack.EMPTY);
  86. }
  87. else if(amount == sub)
  88. {
  89. inv.setInventorySlotContents(i, ItemStack.EMPTY);
  90. return 0;
  91. }
  92. else
  93. {
  94. stack.setCount(sub - amount);
  95. return 0;
  96. }
  97. }
  98. }
  99. return amount;
  100. }
  101. public static int addToInventory(IInventory inv, ItemStack add)
  102. {
  103. if(add.isEmpty())
  104. {
  105. return 0;
  106. }
  107. else
  108. {
  109. if(add.isItemDamaged())
  110. {
  111. int j = getFirstEmptyStack(inv);
  112. if(j >= 0)
  113. {
  114. inv.setInventorySlotContents(j, add.copy());
  115. inv.getStackInSlot(j).setAnimationsToGo(5);
  116. return 0;
  117. }
  118. return add.getCount();
  119. }
  120. else
  121. {
  122. ItemStack copy = add.copy();
  123. int i;
  124. while(true)
  125. {
  126. i = copy.getCount();
  127. copy.setCount(storePartialItemStack(inv, copy));
  128. if(copy.isEmpty() || copy.getCount() >= i)
  129. {
  130. break;
  131. }
  132. }
  133. return copy.getCount();
  134. }
  135. }
  136. }
  137. private static int storePartialItemStack(IInventory inv, ItemStack add)
  138. {
  139. int i = add.getCount();
  140. int j = storeItemStack(inv, add);
  141. if(j == -1)
  142. {
  143. j = getFirstEmptyStack(inv);
  144. }
  145. if (j == -1)
  146. {
  147. return i;
  148. }
  149. ItemStack stack = inv.getStackInSlot(j);
  150. if(stack.isEmpty())
  151. {
  152. stack = add.copy();
  153. stack.setCount(0);
  154. if(add.hasTagCompound())
  155. {
  156. stack.setTagCompound(add.getTagCompound().copy());
  157. }
  158. inv.setInventorySlotContents(j, stack);
  159. }
  160. int k = i;
  161. if(i > stack.getMaxStackSize() - stack.getCount())
  162. {
  163. k = stack.getMaxStackSize() - stack.getCount();
  164. }
  165. if(k > inv.getInventoryStackLimit() - stack.getCount())
  166. {
  167. k = inv.getInventoryStackLimit() - stack.getCount();
  168. }
  169. if(k == 0)
  170. {
  171. return i;
  172. }
  173. else
  174. {
  175. i -= k;
  176. stack.grow(k);
  177. stack.setAnimationsToGo(5);
  178. return i;
  179. }
  180. }
  181. private static int storeItemStack(IInventory inv, ItemStack add)
  182. {
  183. for (int i = 0; i < inv.getSizeInventory(); i++)
  184. {
  185. if(canMergeStacks(inv, inv.getStackInSlot(i), add))
  186. {
  187. return i;
  188. }
  189. }
  190. return -1;
  191. }
  192. private static boolean canMergeStacks(IInventory inv, ItemStack first, ItemStack sec)
  193. {
  194. return !first.isEmpty() && stackEqualExact(first, sec) && first.isStackable() && first.getCount() < first.getMaxStackSize() && first.getCount() < inv.getInventoryStackLimit();
  195. }
  196. public static boolean stackEqualExact(ItemStack first, ItemStack sec)
  197. {
  198. return first.getItem() == sec.getItem() && (!first.getHasSubtypes() || first.getMetadata() == sec.getMetadata()) && ItemStack.areItemStackTagsEqual(first, sec);
  199. }
  200. public static int getFirstEmptyStack(IInventory inv)
  201. {
  202. for(int i = 0; i < inv.getSizeInventory(); i++)
  203. {
  204. if(inv.getStackInSlot(i).isEmpty())
  205. {
  206. return i;
  207. }
  208. }
  209. return -1;
  210. }
  211. }