【问题标题】:Save a variable when the server is off服务器关闭时保存变量
【发布时间】:2022-01-25 02:04:39
【问题描述】:

事实上,我正在制作一个 Minecraft 插件,我想知道一些插件(不使用数据库)如何在服务器关闭时也能保存信息。

例如,如果我们制作了一个成绩插件并创建了一个不同的列表,或者我们堆叠了构成每个列表的玩家。当服务器关闭并随后重新启动时,列表将再次变为空(因为我初始化它们)。

所以我想知道是否有人知道如何保存这些信息。

【问题讨论】:

    标签: java plugins minecraft


    【解决方案1】:

    如果插件只想为自己保存信息,并且不需要通过其他方式(例如 PHP 网站)访问,则可以使用 YAML 格式。

    1. 创建配置文件:
    File usersFile = new File(plugin.getDataFolder(), "user-data.yml");
    if(!usersFile.exists()) { // don't exist
        usersFile.createNewFile();
        // OR you can copy file, but the plugin should contains a default file
        /*try (InputStream in = plugin.getResource("user-data.yml");
                             OutputStream out = new FileOutputStream(usersFile)) {
            ByteStreams.copy(in, out);
        } catch (Exception e) {
             e.printStackTrace();
        }*/
    }
    
    1. 将文件加载为 Yaml 内容:
    YamlConfiguration config = YamlConfiguration.loadConfiguration(usersFile);
    
    1. 编辑内容:
    config.set(playerUUID, myVar);
    
    1. 保存内容:
    config.save(usersFile);
    

    另外,我建议您使用调度程序使 I/O 异步(读写)。

    奖金:

    如果您想为每个用户创建一个配置文件,并使用默认配置,请这样做:

    File oneUsersFile = new File(plugin.getDataFolder(), playerUUID + ".yml");
    if(!oneUsersFile.exists()) { // don't exist
        try (InputStream in = plugin.getResource("my-def-file.yml");
                             OutputStream out = new FileOutputStream(oneUsersFile)) {
            ByteStreams.copy(in, out); // copy default to current
        } catch (Exception e) {
             e.printStackTrace();
        }
    }
    YamlConfiguration userConfig = YamlConfiguration.loadConfiguration(oneUsersFile);
    

    PS:变量plugin 是你的插件的实例,即扩展“JavaPlugin”的类。

    【讨论】:

      【解决方案2】:

      您可以使用 PersistentDataContainers: 要从播放器读取数据,请使用

      PersistentDataContainer p = player.getPersistentDataContainer();
      int blocksBroken = p.get(new NamespacedKey(plugin, "blocks_broken"), PersistentDataType.INTEGER); // You can also use DOUBLE, STRING, etc.
      

      Namespaced 键是指所存储数据的名称或指针。 PersistentDataType 是指正在存储的数据类型,可以是任何 Java 原始类型或字符串。要将数据写入播放器,请使用

      p.set(new NamespacedKey(plugin, "blocks_broken"), PersistentDataType.INTEGER, blocksBroken + 1);

      【讨论】:

        猜你喜欢
        • 2012-08-24
        • 2016-10-23
        • 2015-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 2019-07-17
        相关资源
        最近更新 更多