1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Создание GUI

Тема в разделе "Разработка плагинов для новичков", создана пользователем MrMeow, 26 окт 2020.

  1. Автор темы
    MrMeow

    MrMeow Ньюби

    Баллы:
    1
    Я пытаюсь сделать простой GUI, но предметы из GUI не кликаються, а забираються. Вот код, если это можно назвать кодом неговнокодным:
    Код:
    package org.mrmeow.gui;
    
    import java.util.ArrayList;
    
    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.Particle;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.*********ventory.Inventory;
    import org.*********ventory.ItemStack;
    import org.*********ventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    
    import net.md_5.bungee.api.ChatColor;
    
    public class Main extends JavaPlugin implements Listener{
        @Override
        public void onEnable(){
            getServer().getPluginManager().registerEvents(this, this);
        }
        
        @EventHandler
        public void onJoin(PlayerJoinEvent joinEvent){
            Player p = joinEvent.getPlayer();
            Inventory gui = Bukkit.createInventory(p, 9, ChatColor.GOLD + "AbsolutelyNotGUI");
            
            ItemStack motion = new ItemStack(Material.FEATHER);
            ItemMeta motion_meta = motion.getItemMeta();
            motion_meta.setDisplayName(ChatColor.WHITE +"Motion");
            ArrayList<String> motion_lore = new ArrayList<>();
            motion_lore.add(ChatColor.WHITE + "Send yourself up!");
            motion_meta.setLore(motion_lore);
            motion.setItemMeta(motion_meta);
            
            ItemStack particle = new ItemStack(Material.DRAGON_BREATH);
            ItemMeta particle_meta = particle.getItemMeta();
            particle_meta.setDisplayName(ChatColor.DARK_PURPLE + "Particle");
            ArrayList<String> particle_lore = new ArrayList<>();
            particle_lore.add(ChatColor.DARK_PURPLE + "Spawn particles!");
            particle_meta.setLore(particle_lore);
            particle.setItemMeta(particle_meta);
            
            ItemStack fire = new ItemStack(Material.BLAZE_POWDER);
            ItemMeta fire_meta = fire.getItemMeta();
            fire_meta.setDisplayName(ChatColor.GOLD + "Fire");
            ArrayList<String> fire_lore = new ArrayList<>();
            fire_lore.add(ChatColor.GOLD + "Set yourself on fire!");
            fire_meta.setLore(fire_lore);
            fire.setItemMeta(fire_meta);
            
            ItemStack[] menu_items = {motion, particle, fire};
            
            gui.setContents(menu_items);
            
            p.openInventory(gui);
        }
        public void InventoryClickEvent(InventoryClickEvent clickEvent){
            if(!ChatColor.stripColor(clickEvent.getView().getTitle().toString()).equalsIgnoreCase("AbsolutelyNotGUI")) return;
            
            if(clickEvent.getCurrentItem() == null) return;       
            if(ChatColor.stripColor(clickEvent.getCurrentItem().getItemMeta().getDisplayName()).equalsIgnoreCase("Motion")){
                Player p = (Player) clickEvent.getWhoClicked();
                p.getVelocity().setY(0.5d);
                p.sendMessage("Fly, player, FLY!");
                clickEvent.setCancelled(true);
                p.closeInventory();
            }
            else if(ChatColor.stripColor(clickEvent.getCurrentItem().getItemMeta().getDisplayName()).equalsIgnoreCase("Particle")){
                Player p = (Player) clickEvent.getWhoClicked();
                p.getLocation().getWorld().spawnParticle(Particle.DRAGON_BREATH, p.getLocation(), 100, 1, 0.35, 1);
                p.sendMessage("Sniff this dragon breath!");
                clickEvent.setCancelled(true);
                p.closeInventory();
            }
            else if(ChatColor.stripColor(clickEvent.getCurrentItem().getItemMeta().getDisplayName()).equalsIgnoreCase("Fire")){
                Player p = (Player) clickEvent.getWhoClicked();
                p.setFireTicks(200);
                p.sendMessage("Have fun with your new friend - fire!");
                clickEvent.setCancelled(true);
                p.closeInventory();
            }
        }
    }
     
  2. _MRDen3000YT_

    _MRDen3000YT_ Активный участник Пользователь

    Баллы:
    76
    Я конечно видел все, но проверку по имени... Если уж на то пошло - суй в хэш мап игрока и чему равен инвентарь, и при клик ивенте проверяй, есть ли игрок в хэшмапе.

    UPD: Вот пример, используй его только если хочешь сделать в разных классах эвент и инвентарь:
    В главный классе создаешь хэшмап:
    Код:
    public static ConcurrentHashMap<Player, Inventory> getInventory = new ConcurrentHashMap<>();
    Далее при открытии инвентаря суешь в хэш мап игрока и инвентарь
    Код:
    Main.getInventory.put(p, i);
    player.openInventory(i);
    
    Далее при инвентори клик ивент:

    Код:
    Inventory i = event.getInventory();
    Player p = (Player) event.getWhoClicked();
    Inventory b = Main.getInventory.get(p);
    if (!i.equals(b))
         return;
    else {
            event.setCancelled(true);
    }
     
    Последнее редактирование: 26 окт 2020
  3. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ну потому что ивент надо отменять и как то обрабатывать клики самому не?
    Код:
        @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
        public void onClick(InventoryClickEvent e) {
            Inventory inv = e.getClickedInventory();
            if (inv != null && inv.getHolder() instanceof Menu) {
                e.setCancelled(true);
                Player player = (Player) e.getWhoClicked();
                Menu menu = (Menu) inv.getHolder();
                Stack stack = menu.getStack(e.getSlot(), player);
                if (stack != null) {
                    stack.runCommand(player);
                }
            }
        }
     
  4. Автор темы
    MrMeow

    MrMeow Ньюби

    Баллы:
    1
    А я не совсем понял что тут за класс Menu
     
  5. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Реализация InventoryHolder для менюшки и Stack это логика кнопки с предметом.
     
  6. CriticaMobslps

    CriticaMobslps Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Votybo
    Она не обязательна, конечно лучше сразу привыкать к хорошему но что-бы понять принцип можно использовать более простые примеры
    HTML:
    inv.getHolder() instanceof Menu
    используется для определения, это нужное нам меню либо нет, ну а Stack более улучшенная версия того что ты напишешь
    HTML:
    if (5 == e.getSlot()) {
     //Действия
    }
     

Поделиться этой страницей