【问题标题】:Event InventoryClickEvent don't work [Minecraft Bukkit Plugin]事件 InventoryClickEvent 不起作用 [Minecraft Bukkit 插件]
【发布时间】:2020-02-08 22:37:03
【问题描述】:

我想创建一个使用物品栏的我的世界 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);

    }
}

【问题讨论】:

    标签: events minecraft bukkit inventory


    【解决方案1】:

    您需要在 CommandRtp 类中实现 Listener。一旦你这样做了,它应该可以工作。

    所以你的班级看起来像这样:

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

    【讨论】:

    • 我实现了监听器,但它不起作用。我可以打开菜单,但是当我想进行交互时,它什么也没做,而且似乎没有调用该事件。
    【解决方案2】:

    好的,所以我发现了我的错误。我已经创建了我的新课程,并且我正确注册了新课程。在我更改 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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      你可以使用这个事件:

      @EventHandler
      public void onInventoryClick(InventoryClickEvent event)  {
      
      }
      

      对我来说很有效

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        相关资源
        最近更新 更多