3
3
import com .focamacho .sealmenus .bukkit .item .ClickableItem ;
4
4
import com .focamacho .sealmenus .bukkit .item .MenuItem ;
5
5
import com .google .common .collect .Sets ;
6
+ import lombok .AccessLevel ;
6
7
import lombok .Getter ;
7
8
import lombok .RequiredArgsConstructor ;
8
9
import lombok .Setter ;
@@ -55,7 +56,7 @@ public class ChestMenu {
55
56
//Bukkit Inventory
56
57
@ Getter protected Inventory inventory ;
57
58
protected final Set <Integer > slotsRequiringUpdate = Sets .newHashSet ();
58
- private BukkitTask updateItemsTask = null ;
59
+ @ Getter ( AccessLevel . PROTECTED ) @ Setter ( AccessLevel . PROTECTED ) private BukkitTask updateItemsTask = null ;
59
60
60
61
ChestMenu (String title , int rows , JavaPlugin plugin ) {
61
62
if (rows <= 0 || rows > 6 ) throw new IllegalArgumentException ("The number of rows for a menu must be >= 1 && <= 6." );
@@ -187,17 +188,7 @@ public void update() {
187
188
}
188
189
189
190
for (int i = 0 ; i < this .inventory .getSize (); i ++) {
190
- final int finalIndex = i ;
191
-
192
- ItemStack slotStack = this .inventory .getItem (i );
193
- if (slotStack == null ) slotStack = new ItemStack (Material .AIR );
194
-
195
- if (containsItem (i )) {
196
- ItemStack stack = getItem (i ).getItem ();
197
- if (slotStack != stack ) Bukkit .getScheduler ().runTask (this .plugin , () -> this .inventory .setItem (finalIndex , stack ));
198
- } else if (slotStack .getType () != Material .AIR ) {
199
- Bukkit .getScheduler ().runTask (this .plugin , () -> this .inventory .clear (finalIndex ));
200
- }
191
+ updateSlotStack (i );
201
192
}
202
193
203
194
slotsRequiringUpdate .clear ();
@@ -211,16 +202,7 @@ public void update() {
211
202
*/
212
203
public void update (int slot ) {
213
204
if (this .inventory == null ) update ();
214
-
215
- ItemStack inventoryStack = this .inventory .getItem (slot );
216
- if (inventoryStack == null ) inventoryStack = new ItemStack (Material .AIR );
217
-
218
- if (containsItem (slot )) {
219
- ItemStack stack = getItem (slot ).getItem ();
220
- if (inventoryStack != stack )
221
- Bukkit .getScheduler ().runTask (this .plugin , () -> this .inventory .setItem (slot , stack ));
222
- } else if (inventoryStack .getType () != Material .AIR ) Bukkit .getScheduler ().runTask (this .plugin , () -> this .inventory .clear (slot ));
223
-
205
+ updateSlotStack (slot );
224
206
slotsRequiringUpdate .remove (slot );
225
207
}
226
208
@@ -275,6 +257,17 @@ public boolean hasViewers() {
275
257
return this .inventory .getViewers ().size () > 0 ;
276
258
}
277
259
260
+ private void updateSlotStack (int slot ) {
261
+ ItemStack inventoryStack = this .inventory .getItem (slot );
262
+ if (inventoryStack == null ) inventoryStack = new ItemStack (Material .AIR );
263
+
264
+ if (containsItem (slot )) {
265
+ ItemStack stack = getItem (slot ).getItem ();
266
+ if (inventoryStack != stack )
267
+ Bukkit .getScheduler ().runTask (this .plugin , () -> this .inventory .setItem (slot , stack ));
268
+ } else if (inventoryStack .getType () != Material .AIR ) Bukkit .getScheduler ().runTask (this .plugin , () -> this .inventory .clear (slot ));
269
+ }
270
+
278
271
/**
279
272
* Creates a copy of this menu.
280
273
* @return the copy of this menu.
@@ -301,20 +294,26 @@ public ChestMenu copy() {
301
294
}
302
295
303
296
protected void handlesUpdateItemsTask () {
304
- if (this . updateItemsTask == null && hasViewers ())
305
- updateItemsTask = new BukkitRunnable () {
297
+ if (getUpdateItemsTask () == null && hasViewers ())
298
+ setUpdateItemsTask ( new BukkitRunnable () {
306
299
@ Override
307
300
public void run () {
308
- items .forEach ((slot , item ) -> {
309
- if (item .update ()) requireUpdate (slot );
310
- });
301
+ handleUpdateItems ();
311
302
312
303
if (!hasViewers ()) {
313
304
this .cancel ();
314
305
updateItemsTask = null ;
315
306
}
316
307
}
317
- }.runTaskTimer (this .plugin , 1 , 1 );
308
+ }.runTaskTimer (this .plugin , 1 , 1 ));
309
+ }
310
+
311
+ protected void handleUpdateItems () {
312
+ getItems ().forEach ((slot , item ) -> {
313
+ if (item .update ()) {
314
+ requireUpdate (slot );
315
+ }
316
+ });
318
317
}
319
318
320
319
@ RequiredArgsConstructor
@@ -323,7 +322,7 @@ static class Listener implements org.bukkit.event.Listener {
323
322
private static final MenuItem dummyItem = ClickableItem .create (new ItemStack (Material .AIR ));
324
323
325
324
private final JavaPlugin plugin ;
326
- private final Set <ChestMenu > chestMenus = Sets .newHashSet ();
325
+ private final Set <ChestMenu > chestMenus = Collections . synchronizedSet ( Sets .newHashSet () );
327
326
328
327
@ EventHandler
329
328
public void onClick (InventoryClickEvent ce ) {
0 commit comments