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

216 lines
5.6 KiB
Java

package world.bentobox.challenges.panel.user;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.function.Consumer;
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(4, this.getButton(Button.VALUE));
// Reduce
panelBuilder.item(2, this.getButton(Button.REDUCE_LOT));
panelBuilder.item(3, this.getButton(Button.REDUCE));
// Increase
panelBuilder.item(5, this.getButton(Button.INCREASE));
panelBuilder.item(6, 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;
}