【发布时间】:2022-01-25 02:04:39
【问题描述】:
事实上,我正在制作一个 Minecraft 插件,我想知道一些插件(不使用数据库)如何在服务器关闭时也能保存信息。
例如,如果我们制作了一个成绩插件并创建了一个不同的列表,或者我们堆叠了构成每个列表的玩家。当服务器关闭并随后重新启动时,列表将再次变为空(因为我初始化它们)。
所以我想知道是否有人知道如何保存这些信息。
【问题讨论】:
事实上,我正在制作一个 Minecraft 插件,我想知道一些插件(不使用数据库)如何在服务器关闭时也能保存信息。
例如,如果我们制作了一个成绩插件并创建了一个不同的列表,或者我们堆叠了构成每个列表的玩家。当服务器关闭并随后重新启动时,列表将再次变为空(因为我初始化它们)。
所以我想知道是否有人知道如何保存这些信息。
【问题讨论】:
如果插件只想为自己保存信息,并且不需要通过其他方式(例如 PHP 网站)访问,则可以使用 YAML 格式。
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();
}*/
}
YamlConfiguration config = YamlConfiguration.loadConfiguration(usersFile);
config.set(playerUUID, myVar);
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”的类。
【讨论】:
您可以使用 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);
【讨论】: