Minecraft Forge 1.19.3:如何为所有玩家或世界存储统一NBT数据?
全局数据存储方案:统一玩家数据或世界级存储
一、批量给所有玩家设置相同数据
要是你想一次性给所有在线玩家都写入(a, b)这组数据,直接遍历服务器在线玩家列表就行:
// 遍历所有在线玩家,写入统一数据 for (Player player : Bukkit.getOnlinePlayers()) { player.getPersistentDataContainer().putString("a", "b"); }
如果要让后续新加入的玩家自动获取这组数据,可以监听玩家加入事件,在玩家刚进服时自动写入:
@EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); // 可选:先判断数据是否存在,避免重复写入 if (!player.getPersistentDataContainer().has("a", PersistentDataType.STRING)) { player.getPersistentDataContainer().putString("a", "b"); } }
二、将数据存储到世界中(全局共享)
如果不需要给每个玩家单独存数据,而是想让整个世界共享这组数据,有两种常用方式:
方式1:使用世界的持久化数据容器
直接利用世界自带的PersistentDataContainer,数据会和世界文件绑定:
// 获取服务器主世界(也可以指定其他世界) World mainWorld = Bukkit.getWorlds().get(0); PersistentDataContainer worldPDC = mainWorld.getPersistentDataContainer(); // 写入全局数据 worldPDC.putString("a", "b"); // 读取数据示例 String globalValue = worldPDC.getString("a");
方式2:自定义配置文件存储
如果数据需要手动修改或者更直观的管理,创建自定义YAML配置文件是更合适的选择:
// 初始化配置文件(替换YourPluginName为你的插件名称) Plugin yourPlugin = Bukkit.getPluginManager().getPlugin("YourPluginName"); File globalDataFile = new File(yourPlugin.getDataFolder(), "globalData.yml"); // 若文件不存在则从插件资源目录复制 if (!globalDataFile.exists()) { yourPlugin.saveResource("globalData.yml", false); } YamlConfiguration globalConfig = YamlConfiguration.loadConfiguration(globalDataFile); // 写入数据 globalConfig.set("a", "b"); globalConfig.save(globalDataFile); // 读取数据示例(第二个参数是默认值,当key不存在时返回) String globalValue = globalConfig.getString("a", "default_b");
关键提示
- 使用
PersistentDataContainer时,强烈建议自定义NamespacedKey来避免和其他插件的数据冲突,示例:
NamespacedKey customKey = new NamespacedKey(yourPlugin, "a"); player.getPersistentDataContainer().put(customKey, PersistentDataType.STRING, "b");
- 世界PDC适合绑定世界的动态数据,配置文件则适合需要持久化且支持手动编辑的场景。
内容的提问来源于stack exchange,提问作者BaRiboD
相关产品推荐
相关产品推荐

