【问题标题】:Minecraft Spigot Plugin YML File is overwriting custom input in fileMinecraft Spigot 插件 YML 文件正在覆盖文件中的自定义输入
【发布时间】:2021-06-25 15:00:01
【问题描述】:

我为我的 Minecraft 服务器制作了一个插件,一切正常。 我使用 users.yml 文件为每个用户存储一些数据,例如组和 uuid。

现在发生了一些奇怪的事情,我不知道如何解决: 我的 users.yml 生成良好,没有问题。所有数据都保存在那里,我可以访问它。 但是,当我尝试将用户组从默认值(这是分配给每个新用户的组)编辑为文件本身的管理员并且用户再次加入时,文件会将组覆盖为默认值。

我在下面的代码中没有看到什么以防止覆盖或我做错了什么?

这是创建 users.yml 文件的函数:

    public class UserList {

    private static File usersFile;
    private static FileConfiguration usersConf;

    public static void Setup(){
        usersFile = new File(Main.getInstance().getDataFolder(), "users.yml");

        if(!usersFile.exists()){
            try {
                usersFile.createNewFile();
            } catch (Exception e){
                System.out.println("Error creating Usersfile: " + e);
            }
        }
        usersConf = YamlConfiguration.loadConfiguration(usersFile);
    }

    public static FileConfiguration get(){
        return usersConf;
    }

    public static void Save(){
        try {
            usersConf.save(usersFile);
        } catch (Exception e){
            System.out.println("Error saving Usersfile: " + e);
        }
    }

    public static void reload(){
        usersConf = YamlConfiguration.loadConfiguration(usersFile);
    }
}

这是 onEnabled() 函数中的代码:

    @Override
    public void onEnable() {
        instance = this;
        if (!getDataFolder().exists()) getDataFolder().mkdir();

        //Erstelle users.yml mit Standardwerten
        UserList.Setup();
        UserList.get().addDefault("groups.admin.prefix", "§c");
        UserList.get().addDefault("groups.vip.prefix", "§6");
        UserList.get().addDefault("groups.default.prefix", "§7");
        UserList.get().options().copyDefaults(false);
        UserList.Save();

        //Hole alle Usergruppen
        Set<String> groups = UserList.get().getConfigurationSection("groups").getKeys(false);

        //Events Registrieren
        getServer().getPluginManager().registerEvents(this, this);
    }

以下是玩家加入服务器时执行的代码:

    @EventHandler
    public void onJoin(PlayerJoinEvent e){
        Player p = e.getPlayer();

        if (UserList.get().get("users." + p.getName() + ".group") == null){  //<- I tried to prevent it with this if-statement but the problem must be elsewhere
            UserList.get().set("users." + p.getName() + ".group", "default");
        }
        UserList.get().set("users." + p.getName() + ".uuid", p.getUniqueId().toString());
        UserList.Save();

        if (!p.hasPlayedBefore()) e.setJoinMessage(ChatColor.YELLOW + p.getName() + ChatColor.WHITE + " is new on this Server!");
        else e.setJoinMessage(ChatColor.YELLOW + p.getName() + ChatColor.WHITE + " is " + ChatColor.GREEN + "Online");

    }

【问题讨论】:

    标签: java yaml minecraft


    【解决方案1】:

    这是造成问题的原因:

    UserList.get().options().copyDefaults(false);
    

    您应该使用saveDefaultConfig(),当(且仅当)配置文件不存在时,它将写入配置。

    此方法应与您的插件实例一起调用,并且适用于您的 config.yml 文件。

    如果你想在文件不存在时复制它,你应该这样做:

    File usersFile = new File(Main.getInstance().getDataFolder(), "users.yml");
    if(!usersFile.exists()){
        try (InputStream in = pl.getResource("users.yml");
                   OutputStream out = new FileOutputStream(usersFile)) {
            ByteStreams.copy(in, out);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    config = YamlConfiguration.loadConfiguration(usersFile);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多