带 bukkit 的简单套件 API

Simple kits with bukkit API

我正在尝试使用 bukkit API 制作一些简单的 kitPvP(主要用于学习目的),但我正在努力在玩家选择装备之前备份他们的物品栏。

我现在的代码:(文件:Commands.java,使用 onCommand 从 main 调用它)

    public boolean testkit(CommandSender sender, String[] args) {
        if(sender instanceof Player) {
            String kit = args[0]; // I know, may throw exception
            Player player = (Player) sender;
            PlayerInventory inventory = player.getInventory();
            // Backup inventory into HashMap(?)

            if(kit.equalsIgnoreCase("basic")) {
                // Clear inventory then give items to player (or replace)
            } else if(kit.equalsIgnoreCase("out")) {
                // Clear inventory then give backup to player (or replace)
            } else {
                sender.sendMessage("No such kit.");
                return false;
            }
            return true; // Returns if a good kit selected
        } else {
            sender.sendMessage("Only players can select kits!");
            return false;
        }
    }

现在,我有以下部分的问题:

我不知道如何做这些事情,因为你不能创建一个新的 PlayerInventory 实例(它是一个接口),而且我不知道什么可以保存玩家的物品。 (另外我知道如果服务器关闭,HashMap 将被擦除,但这不是重点)

此外,我想有一些方法可以用另一个替换玩家的物品栏,但我完全不知道该怎么做。

编辑: 找到了一个相当不雅的解决方案。在 here 期间,找到了如何制作新物品栏,并制作了一个函数来迭代玩家的物品栏并将物品复制到备份中。

private void overwrite(Inventory source, Inventory dest) {
    for(int i = 0; i < source.getSize(); i++) {
        dest.setItem(i, source.getItem(i));
    }
}

private Inventory copy(Inventory inventory) {
    Inventory copy = Bukkit.createInventory(inventory.getHolder(), inventory.getSize(), inventory.getName());
    overwrite(inventory, copy);
    return copy;
}

但有一个问题:如果旧库存发生变化,ItemStack 是否会更新到新库存? (这里不是很重要,但了解 IMO 很重要) 如果会,有什么办法可以防止吗?

你应该做的是调用 getContents() on the Player's inventory, then saving the array that that returns into a HashMap. You then clear() the player's inventory, and individually set the contents of each slot (or, for a more elegant solution, have a ItemStack[] ready for the items of each kit, that you can push into the inventory using setContents()).

一旦玩家使用完工具包并且您想恢复他们的原始库存,您只需 setContents() 使用您存储在 HashMap 中的他们物品的副本。

请注意 getContents()setContents() 不处理装甲槽,所以要做到这一点,您还需要 getArmorContents() and setArmorContents()