保存玩家库存

时间:2012-03-21 17:32:11

标签: java bukkit

使用允许传输世界的命令,我正在尝试保存玩家库存。

public void savePlayerInv(Player p, World w){
    File playerInvConfigFile = new File(plugin.getDataFolder() + File.separator + "players" + File.separator + p.getName(), "inventory.yml");
    FileConfiguration pInv = YamlConfiguration.loadConfiguration(playerInvConfigFile);
    PlayerInventory inv = p.getInventory();
    int i = 0;

    for (ItemStack stack : inv.getContents()) {
        //increment integer
        i++;
        String startInventory = w.getName() + ".inv." + Integer.toString(i);

        //save inv
        pInv.set(startInventory + ".amount", stack.getAmount());
        pInv.set(startInventory + ".durability", Short.toString(stack.getDurability()));
        pInv.set(startInventory + ".type", stack.getTypeId());
        //pInv.set(startInventory + ".enchantment", stack.getEnchantments());
        //TODO add enchant saveing
    }

    i = 0;
    for (ItemStack armor : inv.getArmorContents()){
            i++;
            String startArmor = w.getName() + ".armor." + Integer.toString(i);

            //save armor
            pInv.set(startArmor + ".amount", armor.getAmount());
            pInv.set(startArmor + ".durability", armor.getDurability());
            pInv.set(startArmor + ".type", armor.getTypeId());
            //pInv.set(startArmor + ".enchantment", armor.getEnchantments());
    }

    //save exp
    if (p.getExp() != 0) {
            pInv.set(w.getName() + ".exp", p.getExp());
    }
}

问题出在第130行:

pInv.set(startInventory + ".amount", stack.getAmount());

我得到了这个堆栈跟踪:

2012-03-21 13:23:25 [SEVERE] null
org.bukkit.command.CommandException: Unhandled exception executing command 'wtp' in plugin Needs v1.0
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:42)
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:166)
at org.bukkit.craftbukkit.CraftServer.dispatchCommand(CraftServer.java:461)
at net.minecraft.server.NetServerHandler.handleCommand(NetServerHandler.java:818)
at net.minecraft.server.NetServerHandler.chat(NetServerHandler.java:778)
at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:761)
at net.minecraft.server.Packet3Chat.handle(Packet3Chat.java:33)
at net.minecraft.server.NetworkManager.b(NetworkManager.java:229)
at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:112)
at net.minecraft.server.NetworkListenThread.a(NetworkListenThread.java:78)
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:554)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:452)
at net.minecraft.server.ThreadServerApplication.run(SourceFile:490)
    Caused by: java.lang.NullPointerException
at com.devoverflow.improved.needs.commands.CommandWorldtp.savePlayerInv(CommandWorldtp.java:130)
at com.devoverflow.improved.needs.commands.CommandWorldtp.onCommand(CommandWorldtp.java:60)
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:40)
... 12 more

1 个答案:

答案 0 :(得分:3)

执行inv.getContents()时,您将检索播放器广告资源中的每个广告位,包括空广告位。 这些空槽返回null,因为它们中没有任何内容。

要修复,请在启动for循环后立即添加if语句:

for (ItemStack stack : inv.getContents()) {
    if (stack == null) continue;
    // And keep everything else the same
}

您稍后可能遇到的问题是替换它所来自的完全相同的插槽中的所有内容。 我建议使用HashMap或其他东西来跟踪项目的来源。