普特莫斯维基 (Purtmars Wikipedia 📖)

数据控制 (Chemdah 开发者文档)

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

目录

数据控制

数据控制分为玩家数据与任务数据,它们都是由 ink.ptms.chemdah.core.DataContainer 提供存储服务。
以下是 ink.ptms.chemdah.core.PlayerProfile 提供的所有开放属性和方法。

/**
 * 玩家 UUID
 */
val uniqueId: UUID

/**
 * 玩家实例,实时获取的并非缓存
 * 若玩家离线则会直接抛出 NullPointerException 异常
 */
val player: Player

/**
 * 玩家是否在线
 */
val isPlayerOnline: Boolean

/**
 * 玩家数据是否发生变动(玩家自身数据以及所有任务数据)
 */
val isDataChanged: Boolean

/**
 * 玩家持久化数据储存容器
 */
val persistentDataContainer: DataContainer

/**
 * 强制注册新的任务
 * 会覆盖原有的相同任务且不会进行任何条件判断和触发事件
 */
fun registerQuest(quest: Quest)

/**
 * 强制注销任务
 * 不会进行任何条件判断和触发事件
 * @param release 是否从数据库释放数据
 */
fun unregisterQuest(quest: Quest, release: Boolean = true)

/**
 * 获取任务条目持久化储存容器控制器
 */
fun  dataOperator(task: Task, func: QuestDataOperator.() -> T)

/**
 * 通过序号获取正在进行中的有效任务
 * @param openAPI 是否启用开放 API,即允许第三方直接修改这个结果
 */
fun getQuestById(value: String, openAPI: Boolean = true): Quest?

/**
 * 获取所有正在进行中的有效任务
 * @param openAPI 是否启用开放 API,即允许第三方直接修改这个结果
 */
fun getQuests(openAPI: Boolean = false): List

/**
 * 通过序号判断该任务是否已经完成
 */
fun isQuestCompleted(value: String): Boolean

/**
 * 通过模板判断该任务是否已经完成
 */
fun isQuestCompleted(template: Template)

/**
 * 通过序号判断该任务的上次完成时间
 */
fun getQuestCompletedDate(value: String)

/**
 * 通过模板判断该任务的上次完成时间
 */
fun getQuestCompletedDate(template: Template)

/**
 * 检查并保存数据
 */
fun push()

以下是 ink.ptms.chemdah.core.Quest 提供的所有开放属性和方法。

/**
 * 任务序号
 */
val id: String

/**
 * 任务持有者的玩家数据
 */
val profile: PlayerProfile

/**
 * 任务持久化数据储存容器
 */
val persistentDataContainer: DataContainer

/**
 * 任务模板,实时获取非缓存
 * 若不存在则会直接抛出 NullPointerException 异常
 */
val template: Template

/**
 * 任务是否有效(即模板是否存在)
 */
val isValid: Boolean

/**
 * 任务是否完成(即所有条目已签名)
 */
val isCompleted: Boolean

/**
 * 获取所有条目
 */
val tasks: Collection

/**
 * 任务开始时间
 */
val startTime: Long

/**
 * 任务是否超时
 */
val isTimeout: Boolean

/**
 * 判断玩家是否为该任务的拥有者
 */
fun isOwner(player: Player): Boolean

/**
 * 通过序号获取条目
 */
fun getTask(id: String): Task?

/** 
 * 检测任务的所有条目
 * 当所有条目均已签名时完成任务
 */
fun checkComplete()

/**
 * 强制完成任务
 */
fun completeQuest()

/**
 * 强制放弃任务
 */
fun failureQuest()

/**
 * 强制重置任务
 */
fun resetQuest()

不难发现所有支持持久化储存的对象都有一个共同的 persistentDataContainer 属性,操作方法与 Map 无异。
合法的修改容器内的数据则不需要我们去主动执行任何同步行为,相当方便。

init {
    persistentDataContainer["start"] = System.currentTimeMillis()
    profile.persistentDataContainer.remove("quest.complete.$id")
}

需要注意的是 DataContainer 是由 Map 实现,不存在递归结构。所以使用任何字符串作为键都是允许的。