├── src └── main │ └── java │ └── br │ └── com │ └── blecaute │ └── inventory │ ├── configuration │ ├── Configuration.java │ ├── PaginatedConfiguration.java │ └── InventoryConfiguration.java │ ├── validator │ └── SlotInvalidator.java │ ├── button │ ├── ButtonType.java │ ├── impl │ │ ├── PreviousPageButtonImpl.java │ │ ├── NextPageButtonImpl.java │ │ └── AbstractPageButtonImpl.java │ └── Button.java │ ├── task │ └── InventoryUpdateTask.java │ ├── callback │ ├── ItemCallback.java │ ├── ObjectCallback.java │ ├── PaginatedItemCallback.java │ ├── PaginatedObjectCallback.java │ ├── UpdateCallback.java │ └── InventoryCallback.java │ ├── enums │ └── ButtonType.java │ ├── type │ ├── InventorySlot.java │ └── InventoryItem.java │ ├── exception │ └── InventoryBuilderException.java │ ├── util │ └── ListUtil.java │ ├── format │ ├── updater │ │ ├── ObjectUpdater.java │ │ ├── ItemUpdater.java │ │ ├── PaginatedObjectUpdater.java │ │ └── PaginatedItemUpdater.java │ ├── InventoryFormat.java │ ├── impl │ │ ├── ButtonFormatImpl.java │ │ ├── SimpleItemFormatImpl.java │ │ ├── SimpleObjectFormatImpl.java │ │ ├── PaginatedItemFormatImpl.java │ │ └── PaginatedObjectFormatImpl.java │ ├── SimpleFormat.java │ ├── ButtonFormat.java │ └── PaginatedFormat.java │ ├── event │ ├── updatable │ │ ├── UpdatableObject.java │ │ ├── UpdatableItem.java │ │ ├── UpdatableObjectPaginated.java │ │ ├── UpdatableItemPaginated.java │ │ └── Updatable.java │ ├── PaginatedItemEvent.java │ ├── ObjectClickEvent.java │ ├── PaginatedObjectEvent.java │ ├── ItemClickEvent.java │ └── InventoryEvent.java │ ├── property │ ├── type │ │ ├── HashInventoryProperty.java │ │ ├── ConcurrentInventoryProperty.java │ │ └── AbstractInventoryProperty.java │ └── InventoryProperty.java │ ├── InventoryHelper.java │ ├── InventoryManager.java │ ├── handler │ └── UpdateHandler.java │ ├── listener │ └── InventoryClickListener.java │ ├── InventoryUpdater.java │ └── InventoryBuilder.java ├── .gitignore ├── .github └── workflows │ ├── maven-build.yml │ └── maven-publish.yml ├── LICENSE ├── pom.xml └── README.md /src/main/java/br/com/blecaute/inventory/configuration/Configuration.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.configuration; 2 | 3 | /** 4 | * Represents an inventory configuration. 5 | */ 6 | public interface Configuration {} -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/validator/SlotInvalidator.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.validator; 2 | 3 | import org.bukkit.inventory.Inventory; 4 | 5 | /** 6 | * The interface to invalidate slots of @{@link Inventory} 7 | */ 8 | @FunctionalInterface 9 | public interface SlotInvalidator { 10 | 11 | boolean validate(int slot); 12 | 13 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/button/ButtonType.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.button; 2 | 3 | /** 4 | * The available types of @{@link Button} 5 | */ 6 | public enum ButtonType { 7 | 8 | /** 9 | * Previous page button type. 10 | */ 11 | PREVIOUS_PAGE, 12 | 13 | /** 14 | * Next page button type. 15 | */ 16 | NEXT_PAGE 17 | 18 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | 25 | .idea/ 26 | target/ -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/task/InventoryUpdateTask.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.task; 2 | 3 | import br.com.blecaute.inventory.InventoryHelper; 4 | 5 | public class InventoryUpdateTask implements Runnable { 6 | 7 | private int seconds = 0; 8 | 9 | @Override 10 | public void run() { 11 | InventoryHelper.getManager().updateInventories(seconds); 12 | seconds = seconds > 60 ? 0 : seconds + 1; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/callback/ItemCallback.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.callback; 2 | 3 | import br.com.blecaute.inventory.event.ItemClickEvent; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | 6 | /** 7 | * The ItemCallback is designed to process the click event 8 | * of an item in inventories. 9 | * 10 | * @param The type of InventoryItem. 11 | */ 12 | public interface ItemCallback extends InventoryCallback> {} -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/callback/ObjectCallback.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.callback; 2 | 3 | import br.com.blecaute.inventory.event.ObjectClickEvent; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | 6 | /** 7 | * The ObjectCallback is designed to process the click 8 | * on an item in inventory that references an object. 9 | * 10 | * @param The type of InventoryItem. 11 | */ 12 | public interface ObjectCallback extends InventoryCallback> {} -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/callback/PaginatedItemCallback.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.callback; 2 | 3 | import br.com.blecaute.inventory.event.PaginatedItemEvent; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | 6 | /** 7 | * The PaginatedItemCallback is designed to process the click 8 | * in an item with paginated inventory. 9 | * 10 | * @param The type of InventoryItem. 11 | */ 12 | public interface PaginatedItemCallback extends InventoryCallback> {} -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/callback/PaginatedObjectCallback.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.callback; 2 | 3 | import br.com.blecaute.inventory.event.PaginatedObjectEvent; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | 6 | /** 7 | * The PaginatedObjectCallback is designed to process the click 8 | * on an item that referenced an object in a paginated inventory. 9 | * 10 | * @param The type of InventoryItem. 11 | */ 12 | public interface PaginatedObjectCallback extends InventoryCallback> {} 13 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/callback/UpdateCallback.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.callback; 2 | 3 | import br.com.blecaute.inventory.InventoryUpdater; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * The UpdateCallback is designed to process updates in the inventory. 9 | * 10 | * @param The type of InventoryItem. 11 | */ 12 | @FunctionalInterface 13 | public interface UpdateCallback { 14 | 15 | void update(@NotNull InventoryUpdater updater); 16 | 17 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/enums/ButtonType.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.enums; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | import org.jetbrains.annotations.ApiStatus; 7 | 8 | /** 9 | * Enum of buttons to skip or back page of @{@link InventoryBuilder} 10 | */ 11 | @AllArgsConstructor 12 | @Deprecated 13 | @ApiStatus.ScheduledForRemoval 14 | public enum ButtonType { 15 | 16 | PREVIOUS_PAGE(-1), 17 | NEXT_PAGE(1); 18 | 19 | @Getter 20 | private final int value; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/type/InventorySlot.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.type; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | 5 | import org.bukkit.inventory.ItemStack; 6 | 7 | /** 8 | * Any class that implements this can be used in the @{@link InventoryBuilder} 9 | * to represent the object as an @{@link ItemStack} and its slot. 10 | */ 11 | public interface InventorySlot extends InventoryItem { 12 | 13 | /** 14 | * Get the slot that will be used in the inventory. 15 | * 16 | * @return The slot. 17 | */ 18 | int getSlot(); 19 | 20 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/exception/InventoryBuilderException.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.exception; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | /** 6 | * InventoryBuilderException is a runtime exception called 7 | * when an error is encountered in InventoryBuilder. 8 | */ 9 | public class InventoryBuilderException extends RuntimeException { 10 | 11 | public InventoryBuilderException(String message) { 12 | super(message); 13 | } 14 | 15 | public InventoryBuilderException(@NotNull Exception exception) { 16 | super(exception.getMessage()); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/callback/InventoryCallback.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.callback; 2 | 3 | import br.com.blecaute.inventory.event.InventoryEvent; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | 6 | /** 7 | * The InventoryCallback is designed to process the click event in inventories. 8 | * 9 | * @param The type of InventoryItem. 10 | * @param The type of InventoryEvent. 11 | */ 12 | @FunctionalInterface 13 | public interface InventoryCallback> { 14 | 15 | /** 16 | * Accept click event. 17 | * 18 | * @param click The type of InventoryEvent. 19 | */ 20 | void accept(T click); 21 | 22 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/util/ListUtil.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.util; 2 | 3 | import org.jetbrains.annotations.NotNull; 4 | 5 | import java.util.*; 6 | 7 | public class ListUtil { 8 | 9 | /** 10 | * get paginated list 11 | * 12 | * @param list the list 13 | * @param value the page 14 | * @param size the size of list 15 | * @return the list 16 | */ 17 | public static @NotNull List getSublist(@NotNull List list, int value, int size) { 18 | if (list.isEmpty()) return list; 19 | 20 | int first = Math.min(value * size - size, list.size() - 1); 21 | int end = Math.min(list.size(), first + size); 22 | 23 | return list.subList(first, end); 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/updater/ObjectUpdater.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format.updater; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.callback.ObjectCallback; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import org.bukkit.inventory.Inventory; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | public interface ObjectUpdater extends ItemUpdater { 11 | 12 | void update(@NotNull InventoryBuilder builder, @NotNull Inventory inventory, 13 | @NotNull T object, int slot); 14 | 15 | void update(@NotNull InventoryBuilder builder, @NotNull Inventory inventory, 16 | @Nullable ObjectCallback callback, @NotNull T object, int slot); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/type/InventoryItem.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.type; 2 | 3 | import br.com.blecaute.inventory.property.InventoryProperty; 4 | import org.bukkit.inventory.Inventory; 5 | import org.bukkit.inventory.ItemStack; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | /** 10 | * Any class that implements this can be used in InventoryBuilder 11 | * to represent object as an @{@link ItemStack} in @{@link Inventory} 12 | */ 13 | public interface InventoryItem { 14 | 15 | /** 16 | * Get the item that will be used in the inventory 17 | * 18 | * @param inventory - The inventory 19 | * @param property - The inventory property 20 | * 21 | * @return The item that will be used in the inventory. 22 | */ 23 | @Nullable 24 | ItemStack getItem(@NotNull Inventory inventory, @NotNull InventoryProperty property); 25 | 26 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/updater/ItemUpdater.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format.updater; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.callback.ItemCallback; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import org.bukkit.inventory.Inventory; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | public interface ItemUpdater { 12 | 13 | void update(@NotNull InventoryBuilder builder, 14 | @NotNull Inventory inventory, 15 | @Nullable ItemStack itemStack, 16 | int slot); 17 | 18 | void update(@NotNull InventoryBuilder builder, 19 | @NotNull Inventory inventory, 20 | @Nullable ItemCallback callback, 21 | @Nullable ItemStack itemStack, 22 | int slot); 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/event/updatable/UpdatableObject.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.event.updatable; 2 | 3 | import br.com.blecaute.inventory.callback.ObjectCallback; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | /** 8 | * The class that implements the UpdatableObject indicates that 9 | * it has methods to update objects saved in the inventory. 10 | * 11 | * @param The type of InventoryItem. 12 | */ 13 | public interface UpdatableObject extends Updatable { 14 | 15 | /** 16 | * Update clicked object 17 | * 18 | * @param object The object to set. 19 | */ 20 | void updateObject(@NotNull T object); 21 | 22 | /** 23 | * Update clicked object. 24 | * 25 | * @param object The object to set. 26 | * @param callback The ObjectCallback. 27 | */ 28 | void updateObject(@NotNull T object, @NotNull ObjectCallback callback); 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/updater/PaginatedObjectUpdater.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format.updater; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.callback.PaginatedObjectCallback; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import org.bukkit.inventory.Inventory; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | import java.util.Collection; 11 | 12 | public interface PaginatedObjectUpdater extends ObjectUpdater { 13 | 14 | void update(@NotNull InventoryBuilder builder, 15 | @NotNull Inventory inventory, 16 | @NotNull Collection objects); 17 | 18 | void update(@NotNull InventoryBuilder builder, 19 | @NotNull Inventory inventory, 20 | @NotNull Collection objects, 21 | @Nullable PaginatedObjectCallback callback); 22 | 23 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/updater/PaginatedItemUpdater.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format.updater; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.callback.PaginatedItemCallback; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import org.bukkit.inventory.Inventory; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.jetbrains.annotations.NotNull; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | import java.util.Collection; 12 | 13 | public interface PaginatedItemUpdater extends ItemUpdater { 14 | 15 | void update(@NotNull InventoryBuilder builder, 16 | @NotNull Inventory inventory, 17 | @NotNull Collection items); 18 | 19 | void update(@NotNull InventoryBuilder builder, 20 | @NotNull Inventory inventory, 21 | @NotNull Collection items, 22 | @Nullable PaginatedItemCallback callback); 23 | 24 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/property/type/HashInventoryProperty.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.property.type; 2 | 3 | import br.com.blecaute.inventory.exception.InventoryBuilderException; 4 | import br.com.blecaute.inventory.property.InventoryProperty; 5 | 6 | import java.util.HashMap; 7 | 8 | public class HashInventoryProperty extends AbstractInventoryProperty implements Cloneable { 9 | 10 | public HashInventoryProperty() { 11 | super(new HashMap<>()); 12 | } 13 | 14 | @Override 15 | public InventoryProperty deepClone() { 16 | return clone(); 17 | } 18 | 19 | @Override 20 | public HashInventoryProperty clone() { 21 | try { 22 | HashInventoryProperty property = (HashInventoryProperty) super.clone(); 23 | property.map = new HashMap<>(this.map); 24 | 25 | return property; 26 | 27 | } catch (CloneNotSupportedException exception) { 28 | throw new InventoryBuilderException(exception.getMessage()); 29 | } 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /.github/workflows/maven-build.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven 3 | 4 | name: Build project 5 | 6 | on: 7 | push: 8 | branches: [ "master" ] 9 | pull_request: 10 | workflow_dispatch: 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Checkout repository 17 | uses: actions/checkout@v3 18 | 19 | - name: Setup JDK 8 20 | uses: actions/setup-java@v3 21 | with: 22 | java-version: '8' 23 | distribution: 'temurin' 24 | cache: maven 25 | 26 | - name: Setup maven cache 27 | uses: actions/cache@v2 28 | with: 29 | path: ~/.m2/repository 30 | key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} 31 | restore-keys: | 32 | ${{ runner.os }}-maven- 33 | 34 | - name: Build with Maven 35 | run: mvn -B package --file pom.xml -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/event/updatable/UpdatableItem.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.event.updatable; 2 | 3 | import br.com.blecaute.inventory.callback.ItemCallback; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | import org.bukkit.inventory.ItemStack; 6 | import org.jetbrains.annotations.NotNull; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | /** 10 | * The class that implements the UpdatableItem indicates that 11 | * it has methods to update items in the inventory. 12 | * 13 | * @param The type of InventoryItem. 14 | */ 15 | public interface UpdatableItem extends Updatable { 16 | 17 | /** 18 | * Update clicked ItemStack 19 | * 20 | * @param itemStack the ItemStack to set. 21 | */ 22 | void updateItem(@Nullable ItemStack itemStack); 23 | 24 | /** 25 | * Update clicked ItemStack. 26 | * 27 | * @param itemStack The ItemStack to set. 28 | * @param callback The ItemCallback. 29 | */ 30 | void updateItem(@Nullable ItemStack itemStack, @NotNull ItemCallback callback); 31 | 32 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/InventoryHelper.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory; 2 | 3 | import br.com.blecaute.inventory.listener.InventoryClickListener; 4 | import lombok.AccessLevel; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | import org.bukkit.Bukkit; 8 | import org.bukkit.plugin.Plugin; 9 | import org.bukkit.plugin.PluginManager; 10 | 11 | /** 12 | * Class for initializing the inventory helper. 13 | */ 14 | @NoArgsConstructor(access = AccessLevel.PRIVATE) 15 | public class InventoryHelper { 16 | 17 | @Getter private static boolean enabled = false; 18 | @Getter private static InventoryManager manager = null; 19 | 20 | /** 21 | * Enable inventory helper. 22 | * 23 | * @param plugin The @{@link Plugin} 24 | */ 25 | public static void enable(Plugin plugin) { 26 | if (enabled) return; 27 | 28 | PluginManager pluginManager = Bukkit.getPluginManager(); 29 | pluginManager.registerEvents(new InventoryClickListener(), plugin); 30 | 31 | manager = new InventoryManager(plugin); 32 | enabled = true; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/property/type/ConcurrentInventoryProperty.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.property.type; 2 | 3 | import br.com.blecaute.inventory.exception.InventoryBuilderException; 4 | import br.com.blecaute.inventory.property.InventoryProperty; 5 | 6 | import java.util.concurrent.ConcurrentHashMap; 7 | 8 | public class ConcurrentInventoryProperty extends AbstractInventoryProperty implements Cloneable { 9 | 10 | public ConcurrentInventoryProperty() { 11 | super(new ConcurrentHashMap<>()); 12 | } 13 | 14 | @Override 15 | public InventoryProperty deepClone() { 16 | return clone(); 17 | } 18 | 19 | @Override 20 | public ConcurrentInventoryProperty clone() { 21 | try { 22 | ConcurrentInventoryProperty property = (ConcurrentInventoryProperty) super.clone(); 23 | property.map = new ConcurrentHashMap<>(this.map); 24 | 25 | return property; 26 | 27 | } catch (CloneNotSupportedException exception) { 28 | throw new InventoryBuilderException(exception.getMessage()); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 SrBlecaute 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/event/updatable/UpdatableObjectPaginated.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.event.updatable; 2 | 3 | import br.com.blecaute.inventory.callback.PaginatedObjectCallback; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.Collection; 8 | 9 | /** 10 | * The class that implements the UpdatableObjectPaginated indicates that 11 | * it has methods to update objects in paginated inventories. 12 | * 13 | * @param The type of InventoryItem. 14 | */ 15 | public interface UpdatableObjectPaginated extends UpdatableObject { 16 | 17 | /** 18 | * Update all objects in paginated inventory. 19 | * 20 | * @param objects The collection of objects to update. 21 | */ 22 | void updateObjects(@NotNull Collection objects); 23 | 24 | /** 25 | * Update all objects in paginated inventory. 26 | * 27 | * @param objects The collection of objects to update. 28 | * @param callback The PaginatedObjectCallback. 29 | */ 30 | void updateObjects(@NotNull Collection objects, @NotNull PaginatedObjectCallback callback); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/button/impl/PreviousPageButtonImpl.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.button.impl; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.format.PaginatedFormat; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import org.bukkit.event.inventory.InventoryEvent; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class PreviousPageButtonImpl extends AbstractPageButtonImpl { 11 | 12 | public PreviousPageButtonImpl(int slot, ItemStack itemStack, boolean alwaysShow) { 13 | super(slot, itemStack, alwaysShow); 14 | } 15 | 16 | boolean canChange(@NotNull PaginatedFormat format) { 17 | return format.getCurrentPage() > 1; 18 | } 19 | 20 | void change(@NotNull InventoryEvent event, @NotNull InventoryBuilder builder, 21 | @NotNull PaginatedFormat format) { 22 | 23 | int current = format.getCurrentPage(); 24 | if (current > 1) { 25 | format.setCurrentPage(event.getInventory(), builder, current - 1); 26 | } 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/event/updatable/UpdatableItemPaginated.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.event.updatable; 2 | 3 | import br.com.blecaute.inventory.callback.PaginatedItemCallback; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | import org.bukkit.inventory.ItemStack; 6 | import org.jetbrains.annotations.NotNull; 7 | 8 | import java.util.Collection; 9 | 10 | /** 11 | * The class that implements the UpdatableItemPaginated indicates that 12 | * it has methods to update items in paginated inventories. 13 | * 14 | * @param The type of InventoryItem. 15 | */ 16 | public interface UpdatableItemPaginated extends UpdatableItem { 17 | 18 | /** 19 | * Update all items of paginated inventory. 20 | * 21 | * @param items The collection of ItemStack to update. 22 | */ 23 | void updateItems(@NotNull Collection items); 24 | 25 | /** 26 | * Update all items of paginated inventory. 27 | * 28 | * @param items The collection of ItemStack to update. 29 | * @param callback The PaginatedItemCallback. 30 | */ 31 | void updateItems(@NotNull Collection items, @NotNull PaginatedItemCallback callback); 32 | 33 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/button/impl/NextPageButtonImpl.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.button.impl; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.format.PaginatedFormat; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import org.bukkit.event.inventory.InventoryEvent; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | public class NextPageButtonImpl extends AbstractPageButtonImpl { 11 | 12 | public NextPageButtonImpl(int slot, ItemStack itemStack, boolean alwaysShow) { 13 | super(slot, itemStack, alwaysShow); 14 | } 15 | 16 | boolean canChange(@NotNull PaginatedFormat format) { 17 | return format.getCurrentPage() < format.getPagesSize(); 18 | } 19 | 20 | void change(@NotNull InventoryEvent event, @NotNull InventoryBuilder builder, 21 | @NotNull PaginatedFormat format) { 22 | 23 | int current = format.getCurrentPage(); 24 | if (current < format.getPagesSize()) { 25 | format.setCurrentPage(event.getInventory(), builder, current + 1); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/InventoryManager.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory; 2 | 3 | import br.com.blecaute.inventory.task.InventoryUpdateTask; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.plugin.Plugin; 6 | 7 | import java.util.Set; 8 | import java.util.concurrent.ConcurrentHashMap; 9 | 10 | public class InventoryManager { 11 | 12 | private final Set> inventories = ConcurrentHashMap.newKeySet(); 13 | 14 | public InventoryManager(Plugin plugin) { 15 | Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, new InventoryUpdateTask(), 20L, 20L); 16 | } 17 | 18 | public void register(InventoryBuilder builder) { 19 | inventories.add(builder); 20 | } 21 | 22 | public void unregister(InventoryBuilder builder) { 23 | inventories.remove(builder); 24 | } 25 | 26 | public Set> getInventories() { 27 | return inventories; 28 | } 29 | 30 | public void updateInventories(int seconds) { 31 | for (InventoryBuilder builder : getInventories()) { 32 | if (builder.getInventory().getViewers().size() <= 0) { 33 | unregister(builder); 34 | continue; 35 | } 36 | 37 | builder.handleUpdates(seconds); 38 | } 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/InventoryFormat.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | import org.bukkit.event.inventory.InventoryClickEvent; 6 | import org.bukkit.inventory.Inventory; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * Interface to format @{@link Inventory} in @{@link InventoryBuilder} 11 | * 12 | * @param The type of @{@link InventoryItem} 13 | */ 14 | public interface InventoryFormat { 15 | 16 | /** 17 | * Check if clicked slot is valid 18 | * 19 | * @param slot The slot 20 | * @return true if slot is valid. 21 | */ 22 | boolean isValid(int slot); 23 | 24 | /** 25 | * Accept click event 26 | * 27 | * @param event The @{@link InventoryClickEvent} 28 | * @param builder The @{@link InventoryBuilder} 29 | */ 30 | void accept(@NotNull InventoryClickEvent event, @NotNull InventoryBuilder builder); 31 | 32 | /** 33 | * Format inventory 34 | * 35 | * @param inventory The @{@link Inventory} 36 | * @param builder The @{@link InventoryBuilder} 37 | */ 38 | void format(@NotNull Inventory inventory, @NotNull InventoryBuilder builder); 39 | 40 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/handler/UpdateHandler.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.handler; 2 | 3 | import br.com.blecaute.inventory.InventoryUpdater; 4 | import br.com.blecaute.inventory.callback.UpdateCallback; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import lombok.RequiredArgsConstructor; 7 | import org.apache.commons.lang.Validate; 8 | import org.jetbrains.annotations.NotNull; 9 | 10 | import java.util.concurrent.TimeUnit; 11 | 12 | @RequiredArgsConstructor 13 | public class UpdateHandler { 14 | 15 | private final long seconds; 16 | private final UpdateCallback callback; 17 | 18 | public UpdateHandler(long time, @NotNull TimeUnit unit, @NotNull UpdateCallback callback) { 19 | Validate.isTrue(time > 0, "time must be greater than 0"); 20 | Validate.notNull(unit, "unit cannot be null"); 21 | Validate.notNull(callback, "callback cannot be null"); 22 | 23 | this.seconds = unit.toSeconds(time); 24 | this.callback = callback; 25 | } 26 | 27 | public void call(InventoryUpdater updater) { 28 | Validate.notNull(updater, "updater cannot be null"); 29 | callback.update(updater); 30 | } 31 | 32 | public boolean canUpdate(int currentSeconds) { 33 | return currentSeconds % seconds == 0; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/listener/InventoryClickListener.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.listener; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import org.bukkit.Material; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.inventory.InventoryClickEvent; 8 | import org.bukkit.inventory.InventoryHolder; 9 | import org.bukkit.inventory.ItemStack; 10 | import org.jetbrains.annotations.NotNull; 11 | 12 | public class InventoryClickListener implements Listener { 13 | 14 | @EventHandler 15 | public void onClick(@NotNull InventoryClickEvent event) { 16 | if (event.getInventory() == null) return; 17 | 18 | InventoryHolder inventoryHolder = event.getInventory().getHolder(); 19 | if (inventoryHolder instanceof InventoryBuilder.CustomHolder) { 20 | InventoryBuilder.CustomHolder holder = (InventoryBuilder.CustomHolder) inventoryHolder; 21 | ItemStack item = event.getCurrentItem(); 22 | 23 | if (item != null && item.getType() != Material.AIR) { 24 | try { 25 | holder.getConsumer().accept(event); 26 | } catch (Exception exception) { 27 | exception.printStackTrace(); 28 | } 29 | } 30 | 31 | event.setCancelled(true); 32 | } 33 | 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/impl/ButtonFormatImpl.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format.impl; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.button.Button; 5 | import br.com.blecaute.inventory.format.ButtonFormat; 6 | import br.com.blecaute.inventory.type.InventoryItem; 7 | import org.apache.commons.lang.Validate; 8 | import org.bukkit.event.inventory.InventoryClickEvent; 9 | import org.bukkit.inventory.Inventory; 10 | import org.bukkit.inventory.ItemStack; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | public class ButtonFormatImpl implements ButtonFormat { 14 | 15 | private final Button button; 16 | 17 | public ButtonFormatImpl(@NotNull Button button) { 18 | Validate.notNull(button, "button cannot be null"); 19 | 20 | this.button = button; 21 | } 22 | 23 | @Override 24 | public @NotNull Button getButton() { 25 | return this.button; 26 | } 27 | 28 | @Override 29 | public void accept(@NotNull InventoryClickEvent event, @NotNull InventoryBuilder builder) { 30 | this.button.accept(event, builder, this); 31 | } 32 | 33 | @Override 34 | public int getSlot() { 35 | return this.button.getSlot(); 36 | } 37 | 38 | @Override 39 | public ItemStack getItemStack(@NotNull Inventory inventory, @NotNull InventoryBuilder builder) { 40 | return this.button.getItem(inventory, builder.getProperties()); 41 | } 42 | } -------------------------------------------------------------------------------- /.github/workflows/maven-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a package using Maven and then publish it to GitHub packages when a release is created 2 | # For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path 3 | 4 | name: Publish Project 5 | 6 | on: 7 | release: 8 | types: [published] 9 | workflow_dispatch: 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | permissions: 15 | contents: read 16 | packages: write 17 | 18 | steps: 19 | - name: Checkout repository 20 | uses: actions/checkout@v3 21 | 22 | - name: Setup JDK 8 23 | uses: actions/setup-java@v3 24 | with: 25 | java-version: '8' 26 | distribution: 'temurin' 27 | server-id: github 28 | settings-path: ${{ github.workspace }} 29 | 30 | - name: Setup maven cache 31 | uses: actions/cache@v2 32 | with: 33 | path: ~/.m2/repository 34 | key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} 35 | restore-keys: | 36 | ${{ runner.os }}-maven- 37 | 38 | - name: Build project 39 | run: mvn -B package --file pom.xml 40 | 41 | - name: Upload artifacts 42 | uses: actions/upload-artifact@v3 43 | with: 44 | path: 'target/*.jar' 45 | if-no-files-found: error 46 | 47 | - name: Publish project 48 | run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml 49 | env: 50 | GITHUB_TOKEN: ${{ github.token }} 51 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/event/PaginatedItemEvent.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.event; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.callback.PaginatedItemCallback; 5 | import br.com.blecaute.inventory.event.updatable.UpdatableItemPaginated; 6 | import br.com.blecaute.inventory.format.InventoryFormat; 7 | import br.com.blecaute.inventory.format.PaginatedFormat; 8 | import br.com.blecaute.inventory.type.InventoryItem; 9 | import org.bukkit.event.inventory.InventoryClickEvent; 10 | import org.bukkit.inventory.ItemStack; 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.Collection; 14 | 15 | public class PaginatedItemEvent extends ItemClickEvent implements UpdatableItemPaginated { 16 | 17 | public PaginatedItemEvent(@NotNull InventoryFormat format, 18 | @NotNull InventoryBuilder builder, 19 | @NotNull InventoryClickEvent event) { 20 | 21 | super(format, builder, event); 22 | } 23 | 24 | @Override 25 | public void updateItems(@NotNull Collection items) { 26 | updater.updateItems(getIdentifier(), items); 27 | } 28 | 29 | @Override 30 | public void updateItems(@NotNull Collection items, @NotNull PaginatedItemCallback callback) { 31 | updater.updateItems(getIdentifier(), items, callback); 32 | } 33 | 34 | private @NotNull String getIdentifier() { 35 | return ((PaginatedFormat) format).getConfiguration().getIdentifier(); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/event/ObjectClickEvent.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.event; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.callback.ObjectCallback; 5 | import br.com.blecaute.inventory.event.updatable.UpdatableObject; 6 | import br.com.blecaute.inventory.format.InventoryFormat; 7 | import br.com.blecaute.inventory.type.InventoryItem; 8 | import org.bukkit.event.inventory.InventoryClickEvent; 9 | import org.jetbrains.annotations.NotNull; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import java.util.Objects; 13 | 14 | /** 15 | * The event called when the player clicks on an object. 16 | * 17 | * @param The type of @{@link InventoryItem} 18 | */ 19 | public class ObjectClickEvent extends ItemClickEvent implements UpdatableObject { 20 | 21 | private final T object; 22 | 23 | public ObjectClickEvent(@NotNull InventoryFormat format, 24 | @NotNull InventoryBuilder builder, 25 | @NotNull InventoryClickEvent event, 26 | @Nullable T object) { 27 | 28 | super(format, builder, event); 29 | this.object = object; 30 | } 31 | 32 | @NotNull 33 | public T getObject() { 34 | return Objects.requireNonNull(object); 35 | } 36 | 37 | @Override 38 | public void updateObject(@NotNull T object) { 39 | updateObject(getSlot(), object); 40 | } 41 | 42 | @Override 43 | public void updateObject(@NotNull T object, @NotNull ObjectCallback callback) { 44 | updateObject(getSlot(), object, callback); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/event/PaginatedObjectEvent.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.event; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.callback.PaginatedObjectCallback; 5 | import br.com.blecaute.inventory.event.updatable.UpdatableObjectPaginated; 6 | import br.com.blecaute.inventory.format.InventoryFormat; 7 | import br.com.blecaute.inventory.format.PaginatedFormat; 8 | import br.com.blecaute.inventory.type.InventoryItem; 9 | import org.bukkit.event.inventory.InventoryClickEvent; 10 | import org.jetbrains.annotations.NotNull; 11 | import org.jetbrains.annotations.Nullable; 12 | 13 | import java.util.Collection; 14 | 15 | public class PaginatedObjectEvent extends ObjectClickEvent implements UpdatableObjectPaginated { 16 | 17 | public PaginatedObjectEvent(@NotNull InventoryFormat format, 18 | @NotNull InventoryBuilder builder, 19 | @NotNull InventoryClickEvent event, 20 | @Nullable T object) { 21 | 22 | super(format, builder, event, object); 23 | } 24 | 25 | @Override 26 | public void updateObjects(@NotNull Collection objects) { 27 | updater.updateObjects(getIdentifier(), objects); 28 | } 29 | 30 | @Override 31 | public void updateObjects(@NotNull Collection objects, @NotNull PaginatedObjectCallback callback) { 32 | updater.updateObjects(getIdentifier(), objects, callback); 33 | } 34 | 35 | private @NotNull String getIdentifier() { 36 | return ((PaginatedFormat) format).getConfiguration().getIdentifier(); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/SimpleFormat.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.type.InventoryItem; 5 | import org.bukkit.inventory.Inventory; 6 | import org.bukkit.inventory.ItemStack; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | /** 10 | * The class that implements the Simple Format indicates that 11 | * it is able to update the inventory with items. 12 | * 13 | * @param The type of @{@link InventoryItem} 14 | */ 15 | public interface SimpleFormat extends InventoryFormat { 16 | 17 | /** 18 | * Get the slot of item 19 | * 20 | * @return The slot 21 | */ 22 | int getSlot(); 23 | 24 | /** 25 | * Get the @{@link ItemStack} 26 | * 27 | * @param inventory The @{@link Inventory} 28 | * @param builder The @{@link InventoryBuilder} 29 | * 30 | * @return The @{@link ItemStack} 31 | */ 32 | ItemStack getItemStack(@NotNull Inventory inventory, @NotNull InventoryBuilder builder); 33 | 34 | /** 35 | * Check if clicked slot is valid to handle click event. 36 | * 37 | * @param slot The clicked slot 38 | * 39 | * @return True if valid, false otherwise 40 | */ 41 | @Override 42 | default boolean isValid(int slot) { 43 | return getSlot() == slot; 44 | } 45 | 46 | /** 47 | * Format @{@link Inventory} 48 | * 49 | * @param inventory The @{@link Inventory} 50 | * @param builder The @{@link InventoryBuilder} 51 | */ 52 | default void format(@NotNull Inventory inventory, @NotNull InventoryBuilder builder) { 53 | if (getSlot() >= 0 && getSlot() < inventory.getSize()) { 54 | inventory.setItem(getSlot(), getItemStack(inventory, builder)); 55 | } 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | br.com.blecaute 8 | inventory-helper 9 | 1.5.1 10 | 11 | 12 | 8 13 | 8 14 | 15 | UTF-8 16 | 17 | 18 | 19 | 20 | nms-repo 21 | https://repo.codemc.io/repository/nms/ 22 | 23 | 24 | 25 | 26 | 27 | github 28 | GitHub OWNER Apache Maven Packages 29 | https://maven.pkg.github.com/srblecaute01/inventoryhelper 30 | 31 | 32 | 33 | 34 | 35 | org.spigotmc 36 | spigot 37 | 1.8.8-R0.1-SNAPSHOT 38 | provided 39 | 40 | 41 | 42 | org.jetbrains 43 | annotations 44 | 23.0.0 45 | provided 46 | 47 | 48 | 49 | org.projectlombok 50 | lombok 51 | 1.18.24 52 | provided 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/ButtonFormat.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.button.Button; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import org.apache.commons.lang.Validate; 7 | import org.bukkit.event.inventory.InventoryClickEvent; 8 | import org.bukkit.inventory.Inventory; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | /** 12 | * Represents inventory format for a @{@link Button}. 13 | * @param The inventory item type. 14 | */ 15 | public interface ButtonFormat extends SimpleFormat{ 16 | 17 | /** 18 | * Return @{@link Button} instance for this format. 19 | * 20 | * @return The button instance. 21 | */ 22 | @NotNull 23 | Button getButton(); 24 | 25 | @Override 26 | default void accept(@NotNull InventoryClickEvent event, @NotNull InventoryBuilder builder) { 27 | accept(event, builder, this); 28 | } 29 | 30 | default void accept(@NotNull InventoryClickEvent event, 31 | @NotNull InventoryBuilder builder, 32 | @NotNull InventoryFormat format) { 33 | 34 | Validate.notNull(event, "event cannot be null"); 35 | Validate.notNull(builder, "builder cannot be null"); 36 | 37 | getButton().accept(event, builder, format); 38 | } 39 | 40 | /** 41 | * Format inventory with given button. 42 | * 43 | * @param inventory The inventory. 44 | * @param builder The builder. 45 | */ 46 | @Override 47 | default void format(@NotNull Inventory inventory, @NotNull InventoryBuilder builder) { 48 | if (!getButton().canFormat(inventory, builder, this)) return; 49 | 50 | int slot = getSlot(); 51 | if (slot >= 0 && slot < inventory.getSize()) { 52 | inventory.setItem(slot, getItemStack(inventory, builder)); 53 | } 54 | } 55 | 56 | /** 57 | * Update button in inventory. 58 | * 59 | * @param inventory The inventory. 60 | * @param builder The builder. 61 | * @param caller The formatter that was updated. 62 | * 63 | * @return True if button was updated, false otherwise. 64 | */ 65 | default boolean update(@NotNull Inventory inventory, @NotNull InventoryBuilder builder, @NotNull InventoryFormat caller) { 66 | int slot = getSlot(); 67 | if (slot >= 0) { 68 | boolean format = getButton().canFormat(inventory, builder, caller); 69 | inventory.setItem(slot, format ? getItemStack(inventory, builder) : null); 70 | return true; 71 | } 72 | 73 | return false; 74 | } 75 | 76 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/format/PaginatedFormat.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.format; 2 | 3 | import br.com.blecaute.inventory.InventoryBuilder; 4 | import br.com.blecaute.inventory.configuration.PaginatedConfiguration; 5 | import br.com.blecaute.inventory.type.InventoryItem; 6 | import br.com.blecaute.inventory.util.ListUtil; 7 | import org.bukkit.inventory.Inventory; 8 | import org.jetbrains.annotations.ApiStatus; 9 | import org.jetbrains.annotations.NotNull; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | /** 15 | * Represents a paginated inventory format 16 | * @param The @{@link InventoryItem} type. 17 | */ 18 | public interface PaginatedFormat extends InventoryFormat { 19 | 20 | /** 21 | * Get the @{@link PaginatedConfiguration} for this formatter. 22 | * 23 | * @return The paginated configuration. 24 | */ 25 | @NotNull 26 | PaginatedConfiguration getConfiguration(); 27 | 28 | /** 29 | * Get size of objects in this formatter. 30 | * 31 | * @return The objects size. 32 | */ 33 | @Deprecated 34 | @ApiStatus.ScheduledForRemoval 35 | int getSize(); 36 | 37 | /** 38 | * Get size of objects in this formatter. 39 | * 40 | * @return The objects size. 41 | */ 42 | int getObjectsSize(); 43 | 44 | /** 45 | * Get number of pages. 46 | * 47 | * @return The number of pages. 48 | */ 49 | @Deprecated 50 | @ApiStatus.ScheduledForRemoval 51 | int getPages(); 52 | 53 | /** 54 | * Get pages number. 55 | * 56 | * @return The pages number. 57 | */ 58 | int getPagesSize(); 59 | 60 | /** 61 | * Get current page number. 62 | * 63 | * @return The current page number. 64 | */ 65 | int getCurrentPage(); 66 | 67 | /** 68 | * Set current page number. 69 | * 70 | * @param inventory The inventory. 71 | * @param builder The builder. 72 | * @param page The page. 73 | */ 74 | void setCurrentPage(@NotNull Inventory inventory, @NotNull InventoryBuilder builder, int page); 75 | 76 | /** 77 | * Calculate pages number. 78 | * 79 | * @param size The size of objects in each page. 80 | * @param items The items. 81 | * @param map The map of pages. 82 | * 83 | * @param The @{@link InventoryFormat} type. 84 | */ 85 | default > void calculate(int size, List items, @NotNull Map> map) { 86 | if (map.size() > 0) return; 87 | if (size <= 0) { 88 | map.put(1, items); 89 | return; 90 | } 91 | 92 | for (int page = 0; items.size() > page * size; page++) { 93 | map.put(page + 1, ListUtil.getSublist(items, page + 1, size)); 94 | } 95 | } 96 | } -------------------------------------------------------------------------------- /src/main/java/br/com/blecaute/inventory/configuration/PaginatedConfiguration.java: -------------------------------------------------------------------------------- 1 | package br.com.blecaute.inventory.configuration; 2 | 3 | import br.com.blecaute.inventory.button.Button; 4 | import br.com.blecaute.inventory.validator.SlotInvalidator; 5 | import lombok.*; 6 | import org.jetbrains.annotations.ApiStatus; 7 | import org.jetbrains.annotations.Nullable; 8 | 9 | import java.util.*; 10 | 11 | /** 12 | * The PaginatedConfiguration is designed to configure paginated inventories. 13 | */ 14 | @Getter 15 | @Builder 16 | @RequiredArgsConstructor 17 | @AllArgsConstructor 18 | public class PaginatedConfiguration implements Configuration { 19 | 20 | @NonNull 21 | private final String identifier; 22 | 23 | @Builder.Default @Nullable 24 | private SlotInvalidator validator = null; 25 | 26 | private int start; 27 | private int end; 28 | private int size; 29 | 30 | @NonNull @Singular 31 | private Set