package world.bentobox.challenges.panel.admin; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.ItemStack; import lv.id.bonne.panelutils.PanelUtils; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelListener; 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.ChallengesAddon; import world.bentobox.challenges.config.Settings; import world.bentobox.challenges.config.SettingsUtils.GuiMode; import world.bentobox.challenges.config.SettingsUtils.VisibilityMode; import world.bentobox.challenges.panel.CommonPanel; import world.bentobox.challenges.panel.ConversationUtils; import world.bentobox.challenges.utils.Constants; import world.bentobox.challenges.utils.Utils; /** * This Class creates GUI that allows to change Challenges Addon Settings via in-game * menu. */ public class EditSettingsPanel extends CommonPanel { // --------------------------------------------------------------------- // Section: Constructors // --------------------------------------------------------------------- /** * @param addon Addon where panel operates. * @param world World from which panel was created. * @param user User who created panel. * @param topLabel Command top label which creates panel (f.e. island or ai) * @param permissionPrefix Command permission prefix (f.e. bskyblock.) */ private EditSettingsPanel(ChallengesAddon addon, User user, World world, String topLabel, String permissionPrefix) { super(addon, user, world, topLabel, permissionPrefix); this.settings = this.addon.getChallengesSettings(); } /** * @param parentGUI Parent GUI. */ private EditSettingsPanel(CommonPanel parentGUI) { super(parentGUI); this.settings = this.addon.getChallengesSettings(); } /** * Open the Challenges Admin GUI. * * @param addon the addon * @param world the world * @param user the user * @param topLabel the top label * @param permissionPrefix the permission prefix */ public static void open(ChallengesAddon addon, World world, User user, String topLabel, String permissionPrefix) { new EditSettingsPanel(addon, user, world, topLabel, permissionPrefix).build(); } /** * Open the Challenges Admin GUI. */ public static void open(CommonPanel parentGUI) { new EditSettingsPanel(parentGUI).build(); } // --------------------------------------------------------------------- // Section: Methods // --------------------------------------------------------------------- @Override protected void build() { PanelBuilder panelBuilder = new PanelBuilder().user(this.user).name( this.user.getTranslation(Constants.TITLE + "settings")); PanelUtils.fillBorder(panelBuilder); panelBuilder.item(10, this.getSettingsButton(Button.SHOW_TITLE)); if (this.settings.isShowCompletionTitle()) { panelBuilder.item(19, this.getSettingsButton(Button.TITLE_SHOWTIME)); } panelBuilder.item(28, this.getSettingsButton(Button.BROADCAST)); panelBuilder.item(11, this.getSettingsButton(Button.GLOW_COMPLETED)); panelBuilder.item(20, this.getSettingsButton(Button.REMOVE_COMPLETED)); panelBuilder.item(29, this.getSettingsButton(Button.VISIBILITY_MODE)); panelBuilder.item(30, this.getSettingsButton(Button.INCLUDE_UNDEPLOYED)); panelBuilder.item(21, this.getSettingsButton(Button.LOCKED_LEVEL_ICON)); panelBuilder.item(22, this.getSettingsButton(Button.GAMEMODE_GUI)); if (this.settings.isUseCommonGUI()) { // This should be active only when single gui is enabled. panelBuilder.item(31, this.getSettingsButton(Button.ACTIVE_WORLD_LIST)); } panelBuilder.item(24, this.getSettingsButton(Button.STORE_HISTORY)); if (this.settings.isStoreHistory()) { panelBuilder.item(33, this.getSettingsButton(Button.PURGE_HISTORY)); } panelBuilder.item(25, this.getSettingsButton(Button.RESET_ON_NEW)); panelBuilder.item(34, this.getSettingsButton(Button.DATA_PER_ISLAND)); // Return Button panelBuilder.item(44, this.returnButton); panelBuilder.listener(new IconChanger()); panelBuilder.build(); } private PanelItem getSettingsButton(Button button) { final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; final String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); description.add(this.user.getTranslation(reference + "description")); ItemStack icon; boolean glow; PanelItem.ClickHandler clickHandler; switch (button) { case RESET_ON_NEW -> { description.add(this.user.getTranslation(reference + (this.settings.isResetChallenges() ? "enabled" : "disabled"))); icon = new ItemStack(Material.LAVA_BUCKET); clickHandler = (panel, user1, clickType, i) -> { this.settings.setResetChallenges(!this.settings.isResetChallenges()); panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = this.settings.isResetChallenges(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case BROADCAST -> { description.add(this.user.getTranslation(reference + (this.settings.isBroadcastMessages() ? "enabled" : "disabled"))); icon = new ItemStack(Material.JUKEBOX); clickHandler = (panel, user1, clickType, i) -> { this.settings.setBroadcastMessages(!this.settings.isBroadcastMessages()); panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = this.settings.isBroadcastMessages(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case REMOVE_COMPLETED -> { description.add(this.user.getTranslation(reference + (this.settings.isRemoveCompleteOneTimeChallenges() ? "enabled" : "disabled"))); icon = new ItemStack(Material.MAGMA_BLOCK); clickHandler = (panel, user1, clickType, i) -> { this.settings.setRemoveCompleteOneTimeChallenges(!this.settings.isRemoveCompleteOneTimeChallenges()); panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = this.settings.isRemoveCompleteOneTimeChallenges(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case ACTIVE_WORLD_LIST -> { description.add(this.user.getTranslation(reference + (this.settings.getUserGuiMode().equals(GuiMode.GAMEMODE_LIST) ? "disabled" : "enabled"))); icon = new ItemStack(Material.STONE_BUTTON); clickHandler = (panel, user1, clickType, i) -> { if (this.settings.getUserGuiMode().equals(GuiMode.GAMEMODE_LIST)) { this.settings.setUserGuiMode(GuiMode.CURRENT_WORLD); } else { this.settings.setUserGuiMode(GuiMode.GAMEMODE_LIST); } this.addon.saveSettings(); panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); return true; }; glow = this.settings.getUserGuiMode().equals(GuiMode.GAMEMODE_LIST); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); } case GAMEMODE_GUI -> { description.add(this.user.getTranslation(reference + (this.settings.isUseCommonGUI() ? "enabled" : "disabled"))); icon = new ItemStack(Material.BLACK_STAINED_GLASS_PANE); clickHandler = (panel, user1, clickType, i) -> { this.settings.setUseCommonGUI(!this.settings.isUseCommonGUI()); // Need to rebuild more icons this.build(); this.addon.saveSettings(); return true; }; glow = this.settings.isUseCommonGUI(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case STORE_HISTORY -> { description.add(this.user.getTranslation(reference + (this.settings.isStoreHistory() ? "enabled" : "disabled"))); icon = new ItemStack(Material.WRITTEN_BOOK); clickHandler = (panel, user1, clickType, i) -> { this.settings.setStoreHistory(!this.settings.isStoreHistory()); panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = this.settings.isStoreHistory(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case PURGE_HISTORY -> { description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, String.valueOf(this.settings.getLifeSpan()))); icon = new ItemStack(Material.FLINT_AND_STEEL, Math.max(1, this.settings.getLifeSpan())); clickHandler = (panel, user, clickType, i) -> { Consumer numberConsumer = number -> { if (number != null) { this.settings.setLifeSpan(number.intValue()); this.addon.saveSettings(); } // reopen panel this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, 2000); return true; }; glow = false; description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); } case DATA_PER_ISLAND -> { description.add(this.user.getTranslation(reference + (this.settings.isStoreAsIslandData() ? "enabled" : "disabled"))); icon = new ItemStack(Material.GRASS_BLOCK); clickHandler = (panel, user1, clickType, i) -> { this.settings.setStoreAsIslandData(!this.settings.isStoreAsIslandData()); // TODO: Migration panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = this.settings.isStoreAsIslandData(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case GLOW_COMPLETED -> { description.add(this.user.getTranslation(reference + (this.settings.isAddCompletedGlow() ? "enabled" : "disabled"))); icon = new ItemStack(Material.GLOWSTONE); clickHandler = (panel, user1, clickType, i) -> { this.settings.setAddCompletedGlow(!this.settings.isAddCompletedGlow()); panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = this.settings.isAddCompletedGlow(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case LOCKED_LEVEL_ICON -> { icon = this.settings.getLockedLevelIcon(); clickHandler = (panel, user, clickType, i) -> { if (this.selectedButton != null) { this.selectedButton = null; } else { this.selectedButton = button; } panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); return true; }; if (this.selectedButton != button) { description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); } else { description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-on-item")); } glow = this.selectedButton == button; } case SHOW_TITLE -> { description.add(this.user.getTranslation(reference + (this.settings.isShowCompletionTitle() ? "enabled" : "disabled"))); icon = new ItemStack(Material.OAK_SIGN); clickHandler = (panel, user1, clickType, i) -> { this.settings.setShowCompletionTitle(!this.settings.isShowCompletionTitle()); panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = this.settings.isShowCompletionTitle(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case TITLE_SHOWTIME -> { description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, String.valueOf(this.settings.getTitleShowtime()))); icon = new ItemStack(Material.CLOCK, Math.max(1, this.settings.getTitleShowtime())); clickHandler = (panel, user, clickType, i) -> { Consumer numberConsumer = number -> { if (number != null) { this.settings.setTitleShowtime(number.intValue()); this.addon.saveSettings(); } // reopen panel this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, 2000); return true; }; glow = false; description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); } case VISIBILITY_MODE -> { description.add(this.user.getTranslation(reference + (this.settings.getVisibilityMode().equals(VisibilityMode.VISIBLE) ? "enabled" : "disabled")) + this.user.getTranslation(reference + "visible")); description.add(this.user.getTranslation(reference + (this.settings.getVisibilityMode().equals(VisibilityMode.HIDDEN) ? "enabled" : "disabled")) + this.user.getTranslation(reference + "hidden")); if (this.settings.getVisibilityMode().equals(VisibilityMode.VISIBLE)) { icon = new ItemStack(Material.OAK_PLANKS); } else if (this.settings.getVisibilityMode().equals(VisibilityMode.HIDDEN)) { icon = new ItemStack(Material.OAK_SLAB); } else { icon = new ItemStack(Material.OAK_BUTTON); } clickHandler = (panel, user, clickType, slot) -> { if (clickType.isRightClick()) { this.settings.setVisibilityMode(Utils.getPreviousValue(VisibilityMode.values(), this.settings.getVisibilityMode())); } else { this.settings.setVisibilityMode(Utils.getNextValue(VisibilityMode.values(), this.settings.getVisibilityMode())); } // Rebuild just this icon panel.getInventory().setItem(slot, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = false; description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "left-click-to-cycle")); description.add(this.user.getTranslation(Constants.TIPS + "right-click-to-cycle")); } case INCLUDE_UNDEPLOYED -> { description.add(this.user.getTranslation(reference + (this.settings.isIncludeUndeployed() ? "enabled" : "disabled"))); icon = new ItemStack(Material.BARREL); clickHandler = (panel, user1, clickType, i) -> { this.settings.setIncludeUndeployed(!this.settings.isIncludeUndeployed()); panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); this.addon.saveSettings(); return true; }; glow = this.settings.isIncludeUndeployed(); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } default -> { icon = new ItemStack(Material.PAPER); clickHandler = null; glow = false; } } return new PanelItemBuilder(). icon(icon). name(name). description(description). glow(glow). clickHandler(clickHandler). build(); } // --------------------------------------------------------------------- // Section: Classes // --------------------------------------------------------------------- /** * This class allows changing icon for Generator Tier */ private class IconChanger implements PanelListener { /** * Process inventory click. If generator icon is selected and user clicks on item in his inventory, then change * icon to the item from inventory. * * @param user the user * @param event the event */ @Override public void onInventoryClick(User user, InventoryClickEvent event) { // Handle icon changing if (EditSettingsPanel.this.selectedButton != null && event.getCurrentItem() != null && !event.getCurrentItem().getType().equals(Material.AIR) && event.getRawSlot() > 44) { // set material and amount only. Other data should be removed. if (EditSettingsPanel.this.selectedButton == Button.LOCKED_LEVEL_ICON) { EditSettingsPanel.this.settings.setLockedLevelIcon(event.getCurrentItem().clone()); EditSettingsPanel.this.addon.saveSettings(); // Deselect icon EditSettingsPanel.this.selectedButton = null; EditSettingsPanel.this.build(); } } } /** * On inventory close. * * @param event the event */ @Override public void onInventoryClose(InventoryCloseEvent event) { // Do nothing } /** * Setup current listener. */ @Override public void setup() { // Do nothing } } // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- /** * This enum holds all settings buttons that must have been displayed in this panel. */ private enum Button { RESET_ON_NEW, BROADCAST, REMOVE_COMPLETED, ACTIVE_WORLD_LIST, GAMEMODE_GUI, STORE_HISTORY, PURGE_HISTORY, DATA_PER_ISLAND, GLOW_COMPLETED, LOCKED_LEVEL_ICON, SHOW_TITLE, TITLE_SHOWTIME, /** * This allows to switch between counting/not couting undeployed challenges. */ INCLUDE_UNDEPLOYED, /** * This allows to switch between different challenges visibility modes. */ VISIBILITY_MODE } /** * This allows faster access to challenges settings object. */ private final Settings settings; /** * Allows changing locked level icon. */ private Button selectedButton; }