普特莫斯维基 (Purtmars Wikipedia 📖)

数据持久化与生命周期 (Chemdah 开发者文档)

来自Purtmars Wikipedia —— 普特莫斯维基

目录

数据持久化

很多地方都应用了 DataContainer 容器,但只有 PlayerProfile、Quest 经过数据库,所以需要在存入数据时考量数据类型是否支持持久化储存,例如 ItemStack、Location 便不支持。

persistentDataContainer["item"] = itemStack
persistentDataContainer["location"] = Location(world, 0.0, 0.0, 0.0)

这种写法是完全错误的,尽管它能够通过编译,但是在数据写入数据库时便会发生错误。而我们在开发的过程中,应当使用最保守的基本数据类型。例如整型、浮点数、字符串等。

persistentDataContainer["level"] = 10
persistentDataContainer["experience"] = Data(15.6)

假如你因操作失误存入了 ink.ptms.chemdah.core.Data 类型,Chemdah 也会为你自动转换,这点不用担心。

数据转换

ink.ptms.chemdah.core.Data 中我们提供了以下开放方法用于转换存入的数据类型。

/**
 * 转换为 Integer 基本类型
 */
fun toInt(): Int

/**
 * 转换为 Float 基本类型
 */
fun toFloat(): Float

/**
 * 转换为 Double 基本类型
 */
fun toDouble(): Double

/**
 * 转换为 Long 基本类型
 */
fun toLong(): Long

/**
 * 转换为 Short 基本类型
 */
fun toShort(): Short

/**
 * 转换为 Byte 基本类型
 */
fun toByte(): Byte

/**
 * 转换为 Boolean 基本类型
 */
fun toBoolean(): Boolean

/**
 * 转换为文本并识别为 InferArea 类型,识别后缓存
 * 书写格式为 InferArea 无世界单坐标格式(详见区域选择器)
 */
fun toVector(): InferArea

/**
 * 转换为文本并识别为 InferArea 类型,识别后缓存
 * 书写格式为 InferArea 任何格式(详见区域选择器)
 */
fun toPosition(): InferArea

/**
 * 转换为文本并识别为 InferEntity 类型,识别后缓存
 * 书写格式为 InferEntity 任何格式(详见实体选择器)
 */
fun toInferEntity(): InferEntity

/**
 * 转换为文本并识别为 InferBlock 类型,识别后缓存
 * 书写格式为 InferBlock 任何格式(详见实体选择器)
 */
fun toInferBlock(): InferBlock

/**
 * 转换为文本并识别为 InferItem 类型,识别后缓存
 * 书写格式为 InferItem 任何格式(详见物品选择器)
 */
fun toInferItem(): InferItem

数据生命周期

当 DataContainer 中的数据发生变动时,会被标记为已修改并等待写入数据库。每 100 游戏刻(5000 毫秒)或玩家退出游戏时进行数据检查,将所有已修改的数据写入数据库,并唤起 PlayerEvents.Updated 事件。

为了保证数据同步的有效性,玩家加入游戏时的数据载入默认会延迟 20 游戏刻(1000 毫秒)虽然这个方法已经被证实不安全。