猫泡
在即将到来的 万象添补0.11.0 中,我加入了统计系统。是的,基岩版统计系统,其实非常好做,不知道为什么几乎没有这方面的很流行的附加包。 做统计系统简单,但是写更新日志却成了大问题,我越写越感觉不对劲,加上一开始我就有点废话文学,最后导致 0.11.0 的更新日志应该会是目前所有版本里最长的。 那么废话文学体现在哪里?请看下面的原文: weatherChanges 表示天气改变的总次数,改变天气即可使其增加。
初现端倪。再看下面这张图片(有 1.7 MiB 这么大,需要加载一会儿): 
写完统计系统的更新日志之后,我决定直接把它放出来,让大家都读一读。包括统计系统本身的更新日志,和获取统计信息的命令的更新日志。 + 加入了统计系统。
·现在,世界中发生的大部分事件都会计入统计系统。
·统计数据分四类,下面列出这些类中的所有事件以及数据格式。
·第一类:玩家数据。
·位于根标签下 players 对象中,其中每个键都是玩家的独特 ID,它们的值是一个对象,即特定玩家的统计数据。
·每个玩家的统计数据事件及格式如下:
·方块放置事件
·即 blocksPlaced 字段,是一个对象,其中每个键都是方块 ID,值是此方块的放置次数。
·玩家放置任意方块,即可使此统计数据中相应方块的值增加。
·方块破坏事件
·即 blocksBroken 字段,是一个对象,其中每个键都是方块 ID,值是此方块的破坏次数。
·玩家破坏任意方块,即可使此统计数据中相应方块的值增加。
·方块交互事件
·即 blockInteractions 字段,是一个对象,其中每个键都是方块 ID,值是此方块的交互次数。
·玩家与任意方块交互,即可使此统计数据中相应方块的值增加。
·方块攻击事件
·即 blockHits 字段,是一个对象,其中每个键都是方块 ID,值是此方块的攻击次数。
·玩家攻击任意方块,即可使此统计数据中相应方块的值增加。
·例如,使用左键在不改变其音符的情况下演奏音符盒。
·实体交互事件
·即 entityInteractions 字段,是一个对象,其中每个键都是实体 ID,值是此实体的交互次数。
·玩家与任意实体交互,即可使此统计数据中相应实体的值增加。
·例如给牛挤奶、喂食动物、驯服动物等等。
·实体攻击事件
·即 entityHits 字段,是一个对象,其中每个键都是实体 ID,值是此实体的攻击次数。
·玩家攻击任意实体,即可使此统计数据中相应实体的值增加。
·物品使用事件
·即 itemsUsed 字段,是一个对象,其中每个键都是物品 ID,值是此物品的使用次数。
·玩家使用任意物品,即可使此统计数据中相应物品的值增加。
·注意,放置方块实际上也算作“使用”了方块对应的方块物品。
·表情使用事件
·即 emotes 字段,是一个对象,其中每个键都是表情 ID,值是此表情的使用次数。
·玩家使用任意表情,即可使此统计数据中相应表情的值增加。
·注意,表情 ID 通常是 UUID,且无法直接看出表情 ID 与表情名称的联系。
·维度改变事件
·即 dimensionChanges 字段,是一个对象,其中每个键都遵循特定规律以表示穿越维度的路径,值是此路径被使用的次数。
·遵循的规律为:(原来的维度 ID)>(现在的维度 ID),例如 minecraft:nether>minecraft:overworld。
·维度 ID 与名称的映射关系如下:
·minecraft:overworld - 主世界
·minecraft:nether - 下界
·minecraft:the_end - 末路之地
·玩家在任意维度间穿越,即可使此统计数据中相应路径的值增加。
·游戏模式改变事件
·即 gameModeChanges 字段,是一个对象,其中每个键都遵循特定规律以表示游戏模式改变的方式,值是此改变发生的次数。
·遵循的规律为:(原来的游戏模式枚举)>(现在的游戏模式枚举),例如 Survival>Creative。
·游戏模式枚举与游戏模式的映射关系如下:
·Survival - 生存模式
·Creative - 创造模式
·Adventure - 冒险模式
·Spectator - 旁观模式
·玩家任意改变其游戏模式,即可使此统计数据中相应改变的值增加。
·聊天事件
·即 chat 字段,是一个对象,其中包含两个字段。
·messages 字段记录此玩家发送聊天消息的次数,玩家发送任意消息即可使其值增加。
·length 字段记录此玩家发送聊天消息的总长度,玩家发送任意非空消息即可使其值增加。
·注意,它实际上记录的是消息字符串的 length 属性的总和,也就是 UTF-16 码元数量的总和,因此,表情符号等特殊符号会被计算为 2。
·获得状态效果事件
·即 effects 字段,是一个对象,其中包含状态效果的独特字符串,每个独特字符串都代表一种特定等级的特定状态效果,遵循特定格式。
·此特定格式为:(状态效果ID)|(等级),例如 minecraft:instant_health|1 表示瞬间治疗Ⅱ。
·注意,这里记录的是等级,而不是通常在命令中使用的倍率。等级 = 倍率 + 1。
·每个键的值都是对象,包含两个字段。
·count 记录此玩家获得此特定等级的特定状态效果的总次数,玩家获得此特定等级的特定状态效果即可使其增加。
·duration 记录此玩家获得此特定等级的特定状态效果的总时长,单位是刻,20 刻 = 1 秒。玩家获得此特定等级的特定状态效果即可使其增加。
·加入世界事件
·即 joins 字段,记录玩家加入世界的总次数。玩家加入世界即可使其增加。
·离开世界事件
·即 leaves 字段,记录玩家离开世界的总次数。单人游戏中,玩家离开世界后世界即关闭,无法统计此项,因此永远为 0;推测多人游戏中玩家离开世界且世界仍在加载即可使其增加。
·第二类:实体数据。
·位于根标签下 entities 对象中,其中每个键都是实体 ID 或玩家的独特 ID,它们的值是一个对象,即特定实体类型或特定玩家的统计数据。
·每个特定实体类型或特定玩家的统计数据事件及格式如下:
·死亡事件
·即 deaths 字段,是一个对象,其中每个键都表示唯一的死亡来源,值是因为这种来源而死亡的次数。死亡来源包括死亡原因、可能的源实体和可能的源投掷物。
·死亡来源遵循特定格式:(死亡原因)|(玩家独特 ID 或实体 ID)|(投掷物 ID)。如果后两项中任意一项不存在,则为 none。例如 selfDestruct|none|none 表示被 kill 命令杀死。
·实体因为特定来源而死亡,即可使此统计数据中相应来源的值增加。
·受伤事件
·即 hurts 字段,是一个对象,其中每个键都表示唯一的受伤来源,值是因为这种来源而失去的血量总和。受伤来源包括受伤原因、可能的源实体和可能的源投掷物。
·受伤来源遵循特定格式:(受伤原因)|(玩家独特 ID 或实体 ID)|(投掷物 ID)。如果后两项中任意一项不存在,则为 none。例如 entityExplosion|minecraft:tnt|none 表示被 TNT 炸伤。
·实体因为特定来源而受伤,即可使此统计数据中相应来源的值增加。
·血量改变事件
·即 healthChanges 字段,是一个对象,包含两个字段。
·damage 表示实体受伤所失去的血量,实体受伤所失去的血量大于零即可使此项增加。
·heal 表示实体受到治疗所获得的血量,实体受到治疗所获得的血量大于零即可使此项增加。
·获得状态效果事件
·即 effects 字段,是一个对象,其中包含状态效果的独特字符串,每个独特字符串都代表一种特定等级的特定状态效果,遵循特定格式。
·此特定格式为:(状态效果ID)|(等级),例如 minecraft:instant_health|1 表示瞬间治疗Ⅱ。
·注意,这里记录的是等级,而不是通常在命令中使用的倍率。等级 = 倍率 + 1。
·每个键的值都是对象,包含两个字段。
·count 记录此实体获得此特定等级的特定状态效果的总次数,实体获得此特定等级的特定状态效果即可使其增加。
·duration 记录此实体获得此特定等级的特定状态效果的总时长,单位是刻,20 刻 = 1 秒。实体获得此特定等级的特定状态效果即可使其增加。
·加载事件
·即 spawns 字段,是一个对象,其中包含各种初始化原因,每个初始化原因的值即为实体因为此初始化原因而加载的总次数。
·初始化原因与其含义有如下的映射关系:
·Spawned - 实体由于生成而导致的初始化,例如实体自然生成导致的初始化,或者非生物实体由于玩家的影响而生成导致的初始化,以点燃 TNT 为代表。
·Event - 实体由于生物事件而生成导致的初始化,例如流浪商人由于 minecraft:wandering_trader_event 生物事件而生成导致的初始化,或者行商羊驼由于流浪商人的生成而生成导致的初始化。
·Loaded - 实体由于存档数据的读取而加载导致的初始化,例如喂养过的不会自然消失的动物在区块卸载且保存后重新加载导致的初始化。
·Transformed - 实体由于实体转化而导致的初始化,例如僵尸村民转化为村民,或者疣猪兽转化为僵尸疣猪兽。
·Born - 实体由于其他实体需要创建子实体而生成导致的初始化,例如繁殖动物产生的幼年动物导致的初始化,或者史莱姆分裂成小史莱姆导致的初始化。
·实体因为任意原因生成即可使此项中此生成原因的值增加。
·第三类:世界数据。
·位于根标签,共有两个字段,它们的值是对象,表示对应事件中的子事件发生的总次数。
·weather 字段表示天气发生变化的统计数据,是一个对象,其中每个键都代表一种天气变化的方式。
·其中每个键都遵循特定规律:(原来的天气枚举)>(现在的天气枚举),比如 Clear>Rain 表示从晴天到雨雪天。
·天气枚举与天气的映射关系如下:
·Clear - 晴天,无任何天气。
·Rain - 雨雪天,根据生物群系的温度和高度决定是下雨还是下雪。
·Thunder - 雷暴雨天,是会打雷、可以睡觉、可以刷怪的雨天。
·天气以任意方式改变即可使对应改变方式的值增加。
·gameRules 字段表示游戏规则发生变化的统计数据,是一个对象,其中每个键都代表一种游戏规则。
·游戏规则以任意方式改变即可使对应改变方式的值增加。
·注意,滑动百分比滑块时,每次数值跳动都对应一次游戏规则改变。直接在滑动条上点击,使滑块移动到指定位置则仅算一次游戏规则改变。
·第四类:全局数据。
·位于根标签,有 5 个字段,其中 global 字段存储那些只需要一个数值的统计数据,其他四个字段存储需要复杂对象的统计数据。
·dimensions 表示穿越维度的特定路径被使用的总次数,具体格式和说明与 players 字段下的 dimensionChanges 字段相同。使用特定路径穿越维度即可使对应路径的值增加。
·gameModes 表示游戏模式改变的方式被使用的总次数,具体格式和说明与 players 字段下的 gameModeChanges 字段相同。使用特定方式改变游戏模式即可使对应方式的值增加。
·emotes 表示各种表情分别被使用的总次数,具体格式和说明与 players 字段下的 emotes 字段相同。使用特定表情即可使对应表情 ID 的值增加。
·effects 表示特定等级的特定状态效果被获得的总次数,具体格式和说明与 players 字段下或 entities 字段下的 emotes 字段相同。获得特定等级的特定状态效果即可使对应特定等级的特定状态效果的值增加。
·global 是一个对象,含有 23 个字段,表示它们的统计数据。
·blocksPlaced 表示所有玩家放置的所有方块的总数,玩家放置方块即可使其增加。
·blocksBroken 表示所有玩家破坏的所有方块的总数,玩家破坏方块即可使其增加。
·itemsUsed 表示所有玩家成功使用的所有物品的总数,玩家使用物品即可使其增加。
·playerJoins 表示所有玩家加入世界的总次数,玩家加入世界即可使其增加。
·playerLeaves 表示所有玩家离开世界的总次数,玩家离开世界且保证离开后世界继续加载即可使其增加。
·playerLeaves 表示所有玩家离开世界的总次数,玩家离开世界且保证离开后世界继续加载即可使其增加。
·entityDeaths 表示所有实体死亡的总次数,实体死亡即可使其增加。
·entityHurts 表示所有实体受伤所失去的血量的总数,实体受伤且失去的血量大于零即可使其增加。
·healthChanges 表示所有实体血量的变化量的总数,实体血量的变化量大于零即可使其增加。
·blockInteractions 表示玩家与方块交互的总次数,玩家与方块交互即可使其增加。
·entityInteractions 表示玩家与实体交互的总次数,玩家与实体交互即可使其增加。
·emotesUsed 表示玩家使用表情的总次数,玩家使用表情即可使其增加。
·chatMessages 表示玩家发送聊天消息的总次数,玩家发送聊天消息即可使其增加。
·chatLength 表示玩家发送聊天消息的 UTF-16 码元总数,玩家发送非空的聊天消息即可使其增加。
·explosions 表示发生爆炸的总次数,发生爆炸即可使其增加。
·explosionBlocks 表示所有爆炸涉及到方块的总数,发生爆炸即可使其增加。
·gameRuleChanges 表示游戏规则变化的总次数,改变游戏规则即可使其增加。
·effectsAdded 表示得到状态效果的总次数,得到状态效果即可使其增加。
·entitiesSpawned 表示实体加载的总次数,加载实体即可使其增加。
·blockHits 表示方块受到攻击的总次数,攻击方块即可使其增加。
·entityHits 表示实体受到攻击的总次数,攻击实体即可使其增加。
·dimensionChanges 表示维度改变的总次数,改变维度即可使其增加。
·gameModeChanges 表示游戏模式改变的总次数,改变游戏模式即可使其增加。
·weatherChanges 表示天气改变的总次数,改变天气即可使其增加。
+ 加入了命令:stats。
·获取统计信息。
·语法:stats
·无需任何参数。
·执行后,获得包含全部统计信息的书。
·书的标题为“统计(日期)_(序号)”,如“统计190701_1”。
·如果所有统计数据在格式化后可以用一本书写完,则仅会生成一本书,序号为 1,否则会生成多本书,序号依次递增。
·每本书都会尽量写满,且从后向前寻找换行符并在其之后分割页。每页最多有 222 字符,每本书最多有 50 页。
·这是为了防止无法完整地显示统计数据的问题。 |
|