java 如何打开包含物料的库存

h5qlskok  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(167)

只需在一个类中编写代码,然后编写:

case "example":
     player.openInventory(exampleInv);
     break;

但是因为我喜欢我的东西有组织和良好的排序,我在另一个类中编写了库存,作为库存点击事件。
下面是带有InvClickEvent的类:

package de.t0x1ccr34t0r.charactertrails.listeners;

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

public class InventoryListener implements Listener{

    @EventHandler
    public void onInvClick(InventoryClickEvent event) {
        if(event.getCurrentItem() == null) return;
        if(event.getView().getTitle() == "§5Trails:"){
            Player player = (Player) event.getWhoClicked();
            event.setCancelled(true);
            if(event.getCurrentItem().getItemMeta().hasLocalizedName()) {
                switch (event.getCurrentItem().getItemMeta().getLocalizedName()) {
                    case "Close":
                        player.closeInventory();
                        break;
                    case "Copper":
                        player.closeInventory();
                        break;
                    case "Iron":
                        player.closeInventory();
                        break;
                    case "Gold":
                        player.closeInventory();
                        break;
                    case "Diamond":
                        player.closeInventory();
                        break;
                    case "Emerald":
                        player.closeInventory();
                        break;
                }
            }
        }
    }
}

这一切都说player.closeinventory(),因为player.openInventory()还不工作,我需要帮助。我做了几个类,比如copper_Inventory,我在这里向你展示:

package de.t0x1ccr34t0r.charactertrails.inventories;

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.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;

public class Copper_Inventory implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender1, Command cmd1, String s1, String[] strings1) {
        if(!(sender1 instanceof Player)) return false;
        Player player1 = (Player) sender1;

        Inventory copperInventory = Bukkit.createInventory(null , 4 * 9 , "§5Copper Trails:");

        ItemStack ia = new ItemStack(Material.BARRIER);
        ItemMeta ma = ia.getItemMeta();
        ma.setLocalizedName("Close");
        ma.setDisplayName("§cClose");
        ia.setItemMeta(ma);
        copperInventory.setItem(31 , ia);

        ItemStack ib = new ItemStack(Material.ARROW);
        ItemMeta mb = ib.getItemMeta();
        mb.setLocalizedName("Back");
        mb.setDisplayName("§7Back");
        ib.setItemMeta(mb);
        copperInventory.setItem(27 , ib);

        player1.openInventory(copperInventory);

        return false;
    }
}

这样代码就能正常工作了。但只有在游戏中的命令。最后,我想要这样的东西:

case "copper":
     player.openInventory(copperInventory);
     break;

但这显然是行不通的,因为程序找不到“copperInventory”。
我在“铜”的情况下使用“铜”这个词:它看起来像这样,并且已经工作了:

package de.t0x1ccr34t0r.charactertrails.inventories;

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.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.ArrayList;

public class Main_Inventory implements CommandExecutor {
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(!(sender instanceof Player)) return false;
        Player player = (Player) sender;

        Inventory mainInventory = Bukkit.createInventory(null , 3 * 9 , "§5Trails:");

        ItemStack i1 = new ItemStack(Material.COPPER_INGOT);
        ItemMeta m1 = i1.getItemMeta();
        m1.setLocalizedName("Copper");
        m1.setDisplayName(ChatColor.WHITE + "example");
        i1.setItemMeta(m1);
        mainInventory.setItem(11 , i1);

        player.openInventory(mainInventory);

        return false;
    }
}

所以我现在的问题是:如何在“case“copper”中定义公共类Copper_Inventory中的变量“copperInventory”:在public class InventoryListener中。
另外,我不知道这是否重要,您可能会看到这些类不在同一个包中。我做了多个子包,以保持一切顺利。
最后,我的代码应该是这样的:

case "copper":
     player.openInventory(copperInventory);
     break;

但是我不知道如何在其他类中使用变量。
你能帮我吗?

pu3pd22g

pu3pd22g1#

这个问题是因为变量超出了你的实际作用域。它是在另一个方法中创建的,现在变量本身是不可访问的。
如果你想保持相同的库存(不特别推荐),你可以放入一个HashMap<>(),然后再拿。示例:

public class Copper_Inventory implements CommandExecutor {

    public static final HashMap<Player, Inventory> INVENTORIES = new HashMap<>();

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if(!(sender instanceof Player)) return false;
        Player player = (Player) sender;

        Inventory copperInventory = Bukkit.createInventory(null , 4 * 9 , "§5Copper 
Trails:");
        // fill inventory
        player.openInventory(copperInventory);
        INVENTORIES.put(player, copperInventory);
    }
}

然后,在关闭库存时,用途:player.openInventort(Copper_Inventory.INVENTORIES.get(player))
但是,最值得推荐的方式不是这一种。

重新打开即可

你可以创建一个新的类,它可以是这样的:

public class Inventories {

    public static Inventory createCopperInventory(Player p) {
        Inventory copperInventory = Bukkit.createInventory(null , 4 * 9 , "§5Copper 
Trails:");
        // fill inventory
        return copperInventory;
    }
}

然后,每次使用player.openInventory(Inventories.createCopperInventory(player))

相关问题