Skip to content

Commit 9c528cf

Browse files
authored
Merge pull request #1 from focamacho/dev
fix item updates
2 parents 6b48aa5 + 4352a2c commit 9c528cf

File tree

6 files changed

+133
-46
lines changed

6 files changed

+133
-46
lines changed

build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
allprojects {
22
group = 'com.focamacho'
3-
version = '1.0.8'
3+
version = '1.0.9'
44
}
55

66
subprojects {
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/ChestMenu.java

+28-29
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.focamacho.sealmenus.bukkit.item.ClickableItem;
44
import com.focamacho.sealmenus.bukkit.item.MenuItem;
55
import com.google.common.collect.Sets;
6+
import lombok.AccessLevel;
67
import lombok.Getter;
78
import lombok.RequiredArgsConstructor;
89
import lombok.Setter;
@@ -55,7 +56,7 @@ public class ChestMenu {
5556
//Bukkit Inventory
5657
@Getter protected Inventory inventory;
5758
protected final Set<Integer> slotsRequiringUpdate = Sets.newHashSet();
58-
private BukkitTask updateItemsTask = null;
59+
@Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) private BukkitTask updateItemsTask = null;
5960

6061
ChestMenu(String title, int rows, JavaPlugin plugin) {
6162
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() {
187188
}
188189

189190
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);
201192
}
202193

203194
slotsRequiringUpdate.clear();
@@ -211,16 +202,7 @@ public void update() {
211202
*/
212203
public void update(int slot) {
213204
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);
224206
slotsRequiringUpdate.remove(slot);
225207
}
226208

@@ -275,6 +257,17 @@ public boolean hasViewers() {
275257
return this.inventory.getViewers().size() > 0;
276258
}
277259

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+
278271
/**
279272
* Creates a copy of this menu.
280273
* @return the copy of this menu.
@@ -301,20 +294,26 @@ public ChestMenu copy() {
301294
}
302295

303296
protected void handlesUpdateItemsTask() {
304-
if(this.updateItemsTask == null && hasViewers())
305-
updateItemsTask = new BukkitRunnable() {
297+
if(getUpdateItemsTask() == null && hasViewers())
298+
setUpdateItemsTask(new BukkitRunnable() {
306299
@Override
307300
public void run() {
308-
items.forEach((slot, item) -> {
309-
if (item.update()) requireUpdate(slot);
310-
});
301+
handleUpdateItems();
311302

312303
if(!hasViewers()) {
313304
this.cancel();
314305
updateItemsTask = null;
315306
}
316307
}
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+
});
318317
}
319318

320319
@RequiredArgsConstructor
@@ -323,7 +322,7 @@ static class Listener implements org.bukkit.event.Listener {
323322
private static final MenuItem dummyItem = ClickableItem.create(new ItemStack(Material.AIR));
324323

325324
private final JavaPlugin plugin;
326-
private final Set<ChestMenu> chestMenus = Sets.newHashSet();
325+
private final Set<ChestMenu> chestMenus = Collections.synchronizedSet(Sets.newHashSet());
327326

328327
@EventHandler
329328
public void onClick(InventoryClickEvent ce) {

sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/PageableChestMenu.java

+47-4
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@
1111
import org.bukkit.event.inventory.InventoryOpenEvent;
1212
import org.bukkit.inventory.ItemStack;
1313
import org.bukkit.plugin.java.JavaPlugin;
14+
import org.bukkit.scheduler.BukkitTask;
1415

15-
import java.util.AbstractMap;
16-
import java.util.Collections;
17-
import java.util.List;
18-
import java.util.Objects;
16+
import java.util.*;
1917
import java.util.function.Consumer;
2018

2119
public class PageableChestMenu extends ChestMenu {
@@ -126,6 +124,22 @@ public PageableChestMenu clearPageableItems() {
126124
return this;
127125
}
128126

127+
/**
128+
* Returns the slot for the inserted pageable item.
129+
*
130+
* @return the slot and page of the pageable item, or null if
131+
* not present in the menu.
132+
*/
133+
public Map.Entry<Integer, Integer> getPageableItemSlot(MenuItem item) {
134+
if(!this.pageableItems.contains(item)) return null;
135+
136+
int indexOf = pageableItems.indexOf(item);
137+
int page = (int) Math.floor((float) indexOf / itemSlots.length);
138+
int slot = itemSlots[indexOf - (page * itemSlots.length)];
139+
140+
return new AbstractMap.SimpleEntry<>(page, slot);
141+
}
142+
129143
/**
130144
* Get the quantity of pages of this menu.
131145
* The quantity is defined by the amount
@@ -304,6 +318,35 @@ public ChestMenu copy() {
304318
return copy;
305319
}
306320

321+
@Override
322+
protected BukkitTask getUpdateItemsTask() {
323+
if(fatherMenu == null) return super.getUpdateItemsTask();
324+
else return fatherMenu.getUpdateItemsTask();
325+
}
326+
327+
@Override
328+
protected ChestMenu setUpdateItemsTask(BukkitTask updateItemsTask) {
329+
if(fatherMenu == null) return super.setUpdateItemsTask(updateItemsTask);
330+
else return fatherMenu.setUpdateItemsTask(updateItemsTask);
331+
}
332+
333+
@Override
334+
protected void handlesUpdateItemsTask() {
335+
if(fatherMenu == null) super.handlesUpdateItemsTask();
336+
else fatherMenu.handlesUpdateItemsTask();
337+
}
338+
339+
@Override
340+
protected void handleUpdateItems() {
341+
super.handleUpdateItems();
342+
343+
getPageableItems().forEach(item -> {
344+
if (item.update()) {
345+
requireUpdate(getPageableItemSlot(item).getValue());
346+
}
347+
});
348+
}
349+
307350
//Override global actions for mirrored menus
308351
@Override
309352
public Consumer<InventoryOpenEvent> getOnOpen() {

sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/ChestMenu.java

+15-7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.focamacho.sealmenus.sponge.item.MenuItem;
55
import com.google.common.collect.Lists;
66
import com.google.common.collect.Sets;
7+
import lombok.AccessLevel;
78
import lombok.Getter;
89
import lombok.Setter;
910
import lombok.experimental.Accessors;
@@ -54,7 +55,7 @@ public class ChestMenu {
5455
@Getter protected Inventory inventory;
5556
protected List<Player> playersViewing = Lists.newArrayList();
5657
protected final Set<Integer> slotsRequiringUpdate = Sets.newHashSet();
57-
private Task updateItemsTask = null;
58+
@Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) private Task updateItemsTask = null;
5859

5960
ChestMenu(String title, int rows, Object plugin) {
6061
if(rows <= 0 || rows > 6) throw new IllegalArgumentException("The number of rows for a menu must be >= 1 && <= 6.");
@@ -289,6 +290,7 @@ public void update(int slot) {
289290
for (Inventory inventorySlot : this.inventory.slots()) {
290291
Integer slotIndex = inventorySlot.getInventoryProperty(SlotIndex.class).get().getValue();
291292
if(Objects.equals(slot, slotIndex)) {
293+
System.out.println("atualizando slot");
292294
if(containsItem(slot)) {
293295
ItemStack stack = getItem(slot).getItem();
294296
if (inventorySlot.peek().orElse(ItemStack.empty()) != stack)
@@ -374,17 +376,23 @@ public ChestMenu copy() {
374376
}
375377

376378
protected void handlesUpdateItemsTask() {
377-
if(this.updateItemsTask == null && hasViewers())
378-
updateItemsTask = Task.builder().intervalTicks(1).execute((task) -> {
379-
items.forEach((slot, item) -> {
380-
if(item.update()) requireUpdate(slot);
381-
});
379+
if(getUpdateItemsTask() == null && hasViewers())
380+
setUpdateItemsTask(Task.builder().intervalTicks(1).execute((task) -> {
381+
handleUpdateItems();
382382

383383
if(!hasViewers()) {
384384
task.cancel();
385385
this.updateItemsTask = null;
386386
}
387-
}).submit(this.plugin);
387+
}).submit(this.plugin));
388+
}
389+
390+
protected void handleUpdateItems() {
391+
getItems().forEach((slot, item) -> {
392+
if(item.update()) {
393+
requireUpdate(slot);
394+
}
395+
});
388396
}
389397

390398
}

sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/PageableChestMenu.java

+41-4
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@
99
import org.spongepowered.api.event.item.inventory.InteractInventoryEvent;
1010
import org.spongepowered.api.item.inventory.ItemStack;
1111
import org.spongepowered.api.scheduler.Task;
12+
import org.spongepowered.api.util.Tuple;
1213

13-
import java.util.AbstractMap;
14-
import java.util.Collections;
15-
import java.util.List;
16-
import java.util.Objects;
14+
import java.util.*;
1715
import java.util.function.Consumer;
1816

1917
public class PageableChestMenu extends ChestMenu {
@@ -124,6 +122,22 @@ public PageableChestMenu clearPageableItems() {
124122
return this;
125123
}
126124

125+
/**
126+
* Returns the slot for the inserted pageable item.
127+
*
128+
* @return the slot and page of the pageable item, or null if
129+
* not present in the menu.
130+
*/
131+
public Map.Entry<Integer, Integer> getPageableItemSlot(MenuItem item) {
132+
if(!this.pageableItems.contains(item)) return null;
133+
134+
int indexOf = pageableItems.indexOf(item);
135+
int page = (int) Math.floor((float) indexOf / itemSlots.length);
136+
int slot = itemSlots[indexOf - (page * itemSlots.length)];
137+
138+
return new AbstractMap.SimpleEntry<>(page, slot);
139+
}
140+
127141
/**
128142
* Get the quantity of pages of this menu.
129143
* The quantity is defined by the amount
@@ -302,12 +316,35 @@ public ChestMenu copy() {
302316
return copy;
303317
}
304318

319+
@Override
320+
protected Task getUpdateItemsTask() {
321+
if(fatherMenu == null) return super.getUpdateItemsTask();
322+
else return fatherMenu.getUpdateItemsTask();
323+
}
324+
325+
@Override
326+
protected ChestMenu setUpdateItemsTask(Task updateItemsTask) {
327+
if(fatherMenu == null) return super.setUpdateItemsTask(updateItemsTask);
328+
else return fatherMenu.setUpdateItemsTask(updateItemsTask);
329+
}
330+
305331
@Override
306332
protected void handlesUpdateItemsTask() {
307333
if(fatherMenu == null) super.handlesUpdateItemsTask();
308334
else fatherMenu.handlesUpdateItemsTask();
309335
}
310336

337+
@Override
338+
protected void handleUpdateItems() {
339+
super.handleUpdateItems();
340+
341+
getPageableItems().forEach(item -> {
342+
if(item.update()) {
343+
requireUpdate(getPageableItemSlot(item).getValue());
344+
}
345+
});
346+
}
347+
311348
//Override global actions for mirrored menus
312349
@Override
313350
public Consumer<InteractInventoryEvent.Open> getOnOpen() {

0 commit comments

Comments
 (0)