addon-challenges/src/main/java/world/bentobox/challenges/panel/user/MultipleGUI.java

216 lines
5.6 KiB
Java
Raw Normal View History

package world.bentobox.challenges.panel.user;
import java.util.function.Consumer;
Bug fix release (#228) * Fix issue when users could not select non-block items as icons for challenges and levels. (#190) * English update (#193) * Organized imports * Minor code cleanup * Updated English locale file. * Translate zh-CN.yml via GitLocalize (#188) * Make default translation looking a bit nicer (#192) * Make default translation looking a bit nicer * Updating a few friendly names and rewording some phrases * Add generic .gitignore * Fix novice level Update `chiseledmaker` name in `novice` level. * Adapt literal style (#197) Improve translations and process as a YAML string. * Test coverage (#199) * Test coverage for Challenges Command * Added CompleteChallengeCommand test class * Added Utils test class * Added ChallengesGUI test class * Fix code smells from sonarcloud analysis * Added .gitignore * Added Travis CI config file * WIP ChallengesManager Test class * Added ChallengesManager test class * Removed debug * Removed code smells. * Added ChallengesAddon test class. * Added onDisbale test * Added new TryToComplete test class - WIP Covers inventory challenges. * Added Island Challenge entity tests to TryToComplete test class * Fix a bug with challenge deletion. If challenge has been left in a level, then system did not remove challenge from it and was kept as ghost challenge, preventing from completing level. * Fixes tests * Updated travis.yml * All strings to spanish (#200) * Translate es.yml via GitLocalize * Translate es.yml via GitLocalize * Translate es.yml via GitLocalize * Fix LevelListRequestHandler. This handler did not return list of strings but list of challenge levels, that is incorrect. Not it should work correctly. * Create ro.yml * Create id.yml * Remove blanks files now that GitLocalize is fixed. * Initial Russian translation (#207) * Translate ru.yml via GitLocalize Co-authored-by: @mt-gitlocalize @IPeredero @LoveBiscuit * Changed build character from # to b * Add German translation (#210) * Translate de.yml via GitLocalize * Translate de.yml via GitLocalize * Translate de.yml via GitLocalize Co-authored-by: xXjojojXx <36734820+xXjojojXx@users.noreply.github.com> Co-authored-by: FunnysBanana <51290016+FunnysBanana@users.noreply.github.com> Co-authored-by: mt-gitlocalize <mt@gitlocalize.com> * Czech translation. Credit @Polda18 * Added a uniqueId sanitization when creating challenges/levels This will help fixing issues with spaces, hyphens and accents in non-English languages. * Fixes bug with checking entities in nether and end (#219) https://github.com/BentoBoxWorld/Challenges/issues/218 Adds test case to check for compliance. * Add 7 new placeholders for Challenges Addon. - `[gamemode]_challenge_total_completion_count` returns number of sum of challenge completions for user. - `[gamemode]_challenge_completed_count` returns number of completed challenges (at least once) for user. - `[gamemode]_challenge_uncompleted_count` returns number of uncompleted challenges for user. - `[gamemode]_challenge_completed_level_count` returns number of completed levels for user. - `[gamemode]_challenge_uncompleted_level_count` returns number of uncompleted levels for user. - `[gamemode]_challenge_unlocked_level_count` returns number of unlocked levels for user. - `[gamemode]_challenge_locked_level_count` returns number of locked levels for user. Fixes #224 * Add 2 new placeholders: - `[gamemode]_challenge_latest_level_name` returns latest unlocked challenge level name - `[gamemode]_challenge_latest_level_id` returns latest unlocked challenge level id Fixes #226 * Fix broken tests due to placeholder additions. https://github.com/BentoBoxWorld/Challenges/commit/b5ecffb725d78c154f469d7e2868574ca7ecff30 https://github.com/BentoBoxWorld/Challenges/commit/2958ca8b6c98f9c8d389aa93c4a2846f578fff43 * Added default perms for aoneblock * Downgrade to 0.8.1 version * Add option to quit from conversation by writing "cancel" in chat. Move sanitizeInput to a GuiUtil class. * Change latest version to 0.8.1
2020-04-22 00:19:46 +02:00
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import world.bentobox.bentobox.api.panels.Panel;
import world.bentobox.bentobox.api.panels.PanelItem;
import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.challenges.utils.GuiUtils;
/**
* This GUI will pop out when user uses right click on challenge. It is meant to choose
* how many times player will complete challenges.
*/
public class MultipleGUI
{
/**
* Default constructor.
* @param user User who opens gui.
* @param lineLength Length of lore message.
* @param action Action that will be performed on value clicking.
*/
public MultipleGUI(User user, int lineLength, Consumer<Integer> action)
{
this.user = user;
this.lineLength = lineLength;
this.action = action;
this.build();
}
/**
* This method builds panel that allows to change given number value.
*/
private void build()
{
PanelBuilder panelBuilder = new PanelBuilder().
user(this.user).
type(Panel.Type.HOPPER).
name(this.user.getTranslation("challenges.gui.title.multiple-complete"));
panelBuilder.item(2, this.getButton(Button.VALUE));
// Reduce
panelBuilder.item(0, this.getButton(Button.REDUCE_LOT));
panelBuilder.item(1, this.getButton(Button.REDUCE));
// Increase
panelBuilder.item(3, this.getButton(Button.INCREASE));
panelBuilder.item(4, this.getButton(Button.INCREASE_LOT));
panelBuilder.build();
}
/**
* This method creates PanelItem with required functionality.
* @param button Functionality requirement.
* @return PanelItem with functionality.
*/
private PanelItem getButton(Button button)
{
ItemStack icon;
String name;
String description;
PanelItem.ClickHandler clickHandler;
boolean glow;
switch (button)
{
case VALUE:
{
name = this.user.getTranslation("challenges.gui.buttons.value");
description = this.user.getTranslation("challenges.gui.descriptions.current-value", "[value]", Integer.toString(this.value));
icon = new ItemStack(Material.GREEN_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> {
this.action.accept(this.value);
return true;
};
glow = false;
break;
}
case INCREASE:
{
name = this.user.getTranslation("challenges.gui.buttons.increase");
description = this.user.getTranslation("challenges.gui.descriptions.increase-by", "[value]", "1");
icon = new ItemStack(Material.BLUE_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> {
this.value++;
// Necessary just to update second item
panel.getInventory().setItem(2, this.getButton(Button.VALUE).getItem());
return true;
};
glow = false;
break;
}
case INCREASE_LOT:
{
name = this.user.getTranslation("challenges.gui.buttons.increase");
description = this.user.getTranslation("challenges.gui.descriptions.increase-by", "[value]", "5");
icon = new ItemStack(Material.MAGENTA_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> {
this.value += 5;
// Necessary just to update second item
panel.getInventory().setItem(2, this.getButton(Button.VALUE).getItem());
return true;
};
glow = false;
break;
}
case REDUCE:
{
name = this.user.getTranslation("challenges.gui.buttons.reduce");
description = this.user.getTranslation("challenges.gui.descriptions.reduce-by", "[value]", "1");
icon = new ItemStack(Material.ORANGE_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> {
this.value--;
if (this.value < 1)
{
this.value = 1;
}
// Necessary just to update second item
panel.getInventory().setItem(2, this.getButton(Button.VALUE).getItem());
return true;
};
glow = false;
break;
}
case REDUCE_LOT:
{
name = this.user.getTranslation("challenges.gui.buttons.reduce");
description = this.user.getTranslation("challenges.gui.descriptions.reduce-by", "[value]", "5");
icon = new ItemStack(Material.RED_STAINED_GLASS_PANE);
clickHandler = (panel, user, clickType, slot) -> {
this.value -= 5;
if (this.value < 1)
{
this.value = 1;
}
// Necessary just to update second item
panel.getInventory().setItem(2, this.getButton(Button.VALUE).getItem());
return true;
};
glow = false;
break;
}
default:
return null;
}
return new PanelItemBuilder().
icon(icon).
name(name).
description(GuiUtils.stringSplit(description, this.lineLength)).
glow(glow).
clickHandler(clickHandler).
build();
}
// ---------------------------------------------------------------------
// Section: Enums
// ---------------------------------------------------------------------
/**
* This enum allows to easier define available buttons.
*/
enum Button
{
VALUE,
REDUCE,
REDUCE_LOT,
INCREASE,
INCREASE_LOT
}
// ---------------------------------------------------------------------
// Section: Instance variables
// ---------------------------------------------------------------------
/**
* This variable allows to access to user object.
*/
private User user;
/**
* This variable holds action that will be performed on accept.
*/
private Consumer<Integer> action;
/**
* This variable holds a number of characters in single line for lore message.
*/
private int lineLength;
/**
* This integer holds current value of completion count.
*/
private int value = 1;
}