Bukkit:从配置文件中获取数据返回null

时间:2014-02-03 07:31:41

标签: java minecraft bukkit

这一整天一直困扰着我。我一直在谷歌搜索,搜索并四处寻找无济于事。

我有一个用于测试经济的小插件。保存数据工作正常!当我希望加载存储在里面的数据时它就成了问题。

这是我的一流代码。 (记住,仅用于测试)

package me.dudemister.crimsongaming;

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.plugin.java.JavaPlugin;

public class CrimsonGaming extends JavaPlugin implements Listener
{   

    public boolean log = true;

    public YamlConfiguration yc = YamlConfiguration.loadConfiguration(getResource("economy.yml"));
    File cf = new File(getDataFolder(), "economy.yml");

    public void log(Level level, String message)
    {
        if(log)
        {
            getLogger().log(level, message);
        }
    }

    public void enableListeners()
    {
        Bukkit.getPluginManager().registerEvents(this, this);
    }

    public void loadData()
    {

    }

    @Override
    public void onEnable()
    {
        enableListeners();
        loadData();
        unpack();
    }

    @Override
    public void onDisable()
    {

    }

    @EventHandler
    public void onChat(AsyncPlayerChatEvent event) throws IOException
    {
        Player player = event.getPlayer();
        String message = event.getMessage();
        String[] args = message.split(" ");
        String cmd = args[0];

        if(message.equalsIgnoreCase(".setupecon"))
        {
            log(Level.INFO, "Setting up economy...");
            player.sendMessage(ChatColor.RED + "Setting up economy...");
            yc.set("config.log", true);
            yc.set("config.seedmoney", "150");
            yc.set("config.bonusmoney", "100");
            yc.set("config.bank.min", "0");
            yc.set("config.bank.max", "1000000000");
            yc.save(cf);
            event.setCancelled(true);
        }
        if(message.equalsIgnoreCase(".money_give"))
        {
            log(Level.INFO, "Giving player " + player.getName() + " 1,000,000 dollars.");
            player.sendMessage(ChatColor.RED + "Giving you $100.");
            yc.set("player."+player.getName()+".balance", "100");
            yc.save(cf);
        }
        if(message.equalsIgnoreCase(".money"))
        {
            String balance = yc.getString("player."+player.getName()+".balance");
            log(Level.INFO, "Balance of player " + player.getName() + ": " + balance);
            player.sendMessage(ChatColor.RED + "Your current net worth: " + balance);
            event.setCancelled(true);
        }
    }

    private void unpack()
    {
        try
        {
            if (cf.exists())
            {
                log(Level.INFO, "Economy detected, skipping unpacking process...");
            }
            else
            {
                log(Level.INFO, "No economy detected, creating new one...");
                yc.save(cf);
            }
        }
        catch (IOException e)
        {
            log(Level.SEVERE, "Could not create economy!");
        }
    }
}

现在,会发生以下情况:

一切都很好。它保存并更新配置。除了我想加载它的时候。这是它在日志中显示的内容。控制台:

Balance of player Dudemister1999: null

直到我给自己付钱才这样做。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

事实证明getResource获取了插件jar中的文件。

jars中的文件无法通过流编辑java。

您每次尝试从jar中的文件读取,而不是在数据文件夹中创建的文件。您需要创建一个加载相应文件的函数:

public YamlConfiguration yc;
//...
public void loadData()
{
    if (cf.exists())
        yc = YamlConfiguration.loadConfiguration(cf);
    else
        yc = YamlConfiguration.loadConfiguration(getResource("economy.yml"));
}

旁注:

您还应该使用setIntgetInt并研究标准的Bukkit命令系统。 (使用plugin.yml和正确处理权限等的命令处理程序的那个。)