All source projects

MrUltimateLibrary Source

Standalone source project / 68 files

MrUltimateLibrary is the backbone of all my plugins; it offers features that facilitate plugin creation, maintenance, and updates.

java

MrUltimateLibrary/src/main/java/eu/mrneznamy/mrultimatelibrary/gui/MrLibFormFallback.java

JAVA · Read-only source

package eu.mrneznamy.mrultimatelibrary.gui;

import eu.mrneznamy.mrultimatelibrary.utils.MrLibColors;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import eu.mrneznamy.mrultimatelibrary.MrUltimateLibrary;
import eu.mrneznamy.mrultimatelibrary.MrLibRegisterPlugin;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Consumer;

/**
 * Robust fallback for MrLibForm using Chest GUIs and Chat Input.
 */
public class MrLibFormFallback {

    private final String title;
    private final List<MrLibForm.FormElement> elements;
    private final Consumer<MrLibForm.FormResult> onSubmit;
    private final Runnable onCancel;

    public MrLibFormFallback(String title, List<MrLibForm.FormElement> elements, Consumer<MrLibForm.FormResult> onSubmit, Runnable onCancel) {
        this.title = title;
        this.elements = elements;
        this.onSubmit = onSubmit;
        this.onCancel = onCancel;
    }

    public void open(Player player) {
        
        MrLibForm.FormElement textElement = null;
        for (MrLibForm.FormElement el : elements) {
            if (el.type == MrLibForm.FormElementType.TEXT) {
                textElement = el;
                break;
            }
        }

        if (textElement != null) {
            openChatFallback(player, textElement);
            return;
        }
        openChestFallback(player);
    }

    private void openChatFallback(Player player, MrLibForm.FormElement element) {
        player.closeInventory();
        player.sendMessage("");
        player.sendMessage(MrLibColors.colorize("&b&l" + title));
        
        
        for (MrLibForm.FormElement el : elements) {
            if (el.type == MrLibForm.FormElementType.MESSAGE && el.label != null) {
                player.sendMessage(MrLibColors.colorize("&7" + el.label));
            }
        }
        
        player.sendMessage(MrLibColors.colorize("&7" + element.label + ":"));
        player.sendMessage(MrLibColors.colorize("&7(Type your answer in chat, or type 'cancel' to exit)"));
        player.sendMessage("");

        
        UUID uuid = player.getUniqueId();
        final org.bukkit.plugin.Plugin pluginInstance = getPlugin();
        Listener listener = new Listener() {
            @EventHandler(priority = EventPriority.LOWEST)
            public void onChat(AsyncPlayerChatEvent event) {
                if (!event.getPlayer().getUniqueId().equals(uuid)) return;
                
                event.setCancelled(true);
                String message = event.getMessage();
                
                Bukkit.getScheduler().runTask(pluginInstance, () -> {
                    AsyncPlayerChatEvent.getHandlerList().unregister(this);
                    
                    if (message.equalsIgnoreCase("cancel")) {
                        if (onCancel != null) onCancel.run();
                        player.sendMessage(MrLibColors.colorize("&cInput cancelled."));
                    } else {
                        MrLibForm.FormResult result = new MrLibForm.FormResult();
                        result.put(element.id, message);
                        if (onSubmit != null) onSubmit.accept(result);
                    }
                });
            }
        };
        Bukkit.getPluginManager().registerEvents(listener, pluginInstance);
    }

    private org.bukkit.plugin.Plugin getPlugin() {
        org.bukkit.plugin.Plugin plugin = MrUltimateLibrary.getInstance();
        if (plugin == null) {
            try {
                plugin = org.bukkit.plugin.java.JavaPlugin.getProvidingPlugin(MrLibFormFallback.class);
            } catch (Throwable t) {
                try {
                    plugin = Bukkit.getPluginManager().getPlugins()[0];
                } catch (Throwable ignored) {}
            }
        }
        return plugin;
    }

    private void openChestFallback(Player player) {
        int rows = Math.min(6, (elements.size() / 9) + 1);
        MrLibGUI gui = new MrLibGUI(title, rows);
        
        int slot = 0;
        for (MrLibForm.FormElement element : elements) {
            if (slot >= gui.getSize() - 1) break;
            
            ItemStack item = new ItemStack(Material.PAPER);
            ItemMeta meta = item.getItemMeta();
            if (meta != null) {
                meta.setDisplayName(MrLibColors.colorize("&b" + element.label));
                item.setItemMeta(meta);
            }
            
            
            gui.setItem(slot++, item);
        }
        
        ItemStack submit = new ItemStack(Material.EMERALD_BLOCK);
        ItemMeta sMeta = submit.getItemMeta();
        if (sMeta != null) {
            sMeta.setDisplayName(MrLibColors.colorize("&a&lSUBMIT"));
            submit.setItemMeta(sMeta);
        }
        gui.setItem(gui.getSize() - 1, submit, e -> {
            MrLibForm.FormResult result = new MrLibForm.FormResult();
            if (onSubmit != null) onSubmit.accept(result);
            player.closeInventory();
        });
        
        gui.open(player);
    }
}
148 linesGNU GENERAL PUBLIC LICENSE · Version 3, 29 June 2007 · UTF-8 · Read only