Update to v1.6.0 version.

Remove AnvilGUI, as it is broken. Replaced with Spigot Conversation API.
Remove lore-config from GUI (broken).
Remove RIGHT_CLICK to complete multiple times (broken).
This commit is contained in:
BuildTools 2019-08-25 22:43:15 +03:00
parent b6e2133782
commit c516d53907
16 changed files with 522 additions and 293 deletions

12
pom.xml
View File

@ -36,10 +36,9 @@
<powermock.version>1.7.4</powermock.version> <powermock.version>1.7.4</powermock.version>
<!-- More visible way how to change dependency versions --> <!-- More visible way how to change dependency versions -->
<spigot.version>1.13.2-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.13.2-R0.1-SNAPSHOT</spigot.version>
<bentobox.version>1.6.0-SNAPSHOT</bentobox.version> <bentobox.version>1.6.0</bentobox.version>
<level.version>1.5.0</level.version> <level.version>1.5.0</level.version>
<vault.version>1.7</vault.version> <vault.version>1.7</vault.version>
<anvilgui.version>1.2.2-SNAPSHOT</anvilgui.version>
<!-- Revision variable removes warning about dynamic version --> <!-- Revision variable removes warning about dynamic version -->
<revision>${build.version}-SNAPSHOT</revision> <revision>${build.version}-SNAPSHOT</revision>
<!-- This allows to change between versions and snapshots. --> <!-- This allows to change between versions and snapshots. -->
@ -115,10 +114,6 @@
<id>jitpack.io</id> <id>jitpack.io</id>
<url>https://jitpack.io</url> <url>https://jitpack.io</url>
</repository> </repository>
<repository>
<id>wesjd-repo</id>
<url>https://nexus.wesjd.net/repository/thirdparty/</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
@ -170,11 +165,6 @@
<version>${vault.version}</version> <version>${vault.version}</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>net.wesjd</groupId>
<artifactId>anvilgui</artifactId>
<version>${anvilgui.version}</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -5,9 +5,11 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.conversations.*;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -21,7 +23,12 @@ import org.bukkit.inventory.meta.SkullMeta;
import org.bukkit.inventory.meta.SpawnEggMeta; import org.bukkit.inventory.meta.SpawnEggMeta;
import org.bukkit.inventory.meta.TropicalFishBucketMeta; import org.bukkit.inventory.meta.TropicalFishBucketMeta;
import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionData;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.TextComponent;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.api.user.User;
@ -917,5 +924,68 @@ public abstract class CommonGUI
return result; return result;
} }
// ---------------------------------------------------------------------
// Section: Chat Input Methods
// ---------------------------------------------------------------------
/**
* This method will close opened gui and writes inputText in chat. After players answers on inputText in
* chat, message will trigger consumer and gui will reopen.
* @param consumer Consumer that accepts player output text.
* @param question Message that will be displayed in chat when player triggers conversion.
* @param message Message that will be set in player text field when clicked on question.
*/
protected void getFriendlyName(Consumer<String> consumer, @NonNull String question, @Nullable String message)
{
final User user = this.user;
Conversation conversation =
new ConversationFactory(BentoBox.getInstance()).withFirstPrompt(
new StringPrompt()
{
/**
* @see Prompt#getPromptText(ConversationContext)
*/
@Override
public String getPromptText(ConversationContext conversationContext)
{
// Close input GUI.
user.closeInventory();
if (message != null)
{
// Create Edit Text message.
TextComponent component = new TextComponent(user.getTranslation("challenges.gui.descriptions.admin.click-to-edit"));
component.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, message));
// Send question and message to player.
user.getPlayer().spigot().sendMessage(component);
}
// There are no editable message. Just return question.
return question;
}
/**
* @see Prompt#acceptInput(ConversationContext, String)
*/
@Override
public Prompt acceptInput(ConversationContext conversationContext, String answer)
{
// Add answer to consumer.
consumer.accept(answer);
// End conversation
return Prompt.END_OF_CONVERSATION;
}
}).
withLocalEcho(false).
withPrefix(context -> user.getTranslation("challenges.gui.questions.prefix")).
buildConversation(user.getPlayer());
conversation.begin();
}
} }

View File

@ -3,13 +3,19 @@ package world.bentobox.challenges.panel.admin;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.conversations.*;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.eclipse.jdt.annotation.NonNull;
import net.wesjd.anvilgui.AnvilGUI; import java.util.function.Consumer;
import java.util.function.Function;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.util.Util;
import world.bentobox.challenges.ChallengesAddon; import world.bentobox.challenges.ChallengesAddon;
import world.bentobox.challenges.panel.CommonGUI; import world.bentobox.challenges.panel.CommonGUI;
import world.bentobox.challenges.panel.util.ConfirmationGUI; import world.bentobox.challenges.panel.util.ConfirmationGUI;
@ -208,14 +214,10 @@ public class AdminGUI extends CommonGUI
description = this.user.getTranslation("challenges.gui.descriptions.admin.create-challenge"); description = this.user.getTranslation("challenges.gui.descriptions.admin.create-challenge");
icon = new ItemStack(Material.BOOK); icon = new ItemStack(Material.BOOK);
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(this.addon.getPlugin(),
this.user.getPlayer(),
"unique_id",
(player, reply) -> {
String newName = Utils.getGameMode(this.world) + "_" + reply;
if (!this.addon.getChallengesManager().containsChallenge(newName)) this.getNewUniqueID(challenge -> {
{ String newName = Utils.getGameMode(this.world) + "_" + challenge;
new EditChallengeGUI(this.addon, new EditChallengeGUI(this.addon,
this.world, this.world,
this.user, this.user,
@ -223,14 +225,13 @@ public class AdminGUI extends CommonGUI
this.topLabel, this.topLabel,
this.permissionPrefix, this.permissionPrefix,
this).build(); this).build();
} },
else input -> {
{ String newName = Utils.getGameMode(this.world) + "_" + input;
this.user.sendMessage("challenges.errors.unique-id", "[id]", reply); return !this.addon.getChallengesManager().containsChallenge(newName);
} },
this.user.getTranslation("challenges.question.admin.unique-id")
return reply; );
});
return true; return true;
}; };
@ -244,14 +245,10 @@ public class AdminGUI extends CommonGUI
description = this.user.getTranslation("challenges.gui.descriptions.admin.create-level"); description = this.user.getTranslation("challenges.gui.descriptions.admin.create-level");
icon = new ItemStack(Material.BOOK); icon = new ItemStack(Material.BOOK);
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(this.addon.getPlugin(),
this.user.getPlayer(),
"unique_id",
(player, reply) -> {
String newName = Utils.getGameMode(this.world) + "_" + reply;
if (!this.addon.getChallengesManager().containsLevel(newName)) this.getNewUniqueID(level -> {
{ String newName = Utils.getGameMode(this.world) + "_" + level;
new EditLevelGUI(this.addon, new EditLevelGUI(this.addon,
this.world, this.world,
this.user, this.user,
@ -259,14 +256,13 @@ public class AdminGUI extends CommonGUI
this.topLabel, this.topLabel,
this.permissionPrefix, this.permissionPrefix,
this).build(); this).build();
} },
else input -> {
{ String newName = Utils.getGameMode(this.world) + "_" + input;
this.user.sendMessage("challenges.errors.unique-id", "[id]", reply); return !this.addon.getChallengesManager().containsLevel(newName);
} },
this.user.getTranslation("challenges.question.admin.unique-id")
return reply; );
});
return true; return true;
}; };
@ -496,4 +492,111 @@ public class AdminGUI extends CommonGUI
clickHandler(clickHandler). clickHandler(clickHandler).
build(); build();
} }
// ---------------------------------------------------------------------
// Section: Conversation
// ---------------------------------------------------------------------
/**
* This method will close opened gui and writes inputText in chat. After players answers on
* inputText in chat, message will trigger consumer and gui will reopen.
* @param consumer Consumer that accepts player output text.
* @param question Message that will be displayed in chat when player triggers conversion.
*/
private void getNewUniqueID(Consumer<String> consumer,
Function<String, Boolean> stringValidation,
@NonNull String question)
{
final User user = this.user;
Conversation conversation =
new ConversationFactory(BentoBox.getInstance()).withFirstPrompt(
new ValidatingPrompt()
{
/**
* Gets the text to display to the user when
* this prompt is first presented.
*
* @param context Context information about the
* conversation.
* @return The text to display.
*/
@Override
public String getPromptText(ConversationContext context)
{
// Close input GUI.
user.closeInventory();
// There are no editable message. Just return question.
return question;
}
/**
* Override this method to check the validity of
* the player's input.
*
* @param context Context information about the
* conversation.
* @param input The player's raw console input.
* @return True or false depending on the
* validity of the input.
*/
@Override
protected boolean isInputValid(ConversationContext context, String input)
{
return stringValidation.apply(input);
}
/**
* Optionally override this method to
* display an additional message if the
* user enters an invalid input.
*
* @param context Context information
* about the conversation.
* @param invalidInput The invalid input
* provided by the user.
* @return A message explaining how to
* correct the input.
*/
@Override
protected String getFailedValidationText(ConversationContext context,
String invalidInput)
{
return user.getTranslation("challenges.errors.unique-id", "[id]", invalidInput);
}
/**
* Override this method to accept and processes
* the validated input from the user. Using the
* input, the next Prompt in the prompt graph
* should be returned.
*
* @param context Context information about the
* conversation.
* @param input The validated input text from
* the user.
* @return The next Prompt in the prompt graph.
*/
@Override
protected Prompt acceptValidatedInput(ConversationContext context, String input)
{
// Add answer to consumer.
consumer.accept(input);
// End conversation
return Prompt.END_OF_CONVERSATION;
}
}).
withLocalEcho(false).
withPrefix(context -> user.getTranslation("challenges.gui.questions.prefix")).
buildConversation(user.getPlayer());
conversation.begin();
}
} }

View File

@ -8,7 +8,6 @@ import org.bukkit.inventory.ItemStack;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.wesjd.anvilgui.AnvilGUI;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
@ -16,10 +15,7 @@ import world.bentobox.bentobox.api.user.User;
import world.bentobox.challenges.ChallengesAddon; import world.bentobox.challenges.ChallengesAddon;
import world.bentobox.challenges.database.object.Challenge; import world.bentobox.challenges.database.object.Challenge;
import world.bentobox.challenges.panel.CommonGUI; import world.bentobox.challenges.panel.CommonGUI;
import world.bentobox.challenges.panel.util.ItemSwitchGUI; import world.bentobox.challenges.panel.util.*;
import world.bentobox.challenges.panel.util.NumberGUI;
import world.bentobox.challenges.panel.util.SelectEnvironmentGUI;
import world.bentobox.challenges.panel.util.StringListGUI;
import world.bentobox.challenges.utils.GuiUtils; import world.bentobox.challenges.utils.GuiUtils;
import world.bentobox.challenges.utils.Utils; import world.bentobox.challenges.utils.Utils;
@ -406,23 +402,15 @@ public class EditChallengeGUI extends CommonGUI
"challenges.gui.descriptions.admin.icon-challenge")); "challenges.gui.descriptions.admin.icon-challenge"));
icon = this.challenge.getIcon(); icon = this.challenge.getIcon();
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(this.addon.getPlugin(),
this.user.getPlayer(),
this.challenge.getIcon().getType().name(),
(player, reply) -> {
Material material = Material.getMaterial(reply);
if (material != null) new SelectBlocksGUI(this.user, true, (status, materials) -> {
if (status)
{ {
this.challenge.setIcon(new ItemStack(material)); materials.forEach(material ->
this.challenge.setIcon(new ItemStack(material)));
}
this.build(); this.build();
}
else
{
this.user.sendMessage("challenges.errors.wrong-icon", "[value]", reply);
}
return reply;
}); });
return true; return true;
@ -543,14 +531,14 @@ public class EditChallengeGUI extends CommonGUI
icon = new ItemStack(Material.DROPPER); icon = new ItemStack(Material.DROPPER);
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(this.addon.getPlugin(),
this.user.getPlayer(), this.getFriendlyName(reply -> {
this.challenge.getFriendlyName(),
(player, reply) -> {
this.challenge.setFriendlyName(reply); this.challenge.setFriendlyName(reply);
this.build(); this.build();
return reply; },
}); this.user.getTranslation("challenges.gui.questions.admin.challenge-name"),
this.challenge.getFriendlyName()
);
return true; return true;
}; };

View File

@ -13,7 +13,6 @@ import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import net.wesjd.anvilgui.AnvilGUI;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
@ -23,10 +22,7 @@ import world.bentobox.challenges.ChallengesManager;
import world.bentobox.challenges.database.object.Challenge; import world.bentobox.challenges.database.object.Challenge;
import world.bentobox.challenges.database.object.ChallengeLevel; import world.bentobox.challenges.database.object.ChallengeLevel;
import world.bentobox.challenges.panel.CommonGUI; import world.bentobox.challenges.panel.CommonGUI;
import world.bentobox.challenges.panel.util.ItemSwitchGUI; import world.bentobox.challenges.panel.util.*;
import world.bentobox.challenges.panel.util.NumberGUI;
import world.bentobox.challenges.panel.util.SelectChallengeGUI;
import world.bentobox.challenges.panel.util.StringListGUI;
import world.bentobox.challenges.utils.GuiUtils; import world.bentobox.challenges.utils.GuiUtils;
import world.bentobox.challenges.utils.Utils; import world.bentobox.challenges.utils.Utils;
@ -337,14 +333,14 @@ public class EditLevelGUI extends CommonGUI
"[value]", this.challengeLevel.getFriendlyName())); "[value]", this.challengeLevel.getFriendlyName()));
icon = new ItemStack(Material.DROPPER); icon = new ItemStack(Material.DROPPER);
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(this.addon.getPlugin(),
this.user.getPlayer(), this.getFriendlyName(reply -> {
this.challengeLevel.getFriendlyName(),
(player, reply) -> {
this.challengeLevel.setFriendlyName(reply); this.challengeLevel.setFriendlyName(reply);
this.build(); this.build();
return reply; },
}); this.user.getTranslation("challenges.gui.questions.admin.level-name"),
this.challengeLevel.getFriendlyName()
);
return true; return true;
}; };
@ -358,23 +354,15 @@ public class EditLevelGUI extends CommonGUI
"challenges.gui.descriptions.admin.icon-level")); "challenges.gui.descriptions.admin.icon-level"));
icon = this.challengeLevel.getIcon(); icon = this.challengeLevel.getIcon();
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(this.addon.getPlugin(),
this.user.getPlayer(),
this.challengeLevel.getIcon().getType().name(),
(player, reply) -> {
Material material = Material.getMaterial(reply);
if (material != null) new SelectBlocksGUI(this.user, true, (status, materials) -> {
if (status)
{ {
this.challengeLevel.setIcon(new ItemStack(material)); materials.forEach(material ->
this.challengeLevel.setIcon(new ItemStack(material)));
}
this.build(); this.build();
}
else
{
this.user.sendMessage("challenges.errors.wrong-icon", "[value]", reply);
}
return reply;
}); });
return true; return true;
@ -400,30 +388,14 @@ public class EditLevelGUI extends CommonGUI
} }
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(this.addon.getPlugin(), new SelectBlocksGUI(this.user, true, (status, materials) -> {
this.user.getPlayer(), if (status)
isNull ? "NULL" : icon.getType().name(),
(player, reply) -> {
if (reply.equals("NULL"))
{ {
this.challengeLevel.setLockedIcon(null); materials.forEach(material ->
this.challengeLevel.setLockedIcon(new ItemStack(material)));
}
this.build(); this.build();
return reply;
}
Material material = Material.getMaterial(reply);
if (material != null)
{
this.challengeLevel.setLockedIcon(new ItemStack(material));
this.build();
}
else
{
this.user.sendMessage("challenges.errors.wrong-icon", "[value]", reply);
}
return reply;
}); });
return true; return true;

View File

@ -8,7 +8,6 @@ import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import net.wesjd.anvilgui.AnvilGUI;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
@ -17,6 +16,7 @@ import world.bentobox.challenges.ChallengesAddon;
import world.bentobox.challenges.Settings; import world.bentobox.challenges.Settings;
import world.bentobox.challenges.panel.CommonGUI; import world.bentobox.challenges.panel.CommonGUI;
import world.bentobox.challenges.panel.util.NumberGUI; import world.bentobox.challenges.panel.util.NumberGUI;
import world.bentobox.challenges.panel.util.SelectBlocksGUI;
import world.bentobox.challenges.utils.GuiUtils; import world.bentobox.challenges.utils.GuiUtils;
@ -240,14 +240,16 @@ public class EditSettingsGUI extends CommonGUI
name = this.user.getTranslation("challenges.gui.buttons.admin.level-lore"); name = this.user.getTranslation("challenges.gui.buttons.admin.level-lore");
icon = new ItemStack(Material.MAP); icon = new ItemStack(Material.MAP);
clickHandler = (panel, user1, clickType, i) -> { clickHandler = (panel, user1, clickType, i) -> {
new AnvilGUI(this.addon.getPlugin(),
this.user.getPlayer(), // TODO: AnvilGUI is out. Need to implement better GUI for editing this.
this.settings.getLevelLoreMessage(), // new AnvilGUI(this.addon.getPlugin(),
(player, reply) -> { // this.user.getPlayer(),
this.settings.setLevelLoreMessage(reply); // this.settings.getLevelLoreMessage(),
panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); // (player, reply) -> {
return reply; // this.settings.setLevelLoreMessage(reply);
}); // panel.getInventory().setItem(i, this.getSettingsButton(button).getItem());
// return reply;
// });
return true; return true;
}; };
@ -263,14 +265,16 @@ public class EditSettingsGUI extends CommonGUI
name = this.user.getTranslation("challenges.gui.buttons.admin.challenge-lore"); name = this.user.getTranslation("challenges.gui.buttons.admin.challenge-lore");
icon = new ItemStack(Material.PAPER); icon = new ItemStack(Material.PAPER);
clickHandler = (panel, user1, clickType, i) -> { clickHandler = (panel, user1, clickType, i) -> {
new AnvilGUI(this.addon.getPlugin(), // TODO: AnvilGUI is out. Need to implement better GUI for editing this.
this.user.getPlayer(),
this.settings.getChallengeLoreMessage(), // new AnvilGUI(this.addon.getPlugin(),
(player, reply) -> { // this.user.getPlayer(),
this.settings.setChallengeLoreMessage(reply); // this.settings.getChallengeLoreMessage(),
panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); // (player, reply) -> {
return reply; // this.settings.setChallengeLoreMessage(reply);
}); // panel.getInventory().setItem(i, this.getSettingsButton(button).getItem());
// return reply;
// });
return true; return true;
}; };
@ -441,23 +445,15 @@ public class EditSettingsGUI extends CommonGUI
name = this.user.getTranslation("challenges.gui.buttons.admin.default-locked-icon"); name = this.user.getTranslation("challenges.gui.buttons.admin.default-locked-icon");
icon = this.settings.getLockedLevelIcon(); icon = this.settings.getLockedLevelIcon();
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(this.addon.getPlugin(),
this.user.getPlayer(),
this.settings.getLockedLevelIcon().getType().name(),
(player, reply) -> {
Material material = Material.getMaterial(reply);
if (material != null) new SelectBlocksGUI(this.user, true, (status, materials) -> {
if (status)
{ {
this.settings.setLockedLevelIcon(new ItemStack(material)); materials.forEach(material ->
this.settings.setLockedLevelIcon(new ItemStack(material)));
}
this.build(); this.build();
}
else
{
this.user.sendMessage("challenges.errors.wrong-icon", "[value]", reply);
}
return reply;
}); });
return true; return true;

View File

@ -2,12 +2,10 @@ package world.bentobox.challenges.panel.user;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.List; import java.util.List;
import net.wesjd.anvilgui.AnvilGUI;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
@ -360,34 +358,35 @@ public class ChallengesGUI extends CommonGUI
// Add ability to input how many repeats player should do. // Add ability to input how many repeats player should do.
// Do not open if challenge is not repeatable. // Do not open if challenge is not repeatable.
if (clickType.isRightClick() && challenge.isRepeatable()) // TODO: AnvilGUI is removed. Need to use different input mode.
{ // if (clickType.isRightClick() && challenge.isRepeatable())
new AnvilGUI(this.addon.getPlugin(), // {
this.user.getPlayer(), // new AnvilGUI(this.addon.getPlugin(),
"1", // this.user.getPlayer(),
(player, reply) -> { // "1",
try // (player, reply) -> {
{ // try
if (TryToComplete.complete(this.addon, // {
this.user, // if (TryToComplete.complete(this.addon,
challenge, // this.user,
this.world, // challenge,
this.topLabel, // this.world,
this.permissionPrefix, // this.topLabel,
Integer.parseInt(reply))) // this.permissionPrefix,
{ // Integer.parseInt(reply)))
panel.getInventory().setItem(slot, this.getChallengeButton(challenge).getItem()); // {
} // panel.getInventory().setItem(slot, this.getChallengeButton(challenge).getItem());
} // }
catch (Exception e) // }
{ // catch (Exception e)
this.user.sendMessage("challenges.errors.not-a-integer", "[value]", reply); // {
} // this.user.sendMessage("challenges.errors.not-a-integer", "[value]", reply);
// }
return reply; //
}); // return reply;
} // });
else // }
// else
{ {
if (TryToComplete.complete(this.addon, if (TryToComplete.complete(this.addon,
this.user, this.user,

View File

@ -2,11 +2,12 @@ package world.bentobox.challenges.panel.util;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.conversations.*;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.util.Collections; import org.eclipse.jdt.annotation.NonNull;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Consumer;
import net.wesjd.anvilgui.AnvilGUI;
import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
@ -140,34 +141,12 @@ public class NumberGUI
description = this.user.getTranslation("challenges.gui.descriptions.admin.input"); description = this.user.getTranslation("challenges.gui.descriptions.admin.input");
icon = new ItemStack(Material.ANVIL); icon = new ItemStack(Material.ANVIL);
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
new AnvilGUI(BentoBox.getInstance(),
this.user.getPlayer(),
Integer.toString(this.value),
(player, reply) -> {
try
{
this.value = Integer.parseInt(reply);
if (this.value > this.maxValue || this.value < this.minValue) this.getNumberInput(number -> {
{ this.value = number.intValue();
this.user.sendMessage("challenges.errors.not-valid-integer",
"[value]", reply,
"[min]", Integer.toString(this.minValue),
"[max]", Integer.toString(this.maxValue));
}
else
{
this.build(); this.build();
} },
} this.user.getTranslation("challenges.gui.questions.admin.number"));
catch (Exception e)
{
reply = Integer.toString(this.value);
this.user.sendMessage("challenges.errors.not-a-integer", "[value]", reply);
}
return reply;
});
return true; return true;
}; };
@ -368,6 +347,120 @@ public class NumberGUI
} }
// ---------------------------------------------------------------------
// Section: Conversation
// ---------------------------------------------------------------------
/**
* This method will close opened gui and writes inputText in chat. After players answers on
* inputText in chat, message will trigger consumer and gui will reopen.
* @param consumer Consumer that accepts player output text.
* @param question Message that will be displayed in chat when player triggers conversion.
*/
private void getNumberInput(Consumer<Number> consumer, @NonNull String question)
{
final User user = this.user;
Conversation conversation =
new ConversationFactory(BentoBox.getInstance()).withFirstPrompt(
new NumericPrompt()
{
/**
* Override this method to perform some action
* with the user's integer response.
*
* @param context Context information about the
* conversation.
* @param input The user's response as a {@link
* Number}.
* @return The next {@link Prompt} in the prompt
* graph.
*/
@Override
protected Prompt acceptValidatedInput(ConversationContext context, Number input)
{
// Add answer to consumer.
consumer.accept(input);
// Reopen GUI
NumberGUI.this.build();
// End conversation
return Prompt.END_OF_CONVERSATION;
}
/**
* Override this method to do further validation on the numeric player
* input after the input has been determined to actually be a number.
*
* @param context Context information about the conversation.
* @param input The number the player provided.
* @return The validity of the player's input.
*/
protected boolean isNumberValid(ConversationContext context, Number input)
{
return input.intValue() >= NumberGUI.this.minValue &&
input.intValue() <= NumberGUI.this.maxValue;
}
/**
* Optionally override this method to display an additional message if the
* user enters an invalid number.
*
* @param context Context information about the conversation.
* @param invalidInput The invalid input provided by the user.
* @return A message explaining how to correct the input.
*/
@Override
protected String getInputNotNumericText(ConversationContext context,
String invalidInput)
{
return NumberGUI.this.user.getTranslation("challenges.errors.not-a-integer", "[value]", invalidInput);
}
/**
* Optionally override this method to display an additional message if the
* user enters an invalid numeric input.
*
* @param context Context information about the conversation.
* @param invalidInput The invalid input provided by the user.
* @return A message explaining how to correct the input.
*/
@Override
protected String getFailedValidationText(ConversationContext context,
Number invalidInput)
{
return NumberGUI.this.user.getTranslation("challenges.errors.not-valid-integer",
"[value]", invalidInput.toString(),
"[min]", Integer.toString(NumberGUI.this.minValue),
"[max]", Integer.toString(NumberGUI.this.maxValue));
}
/**
* @see Prompt#getPromptText(ConversationContext)
*/
@Override
public String getPromptText(ConversationContext conversationContext)
{
// Close input GUI.
user.closeInventory();
// There are no editable message. Just return question.
return question;
}
}).
withLocalEcho(false).
withPrefix(context ->
NumberGUI.this.user.getTranslation("challenges.gui.questions.prefix")).
buildConversation(user.getPlayer());
conversation.begin();
}
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// Section: Enums // Section: Enums
// --------------------------------------------------------------------- // ---------------------------------------------------------------------

View File

@ -23,14 +23,20 @@ public class SelectBlocksGUI
{ {
public SelectBlocksGUI(User user, BiConsumer<Boolean, Set<Material>> consumer) public SelectBlocksGUI(User user, BiConsumer<Boolean, Set<Material>> consumer)
{ {
this(user, Collections.emptySet(), consumer); this(user, false, new HashSet<>(), consumer);
}
public SelectBlocksGUI(User user, boolean singleSelect, BiConsumer<Boolean, Set<Material>> consumer)
{
this(user, singleSelect, new HashSet<>(), consumer);
} }
public SelectBlocksGUI(User user, Set<Material> excludedMaterial, BiConsumer<Boolean, Set<Material>> consumer) public SelectBlocksGUI(User user, boolean singleSelect, Set<Material> excludedMaterial, BiConsumer<Boolean, Set<Material>> consumer)
{ {
this.consumer = consumer; this.consumer = consumer;
this.user = user; this.user = user;
this.singleSelect = singleSelect;
// Current GUI cannot display air blocks. It crashes with null-pointer // Current GUI cannot display air blocks. It crashes with null-pointer
excludedMaterial.add(Material.AIR); excludedMaterial.add(Material.AIR);
@ -185,7 +191,7 @@ public class SelectBlocksGUI
this.user.getTranslation("challenges.gui.descriptions.admin.selected") : ""). this.user.getTranslation("challenges.gui.descriptions.admin.selected") : "").
icon(itemStack). icon(itemStack).
clickHandler((panel, user1, clickType, slot) -> { clickHandler((panel, user1, clickType, slot) -> {
if (clickType.isRightClick()) if (!this.singleSelect && clickType.isRightClick())
{ {
if (!this.selectedMaterials.add(material)) if (!this.selectedMaterials.add(material))
{ {
@ -230,4 +236,9 @@ public class SelectBlocksGUI
* User who runs GUI. * User who runs GUI.
*/ */
private User user; private User user;
/**
* This indicate that return set must contain only single item.
*/
private boolean singleSelect;
} }

View File

@ -15,7 +15,6 @@ import java.util.function.Consumer;
import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import net.wesjd.anvilgui.AnvilGUI;
import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
@ -78,8 +77,6 @@ public class StringListGUI
panelBuilder.item(5, this.getButton(Button.REMOVE)); panelBuilder.item(5, this.getButton(Button.REMOVE));
panelBuilder.item(6, this.getButton(Button.CLEAR)); panelBuilder.item(6, this.getButton(Button.CLEAR));
panelBuilder.item(8, this.getButton(Button.MODE));
panelBuilder.item(44, this.getButton(Button.CANCEL)); panelBuilder.item(44, this.getButton(Button.CANCEL));
int slot = 10; int slot = 10;
@ -154,23 +151,8 @@ public class StringListGUI
icon = new ItemStack(Material.WHITE_STAINED_GLASS_PANE); icon = new ItemStack(Material.WHITE_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> { clickHandler = (panel, user, clickType, slot) -> {
if (this.useAnvil) this.getStringInput(value -> this.value.add(value),
{
new AnvilGUI(BentoBox.getInstance(),
this.user.getPlayer(),
" ",
(player, reply) -> {
this.value.add(reply);
this.build();
return reply;
});
}
else
{
this.startConversion(value ->
this.value.add(value),
this.user.getTranslation("challenges.gui.descriptions.admin.add-text-line")); this.user.getTranslation("challenges.gui.descriptions.admin.add-text-line"));
}
return true; return true;
}; };
@ -201,18 +183,6 @@ public class StringListGUI
}; };
break; break;
} }
case MODE:
{
name = this.user.getTranslation("challenges.gui.buttons.admin.input-mode");
description = Collections.singletonList(this.user.getTranslation("challenges.gui.descriptions.admin.input-mode"));
icon = this.useAnvil ? new ItemStack(Material.ANVIL) : new ItemStack(Material.MAP);
clickHandler = (panel, user, clickType, slot) -> {
this.useAnvil = !this.useAnvil;
panel.getInventory().setItem(slot, this.getButton(button).getItem());
return true;
};
break;
}
default: default:
return null; return null;
} }
@ -239,24 +209,10 @@ public class StringListGUI
icon(Material.PAPER). icon(Material.PAPER).
clickHandler((panel, user1, clickType, i) -> { clickHandler((panel, user1, clickType, i) -> {
if (this.useAnvil) this.getStringInput(
{
new AnvilGUI(BentoBox.getInstance(),
this.user.getPlayer(),
element,
(player, reply) -> {
this.value.set(stringIndex, reply);
this.build();
return reply;
});
}
else
{
this.startConversion(
value -> this.value.set(stringIndex, value), value -> this.value.set(stringIndex, value),
this.user.getTranslation("challenges.gui.descriptions.admin.edit-text-line"), this.user.getTranslation("challenges.gui.descriptions.admin.edit-text-line"),
element); element);
}
return true; return true;
}).build(); }).build();
@ -269,9 +225,9 @@ public class StringListGUI
* @param consumer Consumer that accepts player output text. * @param consumer Consumer that accepts player output text.
* @param question Message that will be displayed in chat when player triggers conversion. * @param question Message that will be displayed in chat when player triggers conversion.
*/ */
private void startConversion(Consumer<String> consumer, @NonNull String question) private void getStringInput(Consumer<String> consumer, @NonNull String question)
{ {
this.startConversion(consumer, question, null); this.getStringInput(consumer, question, null);
} }
@ -282,7 +238,7 @@ public class StringListGUI
* @param question Message that will be displayed in chat when player triggers conversion. * @param question Message that will be displayed in chat when player triggers conversion.
* @param message Message that will be set in player text field when clicked on question. * @param message Message that will be set in player text field when clicked on question.
*/ */
private void startConversion(Consumer<String> consumer, @NonNull String question, @Nullable String message) private void getStringInput(Consumer<String> consumer, @NonNull String question, @Nullable String message)
{ {
final User user = this.user; final User user = this.user;
@ -328,6 +284,7 @@ public class StringListGUI
} }
}). }).
withLocalEcho(false). withLocalEcho(false).
withPrefix(context -> user.getTranslation("challenges.gui.questions.prefix")).
buildConversation(user.getPlayer()); buildConversation(user.getPlayer());
conversation.begin(); conversation.begin();
@ -349,8 +306,7 @@ public class StringListGUI
REMOVE, REMOVE,
CANCEL, CANCEL,
CLEAR, CLEAR,
SAVE, SAVE
MODE
} }
@ -369,11 +325,6 @@ public class StringListGUI
*/ */
private User user; private User user;
/**
* Boolean that indicate if editing should happen in anvil.
*/
private boolean useAnvil;
/** /**
* Current value. * Current value.
*/ */

View File

@ -321,6 +321,16 @@ challenges:
skull-owner: ' [owner]' skull-owner: ' [owner]'
egg-meta: ' [mob]' egg-meta: ' [mob]'
fish-meta: ' [body-color] with [pattern-color] [pattern]' fish-meta: ' [body-color] with [pattern-color] [pattern]'
questions:
prefix: "&2[SERVER]: "
admin:
number: "Write a number in chat and press enter to accept it and press enter."
unique-id: "Write object unique name and press enter."
challenge-name: "Write in chat display name for current challenge."
level-name: "Write in chat display name for current level."
titles: titles:
# Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object. # Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object.
# [friendlyName] will be replaced with challenge friendly name. # [friendlyName] will be replaced with challenge friendly name.

View File

@ -283,6 +283,15 @@ challenges:
money-reward: '&6Recompensa de dinero: $[value]' money-reward: '&6Recompensa de dinero: $[value]'
reward-items: '&6Artículos de recompensa:' reward-items: '&6Artículos de recompensa:'
reward-commands: '&6Comandos de recompensa:' reward-commands: '&6Comandos de recompensa:'
questions:
prefix: "&2[SERVER]: "
admin:
number: "Write a number in chat and press enter to accept it and press enter."
unique-id: "Write object unique name and press enter."
challenge-name: "Write in chat display name for current challenge."
level-name: "Write in chat display name for current level."
messages: messages:
admin: admin:
hit-things: 'Golpea cosas para agregarlas a la lista de cosas requeridas. Haga click derecho cuando haya terminado.' hit-things: 'Golpea cosas para agregarlas a la lista de cosas requeridas. Haga click derecho cuando haya terminado.'

View File

@ -295,6 +295,15 @@ challenges:
money-reward: '&6Récompense: [value]$' money-reward: '&6Récompense: [value]$'
reward-items: '&6Récompenses:' reward-items: '&6Récompenses:'
reward-commands: '&6Récompenses (commandes):' reward-commands: '&6Récompenses (commandes):'
questions:
prefix: "&2[SERVER]: "
admin:
number: "Write a number in chat and press enter to accept it and press enter."
unique-id: "Write object unique name and press enter."
challenge-name: "Write in chat display name for current challenge."
level-name: "Write in chat display name for current level."
titles: titles:
# Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object. # Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object.
# [friendlyName] will be replaced with challenge friendly name. # [friendlyName] will be replaced with challenge friendly name.

View File

@ -318,6 +318,15 @@ challenges:
skull-owner: ' [owner]' skull-owner: ' [owner]'
egg-meta: ' [mob]' egg-meta: ' [mob]'
fish-meta: ' [body-color] ar [pattern-color] [pattern]' fish-meta: ' [body-color] ar [pattern-color] [pattern]'
questions:
prefix: "&2[SERVERIS]: "
admin:
number: "Ieraksti nummuru sarakstē."
unique-id: "Ieraksti objekta unikālo nosaukumu sarakstē."
challenge-name: "Ieraksti uzdevuma nosaukumu sarakstē."
level-name: "Ieraksti uzdevuma līmeņa nosaukumu sarakstē."
titles: titles:
# Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object. # Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object.
# [friendlyName] will be replaced with challenge friendly name. # [friendlyName] will be replaced with challenge friendly name.

View File

@ -315,6 +315,16 @@ challenges:
skull-owner: ' [owner]' skull-owner: ' [owner]'
egg-meta: ' [mob]' egg-meta: ' [mob]'
fish-meta: ' [body-color] with [pattern-color] [pattern]' fish-meta: ' [body-color] with [pattern-color] [pattern]'
questions:
prefix: "&2[SERVER]: "
admin:
number: "Write a number in chat and press enter to accept it and press enter."
unique-id: "Write object unique name and press enter."
challenge-name: "Write in chat display name for current challenge."
level-name: "Write in chat display name for current level."
titles: titles:
# Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object. # Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object.
# [friendlyName] will be replaced with challenge friendly name. # [friendlyName] will be replaced with challenge friendly name.

View File

@ -315,6 +315,15 @@ challenges:
skull-owner: ' [owner]' skull-owner: ' [owner]'
egg-meta: ' [mob]' egg-meta: ' [mob]'
fish-meta: ' [body-color] with [pattern-color] [pattern]' fish-meta: ' [body-color] with [pattern-color] [pattern]'
questions:
prefix: "&2[SERVER]: "
admin:
number: "Write a number in chat and press enter to accept it and press enter."
unique-id: "Write object unique name and press enter."
challenge-name: "Write in chat display name for current challenge."
level-name: "Write in chat display name for current level."
titles: titles:
# Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object. # Title and subtitle my contain variable in [] that will be replaced with proper message from challenge object.
# [friendlyName] will be replaced with challenge friendly name. # [friendlyName] will be replaced with challenge friendly name.