Событие InventoryClickEvent не работает [Плагин Minecraft Bukkit] - PullRequest
0 голосов
/ 09 февраля 2020

Я хочу создать Minecraft GUI, который использует инвентарь. Я сделал все GUI с предметами внутри. Но когда я пытаюсь взаимодействовать с GUI (например, нажатием на элемент), это ничего не дает. Так что я уверен, что InventoryClickEvent не работает.

Это мой код:

package can.evilestvirus.randomtp;

import java.util.Arrays;


import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.PluginManager;

public class CommandRtp implements CommandExecutor {


@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

    if (sender instanceof Player) {

        Player player = (Player) sender;

        Inventory inv = Bukkit.createInventory(null, 9, "Menu de tp aléatoire");

        ItemStack goldBlock = new ItemStack(Material.GOLD_BLOCK, 1);
        ItemMeta goldBlockM = goldBlock.getItemMeta();
        goldBlockM.setDisplayName("§8[§a+§8] §aRandomTP Normal §8[§a+§8]");
        goldBlockM.setLore(Arrays.asList("§b- §6Distance de TP: 2500 Blocks", "§b- §6Prix: $0", "§b- §6Cooldown de 60 secondes", "§a§lCliquez ici pour utiliser"));
        goldBlockM.addEnchant(Enchantment.DURABILITY, 10, true);
        goldBlockM.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        goldBlock.setItemMeta(goldBlockM);
        inv.setItem(3, goldBlock);

        ItemStack diamondBlock = new ItemStack(Material.DIAMOND_BLOCK, 1);
        ItemMeta diamondBlockM = diamondBlock.getItemMeta();
        diamondBlockM.setDisplayName("§8[§a+§8] §aRandomTP §6§lVIP §8[§a+§8]");
        diamondBlockM.setLore(Arrays.asList("§b- §6Distance de TP: 5000 Blocks", "§b- §6Prix: $1000", "§b- §6Cooldown de 5 minutes", "§a§lCliquez ici pour utiliser"));
        diamondBlockM.addEnchant(Enchantment.DURABILITY, 10, true);
        diamondBlockM.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        diamondBlock.setItemMeta(diamondBlockM);
        inv.setItem(5, diamondBlock);


        player.openInventory(inv);





    }


    return true;


}

@EventHandler
public void onClick(InventoryClickEvent event) {

    Player player = (Player) event.getWhoClicked();
    ItemStack current = event.getCurrentItem();

    if(current == null) return;

    if(event.getInventory().getTitle().equals("Menu de tp aléatoire")) {

        event.setCancelled(true);

        if(current.getType() == Material.GOLD_BLOCK) {

            player.closeInventory();
            player.chat("/rtpPlayer");
        }

        if(current.getType() == Material.DIAMOND_BLOCK) {

            player.closeInventory();
            player.setFlying(true);
        }


    }
}

}

Код моего основного класса это:

    package can.evilestvirus.randomtp;

import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

import can.evilestvirus.randomtp.CommandRtpPlayer;

public class Main extends JavaPlugin {
    @Override
    public void onEnable() {
        System.out.println("HELLO PEOPLE!");
         this.getCommand("rtpplayer").setExecutor(new CommandRtpPlayer());
         this.getCommand("rtp").setExecutor(new CommandRtp());
         Bukkit.getPluginManager().registerEvents((Listener) this, Bukkit.getPluginManager().getPlugins()[0]);
         Bukkit.getPluginManager().registerEvents((Listener) new CommandRtp(), this);

    }
}

Ответы [ 3 ]

2 голосов
/ 09 февраля 2020

Вам необходимо реализовать Listener в вашем классе CommandRtp. Как только вы это сделаете, это должно сработать.

Итак, ваш класс будет выглядеть так:

public class CommandRtp implements Listener, CommandExecutor { // Code }

0 голосов
/ 16 февраля 2020

Вы можете использовать это событие:

@EventHandler
public void onInventoryClick(InventoryClickEvent event)  {

}

Для меня это работает

0 голосов
/ 09 февраля 2020

Хорошо, я нашел свою ошибку. Я создал новый класс и правильно зарегистрировал новый класс. После того, как я изменил IF, проверьте, совпадает ли мое меню с командным меню, потому что функция, которую я использую, не была функциональной.

Так что это мой новый код для тех, у которых та же проблема, что и у меня:

   package can.evilestvirus.randomtp;

import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;

public class MenuHandler implements Listener {

    @EventHandler
    public void onMenuClick(InventoryClickEvent e){

        Player player = (Player) e.getWhoClicked();

        if(e.getView().getTitle().equalsIgnoreCase("Menu de tp aleatoire")){
            e.setCancelled(true);
            if (e.getCurrentItem().getType() == Material.GOLD_BLOCK) {
                player.closeInventory();
                player.chat("/rtpPlayer");
            }
            if (e.getCurrentItem().getType() == Material.DIAMOND_BLOCK) {
                player.closeInventory();
                player.setFlying(true);
            }
        }
    }

}

Это основной класс:

package can.evilestvirus.randomtp;

import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin{

    @Override
    public void onEnable() {
        getCommand("rtpplayer").setExecutor(new CommandRtpPlayer());
        getCommand("rtp").setExecutor(new CommandRtp());
        Bukkit.getPluginManager().registerEvents(new MenuHandler(), this);
    }
}
...