数据控制 (Chemdah 开发者文档)
来自Purtmars Wikipedia —— 普特莫斯维基
目录
- Chemdah
- 开始
- 基本
- 事件
- ink.ptms.chemdah.api.event.collect.ConversationEvents
- ink.ptms.chemdah.api.event.collect.ObjectiveEvents
- ink.ptms.chemdah.api.event.collect.PlayerEvents
- ink.ptms.chemdah.api.event.collect.QuestEvents
- ink.ptms.chemdah.api.event.collect.TemplateEvents
- ink.ptms.chemdah.api.event.InferEntityHookEvent
- ink.ptms.chemdah.api.event.InferItemHookEvent
- ink.ptms.chemdah.api.event.PartyHookEvent
- 对话相关
- 数据相关
- 任务相关
数据控制
数据控制分为玩家数据与任务数据,它们都是由 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 实现,不存在递归结构。所以使用任何字符串作为键都是允许的。