当前位置: 首页 > 知识库问答 >
问题:

Minecraft Spigot Plugin YML File正在覆盖文件中的自定义输入

华坚成
2023-03-14

我为我的Minecraft服务器做了一个插件,一切都很好。我使用users.yml文件为每个用户存储一些数据,如组和uuid。

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

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

这是创建用户的函数。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);
    }
}

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

    @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");

    }

共有1个答案

羿宏硕
2023-03-14

这是造成问题的原因:

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);
 类似资料:
  • 问题内容: 我想要的只是让bool(myInstance)返回False(以及在if / or / and等条件下让myInstance评估为False。我知道如何覆盖>,<,=) 我已经试过了: 有什么建议? (我正在使用Python 2.6) 问题答案: 这是Python 2.x还是Python 3.x?对于Python 2.x,您正在寻找替代方法。

  • 在我当前的构建脚本中,我有特殊的/res/和/assets文件夹,我在构建时将它们复制到文件的工作版本上。在/assets/中是捆绑的数据(sql和一个文本文件),而在/res/values/I中有一个connection.xml值文件。

  • 在苹果自带地图和百度地图上覆盖一层图片,图片可以随地图缩放移动。关键就是自定义Overlay和OverlayView。 作者说:实在无力吐槽了,百度地图iOS SDK中的静态库文件居然都是10M !由于过大上传不了,亲们自行去 http://developer.baidu.com/map/sdk-ios.htm 按提示添加SDK吧!至于基于百度地图的自定义Overlay和OverlayView 记

  • 首先,我是Spring集成和Spring JMS方面的新手,所以我尝试采用的解决方案可能不适合我的需求。 我将尝试解释我需要实现什么:基本上,我需要将消息放在一个队列中,并在另一个队列中异步等待答案。 1、将消息放入队列: 我的解决方案: -- 2.异步监听来自另一个队列的回复消息: 我的解决方案1: 自定义MessageListener实现javax.jms.MessageListener。 然

  • 我仍然是python的新手,我已经尝试过这种方式覆盖txt文件上的一行 ''' 答案 =输入(“俄/秒/升/米:”) ''' 它会替换txt文件上的所有文本行,无论我想做什么,当我选择R时,它会写入txt文件的第一行,当我选择S时,它会写入txt文件的第三行 我现在已经尝试过了 ''' ''' 有人能告诉我正确的方向吗

  • 是否有方法更改在〈代码〉*中定义的接口属性的类型。d、 在typescript中? 例如:中的接口定义为 我想在我写入的typescript文件中更改它 甚至这样也行 这种方法有效吗?当我尝试我的系统时,它没有工作。只是想确认一下这是否可能?