From 3593f4517efd73367810fb13389fce8275a35cd1 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Wed, 1 Sep 2021 12:44:45 +0200 Subject: [PATCH] Add prompts (#5248) * Add prompts * Add missing permission test --- resources/lang/en-US.yml | 8 ++- .../conversation/ResidentConversation.java | 59 +++++++++++++++++++ .../towny/conversation/TownyConversation.java | 37 ++++++++++++ .../listeners/TownyInventoryListener.java | 3 + .../bukkit/towny/utils/PermissionGUIUtil.java | 54 +++++++++++++++++ 5 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 src/com/palmergames/bukkit/towny/conversation/ResidentConversation.java create mode 100644 src/com/palmergames/bukkit/towny/conversation/TownyConversation.java diff --git a/resources/lang/en-US.yml b/resources/lang/en-US.yml index 068ebe88ca..b38974b69b 100644 --- a/resources/lang/en-US.yml +++ b/resources/lang/en-US.yml @@ -1,5 +1,5 @@ name: Towny -version: 0.119 +version: 0.120 language: english author: ElgarL website: 'http://townyadvanced.github.io/' @@ -1497,4 +1497,8 @@ status_title_nopvp: '&a(No PVP)' #Added in 0.119 msg_err_resident_cannot_be_jailed_because_they_are_outlawed_there: 'You cannot jail your resident because they are in a location where they are outlawed.' -msg_err_resident_cannot_be_jailed_because_they_are_enemied_there: 'You cannot jail your resident because they are in a location where they are considered an enemy.' \ No newline at end of file +msg_err_resident_cannot_be_jailed_because_they_are_enemied_there: 'You cannot jail your resident because they are in a location where they are considered an enemy.' + +#Added in 0.120 +msg_resident_prompt: 'Enter the name of the player in chat, or q to exit. This will automatically time out in 30 seconds.' +msg_prompt_cancel: 'Prompt cancelled or timed out.' \ No newline at end of file diff --git a/src/com/palmergames/bukkit/towny/conversation/ResidentConversation.java b/src/com/palmergames/bukkit/towny/conversation/ResidentConversation.java new file mode 100644 index 0000000000..82b8402666 --- /dev/null +++ b/src/com/palmergames/bukkit/towny/conversation/ResidentConversation.java @@ -0,0 +1,59 @@ +package com.palmergames.bukkit.towny.conversation; + +import com.palmergames.bukkit.towny.Towny; +import com.palmergames.bukkit.towny.TownyAPI; +import com.palmergames.bukkit.towny.TownyMessaging; +import com.palmergames.bukkit.towny.object.Resident; +import com.palmergames.bukkit.towny.object.Translatable; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.ConversationFactory; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * A conversation that is used for getting resident input via chat. + */ +public class ResidentConversation extends TownyConversation { + public ResidentConversation(Player player) { + new ConversationFactory(Towny.getPlugin()) + .withPrefix(this) + .addConversationAbandonedListener(this) + .withFirstPrompt(new ResidentPrompt()) + .withEscapeSequence("q") + .withTimeout(30) + .withLocalEcho(false) + .withModality(false) + .buildConversation(player) + .begin(); + } + + private class ResidentPrompt extends StringPrompt { + public ResidentPrompt() { + super(); + } + + @NotNull + @Override + public String getPromptText(@NotNull ConversationContext context) { + return Translatable.of("msg_resident_prompt").forLocale(getPlayer(context)); + } + + @Nullable + @Override + public Prompt acceptInput(@NotNull ConversationContext context, @Nullable String string) { + if (string != null) { + Resident resident = TownyAPI.getInstance().getResident(string); + + if (resident == null) + TownyMessaging.sendErrorMsg(getPlayer(context), Translatable.of("msg_err_not_registered_1", string)); + else if (consumer != null) + consumer.accept(resident); + } + + return Prompt.END_OF_CONVERSATION; + } + } +} diff --git a/src/com/palmergames/bukkit/towny/conversation/TownyConversation.java b/src/com/palmergames/bukkit/towny/conversation/TownyConversation.java new file mode 100644 index 0000000000..faa3837122 --- /dev/null +++ b/src/com/palmergames/bukkit/towny/conversation/TownyConversation.java @@ -0,0 +1,37 @@ +package com.palmergames.bukkit.towny.conversation; + +import com.palmergames.bukkit.towny.TownyMessaging; +import com.palmergames.bukkit.towny.object.Translatable; +import org.bukkit.conversations.ConversationAbandonedEvent; +import org.bukkit.conversations.ConversationAbandonedListener; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.ConversationPrefix; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Consumer; + +public class TownyConversation implements ConversationPrefix, ConversationAbandonedListener { + + public Consumer consumer; + + @NotNull + @Override + public String getPrefix(@NotNull ConversationContext context) { + return Translatable.of("default_towny_prefix").forLocale(getPlayer(context)); + } + + public Player getPlayer(@NotNull ConversationContext context) { + return (Player) context.getForWhom(); + } + + public void runOnResponse(Consumer consumer) { + this.consumer = consumer; + } + + @Override + public void conversationAbandoned(@NotNull ConversationAbandonedEvent event) { + if (!event.gracefulExit()) + TownyMessaging.sendMsg(getPlayer(event.getContext()), Translatable.of("msg_prompt_cancel")); + } +} diff --git a/src/com/palmergames/bukkit/towny/listeners/TownyInventoryListener.java b/src/com/palmergames/bukkit/towny/listeners/TownyInventoryListener.java index 8f83858720..dab28beb30 100644 --- a/src/com/palmergames/bukkit/towny/listeners/TownyInventoryListener.java +++ b/src/com/palmergames/bukkit/towny/listeners/TownyInventoryListener.java @@ -79,6 +79,9 @@ public void onClick(InventoryClickEvent event) { Towny.getAdventure().player(player).playSound(clickSound); } else if (event.getCurrentItem().getType() == Material.WRITTEN_BOOK) { player.openBook(PermissionGUIUtil.createTutorialBook()); + } else if (event.getCurrentItem().getType() == Material.NAME_TAG) { + PermissionGUIUtil.handleConversation(player); + event.getWhoClicked().closeInventory(); } else { int currentPage = resident.getGUIPageNum(); diff --git a/src/com/palmergames/bukkit/towny/utils/PermissionGUIUtil.java b/src/com/palmergames/bukkit/towny/utils/PermissionGUIUtil.java index 7f2d56b77d..25ec602971 100644 --- a/src/com/palmergames/bukkit/towny/utils/PermissionGUIUtil.java +++ b/src/com/palmergames/bukkit/towny/utils/PermissionGUIUtil.java @@ -2,20 +2,27 @@ import com.palmergames.bukkit.towny.TownyAPI; import com.palmergames.bukkit.towny.TownyFormatter; +import com.palmergames.bukkit.towny.TownyMessaging; +import com.palmergames.bukkit.towny.TownyUniverse; import com.palmergames.bukkit.towny.command.PlotCommand; +import com.palmergames.bukkit.towny.conversation.ResidentConversation; import com.palmergames.bukkit.towny.exceptions.TownyException; import com.palmergames.bukkit.towny.object.PermissionData; +import com.palmergames.bukkit.towny.object.PlotGroup; import com.palmergames.bukkit.towny.object.Translatable; +import com.palmergames.bukkit.towny.object.WorldCoord; import com.palmergames.bukkit.towny.object.gui.EditGUI; import com.palmergames.bukkit.towny.object.gui.PermissionGUI; import com.palmergames.bukkit.towny.object.Resident; import com.palmergames.bukkit.towny.object.TownBlock; import com.palmergames.bukkit.towny.object.TownyPermission.ActionType; +import com.palmergames.bukkit.towny.permissions.PermissionNodes; import com.palmergames.bukkit.util.BukkitTools; import com.palmergames.bukkit.util.Colors; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; @@ -97,6 +104,15 @@ public static void openPermissionGUI(@NotNull Resident resident, @NotNull TownBl page.addItem(skull); } + if (canEdit) { + ItemStack addButton = new ItemStack(Material.NAME_TAG); + ItemMeta addButtonMeta = addButton.getItemMeta(); + addButtonMeta.setDisplayName(Colors.Gold + "Add Player"); + addButton.setItemMeta(addButtonMeta); + + page.setItem(46, addButton); + } + page.setItem(52, createTutorialBook()); pages.add(page); @@ -170,4 +186,42 @@ public static ItemStack createTutorialBook() { book.setItemMeta(meta); return book; } + + public static void handleConversation(Player player) { + TownBlock startingTownBlock = WorldCoord.parseWorldCoord(player).getTownBlockOrNull(); + if (startingTownBlock == null) { + TownyMessaging.sendErrorMsg(player, Translatable.of("msg_not_claimed_1")); + return; + } + + new ResidentConversation(player).runOnResponse((res) -> { + if (!TownyUniverse.getInstance().getPermissionSource().testPermission(player, PermissionNodes.TOWNY_COMMAND_PLOT_PERM_ADD.getNode())) { + TownyMessaging.sendErrorMsg(player, Translatable.of("msg_err_command_disable")); + return; + } + + Resident resident = (Resident) res; + if (startingTownBlock.hasPlotObjectGroup()) { + PlotGroup group = startingTownBlock.getPlotObjectGroup(); + + if (group.getPermissionOverrides().containsKey(resident)) { + TownyMessaging.sendErrorMsg(player, Translatable.of("msg_overrides_already_set", resident.getName(), Translatable.of("plotgroup_sing"))); + return; + } + + group.putPermissionOverride(resident, new PermissionData(PermissionGUIUtil.getDefaultTypes(), player.getName())); + } else { + if (startingTownBlock.getPermissionOverrides().containsKey(resident)) { + TownyMessaging.sendErrorMsg(player, Translatable.of("msg_overrides_already_set", resident.getName(), Translatable.of("townblock"))); + return; + } + + startingTownBlock.getPermissionOverrides().put(resident, new PermissionData(PermissionGUIUtil.getDefaultTypes(), player.getName())); + startingTownBlock.save(); + } + + TownyMessaging.sendMsg(player, Translatable.of("msg_overrides_added", resident.getName())); + PermissionGUIUtil.openPermissionGUI(TownyAPI.getInstance().getResident(player), startingTownBlock); + }); + } }