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

  • Автор темы Автор темы 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();
        }
    }
}
 
Я конечно видел все, но проверку по имени... Если уж на то пошло - суй в хэш мап игрока и чему равен инвентарь, и при клик ивенте проверяй, есть ли игрок в хэшмапе.

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);
}
 
Последнее редактирование:
Ну потому что ивент надо отменять и как то обрабатывать клики самому не?
Код:
    @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);
            }
        }
    }
 
Ну потому что ивент надо отменять и как то обрабатывать клики самому не?
Код:
    @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);
            }
        }
    }
А я не совсем понял что тут за класс Menu
 
Реализация InventoryHolder для менюшки и Stack это логика кнопки с предметом.
Она не обязательна, конечно лучше сразу привыкать к хорошему но что-бы понять принцип можно использовать более простые примеры
HTML:
inv.getHolder() instanceof Menu
используется для определения, это нужное нам меню либо нет, ну а Stack более улучшенная версия того что ты напишешь
HTML:
if (5 == e.getSlot()) {
 //Действия
}
 
Назад
Верх