From d7b8963f00748e80047d1c7ffcf2e81aee777538 Mon Sep 17 00:00:00 2001 From: Taahh Date: Wed, 8 Jul 2026 22:02:13 -0700 Subject: [PATCH] Replace guild inventory menus with dialogs --- src/main/java/dev/plex/Guilds.java | 8 +- .../java/dev/plex/command/GuildCommand.java | 2 +- .../dev/plex/command/sub/MenuSubCommand.java | 2 +- .../command/sub/PermissionsSubCommand.java | 2 +- .../dev/plex/dialog/GuildDialogService.java | 251 +++++++++++++++ .../plex/gui/GuildMenuInventoryHolder.java | 17 - src/main/java/dev/plex/gui/GuildMenuView.java | 8 - .../gui/RankPermissionInventoryHolder.java | 15 - .../dev/plex/handler/GuildMenuListener.java | 290 ------------------ .../handler/RankPermissionMenuListener.java | 134 -------- 10 files changed, 256 insertions(+), 473 deletions(-) create mode 100644 src/main/java/dev/plex/dialog/GuildDialogService.java delete mode 100644 src/main/java/dev/plex/gui/GuildMenuInventoryHolder.java delete mode 100644 src/main/java/dev/plex/gui/GuildMenuView.java delete mode 100644 src/main/java/dev/plex/gui/RankPermissionInventoryHolder.java delete mode 100644 src/main/java/dev/plex/handler/GuildMenuListener.java delete mode 100644 src/main/java/dev/plex/handler/RankPermissionMenuListener.java diff --git a/src/main/java/dev/plex/Guilds.java b/src/main/java/dev/plex/Guilds.java index e14840b..d5da4b9 100644 --- a/src/main/java/dev/plex/Guilds.java +++ b/src/main/java/dev/plex/Guilds.java @@ -2,11 +2,10 @@ package dev.plex; import dev.plex.command.GuildCommand; import dev.plex.config.ModuleConfig; +import dev.plex.dialog.GuildDialogService; import dev.plex.guild.GuildHolder; import dev.plex.handler.ChatHandlerImpl; -import dev.plex.handler.GuildMenuListener; import dev.plex.handler.GuildWorldProtectionListener; -import dev.plex.handler.RankPermissionMenuListener; import dev.plex.module.PlexModule; import dev.plex.api.storage.ModuleStorage; import dev.plex.storage.GuildRepository; @@ -22,9 +21,8 @@ public class Guilds extends PlexModule { private static Guilds module; private final GuildHolder guildHolder = new GuildHolder(); - private final GuildMenuListener guildMenuListener = new GuildMenuListener(); + private final GuildDialogService guildDialogService = new GuildDialogService(); private final GuildWorldProtectionListener guildWorldProtectionListener = new GuildWorldProtectionListener(); - private final RankPermissionMenuListener rankPermissionMenuListener = new RankPermissionMenuListener(); private final GuildWorldService guildWorldService = new GuildWorldService(); private GuildRepository guildRepository; @@ -71,9 +69,7 @@ public class Guilds extends PlexModule guildHolder.replaceAll(guilds); }); registerListener(new ChatHandlerImpl()); - registerListener(guildMenuListener); registerListener(guildWorldProtectionListener); - registerListener(rankPermissionMenuListener); } @Override diff --git a/src/main/java/dev/plex/command/GuildCommand.java b/src/main/java/dev/plex/command/GuildCommand.java index ae95db2..c1174d0 100644 --- a/src/main/java/dev/plex/command/GuildCommand.java +++ b/src/main/java/dev/plex/command/GuildCommand.java @@ -59,7 +59,7 @@ public class GuildCommand extends SimplePlexCommand return getSubs(); } Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse( - guild -> Guilds.get().getGuildMenuListener().openHome(player, guild), + guild -> Guilds.get().getGuildDialogService().openHome(player, guild), () -> player.sendMessage(messageComponent("guildNotFound")) ); return null; diff --git a/src/main/java/dev/plex/command/sub/MenuSubCommand.java b/src/main/java/dev/plex/command/sub/MenuSubCommand.java index bd6fc5e..feccef5 100644 --- a/src/main/java/dev/plex/command/sub/MenuSubCommand.java +++ b/src/main/java/dev/plex/command/sub/MenuSubCommand.java @@ -26,7 +26,7 @@ public class MenuSubCommand extends GuildSubCommand { assert player != null; Guilds.get().getGuildHolder().getGuild(player.getUniqueId()).ifPresentOrElse( - guild -> Guilds.get().getGuildMenuListener().openHome(player, guild), + guild -> Guilds.get().getGuildDialogService().openHome(player, guild), () -> send(player, messageComponent("guildNotFound")) ); return null; diff --git a/src/main/java/dev/plex/command/sub/PermissionsSubCommand.java b/src/main/java/dev/plex/command/sub/PermissionsSubCommand.java index ea23545..56e6276 100644 --- a/src/main/java/dev/plex/command/sub/PermissionsSubCommand.java +++ b/src/main/java/dev/plex/command/sub/PermissionsSubCommand.java @@ -32,7 +32,7 @@ public class PermissionsSubCommand extends GuildSubCommand send(player, messageComponent("guildNotOwner")); return; } - Guilds.get().getRankPermissionMenuListener().openRankList(player, guild); + Guilds.get().getGuildDialogService().openPermissions(player, guild); }, () -> send(player, messageComponent("guildNotFound"))); return null; } diff --git a/src/main/java/dev/plex/dialog/GuildDialogService.java b/src/main/java/dev/plex/dialog/GuildDialogService.java new file mode 100644 index 0000000..c35c458 --- /dev/null +++ b/src/main/java/dev/plex/dialog/GuildDialogService.java @@ -0,0 +1,251 @@ +package dev.plex.dialog; + +import dev.plex.Guilds; +import dev.plex.guild.Guild; +import dev.plex.guild.data.GuildPermission; +import dev.plex.guild.data.GuildRole; +import dev.plex.guild.data.Member; +import io.papermc.paper.dialog.Dialog; +import io.papermc.paper.registry.data.dialog.ActionButton; +import io.papermc.paper.registry.data.dialog.DialogBase; +import io.papermc.paper.registry.data.dialog.action.DialogAction; +import io.papermc.paper.registry.data.dialog.body.DialogBody; +import io.papermc.paper.registry.data.dialog.type.DialogType; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickCallback; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +public class GuildDialogService +{ + private static final UUID MEMBER_PERMISSION_PROBE = new UUID(0L, 0L); + + public void openHome(Player player, Guild guild) + { + player.showDialog(dialog( + title(guild.getName()), + List.of( + body("Welcome to your guild panel.", NamedTextColor.GRAY), + body("Manage members, enter your guild world, or configure member permissions.", NamedTextColor.DARK_AQUA) + ), + List.of( + button("Members", "View online status and manage members", audience -> player(audience, viewer -> openMembers(viewer, guild))), + button("Guild World", "Load and enter your ASP guild world", audience -> player(audience, viewer -> enterWorld(viewer, guild))), + button("Permissions", "Configure member block permissions", audience -> player(audience, viewer -> openPermissions(viewer, guild))) + ), + 1 + )); + } + + public void openMembers(Player player, Guild guild) + { + List buttons = new ArrayList<>(); + for (Member member : guild.getMembers()) + { + boolean online = Bukkit.getPlayer(member.getUuid()) != null; + buttons.add(button( + member.getName(), + (online ? "Online" : "Offline") + " - " + (guild.isOwner(member.getUuid()) ? "Owner" : "Member"), + audience -> player(audience, viewer -> openMember(viewer, guild, member.getUuid())) + )); + } + buttons.add(button("Back", "Return to the guild menu", audience -> player(audience, viewer -> openHome(viewer, guild)))); + player.showDialog(dialog( + title(guild.getName() + " Members"), + List.of(body("Select a member to view or manage them.", NamedTextColor.GRAY)), + buttons, + 1 + )); + } + + public void openMember(Player player, Guild guild, UUID memberUuid) + { + Member member = guild.getMember(memberUuid); + if (member == null) + { + openMembers(player, guild); + return; + } + boolean online = Bukkit.getPlayer(member.getUuid()) != null; + List body = List.of( + body("Status: " + (online ? "Online" : "Offline"), online ? NamedTextColor.GREEN : NamedTextColor.GRAY), + body("Role: " + (guild.isOwner(memberUuid) ? "Owner" : "Member"), guild.isOwner(memberUuid) ? NamedTextColor.GOLD : NamedTextColor.AQUA) + ); + List buttons = new ArrayList<>(); + if (guild.isOwner(player.getUniqueId()) && !guild.isOwner(memberUuid)) + { + buttons.add(button("Kick Member", "Remove this member from the guild", audience -> player(audience, viewer -> kickMember(viewer, guild, member)))); + buttons.add(button("Transfer Ownership", "Make this member the guild owner", audience -> player(audience, viewer -> transferOwner(viewer, guild, member)))); + } + if (guild.isOwner(player.getUniqueId())) + { + buttons.add(button("Permissions", "Edit member role permissions", audience -> player(audience, viewer -> openPermissions(viewer, guild)))); + } + buttons.add(button("Back", "Return to members", audience -> player(audience, viewer -> openMembers(viewer, guild)))); + player.showDialog(dialog(title(member.getName()), body, buttons, 1)); + } + + public void openPermissions(Player player, Guild guild) + { + if (!guild.isOwner(player.getUniqueId())) + { + player.sendMessage(Guilds.get().messageComponent("guildNotOwner")); + return; + } + List buttons = new ArrayList<>(); + for (GuildPermission permission : GuildPermission.values()) + { + boolean enabled = guild.hasPermission(MEMBER_PERMISSION_PROBE, permission); + buttons.add(button( + permission.displayName() + ": " + (enabled ? "Enabled" : "Disabled"), + "Click to toggle " + permission.displayName().toLowerCase(), + audience -> player(audience, viewer -> togglePermission(viewer, guild, permission)) + )); + } + buttons.add(button("Back", "Return to the guild menu", audience -> player(audience, viewer -> openHome(viewer, guild)))); + player.showDialog(dialog( + title("Member Permissions"), + List.of( + body("These permissions apply to regular guild members in the guild world.", NamedTextColor.GRAY), + body("Owners always bypass these restrictions.", NamedTextColor.GOLD) + ), + buttons, + 1 + )); + } + + private void enterWorld(Player player, Guild guild) + { + player.sendMessage(Guilds.get().messageComponent("guildWorldLoading")); + Guilds.get().getGuildWorldService().ensureWorld(guild).whenComplete((world, throwable) -> + { + if (throwable != null) + { + Guilds.get().api().scheduler().executeGlobal(() -> + { + throwable.printStackTrace(); + player.sendMessage(Guilds.get().messageComponent("guildWorldLoadFailed")); + }); + return; + } + Guilds.get().api().scheduler().executeEntity(player, () -> player.teleportAsync(world.getSpawnLocation().toCenterLocation()), 1L); + }); + } + + private void kickMember(Player player, Guild guild, Member member) + { + if (!guild.isOwner(player.getUniqueId()) || guild.isOwner(member.getUuid())) + { + return; + } + Guilds.get().getGuildRepository().removeMember(guild.getGuildUuid(), member.getUuid()).whenComplete((unused, throwable) -> + { + if (throwable != null) + { + player.sendMessage(Guilds.get().messageComponent("guildStorageFailed")); + return; + } + guild.removeMember(member.getUuid()); + Guilds.get().getGuildHolder().unindexMember(member.getUuid()); + Guilds.get().getGuildWorldService().ejectNonMembers(guild); + player.sendMessage(Guilds.get().messageComponent("guildMemberKicked", member.getName())); + openMembers(player, guild); + }); + } + + private void transferOwner(Player player, Guild guild, Member member) + { + if (!guild.isOwner(player.getUniqueId()) || guild.isOwner(member.getUuid())) + { + return; + } + Member previousOwner = guild.getMember(player.getUniqueId()); + Guilds.get().getGuildRepository().transferOwner(guild.getGuildUuid(), member.getUuid(), player.getUniqueId()).whenComplete((unused, throwable) -> + { + if (throwable != null) + { + player.sendMessage(Guilds.get().messageComponent("guildStorageFailed")); + return; + } + guild.setOwnerUuid(member.getUuid()); + member.setRole(GuildRole.OWNER); + if (previousOwner != null) + { + previousOwner.setRole(GuildRole.MEMBER); + } + player.sendMessage(Guilds.get().messageComponent("guildOwnerSet", member.getName())); + openMember(player, guild, previousOwner == null ? member.getUuid() : previousOwner.getUuid()); + }); + } + + private void togglePermission(Player player, Guild guild, GuildPermission permission) + { + boolean enabled = !guild.hasPermission(MEMBER_PERMISSION_PROBE, permission); + guild.setPermission(permission, enabled); + Guilds.get().getGuildRepository().updateMemberPermission(guild.getGuildUuid(), permission, enabled).whenComplete((unused, throwable) -> + { + if (throwable != null) + { + player.sendMessage(Guilds.get().messageComponent("guildStorageFailed")); + return; + } + openPermissions(player, guild); + }); + } + + private Dialog dialog(Component title, List body, List actions, int columns) + { + return Dialog.create(builder -> builder.empty() + .base(DialogBase.builder(title) + .body(body) + .canCloseWithEscape(true) + .build()) + .type(DialogType.multiAction(actions) + .columns(columns) + .build())); + } + + private ActionButton button(String label, String tooltip, java.util.function.Consumer callback) + { + return ActionButton.builder(text(label, NamedTextColor.AQUA)) + .tooltip(text(tooltip, NamedTextColor.GRAY)) + .width(200) + .action(DialogAction.customClick((response, audience) -> callback.accept(audience), ClickCallback.Options.builder() + .uses(1) + .lifetime(Duration.ofMinutes(5)) + .build())) + .build(); + } + + private DialogBody body(String text, NamedTextColor color) + { + return DialogBody.plainMessage(text(text, color)); + } + + private Component title(String value) + { + return text(value, NamedTextColor.DARK_AQUA); + } + + private Component text(String value, NamedTextColor color) + { + return Component.text(value, color).decoration(TextDecoration.ITALIC, false); + } + + private void player(Audience audience, java.util.function.Consumer playerConsumer) + { + if (audience instanceof Player player) + { + playerConsumer.accept(player); + } + } +} diff --git a/src/main/java/dev/plex/gui/GuildMenuInventoryHolder.java b/src/main/java/dev/plex/gui/GuildMenuInventoryHolder.java deleted file mode 100644 index cc2f082..0000000 --- a/src/main/java/dev/plex/gui/GuildMenuInventoryHolder.java +++ /dev/null @@ -1,17 +0,0 @@ -package dev.plex.gui; - -import dev.plex.guild.Guild; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.jetbrains.annotations.NotNull; - -import java.util.UUID; - -public record GuildMenuInventoryHolder(Guild guild, GuildMenuView view, UUID memberUuid) implements InventoryHolder -{ - @Override - public @NotNull Inventory getInventory() - { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/dev/plex/gui/GuildMenuView.java b/src/main/java/dev/plex/gui/GuildMenuView.java deleted file mode 100644 index faa8622..0000000 --- a/src/main/java/dev/plex/gui/GuildMenuView.java +++ /dev/null @@ -1,8 +0,0 @@ -package dev.plex.gui; - -public enum GuildMenuView -{ - HOME, - MEMBERS, - MEMBER -} diff --git a/src/main/java/dev/plex/gui/RankPermissionInventoryHolder.java b/src/main/java/dev/plex/gui/RankPermissionInventoryHolder.java deleted file mode 100644 index e62774c..0000000 --- a/src/main/java/dev/plex/gui/RankPermissionInventoryHolder.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.plex.gui; - -import dev.plex.guild.Guild; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.jetbrains.annotations.NotNull; - -public record RankPermissionInventoryHolder(Guild guild, String rankName) implements InventoryHolder -{ - @Override - public @NotNull Inventory getInventory() - { - throw new UnsupportedOperationException(); - } -} diff --git a/src/main/java/dev/plex/handler/GuildMenuListener.java b/src/main/java/dev/plex/handler/GuildMenuListener.java deleted file mode 100644 index f0c8f48..0000000 --- a/src/main/java/dev/plex/handler/GuildMenuListener.java +++ /dev/null @@ -1,290 +0,0 @@ -package dev.plex.handler; - -import dev.plex.Guilds; -import dev.plex.guild.Guild; -import dev.plex.guild.data.GuildRole; -import dev.plex.guild.data.Member; -import dev.plex.gui.GuildMenuInventoryHolder; -import dev.plex.gui.GuildMenuView; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.UUID; - -public class GuildMenuListener implements Listener -{ - private static final int MEMBERS_SLOT = 11; - private static final int WORLD_SLOT = 13; - private static final int PERMISSIONS_SLOT = 15; - private static final int BACK_SLOT = 26; - private static final int KICK_SLOT = 11; - private static final int OWNER_SLOT = 13; - private static final int RANK_PERMISSIONS_SLOT = 15; - - public void openHome(Player player, Guild guild) - { - Inventory inventory = Bukkit.createInventory(new GuildMenuInventoryHolder(guild, GuildMenuView.HOME, null), 27, title("* " + guild.getName())); - inventory.setItem(MEMBERS_SLOT, item(Material.PLAYER_HEAD, "Guild Members", NamedTextColor.AQUA, List.of( - line("View online status", NamedTextColor.GRAY), - line("Click to manage members", NamedTextColor.YELLOW) - ))); - inventory.setItem(WORLD_SLOT, item(Material.GRASS_BLOCK, "Guild World", NamedTextColor.GREEN, List.of( - line("Load and enter your guild world", NamedTextColor.GRAY), - line("Only guild members can access it", NamedTextColor.DARK_AQUA) - ))); - if (guild.isOwner(player.getUniqueId())) - { - inventory.setItem(PERMISSIONS_SLOT, item(Material.COMPARATOR, "Rank Permissions", NamedTextColor.GOLD, List.of( - line("Configure member build permissions", NamedTextColor.GRAY), - line("Break - Place - Interact", NamedTextColor.YELLOW) - ))); - } - player.openInventory(inventory); - } - - private void openMembers(Player player, Guild guild) - { - Inventory inventory = Bukkit.createInventory(new GuildMenuInventoryHolder(guild, GuildMenuView.MEMBERS, null), 54, title("* " + guild.getName() + " Members")); - List members = guild.getMembers(); - for (int i = 0; i < members.size() && i < 45; i++) - { - inventory.setItem(i, memberItem(guild, members.get(i))); - } - inventory.setItem(BACK_SLOT, item(Material.ARROW, "Back", NamedTextColor.YELLOW, List.of(line("Return to the guild menu", NamedTextColor.GRAY)))); - player.openInventory(inventory); - } - - private void openMember(Player player, Guild guild, Member member) - { - Inventory inventory = Bukkit.createInventory(new GuildMenuInventoryHolder(guild, GuildMenuView.MEMBER, member.getUuid()), 27, title("* " + member.getName())); - inventory.setItem(4, memberItem(guild, member)); - if (guild.isOwner(player.getUniqueId()) && !guild.isOwner(member.getUuid())) - { - inventory.setItem(KICK_SLOT, item(Material.BARRIER, "Kick Member", NamedTextColor.RED, List.of( - line("Remove this player from the guild", NamedTextColor.GRAY), - line("They will lose guild world access", NamedTextColor.DARK_RED) - ))); - inventory.setItem(OWNER_SLOT, item(Material.GOLDEN_HELMET, "Transfer Ownership", NamedTextColor.GOLD, List.of( - line("Make this player the guild owner", NamedTextColor.GRAY), - line("You will become a regular member", NamedTextColor.YELLOW) - ))); - } - if (guild.isOwner(player.getUniqueId())) - { - inventory.setItem(RANK_PERMISSIONS_SLOT, item(Material.COMPARATOR, "Rank Permissions", NamedTextColor.AQUA, List.of( - line("Open the rank permission editor", NamedTextColor.GRAY) - ))); - } - inventory.setItem(BACK_SLOT, item(Material.ARROW, "Back", NamedTextColor.YELLOW, List.of(line("Return to member list", NamedTextColor.GRAY)))); - player.openInventory(inventory); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onClick(InventoryClickEvent event) - { - if (!(event.getWhoClicked() instanceof Player player) || !(event.getInventory().getHolder() instanceof GuildMenuInventoryHolder holder)) - { - return; - } - event.setCancelled(true); - if (!holder.guild().isMember(player.getUniqueId())) - { - player.closeInventory(); - player.sendMessage(Guilds.get().messageComponent("guildNotFound")); - return; - } - ItemStack clickedItem = event.getCurrentItem(); - if (clickedItem == null || clickedItem.getType() == Material.AIR) - { - return; - } - switch (holder.view()) - { - case HOME -> clickHome(player, holder.guild(), event.getRawSlot()); - case MEMBERS -> clickMembers(player, holder.guild(), clickedItem, event.getRawSlot()); - case MEMBER -> clickMember(player, holder.guild(), holder.memberUuid(), event.getRawSlot()); - } - } - - private void clickHome(Player player, Guild guild, int slot) - { - if (slot == MEMBERS_SLOT) - { - openMembers(player, guild); - return; - } - if (slot == WORLD_SLOT) - { - player.closeInventory(); - Guilds.get().getGuildWorldService().ensureWorld(guild).whenComplete((world, throwable) -> - { - if (throwable != null) - { - Guilds.get().api().scheduler().executeGlobal(() -> player.sendMessage(Guilds.get().messageComponent("guildWorldLoadFailed"))); - return; - } - Guilds.get().api().scheduler().executeEntity(player, () -> player.teleportAsync(world.getSpawnLocation().toCenterLocation()), 1L); - }); - return; - } - if (slot == PERMISSIONS_SLOT && guild.isOwner(player.getUniqueId())) - { - Guilds.get().getRankPermissionMenuListener().openRankList(player, guild); - } - } - - private void clickMembers(Player player, Guild guild, ItemStack clickedItem, int slot) - { - if (slot == BACK_SLOT) - { - openHome(player, guild); - return; - } - memberUuid(clickedItem).map(guild::getMember).filter(Objects::nonNull).ifPresent(member -> openMember(player, guild, member)); - } - - private void clickMember(Player player, Guild guild, UUID memberUuid, int slot) - { - Member member = guild.getMember(memberUuid); - if (member == null) - { - openMembers(player, guild); - return; - } - if (slot == BACK_SLOT) - { - openMembers(player, guild); - return; - } - if (!guild.isOwner(player.getUniqueId())) - { - return; - } - if (slot == KICK_SLOT && !guild.isOwner(memberUuid)) - { - Guilds.get().getGuildRepository().removeMember(guild.getGuildUuid(), memberUuid).whenComplete((unused, throwable) -> - { - if (throwable != null) - { - player.sendMessage(Guilds.get().messageComponent("guildStorageFailed")); - return; - } - guild.removeMember(memberUuid); - Guilds.get().getGuildHolder().unindexMember(memberUuid); - Guilds.get().getGuildWorldService().ejectNonMembers(guild); - player.sendMessage(Guilds.get().messageComponent("guildMemberKicked", member.getName())); - openMembers(player, guild); - }); - return; - } - if (slot == OWNER_SLOT && !guild.isOwner(memberUuid)) - { - Member previousOwner = guild.getMember(player.getUniqueId()); - Guilds.get().getGuildRepository().transferOwner(guild.getGuildUuid(), memberUuid, player.getUniqueId()).whenComplete((unused, throwable) -> - { - if (throwable != null) - { - player.sendMessage(Guilds.get().messageComponent("guildStorageFailed")); - return; - } - guild.setOwnerUuid(memberUuid); - member.setRole(GuildRole.OWNER); - if (previousOwner != null) - { - previousOwner.setRole(GuildRole.MEMBER); - } - player.sendMessage(Guilds.get().messageComponent("guildOwnerSet", member.getName())); - openMember(player, guild, previousOwner == null ? member : previousOwner); - }); - return; - } - if (slot == RANK_PERMISSIONS_SLOT) - { - Guilds.get().getRankPermissionMenuListener().openRankList(player, guild); - } - } - - private ItemStack memberItem(Guild guild, Member member) - { - boolean online = Bukkit.getPlayer(member.getUuid()) != null; - ItemStack itemStack = new ItemStack(online ? Material.LIME_WOOL : Material.GRAY_WOOL); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.displayName(text(member.getName(), online ? NamedTextColor.GREEN : NamedTextColor.GRAY)); - List lore = new ArrayList<>(); - lore.add(label("Status", online ? "Online" : "Offline", online ? NamedTextColor.GREEN : NamedTextColor.GRAY)); - lore.add(label("Role", guild.isOwner(member.getUuid()) ? "Owner" : "Member", guild.isOwner(member.getUuid()) ? NamedTextColor.GOLD : NamedTextColor.AQUA)); - lore.add(label("Rank", guild.isOwner(member.getUuid()) ? "Owner" : "Member", NamedTextColor.LIGHT_PURPLE)); - lore.add(Component.empty()); - lore.add(line("Click to manage", NamedTextColor.YELLOW)); - itemMeta.lore(lore); - itemMeta.addItemFlags(ItemFlag.values()); - itemMeta.getPersistentDataContainer().set(Keys.MEMBER_UUID, org.bukkit.persistence.PersistentDataType.STRING, member.getUuid().toString()); - itemStack.setItemMeta(itemMeta); - return itemStack; - } - - private ItemStack item(Material material, String name, NamedTextColor color, List lore) - { - ItemStack itemStack = new ItemStack(material); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.displayName(text(name, color)); - itemMeta.lore(lore); - itemMeta.addItemFlags(ItemFlag.values()); - itemStack.setItemMeta(itemMeta); - return itemStack; - } - - private Component title(String value) - { - return text(value, NamedTextColor.DARK_AQUA); - } - - private Component text(String value, NamedTextColor color) - { - return Component.text(value, color).decoration(TextDecoration.ITALIC, false); - } - - private Component line(String value, NamedTextColor color) - { - return text("> " + value, color); - } - - private Component label(String label, String value, NamedTextColor valueColor) - { - return text(label + ": ", NamedTextColor.GRAY).append(text(value, valueColor)); - } - - private java.util.Optional memberUuid(ItemStack itemStack) - { - if (!itemStack.hasItemMeta()) - { - return java.util.Optional.empty(); - } - String value = itemStack.getItemMeta().getPersistentDataContainer().get(Keys.MEMBER_UUID, org.bukkit.persistence.PersistentDataType.STRING); - if (value == null) - { - return java.util.Optional.empty(); - } - return java.util.Optional.of(UUID.fromString(value)); - } - - private static class Keys - { - private static final org.bukkit.NamespacedKey MEMBER_UUID = new org.bukkit.NamespacedKey("plex_guilds", "member_uuid"); - } -} diff --git a/src/main/java/dev/plex/handler/RankPermissionMenuListener.java b/src/main/java/dev/plex/handler/RankPermissionMenuListener.java deleted file mode 100644 index cd12396..0000000 --- a/src/main/java/dev/plex/handler/RankPermissionMenuListener.java +++ /dev/null @@ -1,134 +0,0 @@ -package dev.plex.handler; - -import dev.plex.Guilds; -import dev.plex.guild.Guild; -import dev.plex.guild.data.GuildPermission; -import dev.plex.gui.RankPermissionInventoryHolder; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; -import net.kyori.adventure.text.format.TextDecoration; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.List; -import java.util.UUID; - -public class RankPermissionMenuListener implements Listener -{ - private static final UUID MEMBER_PERMISSION_PROBE = new UUID(0L, 0L); - - public void openRankList(Player player, Guild guild) - { - Inventory inventory = Bukkit.createInventory(new RankPermissionInventoryHolder(guild, null), 27, title("* Guild Rank Permissions")); - inventory.setItem(13, rankItem()); - player.openInventory(inventory); - } - - @EventHandler(priority = EventPriority.HIGH) - public void onClick(InventoryClickEvent event) - { - if (!(event.getWhoClicked() instanceof Player player) || !(event.getInventory().getHolder() instanceof RankPermissionInventoryHolder holder)) - { - return; - } - event.setCancelled(true); - if (!holder.guild().isOwner(player.getUniqueId())) - { - player.closeInventory(); - player.sendMessage(Guilds.get().messageComponent("guildNotOwner")); - return; - } - ItemStack clickedItem = event.getCurrentItem(); - if (clickedItem == null || clickedItem.getType() == Material.AIR) - { - return; - } - if (holder.rankName() == null) - { - openPermissionEditor(player, holder.guild()); - return; - } - GuildPermission permission = permissionBySlot(event.getRawSlot()); - if (permission == null) - { - return; - } - boolean enabled = !holder.guild().hasPermission(MEMBER_PERMISSION_PROBE, permission); - holder.guild().setPermission(permission, enabled); - Guilds.get().getGuildRepository().updateMemberPermission(holder.guild().getGuildUuid(), permission, enabled); - openPermissionEditor(player, holder.guild()); - } - - private void openPermissionEditor(Player player, Guild guild) - { - Inventory inventory = Bukkit.createInventory(new RankPermissionInventoryHolder(guild, "MEMBER"), 27, title("* Member Permissions")); - GuildPermission[] permissions = GuildPermission.values(); - for (int i = 0; i < permissions.length; i++) - { - inventory.setItem(11 + i * 2, permissionItem(guild, permissions[i])); - } - player.openInventory(inventory); - } - - private GuildPermission permissionBySlot(int slot) - { - return switch (slot) - { - case 11 -> GuildPermission.BLOCK_BREAKING; - case 13 -> GuildPermission.BLOCK_PLACING; - case 15 -> GuildPermission.INTERACTING; - default -> null; - }; - } - - private ItemStack rankItem() - { - ItemStack itemStack = new ItemStack(Material.NAME_TAG); - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.displayName(text("Member", NamedTextColor.AQUA)); - itemMeta.lore(List.of( - line("Manage member guild world access", NamedTextColor.GRAY), - line("Click to edit permissions", NamedTextColor.YELLOW) - )); - itemStack.setItemMeta(itemMeta); - return itemStack; - } - - private ItemStack permissionItem(Guild guild, GuildPermission permission) - { - ItemStack itemStack = new ItemStack(permission.material()); - ItemMeta itemMeta = itemStack.getItemMeta(); - boolean enabled = guild.hasPermission(MEMBER_PERMISSION_PROBE, permission); - itemMeta.displayName(text(permission.displayName(), enabled ? NamedTextColor.GREEN : NamedTextColor.RED)); - itemMeta.lore(List.of( - text("Status: ", NamedTextColor.GRAY).append(text(enabled ? "Enabled" : "Disabled", enabled ? NamedTextColor.GREEN : NamedTextColor.RED)), - Component.empty(), - line("Click to toggle", NamedTextColor.YELLOW) - )); - itemStack.setItemMeta(itemMeta); - return itemStack; - } - - private Component title(String value) - { - return text(value, NamedTextColor.DARK_AQUA); - } - - private Component text(String value, NamedTextColor color) - { - return Component.text(value, color).decoration(TextDecoration.ITALIC, false); - } - - private Component line(String value, NamedTextColor color) - { - return text("> " + value, color); - } -}