diff --git a/src/main/java/de/shiewk/smoderation/SModeration.java b/src/main/java/de/shiewk/smoderation/SModeration.java index 2d9d968..2e01c60 100644 --- a/src/main/java/de/shiewk/smoderation/SModeration.java +++ b/src/main/java/de/shiewk/smoderation/SModeration.java @@ -3,6 +3,7 @@ package de.shiewk.smoderation; import de.shiewk.smoderation.command.BanCommand; import de.shiewk.smoderation.command.KickCommand; import de.shiewk.smoderation.command.MuteCommand; +import de.shiewk.smoderation.event.CustomInventoryEvents; import de.shiewk.smoderation.listener.PunishmentListener; import de.shiewk.smoderation.storage.PunishmentContainer; import org.bukkit.command.PluginCommand; @@ -23,6 +24,7 @@ public final class SModeration extends JavaPlugin { @Override public void onEnable() { getPluginManager().registerEvents(new PunishmentListener(), this); + getPluginManager().registerEvents(new CustomInventoryEvents(), this); final PluginCommand mute = getCommand("mute"); assert mute != null; diff --git a/src/main/java/de/shiewk/smoderation/event/CustomInventoryEvents.java b/src/main/java/de/shiewk/smoderation/event/CustomInventoryEvents.java new file mode 100644 index 0000000..efe398b --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/event/CustomInventoryEvents.java @@ -0,0 +1,17 @@ +package de.shiewk.smoderation.event; + +import de.shiewk.smoderation.inventory.CustomInventory; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; + +public class CustomInventoryEvents implements Listener { + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onInventoryClick(InventoryClickEvent event){ + if (event.getInventory().getHolder() instanceof CustomInventory customInventory){ + customInventory.click(event.getCurrentItem()); + event.setCancelled(true); + } + } +} diff --git a/src/main/java/de/shiewk/smoderation/inventory/CustomInventory.java b/src/main/java/de/shiewk/smoderation/inventory/CustomInventory.java new file mode 100644 index 0000000..629dbed --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/inventory/CustomInventory.java @@ -0,0 +1,24 @@ +package de.shiewk.smoderation.inventory; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Material; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; + +public interface CustomInventory extends InventoryHolder { + + void refresh(); + void open(); + void click(ItemStack stack); + + default ItemStack createEmptyStack(){ + ItemStack stack = new ItemStack(Material.BLACK_STAINED_GLASS_PANE); + stack.editMeta(meta -> meta.displayName(Component.empty())); + return stack; + } + + default Component applyFormatting(Component component){ + return component.decoration(TextDecoration.ITALIC, false); + } +} diff --git a/src/main/java/de/shiewk/smoderation/inventory/PageableCustomInventory.java b/src/main/java/de/shiewk/smoderation/inventory/PageableCustomInventory.java new file mode 100644 index 0000000..aaa408c --- /dev/null +++ b/src/main/java/de/shiewk/smoderation/inventory/PageableCustomInventory.java @@ -0,0 +1,66 @@ +package de.shiewk.smoderation.inventory; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public abstract class PageableCustomInventory implements CustomInventory { + public abstract int lastPage(); + public abstract void switchPage(); + private ItemStack previousStack = null; + private ItemStack nextStack = null; + private int page = 0; + + public int getPage(){ + return page; + } + + @Override + public void click(ItemStack stack) { + if (stack != null){ + if (stack.equals(previousStack)){ + previousPage(); + } else if (stack.equals(nextStack)) { + nextPage(); + } + } + } + + public void nextPage(){ + if (page < lastPage()){ + page++; + switchPage(); + refresh(); + } + } + + public void previousPage(){ + if (page > 0){ + page--; + switchPage(); + refresh(); + } + } + + public ItemStack createPreviousPageStack(){ + boolean allowed = page > 0; + TextColor color = allowed ? NamedTextColor.GREEN : NamedTextColor.RED; + int skip = allowed ? page : page+1; + ItemStack stack = new ItemStack(allowed ? Material.GREEN_STAINED_GLASS_PANE : Material.RED_STAINED_GLASS_PANE); + stack.editMeta(meta -> meta.displayName(applyFormatting(Component.text("Previous page (%s/%s)".formatted(skip, lastPage()+1)).color(color)))); + previousStack = stack; + return stack; + } + + public ItemStack createNextPageStack(){ + boolean allowed = page < lastPage(); + TextColor color = allowed ? NamedTextColor.GREEN : NamedTextColor.RED; + int skip = allowed ? page+2 : page+1; + ItemStack stack = new ItemStack(allowed ? Material.GREEN_STAINED_GLASS_PANE : Material.RED_STAINED_GLASS_PANE); + stack.editMeta(meta -> meta.displayName(applyFormatting(Component.text("Next page (%s/%s)".formatted(skip, lastPage()+1)).color(color)))); + nextStack = stack; + return stack; + } +}