33import org .bukkit .inventory .ItemStack ;
44import org .jspecify .annotations .Nullable ;
55import xyz .xenondevs .invui .Click ;
6+ import xyz .xenondevs .invui .internal .util .ArrayUtils ;
67import xyz .xenondevs .invui .inventory .event .InventoryClickEvent ;
78import xyz .xenondevs .invui .inventory .event .ItemPostUpdateEvent ;
89import xyz .xenondevs .invui .inventory .event .ItemPreUpdateEvent ;
910import xyz .xenondevs .invui .inventory .event .UpdateReason ;
1011import xyz .xenondevs .invui .window .AbstractWindow ;
1112
12- import java .util .ArrayList ;
13- import java .util .BitSet ;
1413import java .util .List ;
15- import java .util .function .BiConsumer ;
1614import java .util .function .Consumer ;
1715import 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 */
2221public 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 ;
0 commit comments