存储玩家的库存

时间:2015-06-03 18:55:11

标签: java bukkit

如何存储播放器的库存,清除它,然后将其返回到存储的版本?

2 个答案:

答案 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)