-
Notifications
You must be signed in to change notification settings - Fork 497
/
TransactorItemHandler.java
83 lines (71 loc) · 2.82 KB
/
TransactorItemHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/** Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public License 1.0, or MMPL. Please check the contents
* of the license located in http://www.mod-buildcraft.com/MMPL-1.0.txt */
package buildcraft.core.lib.inventory;
import buildcraft.api.core.IStackFilter;
import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import java.util.ArrayList;
import java.util.List;
public class TransactorItemHandler extends Transactor {
protected IItemHandler handler;
public TransactorItemHandler(IItemHandler handler) {
this.handler = handler;
}
@Override
public int inject(ItemStack stack, boolean doAdd) {
List<Integer> filledSlots = new ArrayList<>(handler.getSlots());
List<Integer> emptySlots = new ArrayList<>(handler.getSlots());
for (int i = 0; i < handler.getSlots(); i++) {
ItemStack simulated = handler.insertItem(i, stack, true);
if (simulated == null || simulated.stackSize < stack.stackSize) {
if (handler.getStackInSlot(i) == null) {
emptySlots.add(i);
} else {
filledSlots.add(i);
}
}
}
int injected = 0;
injected = tryPut(stack, filledSlots, injected, doAdd);
injected = tryPut(stack, emptySlots, injected, doAdd);
return injected;
}
private int tryPut(ItemStack stack, List<Integer> slots, int injected, boolean doAdd) {
int realInjected = injected;
ItemStack toInsert = null;
if (realInjected >= stack.stackSize) {
return realInjected;
}
for (int i : slots) {
if (toInsert == null) {
toInsert = stack.copy();
toInsert.stackSize = stack.stackSize - realInjected;
}
int oldInjected = realInjected;
ItemStack insertedStack = handler.insertItem(i, toInsert, !doAdd);
if (insertedStack == null) {
realInjected += stack.stackSize;
} else {
realInjected += stack.stackSize - insertedStack.stackSize;
}
if (realInjected >= stack.stackSize) {
return realInjected;
} else if (oldInjected != realInjected) {
toInsert = null;
}
}
return realInjected;
}
@Override
public ItemStack remove(IStackFilter filter, boolean doRemove) {
for (int i = 0; i < handler.getSlots(); i++) {
ItemStack stack = handler.getStackInSlot(i);
if (stack != null && filter.matches(stack)) {
return handler.extractItem(i, 1, !doRemove);
}
}
return null;
}
}