CustomInventory на клик не будет работать Bukkit - PullRequest
0 голосов
/ 09 ноября 2018

Мне никогда не нравится прибегать к этому, потому что я пытаюсь решить код самостоятельно и выяснить, почему он не работает, на этот раз я действительно не понимаю, почему это не работает. Вот инвентарь, который я сделал:

package io.github.bxnie.gui;

import java.util.ArrayList;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.ClickType;
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 net.minecraft.server.v1_12_R1.CommandExecute;

public class build extends CommandExecute implements Listener, CommandExecutor {

    public String build = "build";

    //open main GUI for building /build
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        Player p = (Player) sender;
        if (!(sender instanceof Player)) {
            sender.sendMessage("Only players may execute this command!");
            return true;
        }
        if (cmd.getName().equalsIgnoreCase(build) && sender instanceof Player) {
            if (p.hasPermission("fp.build")) {
                //Creates the Inventory
                Inventory gui = Bukkit.createInventory(null, 27, ChatColor.BLUE + "Build Menu");

                //Where the Items and Meta are made
                ItemStack creative = new ItemStack(Material.CONCRETE, 1, (short) 3);
                ItemMeta creativemeta = creative.getItemMeta();
                creativemeta.setDisplayName(ChatColor.BLUE + "Creative Mode");
                creativemeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
                ArrayList<String> creativelore = new ArrayList<String>();
                creativelore.add(ChatColor.GRAY + "Click this to set your gamemode to Creative!");
                creativemeta.setLore(creativelore);
                creative.setItemMeta(creativemeta);

                //Positioning
                gui.setItem(18, creative);

                p.openInventory(gui);

            } else {
                p.sendMessage(ChatColor.RED + "Insufficient Permission!");
                return false;
            }
        }

        return false;
    }

}

Вот события onclick для инвентаря:

package io.github.bxnie.events;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;

public class buildmenu implements Listener {

    @SuppressWarnings("unlikely-arg-type")
    @EventHandler
    public void InventoryOnClick(InventoryClickEvent event) { 
        Player player = (Player) event.getWhoClicked();
        Inventory open = event.getInventory();
        ItemStack item = event.getCurrentItem();

        if(open == null) {
            return;
        }

        if(open.getName().equals(ChatColor.BLUE + "Build Menu")) {

            event.setCancelled(true);

            if(item == null || !item.hasItemMeta()) {
                return;
            }
            if(item.getItemMeta().getDisplayName().equals(ChatColor.BLUE + "Creative Mode")) {
                Bukkit.broadcastMessage("Test");
                return;
            }
        }
    }
}

когда я использую команду / сборку в игре, открывается инвентарь с нужным предметом внутри, однако, когда я нажимаю на предмет, он не запускает тестовую трансляцию, которую я установил, на данный момент, кроме того, игрок может перемещать предметы в инвентаре. Я уверен, что это просто простая ошибка, и мне жаль, что я зря трачу ваше время, но я пытаюсь исправить это уже час.

Спасибо -Бен

1 Ответ

0 голосов
/ 10 ноября 2018

Я бы написал это как комментарий, но спасибо stackoverflow за то, что не позволил это.

Как рекомендует Squiddie, возможно, стоит отладить. Возможно отправка игроку сообщения при нажатии на инвентарь.

Кроме того,

Player.updateInventory();

будет полезно, чтобы предотвратить задержку элемента после отмены события, поскольку это может вызвать проблемы с дублированием.

Похожий поток был открыт на bukkit, который я получил, когда гуглил событие -> https://bukkit.org/threads/how-can-i-cancel-inventory-click-event.144874/

...