123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- package me.km.inventory;
- import net.minecraft.inventory.IInventory;
- import net.minecraft.item.Item;
- import net.minecraft.item.ItemStack;
- public class InventoryUtils {
- public static int searchInventoryFor(IInventory inv, ItemStack searchfor, boolean useData) {
- if(searchfor.isEmpty()) {
- return 0;
- }
- int counter = 0;
- if(useData) {
- int size = inv.getContainerSize();
- ItemStack stack;
- for(int i = 0; i < size; i++) {
- stack = inv.getItem(i);
- if(stackEqualExact(stack, searchfor)) {
- counter += stack.getCount();
- }
- }
- } else {
- int size = inv.getContainerSize();
- Item item = searchfor.getItem();
- ItemStack stack;
- for(int i = 0; i < size; i++) {
- stack = inv.getItem(i);
- if(stack.getItem() == item) {
- counter += stack.getCount();
- }
- }
- }
- return counter;
- }
- public static int removeFromInventory(IInventory inv, ItemStack remove) {
- if(remove.isEmpty()) {
- return 0;
- }
- ItemStack stack;
- int sub;
- int amount = remove.getCount();
- for(int i = 0; i < inv.getContainerSize(); i++) {
- stack = inv.getItem(i);
- if(stackEqualExact(stack, remove)) {
- sub = stack.getCount();
- if(amount > sub) {
- amount -= sub;
- inv.setItem(i, ItemStack.EMPTY);
- } else if(amount == sub) {
- inv.setItem(i, ItemStack.EMPTY);
- return 0;
- } else {
- stack.setCount(sub - amount);
- return 0;
- }
- }
- }
- return amount;
- }
- public static int addToInventory(IInventory inv, ItemStack add) {
- if(add.isEmpty()) {
- return 0;
- } else {
- if(add.isDamaged()) {
- int j = getFirstEmptyStack(inv);
- if(j >= 0) {
- inv.setItem(j, add.copy());
- inv.getItem(j).setPopTime(5);
- return 0;
- }
- return add.getCount();
- } else {
- ItemStack copy = add.copy();
- int i;
- while(true) {
- i = copy.getCount();
- copy.setCount(storePartialItemStack(inv, copy));
- if(copy.isEmpty() || copy.getCount() >= i) {
- break;
- }
- }
- return copy.getCount();
- }
- }
- }
- private static int storePartialItemStack(IInventory inv, ItemStack add) {
- int i = add.getCount();
- int j = storeItemStack(inv, add);
- if(j == -1) {
- j = getFirstEmptyStack(inv);
- }
- if(j == -1) {
- return i;
- }
- ItemStack stack = inv.getItem(j);
- if(stack.isEmpty()) {
- stack = add.copy();
- stack.setCount(0);
- if(add.hasTag()) {
- stack.setTag(add.getTag().copy());
- }
- inv.setItem(j, stack);
- }
- int k = i;
- if(i > stack.getMaxStackSize() - stack.getCount()) {
- k = stack.getMaxStackSize() - stack.getCount();
- }
- if(k > inv.getMaxStackSize() - stack.getCount()) {
- k = inv.getMaxStackSize() - stack.getCount();
- }
- if(k == 0) {
- return i;
- } else {
- i -= k;
- stack.grow(k);
- stack.setPopTime(5);
- return i;
- }
- }
- private static int storeItemStack(IInventory inv, ItemStack add) {
- for(int i = 0; i < inv.getContainerSize(); i++) {
- if(canMergeStacks(inv, inv.getItem(i), add)) {
- return i;
- }
- }
- return -1;
- }
- private static boolean canMergeStacks(IInventory inv, ItemStack first, ItemStack sec) {
- return !first.isEmpty() && stackEqualExact(first, sec) && first.isStackable()
- && first.getCount() < first.getMaxStackSize()
- && first.getCount() < inv.getMaxStackSize();
- }
- public static boolean stackEqualExact(ItemStack first, ItemStack sec) {
- return first.getItem() == sec.getItem() && ItemStack.tagMatches(first, sec);
- }
- public static int getFirstEmptyStack(IInventory inv) {
- for(int i = 0; i < inv.getContainerSize(); i++) {
- if(inv.getItem(i).isEmpty()) {
- return i;
- }
- }
- return -1;
- }
- }
|