Create ButtonOption

A ButtonOption allows adding elements to all buttons. To save a ButtonOption your plugin must load with zMenu. You must use the event ButtonLoaderRegisterEvent.

Example:

package fr.maxlego08.example;

// Import statements
import fr.maxlego08.menu.MenuItemStack;
import fr.maxlego08.menu.api.ButtonManager;
import fr.maxlego08.menu.api.InventoryManager;
import fr.maxlego08.menu.api.button.Button;
import fr.maxlego08.menu.api.button.ButtonOption;
import fr.maxlego08.menu.inventory.inventories.InventoryDefault;
import fr.maxlego08.menu.zcore.utils.loader.Loader;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.plugin.Plugin;

import java.io.File;

/**
 * CustomAction implements ButtonOption to provide custom button behavior within the plugin's zMenu.
 */
public class CustomAction implements ButtonOption {

    // A reference to the main plugin instance to access its functionalities and configurations.
    private final ExamplePlugin plugin;
    // A flag to enable or disable the custom action, controlled through the configuration file.
    private boolean enableCustomAction;

    /**
     * Constructor for CustomAction.
     * @param plugin The instance of the main plugin class.
     */
    public CustomAction(ExamplePlugin plugin) {
        this.plugin = plugin;
    }

    /**
     * Returns the unique name for this custom action.
     * @return A string identifier for this action.
     */
    @Override
    public String getName() {
        return "custom_action_example";
    }

    /**
     * Returns the plugin instance associated with this custom action.
     * @return The plugin instance.
     */
    @Override
    public Plugin getPlugin() {
        return this.plugin;
    }

    /**
     * Loads button settings from a configuration file.
     * This method is called automatically to apply configuration settings to the button.
     *
     * @param button The button being configured.
     * @param yamlConfiguration The YamlConfiguration loaded from the file.
     * @param path The path prefix to read configuration values.
     * @param inventoryManager The inventory manager instance.
     * @param buttonManager The button manager instance.
     * @param loader The loader used for loading item stacks.
     * @param file The file from which the configuration is loaded.
     */
    @Override
    public void loadButton(Button button, YamlConfiguration yamlConfiguration, String path, InventoryManager inventoryManager, ButtonManager buttonManager, Loader<MenuItemStack> loader, File file) {
        // Loads the enableCustomAction value from the configuration file. Defaults to false if not specified.
        this.enableCustomAction = yamlConfiguration.getBoolean(path + "enableCustomAction", false);
    }

    /**
     * Handles the click event on the button.
     * This method is triggered when a player clicks on a button that has this custom action assigned.
     *
     * @param button The button that was clicked.
     * @param player The player who clicked the button.
     * @param inventoryClickEvent The event associated with the inventory click.
     * @param inventoryDefault The inventory where the click occurred.
     * @param slot The slot index where the click occurred.
     * @param hasPermission A flag indicating if the player has permission to use this action.
     */
    @Override
    public void onClick(Button button, Player player, InventoryClickEvent inventoryClickEvent, InventoryDefault inventoryDefault, int slot, boolean hasPermission) {
        // If the player has permission and the custom action is enabled, send them a custom message.
        if (hasPermission && enableCustomAction) {
            player.sendMessage("§aHey, it's a custom action here !");
        }
    }
}

You must register your ButtonOption this way:

    @EventHandler
    public void onButtonLoad(ButtonLoaderRegisterEvent event) {
        InventoryManager inventoryManager = event.getInventoryManager(); // Initialize the inventory manager from the event
        inventoryManager.registerOption(this.plugin, CustomAction.class);
    }

Last updated