/
FragmentedInventory.java
147 lines (115 loc) · 3.67 KB
/
FragmentedInventory.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package slimeknights.tmechworks.common.inventory;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import slimeknights.mantle.tileentity.MantleTileEntity;
import java.util.function.Predicate;
public class FragmentedInventory implements IInventory {
private final IInventory parent;
private final int startSlot;
private int size;
private boolean overrideStackLimit;
private int stackLimit = 64;
private Predicate<ItemStack> validItems = itemStack -> true;
public FragmentedInventory(IInventory parent, int startSlot, int size) {
this.parent = parent;
this.startSlot = startSlot;
this.size = size;
}
@Override
public int getSizeInventory() {
return size;
}
@Override
public boolean isEmpty() {
for (int i = 0; i < getSizeInventory(); i++) {
if (!getStackInSlot(i).isEmpty()) {
return false;
}
}
return true;
}
@Override
public ItemStack getStackInSlot(int slot) {
if (!isSlotInInventory(slot))
return ItemStack.EMPTY;
return parent.getStackInSlot(getSlot(slot));
}
@Override
public ItemStack decrStackSize(int slot, int count) {
if (!isSlotInInventory(slot))
return ItemStack.EMPTY;
return parent.decrStackSize(getSlot(slot), count);
}
@Override
public ItemStack removeStackFromSlot(int slot) {
if (!isSlotInInventory(slot))
return ItemStack.EMPTY;
return parent.removeStackFromSlot(getSlot(slot));
}
@Override
public void setInventorySlotContents(int slot, ItemStack itemStack) {
if (isSlotInInventory(slot))
parent.setInventorySlotContents(getSlot(slot), itemStack);
}
public int getSlot(int slot){
return slot + startSlot;
}
@Override
public void markDirty() {
parent.markDirty();
}
/**
* Only works with mantle tile entity as the parent
*/
public void markDirtyFast() {
if (parent instanceof MantleTileEntity)
((MantleTileEntity) parent).markDirtyFast();
}
@Override
public boolean isUsableByPlayer(PlayerEntity playerEntity) {
return parent.isUsableByPlayer(playerEntity);
}
@Override
public void clear() {
for (int slot = 0; slot < getSizeInventory(); slot++) {
setInventorySlotContents(slot, ItemStack.EMPTY);
}
}
@Override
public int getInventoryStackLimit() {
if(overrideStackLimit)
return stackLimit;
return parent.getInventoryStackLimit();
}
public FragmentedInventory overrideStackLimit(int stackLimit) {
this.overrideStackLimit = true;
this.stackLimit = stackLimit;
return this;
}
public FragmentedInventory setValidItemsPredicate(Predicate<ItemStack> validItemsPredicate) {
validItems = validItemsPredicate;
return this;
}
@Override
public void openInventory(PlayerEntity player) {
parent.openInventory(player);
}
@Override
public void closeInventory(PlayerEntity player) {
parent.closeInventory(player);
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack itemStack) {
return validItems.test(itemStack) && parent.isItemValidForSlot(getSlot(slot), itemStack);
}
public boolean isSlotInInventory(int i) {
return i >= 0 && i < size && i + startSlot < parent.getSizeInventory();
}
public void resize(int newSize){
size = newSize;
}
public int getStartSlot() {
return startSlot;
}
}