diff --git a/build.gradle b/build.gradle index d539485..4f6d876 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ allprojects { group = 'com.focamacho' - version = '1.0.8' + version = '1.0.9' } subprojects { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6ce793f..28ff446 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/ChestMenu.java b/sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/ChestMenu.java index 3a3ee8c..5616de6 100644 --- a/sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/ChestMenu.java +++ b/sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/ChestMenu.java @@ -3,6 +3,7 @@ import com.focamacho.sealmenus.bukkit.item.ClickableItem; import com.focamacho.sealmenus.bukkit.item.MenuItem; import com.google.common.collect.Sets; +import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; @@ -55,7 +56,7 @@ public class ChestMenu { //Bukkit Inventory @Getter protected Inventory inventory; protected final Set slotsRequiringUpdate = Sets.newHashSet(); - private BukkitTask updateItemsTask = null; + @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) private BukkitTask updateItemsTask = null; ChestMenu(String title, int rows, JavaPlugin plugin) { 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() { } for (int i = 0; i < this.inventory.getSize(); i++) { - final int finalIndex = i; - - ItemStack slotStack = this.inventory.getItem(i); - if(slotStack == null) slotStack = new ItemStack(Material.AIR); - - if(containsItem(i)) { - ItemStack stack = getItem(i).getItem(); - if(slotStack != stack) Bukkit.getScheduler().runTask(this.plugin, () -> this.inventory.setItem(finalIndex, stack)); - } else if(slotStack.getType() != Material.AIR) { - Bukkit.getScheduler().runTask(this.plugin, () -> this.inventory.clear(finalIndex)); - } + updateSlotStack(i); } slotsRequiringUpdate.clear(); @@ -211,16 +202,7 @@ public void update() { */ public void update(int slot) { if(this.inventory == null) update(); - - ItemStack inventoryStack = this.inventory.getItem(slot); - if(inventoryStack == null) inventoryStack = new ItemStack(Material.AIR); - - if(containsItem(slot)) { - ItemStack stack = getItem(slot).getItem(); - if (inventoryStack != stack) - Bukkit.getScheduler().runTask(this.plugin, () -> this.inventory.setItem(slot, stack)); - } else if(inventoryStack.getType() != Material.AIR) Bukkit.getScheduler().runTask(this.plugin, () -> this.inventory.clear(slot)); - + updateSlotStack(slot); slotsRequiringUpdate.remove(slot); } @@ -275,6 +257,17 @@ public boolean hasViewers() { return this.inventory.getViewers().size() > 0; } + private void updateSlotStack(int slot) { + ItemStack inventoryStack = this.inventory.getItem(slot); + if(inventoryStack == null) inventoryStack = new ItemStack(Material.AIR); + + if(containsItem(slot)) { + ItemStack stack = getItem(slot).getItem(); + if (inventoryStack != stack) + Bukkit.getScheduler().runTask(this.plugin, () -> this.inventory.setItem(slot, stack)); + } else if(inventoryStack.getType() != Material.AIR) Bukkit.getScheduler().runTask(this.plugin, () -> this.inventory.clear(slot)); + } + /** * Creates a copy of this menu. * @return the copy of this menu. @@ -301,20 +294,26 @@ public ChestMenu copy() { } protected void handlesUpdateItemsTask() { - if(this.updateItemsTask == null && hasViewers()) - updateItemsTask = new BukkitRunnable() { + if(getUpdateItemsTask() == null && hasViewers()) + setUpdateItemsTask(new BukkitRunnable() { @Override public void run() { - items.forEach((slot, item) -> { - if (item.update()) requireUpdate(slot); - }); + handleUpdateItems(); if(!hasViewers()) { this.cancel(); updateItemsTask = null; } } - }.runTaskTimer(this.plugin, 1, 1); + }.runTaskTimer(this.plugin, 1, 1)); + } + + protected void handleUpdateItems() { + getItems().forEach((slot, item) -> { + if (item.update()) { + requireUpdate(slot); + } + }); } @RequiredArgsConstructor @@ -323,7 +322,7 @@ static class Listener implements org.bukkit.event.Listener { private static final MenuItem dummyItem = ClickableItem.create(new ItemStack(Material.AIR)); private final JavaPlugin plugin; - private final Set chestMenus = Sets.newHashSet(); + private final Set chestMenus = Collections.synchronizedSet(Sets.newHashSet()); @EventHandler public void onClick(InventoryClickEvent ce) { diff --git a/sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/PageableChestMenu.java b/sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/PageableChestMenu.java index 9dc1c3d..f405f8d 100644 --- a/sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/PageableChestMenu.java +++ b/sealmenus-bukkit/src/main/java/com/focamacho/sealmenus/bukkit/PageableChestMenu.java @@ -11,11 +11,9 @@ import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitTask; -import java.util.AbstractMap; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.function.Consumer; public class PageableChestMenu extends ChestMenu { @@ -126,6 +124,22 @@ public PageableChestMenu clearPageableItems() { return this; } + /** + * Returns the slot for the inserted pageable item. + * + * @return the slot and page of the pageable item, or null if + * not present in the menu. + */ + public Map.Entry getPageableItemSlot(MenuItem item) { + if(!this.pageableItems.contains(item)) return null; + + int indexOf = pageableItems.indexOf(item); + int page = (int) Math.floor((float) indexOf / itemSlots.length); + int slot = itemSlots[indexOf - (page * itemSlots.length)]; + + return new AbstractMap.SimpleEntry<>(page, slot); + } + /** * Get the quantity of pages of this menu. * The quantity is defined by the amount @@ -304,6 +318,35 @@ public ChestMenu copy() { return copy; } + @Override + protected BukkitTask getUpdateItemsTask() { + if(fatherMenu == null) return super.getUpdateItemsTask(); + else return fatherMenu.getUpdateItemsTask(); + } + + @Override + protected ChestMenu setUpdateItemsTask(BukkitTask updateItemsTask) { + if(fatherMenu == null) return super.setUpdateItemsTask(updateItemsTask); + else return fatherMenu.setUpdateItemsTask(updateItemsTask); + } + + @Override + protected void handlesUpdateItemsTask() { + if(fatherMenu == null) super.handlesUpdateItemsTask(); + else fatherMenu.handlesUpdateItemsTask(); + } + + @Override + protected void handleUpdateItems() { + super.handleUpdateItems(); + + getPageableItems().forEach(item -> { + if (item.update()) { + requireUpdate(getPageableItemSlot(item).getValue()); + } + }); + } + //Override global actions for mirrored menus @Override public Consumer getOnOpen() { diff --git a/sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/ChestMenu.java b/sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/ChestMenu.java index 94cefb7..43dfd3d 100644 --- a/sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/ChestMenu.java +++ b/sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/ChestMenu.java @@ -4,6 +4,7 @@ import com.focamacho.sealmenus.sponge.item.MenuItem; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -54,7 +55,7 @@ public class ChestMenu { @Getter protected Inventory inventory; protected List playersViewing = Lists.newArrayList(); protected final Set slotsRequiringUpdate = Sets.newHashSet(); - private Task updateItemsTask = null; + @Getter(AccessLevel.PROTECTED) @Setter(AccessLevel.PROTECTED) private Task updateItemsTask = null; ChestMenu(String title, int rows, Object plugin) { 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) { for (Inventory inventorySlot : this.inventory.slots()) { Integer slotIndex = inventorySlot.getInventoryProperty(SlotIndex.class).get().getValue(); if(Objects.equals(slot, slotIndex)) { + System.out.println("atualizando slot"); if(containsItem(slot)) { ItemStack stack = getItem(slot).getItem(); if (inventorySlot.peek().orElse(ItemStack.empty()) != stack) @@ -374,17 +376,23 @@ public ChestMenu copy() { } protected void handlesUpdateItemsTask() { - if(this.updateItemsTask == null && hasViewers()) - updateItemsTask = Task.builder().intervalTicks(1).execute((task) -> { - items.forEach((slot, item) -> { - if(item.update()) requireUpdate(slot); - }); + if(getUpdateItemsTask() == null && hasViewers()) + setUpdateItemsTask(Task.builder().intervalTicks(1).execute((task) -> { + handleUpdateItems(); if(!hasViewers()) { task.cancel(); this.updateItemsTask = null; } - }).submit(this.plugin); + }).submit(this.plugin)); + } + + protected void handleUpdateItems() { + getItems().forEach((slot, item) -> { + if(item.update()) { + requireUpdate(slot); + } + }); } } \ No newline at end of file diff --git a/sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/PageableChestMenu.java b/sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/PageableChestMenu.java index 5950084..2d99e63 100644 --- a/sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/PageableChestMenu.java +++ b/sealmenus-sponge/src/main/java/com/focamacho/sealmenus/sponge/PageableChestMenu.java @@ -9,11 +9,9 @@ import org.spongepowered.api.event.item.inventory.InteractInventoryEvent; import org.spongepowered.api.item.inventory.ItemStack; import org.spongepowered.api.scheduler.Task; +import org.spongepowered.api.util.Tuple; -import java.util.AbstractMap; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.function.Consumer; public class PageableChestMenu extends ChestMenu { @@ -124,6 +122,22 @@ public PageableChestMenu clearPageableItems() { return this; } + /** + * Returns the slot for the inserted pageable item. + * + * @return the slot and page of the pageable item, or null if + * not present in the menu. + */ + public Map.Entry getPageableItemSlot(MenuItem item) { + if(!this.pageableItems.contains(item)) return null; + + int indexOf = pageableItems.indexOf(item); + int page = (int) Math.floor((float) indexOf / itemSlots.length); + int slot = itemSlots[indexOf - (page * itemSlots.length)]; + + return new AbstractMap.SimpleEntry<>(page, slot); + } + /** * Get the quantity of pages of this menu. * The quantity is defined by the amount @@ -302,12 +316,35 @@ public ChestMenu copy() { return copy; } + @Override + protected Task getUpdateItemsTask() { + if(fatherMenu == null) return super.getUpdateItemsTask(); + else return fatherMenu.getUpdateItemsTask(); + } + + @Override + protected ChestMenu setUpdateItemsTask(Task updateItemsTask) { + if(fatherMenu == null) return super.setUpdateItemsTask(updateItemsTask); + else return fatherMenu.setUpdateItemsTask(updateItemsTask); + } + @Override protected void handlesUpdateItemsTask() { if(fatherMenu == null) super.handlesUpdateItemsTask(); else fatherMenu.handlesUpdateItemsTask(); } + @Override + protected void handleUpdateItems() { + super.handleUpdateItems(); + + getPageableItems().forEach(item -> { + if(item.update()) { + requireUpdate(getPageableItemSlot(item).getValue()); + } + }); + } + //Override global actions for mirrored menus @Override public Consumer getOnOpen() {