我想用bukkit API做一些简单的kitPvP(主要用于学习目的),但是我在为选择工具包前备份玩家的库存而苦苦挣扎。bukkit API的简单工具包
现在我的代码:(文件:Commands.java,是接收来自主叫带按需)
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很重要) 如果会的话,有什么办法来防止这种情况发生?
其他用户可能会读到这一点非常重要:它不包括装甲插槽,我不知道它是否包含副手插槽。 (包括清除,setcontents和getcontents) –
好的,我编辑了答案@AmitGold – hintss