带 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()
。
我正在尝试使用 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()
。