8
8
import xyz .xenondevs .invui .gui .AbstractGui ;
9
9
import xyz .xenondevs .invui .gui .Gui ;
10
10
import xyz .xenondevs .invui .internal .menu .CustomCrafterMenu ;
11
+ import xyz .xenondevs .invui .internal .util .CollectionUtils ;
12
+ import xyz .xenondevs .invui .state .MutableProperty ;
11
13
12
14
import java .util .ArrayList ;
13
15
import java .util .Collections ;
17
19
18
20
final class CrafterWindowImpl extends AbstractSplitWindow <CustomCrafterMenu > implements CrafterWindow {
19
21
22
+ private static final int CRAFTING_SLOTS = 9 ;
23
+
20
24
private final AbstractGui craftingGui ;
21
25
private final AbstractGui resultGui ;
22
26
private final AbstractGui lowerGui ;
27
+ private final List <? extends MutableProperty <Boolean >> slots ;
23
28
private final List <BiConsumer <? super Integer , ? super Boolean >> slotToggleHandlers ;
24
29
25
30
CrafterWindowImpl (
@@ -28,6 +33,7 @@ final class CrafterWindowImpl extends AbstractSplitWindow<CustomCrafterMenu> imp
28
33
AbstractGui craftingGui ,
29
34
AbstractGui resultGui ,
30
35
AbstractGui lowerGui ,
36
+ List <? extends MutableProperty <Boolean >> slots ,
31
37
List <BiConsumer <? super Integer , ? super Boolean >> slotToggleHandlers ,
32
38
boolean closeable
33
39
) {
@@ -40,12 +46,20 @@ final class CrafterWindowImpl extends AbstractSplitWindow<CustomCrafterMenu> imp
40
46
this .craftingGui = craftingGui ;
41
47
this .resultGui = resultGui ;
42
48
this .lowerGui = lowerGui ;
49
+ this .slots = slots ;
43
50
this .slotToggleHandlers = slotToggleHandlers ;
44
-
45
- menu .setSlotStateChangeHandler (this ::handleSlotToggled );
51
+
52
+ for (int i = 0 ; i < CRAFTING_SLOTS ; i ++) {
53
+ int slot = i ;
54
+ MutableProperty <Boolean > property = slots .get (i );
55
+ property .observeWeak (this , thisRef -> thisRef .menu .setSlotDisabled (slot , property .get ()));
56
+ menu .setSlotDisabled (i , property .get ());
57
+ }
58
+ menu .setSlotStateChangeHandler (this ::playerToggleSlot );
46
59
}
47
60
48
- private void handleSlotToggled (int slot , boolean disabled ) {
61
+ private void playerToggleSlot (int slot , boolean disabled ) {
62
+ slots .get (slot ).set (disabled );
49
63
for (var handler : slotToggleHandlers ) {
50
64
handler .accept (slot , disabled );
51
65
}
@@ -54,6 +68,7 @@ private void handleSlotToggled(int slot, boolean disabled) {
54
68
@ Override
55
69
public void setSlotDisabled (int slot , boolean disabled ) {
56
70
menu .setSlotDisabled (slot , disabled );
71
+ slots .get (slot ).set (disabled );
57
72
}
58
73
59
74
@ Override
@@ -96,6 +111,7 @@ static final class BuilderImpl
96
111
private Supplier <? extends Gui > craftingGuiSupplier = () -> Gui .empty (3 , 3 );
97
112
private Supplier <? extends Gui > resultGuiSupplier = () -> Gui .empty (1 , 1 );
98
113
private final List <BiConsumer <? super Integer , ? super Boolean >> slotToggleHandlers = new ArrayList <>();
114
+ private final List <MutableProperty <Boolean >> slots = CollectionUtils .create (9 , i -> MutableProperty .of (false ));
99
115
100
116
@ Override
101
117
public CrafterWindow .Builder setCraftingGui (Supplier <? extends Gui > guiSupplier ) {
@@ -122,6 +138,25 @@ public CrafterWindow.Builder addSlotToggleHandler(BiConsumer<? super Integer, ?
122
138
return this ;
123
139
}
124
140
141
+ @ Override
142
+ public CrafterWindow .Builder setSlot (int slot , MutableProperty <Boolean > state ) {
143
+ if (slot < 0 || slot >= CRAFTING_SLOTS )
144
+ throw new IllegalArgumentException ("Slot must be between 0 and 8" );
145
+ slots .set (slot , state );
146
+ return this ;
147
+ }
148
+
149
+ @ Override
150
+ public CrafterWindow .Builder setSlots (List <? extends MutableProperty <Boolean >> slots ) {
151
+ if (slots .size () != CRAFTING_SLOTS )
152
+ throw new IllegalArgumentException ("Slots must contain exactly " + CRAFTING_SLOTS + " properties" );
153
+
154
+ for (int i = 0 ; i < CRAFTING_SLOTS ; i ++) {
155
+ this .slots .set (i , slots .get (i ));
156
+ }
157
+ return this ;
158
+ }
159
+
125
160
@ Override
126
161
public CrafterWindowImpl build (Player viewer ) {
127
162
var window = new CrafterWindowImpl (
@@ -130,6 +165,7 @@ public CrafterWindowImpl build(Player viewer) {
130
165
(AbstractGui ) craftingGuiSupplier .get (),
131
166
(AbstractGui ) resultGuiSupplier .get (),
132
167
supplyLowerGui (viewer ),
168
+ slots ,
133
169
slotToggleHandlers ,
134
170
closeable
135
171
);
0 commit comments