1
mirror of https://github.com/Shiewk/SModeration.git synced 2026-04-28 05:54:16 +02:00

Support for custom inventories

This commit is contained in:
Shy
2024-06-08 12:53:40 +02:00
parent 16e28b59e0
commit e2fcf9797c
4 changed files with 109 additions and 0 deletions
@@ -3,6 +3,7 @@ package de.shiewk.smoderation;
import de.shiewk.smoderation.command.BanCommand; import de.shiewk.smoderation.command.BanCommand;
import de.shiewk.smoderation.command.KickCommand; import de.shiewk.smoderation.command.KickCommand;
import de.shiewk.smoderation.command.MuteCommand; import de.shiewk.smoderation.command.MuteCommand;
import de.shiewk.smoderation.event.CustomInventoryEvents;
import de.shiewk.smoderation.listener.PunishmentListener; import de.shiewk.smoderation.listener.PunishmentListener;
import de.shiewk.smoderation.storage.PunishmentContainer; import de.shiewk.smoderation.storage.PunishmentContainer;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
@@ -23,6 +24,7 @@ public final class SModeration extends JavaPlugin {
@Override @Override
public void onEnable() { public void onEnable() {
getPluginManager().registerEvents(new PunishmentListener(), this); getPluginManager().registerEvents(new PunishmentListener(), this);
getPluginManager().registerEvents(new CustomInventoryEvents(), this);
final PluginCommand mute = getCommand("mute"); final PluginCommand mute = getCommand("mute");
assert mute != null; assert mute != null;
@@ -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);
}
}
}
@@ -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);
}
}
@@ -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;
}
}