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

标签 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

它会一直这样做,直到我给自己钱为止。

有什么想法吗?

最佳答案

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

jar 内的文件无法通过 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和命令处理程序来正确处理权限等的一个。)

关于java - Bukkit:从配置文件获取数据返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21521907/

相关文章:

LINUX 终端 - Tar : File not found. 跳过文件?

java - 插件 MC 的无限循环 java/java 事件

java - Spigot 插件尝试包含 Apache Commons Text 时出现 NoClassDefFoundError

java - 什么是 "Type mismatch"以及如何修复它?

Java 3D 游戏开发

java - 在 Android 中加载/保存属性文件最方便的方法是什么?

java - 编辑文本字段未检测到。抛出空指针异常

java - 为什么我的 config.yml 文件一直只输出零? bukkit 插件

java - 如何以 boolean 值调用 InventoryClickEvent?

java - HttpClient 、 httppost 和负载