如何存储播放器的库存,清除它,然后将其返回到存储的版本?
答案 0 :(得分:1)
如果你想暂时保存玩家的库存,你可以获得他们库存的内容(我假设的常规内容和装甲?)并将它们放在某种列表中。您可能还需要保存每个ItemStack /项的插槽号,在这种情况下您可能需要使用HashMap。要在保存内容后清除播放器的广告资源,请使用player.getInventory().clear()
。然后,您可以使用player.getInventory.setItem(slot, item)
再次添加项目。
如果要确保即使重新加载插件或关闭服务器也会保存库存,则需要将库存内容转换为字符串(序列化)并将其保存到文件中(Bukkit)有内置的东西,以便保留所有的项目元数据)。如果您需要更多相关信息,请告诉我,我可以为这些方法编写更详细的代码。可能有一种更简单的方法可以临时复制整个广告资源的内容,然后使用player.getInventory().setContents(contents)
。
答案 1 :(得分:1)
您可以使用HashMap
来存储所有玩家的库存和装甲的内容
Map<UUID, ItemStack[]> items = new HashMap<UUID, ItemStack[]>();
Map<UUID, ItemStack[]> armor = new HashMap<UUID, ItemStack[]>();
然后,您可以使用
将玩家的广告资源内容存储在HashMap中UUID uuid = player.getUniqueId();
ItemStack[] contents = player.getInventory().getContents();
ItemStack[] armorContents = player.getInventory().getArmorContents();
items.put(uuid, contents);
armor.put(uuid, armorContents);
然后你可以通过
来清除玩家的库存和装甲player.getInventory().clear();
player.getInventory().setHelmet(null);
player.getInventory().setChestplate(null);
player.getInventory().setLeggings(null);
player.getInventory().setBoots(null);
要恢复库存和amor,您只需使用
即可UUID uuid = player.getUniqueId();
ItemStack[] contents = items.get(uuid);
ItemStack[] armorContents = armor.get(uuid);
player.getInventory().setContents(contents);
player.getInventory().setArmorContents(armorContents);
所以,你可以拥有类似这样的代码
Map<UUID, ItemStack[]> items = new HashMap<UUID, ItemStack[]>();
Map<UUID, ItemStack[]> armor = new HashMap<UUID, ItemStack[]>();
public void storeAndClearInventory(Player player){
UUID uuid = player.getUniqueId();
ItemStack[] contents = player.getInventory().getContents();
ItemStack[] armorContents = player.getInventory().getArmorContents();
items.put(uuid, contents);
armor.put(uuid, armorContents);
player.getInventory().clear();
player.getInventory().setHelmet(null);
player.getInventory().setChestplate(null);
player.getInventory().setLeggings(null);
player.getInventory().setBoots(null);
}
public void restoreInventory(Player player){
UUID uuid = player.getUniqueId();
ItemStack[] contents = items.get(uuid);
ItemStack[] armorContents = armor.get(uuid);
if(contents != null){
player.getInventory().setContents(contents);
}
else{//if the player has no inventory contents, clear their inventory
player.getInventory().clear();
}
if(armorContents != null){
player.getInventory().setArmorContents(armorContents);
}
else{//if the player has no armor, set the armor to null
player.getInventory().setHelmet(null);
player.getInventory().setChestplate(null);
player.getInventory().setLeggings(null);
player.getInventory().setBoots(null);
}
}
然后,当您想要存储播放器的广告资源并清除它时,您可以调用storeAndClearInventory(Player)
,并在想要将播放器的广告资源恢复到原始状态时调用restoreInventory(Player)
。