普特莫斯维基 (Purtmars Wikipedia 📖)

Chemdah 开发者文档:数据控制

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

目录

数据控制

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

 1 /**
 2  * 玩家 UUID
 3  */
 4 val uniqueId: UUID
 5 
 6 /**
 7  * 玩家实例,实时获取的并非缓存
 8  * 若玩家离线则会直接抛出 NullPointerException 异常
 9  */
10 val player: Player
11 
12 /**
13  * 玩家是否在线
14  */
15 val isPlayerOnline: Boolean
16 
17 /**
18  * 玩家数据是否发生变动(玩家自身数据以及所有任务数据)
19  */
20 val isDataChanged: Boolean
21 
22 /**
23  * 玩家持久化数据储存容器
24  */
25 val persistentDataContainer: DataContainer
26 
27 /**
28  * 强制注册新的任务
29  * 会覆盖原有的相同任务且不会进行任何条件判断和触发事件
30  */
31 fun registerQuest(quest: Quest)
32 
33 /**
34  * 强制注销任务
35  * 不会进行任何条件判断和触发事件
36  * @param release 是否从数据库释放数据
37  */
38 fun unregisterQuest(quest: Quest, release: Boolean = true)
39 
40 /**
41  * 获取任务条目持久化储存容器控制器
42  */
43 fun <T> dataOperator(task: Task, func: QuestDataOperator.() -> T)
44 
45 /**
46  * 通过序号获取正在进行中的有效任务
47  * @param openAPI 是否启用开放 API,即允许第三方直接修改这个结果
48  */
49 fun getQuestById(value: String, openAPI: Boolean = true): Quest?
50 
51 /**
52  * 获取所有正在进行中的有效任务
53  * @param openAPI 是否启用开放 API,即允许第三方直接修改这个结果
54  */
55 fun getQuests(openAPI: Boolean = false): List<Quest>
56 
57 /**
58  * 通过序号判断该任务是否已经完成
59  */
60 fun isQuestCompleted(value: String): Boolean
61 
62 /**
63  * 通过模板判断该任务是否已经完成
64  */
65 fun isQuestCompleted(template: Template)
66 
67 /**
68  * 通过序号判断该任务的上次完成时间
69  */
70 fun getQuestCompletedDate(value: String)
71 
72 /**
73  * 通过模板判断该任务的上次完成时间
74  */
75 fun getQuestCompletedDate(template: Template)
76 
77 /**
78  * 检查并保存数据
79  */
80 fun push()

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

 1 /**
 2  * 任务序号
 3  */
 4 val id: String
 5 
 6 /**
 7  * 任务持有者的玩家数据
 8  */
 9 val profile: PlayerProfile
10 
11 /**
12  * 任务持久化数据储存容器
13  */
14 val persistentDataContainer: DataContainer
15 
16 /**
17  * 任务模板,实时获取非缓存
18  * 若不存在则会直接抛出 NullPointerException 异常
19  */
20 val template: Template
21 
22 /**
23  * 任务是否有效(即模板是否存在)
24  */
25 val isValid: Boolean
26 
27 /**
28  * 任务是否完成(即所有条目已签名)
29  */
30 val isCompleted: Boolean
31 
32 /**
33  * 获取所有条目
34  */
35 val tasks: Collection<Task>
36 
37 /**
38  * 任务开始时间
39  */
40 val startTime: Long
41 
42 /**
43  * 任务是否超时
44  */
45 val isTimeout: Boolean
46 
47 /**
48  * 判断玩家是否为该任务的拥有者
49  */
50 fun isOwner(player: Player): Boolean
51 
52 /**
53  * 通过序号获取条目
54  */
55 fun getTask(id: String): Task?
56 
57 /** 
58  * 检测任务的所有条目
59  * 当所有条目均已签名时完成任务
60  */
61 fun checkComplete()
62 
63 /**
64  * 强制完成任务
65  */
66 fun completeQuest()
67 
68 /**
69  * 强制放弃任务
70  */
71 fun failureQuest()
72 
73 /**
74  * 强制重置任务
75  */
76 fun resetQuest()

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

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

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