InventoryUtils.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package me.km.inventory;
  2. import net.minecraft.inventory.IInventory;
  3. import net.minecraft.item.Item;
  4. import net.minecraft.item.ItemStack;
  5. public class InventoryUtils {
  6. public static int searchInventoryFor(IInventory inv, ItemStack searchfor, boolean useData) {
  7. if(searchfor.isEmpty()) {
  8. return 0;
  9. }
  10. int counter = 0;
  11. if(useData) {
  12. int size = inv.getContainerSize();
  13. ItemStack stack;
  14. for(int i = 0; i < size; i++) {
  15. stack = inv.getItem(i);
  16. if(stackEqualExact(stack, searchfor)) {
  17. counter += stack.getCount();
  18. }
  19. }
  20. } else {
  21. int size = inv.getContainerSize();
  22. Item item = searchfor.getItem();
  23. ItemStack stack;
  24. for(int i = 0; i < size; i++) {
  25. stack = inv.getItem(i);
  26. if(stack.getItem() == item) {
  27. counter += stack.getCount();
  28. }
  29. }
  30. }
  31. return counter;
  32. }
  33. public static int removeFromInventory(IInventory inv, ItemStack remove) {
  34. if(remove.isEmpty()) {
  35. return 0;
  36. }
  37. ItemStack stack;
  38. int sub;
  39. int amount = remove.getCount();
  40. for(int i = 0; i < inv.getContainerSize(); i++) {
  41. stack = inv.getItem(i);
  42. if(stackEqualExact(stack, remove)) {
  43. sub = stack.getCount();
  44. if(amount > sub) {
  45. amount -= sub;
  46. inv.setItem(i, ItemStack.EMPTY);
  47. } else if(amount == sub) {
  48. inv.setItem(i, ItemStack.EMPTY);
  49. return 0;
  50. } else {
  51. stack.setCount(sub - amount);
  52. return 0;
  53. }
  54. }
  55. }
  56. return amount;
  57. }
  58. public static int addToInventory(IInventory inv, ItemStack add) {
  59. if(add.isEmpty()) {
  60. return 0;
  61. } else {
  62. if(add.isDamaged()) {
  63. int j = getFirstEmptyStack(inv);
  64. if(j >= 0) {
  65. inv.setItem(j, add.copy());
  66. inv.getItem(j).setPopTime(5);
  67. return 0;
  68. }
  69. return add.getCount();
  70. } else {
  71. ItemStack copy = add.copy();
  72. int i;
  73. while(true) {
  74. i = copy.getCount();
  75. copy.setCount(storePartialItemStack(inv, copy));
  76. if(copy.isEmpty() || copy.getCount() >= i) {
  77. break;
  78. }
  79. }
  80. return copy.getCount();
  81. }
  82. }
  83. }
  84. private static int storePartialItemStack(IInventory inv, ItemStack add) {
  85. int i = add.getCount();
  86. int j = storeItemStack(inv, add);
  87. if(j == -1) {
  88. j = getFirstEmptyStack(inv);
  89. }
  90. if(j == -1) {
  91. return i;
  92. }
  93. ItemStack stack = inv.getItem(j);
  94. if(stack.isEmpty()) {
  95. stack = add.copy();
  96. stack.setCount(0);
  97. if(add.hasTag()) {
  98. stack.setTag(add.getTag().copy());
  99. }
  100. inv.setItem(j, stack);
  101. }
  102. int k = i;
  103. if(i > stack.getMaxStackSize() - stack.getCount()) {
  104. k = stack.getMaxStackSize() - stack.getCount();
  105. }
  106. if(k > inv.getMaxStackSize() - stack.getCount()) {
  107. k = inv.getMaxStackSize() - stack.getCount();
  108. }
  109. if(k == 0) {
  110. return i;
  111. } else {
  112. i -= k;
  113. stack.grow(k);
  114. stack.setPopTime(5);
  115. return i;
  116. }
  117. }
  118. private static int storeItemStack(IInventory inv, ItemStack add) {
  119. for(int i = 0; i < inv.getContainerSize(); i++) {
  120. if(canMergeStacks(inv, inv.getItem(i), add)) {
  121. return i;
  122. }
  123. }
  124. return -1;
  125. }
  126. private static boolean canMergeStacks(IInventory inv, ItemStack first, ItemStack sec) {
  127. return !first.isEmpty() && stackEqualExact(first, sec) && first.isStackable()
  128. && first.getCount() < first.getMaxStackSize()
  129. && first.getCount() < inv.getMaxStackSize();
  130. }
  131. public static boolean stackEqualExact(ItemStack first, ItemStack sec) {
  132. return first.getItem() == sec.getItem() && ItemStack.tagMatches(first, sec);
  133. }
  134. public static int getFirstEmptyStack(IInventory inv) {
  135. for(int i = 0; i < inv.getContainerSize(); i++) {
  136. if(inv.getItem(i).isEmpty()) {
  137. return i;
  138. }
  139. }
  140. return -1;
  141. }
  142. }