9
9
10
10
import me .flame .menus .items .MenuItem ;
11
11
import me .flame .menus .menu .fillers .Filler ;
12
+ import me .flame .menus .menu .fillers .MenuFiller ;
12
13
import me .flame .menus .menu .iterator .MenuIterator ;
13
14
import me .flame .menus .modifiers .Modifier ;
14
15
35
36
36
37
import static org .bukkit .ChatColor .translateAlternateColorCodes ;
37
38
38
- // changed
39
-
40
39
@ Getter
41
40
@ ApiStatus .NonExtendable
42
41
@ SuppressWarnings ({ "unused" , "BooleanMethodIsAlwaysInverted" , "unchecked" , "UnusedReturnValue" })
@@ -45,17 +44,14 @@ public abstract class BaseMenu<M extends BaseMenu<M>> implements IMenu<M> {
45
44
protected Inventory inventory ;
46
45
47
46
@ NotNull
48
- protected final MenuType type ;
47
+ protected MenuType type = MenuType . CHEST ;
49
48
50
49
@ NotNull
51
50
protected final EnumSet <Modifier > modifiers ;
52
51
53
52
@ NotNull
54
53
protected final Map <Integer , MenuItem > itemMap ;
55
54
56
- @ NotNull
57
- protected final Filler filler = Filler .from (this );
58
-
59
55
@ NotNull
60
56
private final MenuIterator iterator = new MenuIterator (IterationDirection .HORIZONTAL , this );
61
57
@@ -65,6 +61,8 @@ public abstract class BaseMenu<M extends BaseMenu<M>> implements IMenu<M> {
65
61
@ NotNull
66
62
private static final BukkitScheduler sch = Bukkit .getScheduler ();
67
63
64
+ protected @ Setter MenuFiller defaultFiller = Filler .from (this );
65
+
68
66
protected int rows = 1 , size ;
69
67
70
68
protected @ Setter boolean dynamicSizing = false , updating = false ;
@@ -85,7 +83,6 @@ public BaseMenu(MenuType type, String title, EnumSet<Modifier> modifiers) {
85
83
}
86
84
87
85
public BaseMenu (int rows , String title , @ NotNull EnumSet <Modifier > modifiers , boolean colorize ) {
88
- this .type = MenuType .CHEST ;
89
86
this .modifiers = modifiers ;
90
87
this .rows = rows ;
91
88
this .title = colorize ? translateAlternateColorCodes ('&' , title ) : title ;
@@ -99,12 +96,20 @@ public BaseMenu(int rows, String title, @NotNull EnumSet<Modifier> modifiers, bo
99
96
this .modifiers = modifiers ;
100
97
this .title = colorize ? translateAlternateColorCodes ('&' , title ) : title ;
101
98
this .size = type .getLimit ();
102
- this .itemMap = new LinkedHashMap <>(size );
99
+ this .itemMap = new HashMap <>(size );
103
100
this .inventory = Bukkit .createInventory (this , type .getType (), title );
104
101
}
105
102
106
103
private static final Material AIR = Material .AIR ;
107
104
105
+ public MenuFiller getFiller () {
106
+ return getFiller (Filler .class );
107
+ }
108
+
109
+ public <T extends MenuFiller > T getFiller (Class <T > value ) {
110
+ return value .cast (defaultFiller );
111
+ }
112
+
108
113
public MenuIterator iterator () {
109
114
return iterator ;
110
115
}
@@ -141,14 +146,8 @@ public M addItem(@NotNull final ItemStack... items) {
141
146
142
147
int slot = 0 ;
143
148
for (final ItemStack guiItem : items ) {
144
- if (slot >= size ) {
145
- notAddedItems .add (guiItem );
146
- continue ;
147
- }
148
-
149
- while (occupiedSlots .contains (slot )) {
150
- slot ++;
151
- }
149
+ slot = getSlot (occupiedSlots , slot );
150
+ if (isInvalidSlot (notAddedItems , slot , guiItem )) continue ; // incase.
152
151
153
152
itemMap .put (slot , MenuItem .of (guiItem ));
154
153
slot ++;
@@ -168,14 +167,8 @@ public M addItem(@NotNull final MenuItem... items) {
168
167
169
168
int slot = 0 ;
170
169
for (final MenuItem guiItem : items ) {
171
- if (slot >= size ) {
172
- notAddedItems .add (guiItem );
173
- continue ;
174
- }
175
-
176
- while (occupiedSlots .contains (slot )) {
177
- slot ++;
178
- }
170
+ slot = getSlot (occupiedSlots , slot );
171
+ if (isInvalidSlot (notAddedItems , slot , guiItem )) continue ; // incase.
179
172
180
173
itemMap .put (slot , guiItem );
181
174
slot ++;
@@ -189,6 +182,32 @@ public M addItem(@NotNull final MenuItem... items) {
189
182
return (M ) this ;
190
183
}
191
184
185
+ private boolean isInvalidSlot (List <MenuItem > notAddedItems , int slot , MenuItem guiItem ) {
186
+ if (slot >= size ) {
187
+ notAddedItems .add (guiItem );
188
+ return true ;
189
+ }
190
+ return false ;
191
+ }
192
+
193
+ private boolean isInvalidSlot (List <ItemStack > notAddedItems , int slot , ItemStack guiItem ) {
194
+ if (slot >= size ) {
195
+ notAddedItems .add (guiItem );
196
+ return true ;
197
+ }
198
+ return false ;
199
+ }
200
+
201
+ private static int getSlot (Set <Integer > occupiedSlots , int slot ) {
202
+ while (true ) {
203
+ boolean contains = occupiedSlots .contains (slot );
204
+ if (!contains ) break ;
205
+ slot ++;
206
+ }
207
+
208
+ return slot ;
209
+ }
210
+
192
211
public M setItem (@ NotNull Slot slot , ItemStack item ) {
193
212
if (!slot .isSlot ()) return (M ) this ;
194
213
itemMap .put (slot .slot , MenuItem .of (item ));
@@ -211,28 +230,6 @@ public M setItem(int slot, MenuItem item) {
211
230
return (M ) this ;
212
231
}
213
232
214
- public M removeItem (@ NotNull final MenuItem item ) {
215
- int size = itemMap .size ();
216
- for (int i = 0 ; i < size ; i ++) {
217
- if (Objects .equals (item , itemMap .get (i ))) {
218
- itemMap .remove (i );
219
- break ;
220
- }
221
- }
222
- return (M ) this ;
223
- }
224
-
225
- public M removeItem (@ NotNull final ItemStack itemStack ) {
226
- int size = itemMap .size ();
227
- for (int i = 0 ; i < size ; i ++) {
228
- if (Objects .equals (itemStack , itemMap .get (i ).getItemStack ())) {
229
- itemMap .remove (i );
230
- break ;
231
- }
232
- }
233
- return (M ) this ;
234
- }
235
-
236
233
public @ Nullable MenuItem getItem (int i ) {
237
234
return itemMap .get (i );
238
235
}
@@ -289,7 +286,7 @@ public Optional<MenuItem> get(Predicate<MenuItem> itemDescription) {
289
286
return null ;
290
287
}
291
288
292
- public M removeItems (@ NotNull final ItemStack ... itemStacks ) {
289
+ public M removeItem (@ NotNull final ItemStack ... itemStacks ) {
293
290
return removeItemStacks (Arrays .asList (itemStacks ));
294
291
}
295
292
@@ -301,65 +298,89 @@ public M removeItemStacks(@NotNull final List<ItemStack> itemStacks) {
301
298
if (item == null ) continue ;
302
299
303
300
val itemStack = item .getItemStack ();
304
- if (set .contains (itemStack )) itemMap .remove (i );
301
+ if (set .contains (itemStack )) {
302
+ itemMap .remove (i );
303
+ inventory .remove (itemStack );
304
+ }
305
305
}
306
306
return (M ) this ;
307
307
}
308
308
309
- public M removeItems (@ NotNull final MenuItem ... itemStacks ) {
310
- return removeItems (Arrays .asList (itemStacks ));
309
+ public M removeItem (@ NotNull final MenuItem ... items ) {
310
+ Set <MenuItem > slots = ImmutableSet .copyOf (items );
311
+
312
+ int size = itemMap .size ();
313
+ for (int i = 0 ; i < size ; i ++) {
314
+ MenuItem item = itemMap .get (i );
315
+ if (item != null && slots .contains (item )) {
316
+ itemMap .remove (i );
317
+ inventory .remove (item .getItemStack ());
318
+ }
319
+ }
320
+ return (M ) this ;
311
321
}
312
322
313
- public M removeItems (@ NotNull final List <MenuItem > itemStacks ) {
323
+ @ Override
324
+ public M removeItem (@ NotNull final List <MenuItem > itemStacks ) {
314
325
Set <MenuItem > set = ImmutableSet .copyOf (itemStacks );
315
326
int size = itemMap .size ();
316
327
for (int i = 0 ; i < size ; i ++) {
317
- if (set .contains (itemMap .get (i ))) itemMap .remove (i );
328
+ MenuItem item = itemMap .get (i );
329
+ if (set .contains (item )) {
330
+ itemMap .remove (i );
331
+ inventory .remove (item .getItemStack ());
332
+ }
318
333
}
319
334
return (M ) this ;
320
335
}
321
336
322
- public M update () {
337
+ M update (Inventory inventory ) {
323
338
this .updating = true ;
324
- recreateItems ();
325
- List <HumanEntity > entities = ImmutableList . copyOf (inventory .getViewers ());
339
+ recreateItems (inventory );
340
+ List <HumanEntity > entities = new ArrayList <> (inventory .getViewers ());
326
341
entities .forEach (e -> ((Player ) e ).updateInventory ());
327
342
this .updating = false ;
328
343
return (M ) this ;
329
344
}
330
345
346
+ @ Override
347
+ public M update () {
348
+ return this .update (this .inventory );
349
+ }
350
+
331
351
public void updatePer (long repeatTime ) {
332
- sch .runTaskTimer (Menus .plugin (), this :: update , 0 , repeatTime );
352
+ sch .runTaskTimer (Menus .plugin (), () -> update () , 0 , repeatTime );
333
353
}
334
354
335
- public void updatePer (Duration repeatTime ) {
336
- sch .runTaskTimer (Menus .plugin (), this :: update , 0 , repeatTime .toMillis () / 50 );
355
+ public void updatePer (@ NotNull Duration repeatTime ) {
356
+ sch .runTaskTimer (Menus .plugin (), () -> update () , 0 , repeatTime .toMillis () / 50 );
337
357
}
338
358
339
359
public void updatePer (long delay , long repeatTime ) {
340
- sch .runTaskTimer (Menus .plugin (), this :: update , delay , repeatTime );
360
+ sch .runTaskTimer (Menus .plugin (), () -> update () , delay , repeatTime );
341
361
}
342
362
343
- public void updatePer (Duration delay , Duration repeatTime ) {
344
- sch .runTaskTimer (Menus .plugin (), this :: update , delay .toMillis () / 50 , repeatTime .toMillis () / 50 );
363
+ public void updatePer (@ NotNull Duration delay , @ NotNull Duration repeatTime ) {
364
+ sch .runTaskTimer (Menus .plugin (), () -> update () , delay .toMillis () / 50 , repeatTime .toMillis () / 50 );
345
365
}
346
366
347
367
public M updateTitle (String title ) {
368
+ Inventory oldInventory = this .inventory ;
348
369
String colorizedTitle = translateAlternateColorCodes ('&' , title );
370
+ this .updating = true ;
349
371
Inventory updatedInventory = type == MenuType .CHEST
350
372
? Bukkit .createInventory (this , size , colorizedTitle )
351
373
: Bukkit .createInventory (this , type .getType (), colorizedTitle );
352
374
this .title = colorizedTitle ;
353
375
this .inventory = updatedInventory ;
354
376
355
- this .updating = true ;
356
- List <HumanEntity > entities = ImmutableList .copyOf (inventory .getViewers ());
377
+ List <HumanEntity > entities = ImmutableList .copyOf (oldInventory .getViewers ());
357
378
entities .forEach (e -> e .openInventory (updatedInventory ));
358
379
this .updating = false ;
359
380
return (M ) this ;
360
381
}
361
382
362
- protected void recreateItems () {
383
+ protected void recreateItems (Inventory inventory ) {
363
384
int size = itemMap .size ();
364
385
for (int i = 0 ; i < size ; i ++) {
365
386
MenuItem menuItem = itemMap .get (i );
0 commit comments