Skip to content

Commit 0ef6cc0

Browse files
Fix ObscuredInventory not mapping iteration order slots
1 parent 0625001 commit 0ef6cc0

3 files changed

Lines changed: 26 additions & 19 deletions

File tree

invui/src/main/java/xyz/xenondevs/invui/internal/util/ArrayUtils.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,17 @@ public static <T> SequencedSet<T> toSequencedSet(T[] array) {
130130
return set;
131131
}
132132

133+
/**
134+
* Creates a new int array of the given size, filled with the given value.
135+
*
136+
* @param size the size of the array
137+
* @param value the value to fill the array with
138+
* @return a new int array of the given size, filled with the given value
139+
*/
140+
public static int[] newIntArray(int size, int value) {
141+
int[] array = new int[size];
142+
Arrays.fill(array, value);
143+
return array;
144+
}
145+
133146
}

invui/src/main/java/xyz/xenondevs/invui/inventory/ObscuredInventory.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,26 @@
33
import org.bukkit.inventory.ItemStack;
44
import org.jspecify.annotations.Nullable;
55
import xyz.xenondevs.invui.Click;
6+
import xyz.xenondevs.invui.internal.util.ArrayUtils;
67
import xyz.xenondevs.invui.inventory.event.InventoryClickEvent;
78
import xyz.xenondevs.invui.inventory.event.ItemPostUpdateEvent;
89
import xyz.xenondevs.invui.inventory.event.ItemPreUpdateEvent;
910
import xyz.xenondevs.invui.inventory.event.UpdateReason;
1011
import xyz.xenondevs.invui.window.AbstractWindow;
1112

12-
import java.util.ArrayList;
13-
import java.util.BitSet;
1413
import java.util.List;
15-
import java.util.function.BiConsumer;
1614
import java.util.function.Consumer;
1715
import java.util.function.IntPredicate;
16+
import java.util.stream.IntStream;
1817

1918
/**
2019
* An {@link Inventory} that delegates to another {@link Inventory} while hiding certain slots.
2120
*/
2221
public final class ObscuredInventory extends Inventory {
2322

2423
private final Inventory inventory;
25-
private final BitSet mask;
26-
private final int[] slots;
24+
private final int[] slots; // this slot -> delegate slot
25+
private final int[] inverseSlots; // delegate slot -> this slot
2726

2827
/**
2928
* Constructs a new {@link ObscuredInventory}.
@@ -34,18 +33,13 @@ public final class ObscuredInventory extends Inventory {
3433
public ObscuredInventory(Inventory inventory, IntPredicate isObscured) {
3534
super(calculateSize(inventory, isObscured));
3635
this.inventory = inventory;
37-
this.mask = new BitSet(inventory.getSize());
38-
39-
ArrayList<Integer> slots = new ArrayList<>();
40-
for (int slot = 0; slot < inventory.getSize(); slot++) {
41-
if (isObscured.test(slot))
42-
continue;
43-
44-
mask.set(slot);
45-
slots.add(slot);
36+
this.slots = IntStream.range(0, inventory.getSize())
37+
.filter(slot -> !isObscured.test(slot))
38+
.toArray();
39+
this.inverseSlots = ArrayUtils.newIntArray(inventory.getSize(), -1);
40+
for (int i = 0; i < this.slots.length; i++) {
41+
inverseSlots[this.slots[i]] = i;
4642
}
47-
48-
this.slots = slots.stream().mapToInt(Integer::intValue).toArray();
4943
}
5044

5145
private static int calculateSize(Inventory inventory, IntPredicate isObscured) {
@@ -62,8 +56,8 @@ public int[] getIterationOrder() {
6256
int[] iterationOrder = new int[slots.length];
6357
int i = 0;
6458
for (int slot : inventory.getIterationOrder()) {
65-
if (mask.get(slot)) {
66-
iterationOrder[i++] = slot;
59+
if (slot < inverseSlots.length && inverseSlots[slot] != -1) {
60+
iterationOrder[i++] = inverseSlots[slot];
6761
}
6862
}
6963
return iterationOrder;

invui/src/test/java/xyz/xenondevs/invui/inventory/ObscuredInventoryTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public void testIterationOrder() {
2525
inv.setIterationOrder(new int[] {4, 3, 0, 1, 2});
2626

2727
var obscured = new ObscuredInventory(inv, i -> i % 2 == 0);
28-
assertArrayEquals(new int[] {3, 1}, obscured.getIterationOrder());
28+
assertArrayEquals(new int[] {1, 0}, obscured.getIterationOrder());
2929
}
3030

3131
}

0 commit comments

Comments
 (0)