From 3bbd427d7c3f1f6295a6224ce6b3c55cada1077c Mon Sep 17 00:00:00 2001 From: unurled Date: Tue, 12 Mar 2024 15:06:20 +0100 Subject: [PATCH] attribute gui --- build.gradle.kts | 3 + .../sr/commands/admin/AttributeCommand.java | 29 ++++- .../sr/gui/attributes/AttributeItem.java | 101 ++++++++++++++++++ .../sr/gui/attributes/AttributesGUI.java | 34 ++++++ 4 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/unurled/sacredrealms/sr/gui/attributes/AttributeItem.java create mode 100644 src/main/java/me/unurled/sacredrealms/sr/gui/attributes/AttributesGUI.java diff --git a/build.gradle.kts b/build.gradle.kts index 676cd9c..b1d817f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,12 +10,15 @@ description = "The main SR plugin." repositories { mavenCentral() + maven("https://repo.xenondevs.xyz/releases") } dependencies { paperweight.paperDevBundle("1.20.4-R0.1-SNAPSHOT") implementation("redis.clients:jedis:5.1.2") + + implementation("xyz.xenondevs.invui:invui:1.26") } java { diff --git a/src/main/java/me/unurled/sacredrealms/sr/commands/admin/AttributeCommand.java b/src/main/java/me/unurled/sacredrealms/sr/commands/admin/AttributeCommand.java index 630ed68..5a7a5e3 100644 --- a/src/main/java/me/unurled/sacredrealms/sr/commands/admin/AttributeCommand.java +++ b/src/main/java/me/unurled/sacredrealms/sr/commands/admin/AttributeCommand.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import me.unurled.sacredrealms.sr.components.attributes.Attribute; import me.unurled.sacredrealms.sr.components.player.PlayerManager; import me.unurled.sacredrealms.sr.components.player.SRPlayer; +import me.unurled.sacredrealms.sr.gui.attributes.AttributesGUI; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -16,6 +17,7 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import xyz.xenondevs.invui.window.Window; public class AttributeCommand implements TabExecutor { @@ -58,13 +60,38 @@ public class AttributeCommand implements TabExecutor { } if (args.length <= 2) { sender.sendMessage( - "Usage: /attribute [value]"); + "Usage: /attribute [value]"); return true; } if (args[0].equals("set") && args.length < 4) { sender.sendMessage("Usage: /attribute set "); return true; } + if (args[0].equals("gui")) { + // open gui + if (args.length != 2) { + sender.sendMessage("Usage: /attribute gui "); + return true; + } + if (!(sender instanceof Player p)) { + sender.sendMessage("You must be a player to use this command."); + return true; + } + Player target = Bukkit.getPlayer(args[1]); + if (target == null) { + sender.sendMessage("Player not found."); + return true; + } + Window window = + Window.single() + .setViewer(p) + .setTitle("Attributes") + .setGui(AttributesGUI.createGui(target)) + .build(); + window.open(); + + return true; + } if (args[1].equals("item-in-hand")) { if (!(sender instanceof Player target)) { sender.sendMessage("You must be a player to use this command."); diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/attributes/AttributeItem.java b/src/main/java/me/unurled/sacredrealms/sr/gui/attributes/AttributeItem.java new file mode 100644 index 0000000..991370b --- /dev/null +++ b/src/main/java/me/unurled/sacredrealms/sr/gui/attributes/AttributeItem.java @@ -0,0 +1,101 @@ +package me.unurled.sacredrealms.sr.gui.attributes; + +import static me.unurled.sacredrealms.sr.utils.Component.comp; + +import me.unurled.sacredrealms.sr.components.attributes.Attribute; +import me.unurled.sacredrealms.sr.components.player.PlayerManager; +import me.unurled.sacredrealms.sr.components.player.SRPlayer; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import xyz.xenondevs.inventoryaccess.component.AdventureComponentWrapper; +import xyz.xenondevs.invui.item.Item; +import xyz.xenondevs.invui.item.ItemProvider; +import xyz.xenondevs.invui.item.builder.ItemBuilder; +import xyz.xenondevs.invui.item.impl.AbstractItem; +import xyz.xenondevs.invui.window.Window; + +public class AttributeItem extends AbstractItem { + + private final Attribute attribute; + + private final Player targetPlayer; + + public AttributeItem(Attribute attribute, Player target) { + this.attribute = attribute; + this.targetPlayer = target; + } + + /** + * Gets the {@link ItemProvider}. This method gets called every time a {@link Window} is notified + * ({@link #notifyWindows()}). + * + * @return The {@link ItemProvider} + */ + @Override + public ItemProvider getItemProvider() { + + double value = 0; + + if (targetPlayer != null) { + PlayerManager playerManager = PlayerManager.getInstance(PlayerManager.class); + SRPlayer sp = playerManager.getPlayer(targetPlayer.getUniqueId()); + if (sp != null) value = sp.getAttribute(attribute); + } + + ItemBuilder ip = + switch (attribute) { + case STRENGTH -> new ItemBuilder(Material.IRON_SWORD).setDisplayName("Strength " + value); + case AGILITY -> new ItemBuilder(Material.BOW).setDisplayName("Agility " + value); + case MANA -> new ItemBuilder(Material.ENCHANTING_TABLE).setDisplayName("Mana " + value); + case HEALTH -> new ItemBuilder(Material.GOLDEN_APPLE).setDisplayName("Health " + value); + case LUCK -> + new ItemBuilder(Material.ENCHANTED_GOLDEN_APPLE).setDisplayName("Luck " + value); + case DEFENSE -> new ItemBuilder(Material.SHIELD).setDisplayName("Defense " + value); + case CHARISMA -> + new ItemBuilder(Material.PLAYER_HEAD).setDisplayName("Charisma " + value); + }; + + ip.addLoreLines(new AdventureComponentWrapper(comp("+1 Left Click to increase"))); + ip.addLoreLines(new AdventureComponentWrapper(comp("-1 Right Click to decrease"))); + ip.addLoreLines( + new AdventureComponentWrapper(comp("Shift + Left Click to increase by 10"))); + ip.addLoreLines( + new AdventureComponentWrapper(comp("Shift + Right Click to decrease by 10"))); + + return ip; + } + + /** + * A method called if the {@link ItemStack} associated to this {@link Item} has been clicked by a + * player. + * + * @param clickType The {@link ClickType} the {@link Player} performed. + * @param player The {@link Player} who clicked on the {@link ItemStack}. + * @param event The {@link InventoryClickEvent} associated with this click. + */ + @Override + public void handleClick( + @NotNull ClickType clickType, @NotNull Player player, @NotNull InventoryClickEvent event) { + + if (targetPlayer != null) { + PlayerManager playerManager = PlayerManager.getInstance(PlayerManager.class); + SRPlayer sp = playerManager.getPlayer(targetPlayer.getUniqueId()); + if (sp != null) { + if (clickType == ClickType.LEFT) { + sp.setAttribute(attribute, sp.getAttribute(attribute) + 1); + } else if (clickType == ClickType.RIGHT) { + sp.setAttribute(attribute, sp.getAttribute(attribute) - 1); + } else if (clickType == ClickType.SHIFT_LEFT) { + sp.setAttribute(attribute, sp.getAttribute(attribute) + 10); + } else if (clickType == ClickType.SHIFT_RIGHT) { + sp.setAttribute(attribute, sp.getAttribute(attribute) - 10); + } + notifyWindows(); + } + } + } +} diff --git a/src/main/java/me/unurled/sacredrealms/sr/gui/attributes/AttributesGUI.java b/src/main/java/me/unurled/sacredrealms/sr/gui/attributes/AttributesGUI.java new file mode 100644 index 0000000..a231e0a --- /dev/null +++ b/src/main/java/me/unurled/sacredrealms/sr/gui/attributes/AttributesGUI.java @@ -0,0 +1,34 @@ +package me.unurled.sacredrealms.sr.gui.attributes; + +import static me.unurled.sacredrealms.sr.utils.Component.comp; + +import me.unurled.sacredrealms.sr.components.attributes.Attribute; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; +import xyz.xenondevs.invui.gui.Gui; +import xyz.xenondevs.invui.gui.Gui.Builder.Normal; +import xyz.xenondevs.invui.item.Item; +import xyz.xenondevs.invui.item.impl.SimpleItem; + +public class AttributesGUI { + + public static Gui createGui(Player target) { + ItemStack t = new ItemStack(Material.PLAYER_HEAD); + SkullMeta tMeta = (SkullMeta) t.getItemMeta(); + tMeta.setOwningPlayer(target); + tMeta.displayName(comp(target.getName())); + t.setItemMeta(tMeta); + Item head = new SimpleItem(t); + Normal gui = + Gui.normal() + .setStructure(".........", "....h....", ".........", ".0123456.") + .addIngredient('h', head); + for (int i = 0; i < Attribute.values().length; i++) { + Item item = new AttributeItem(Attribute.values()[i], target); + gui.addIngredient((char) (i + '0'), item); + } + return gui.build(); + } +}