玩家数据库

使用该扩展快速部署 SQL & SQLite 玩家数据库。

该模块依赖于:

  • common

  • module-database

数据结构如下所示:

{
    "bukkitObj": {
        "health": "20"
        "x": 10
        "y": 0
        "z": 10
    },
    "kirraObj": {
        "health": "20"
        "x": 10
        "y": 0
        "z": 10
    }
}

每个玩家拥有一个独立 Map 容器,键值类型均为可变长度字符串,最大长度 64 字节。

SQL

使用配置文件加载 SQL 类型玩家数据库,表现形式如下:

database:
  host: localhost
  port: 3306
  user: root
  password: root
  database: root
  table: my_database
@Config
lateinit var conf: SecuredFile
    private set

override fun onEnable() {
    // 初始化玩家容器数据库,若数据库连接失败该方法会抛出异常
    setupPlayerDatabase(conf.getConfigurationSection("database"))
}

SQLite

加载 SQLite 类型玩家数据库,表现形式如下:

override fun onEnable() {
    // 初始化玩家容器数据库,若数据库连接失败该方法会抛出异常
    setupPlayerDatabase(File(getDataFolder(), "data.db"))
}

混合写法

override fun onEnable() {
    // 使用配置文件判断玩家数据库类型
    if (conf.getBoolean("database.enable")) {
        setupPlayerDatabase(conf.getConfigurationSection("database"))
    } else {
        setupPlayerDatabase(newFile(getDataFolder(), "data.db"))
    }
}

使用方式

在服务器启动时必须通过 setupPlayerDatabase 方法初始化数据库,否则将无法进行接下来的行为:

@SubscribeEvent
fun e(e: PlayerJoinEvent) {
    // 初始化玩家容器
    e.player.setupDataContainer()
    // 读取或写入数据(写入时唤起异步 I/O 任务,尽量避免高频写入)
    e.player.getDataContainer()["test"] = 123
}

@SubscribeEvent
fun e(e: PlayerQuitEvent) {
    // 释放玩家容器缓存
    e.player.releaseDataContainer()
}