订立标准原因

统一function、advancements、structure、loot table的大致架构以及命名标准,方便发布相关模块、避免冲突。

架构

文件架構

+ 模块名称
    + functions
        + init.mcfunction
        + main.mcfunction
        + ...
    + advancements或loot_tables或structures
        + ...
    + mc_advancements或mc_loot_tables
        + ...
    + resources.zip (这并不是标准的一部分)
functions:
存放 模块 内的function文件。 整合时会把内容放在 存档/data/functions/(模块名称)
advancements:
存放 模块 内的advancement文件 整合时会把内容放在 存档/data/advancements/(模块名称)
loot_tables:
存放 模块 内的loot_table文件 整合时会把内容放在 存档/data/loot_tables/(模块名称)
structures:
存放 模块 内的structure文件 整合时会把内容放在 存档/structures/(模块名称)
mc_advancements:
存放需要 覆盖原版 的advancement文件 整合时会把内容放在 存档/data/advancements/minecraft
mc_loot_tables:
存放需要 覆盖原版 的loot_table文件 整合时会把内容放在 存档/data/loot_tables/minecraft

init.mcfunction:
模块初始化 的命令,包括如添加objective、设置分数等 也包括一些标记,来告诉用户 使用了什么名称 和有什么 依赖项 ,这会在下方仔细描述 会被外面的命令调用, 不需要亦不应 使用advancements执行或修改gameLoopFunction执行
main.mcfunction:
每游戏刻之下一次的命令,如同以前的 高频系统 会被外面的命令调用, 不需要亦不应 使用advancements执行或修改gameLoopFunction执行 由于一个实体的stats只能绑定到一个obj,因此如果需要 绑定stats ,请在 main进行绑定 而不是在init进行绑定,避免别人重新绑定时刷掉了又不知道。

init详细要求

命名

为了避免发生命名冲突,init.mcfunction里应当列出名称前缀及scoreboard objective/team名称 除了objective及team以外名称(如实体名称, tag)的都需要 加上前缀 ,如 pca_test ,前缀需在init.mcfunction以 #prefix: (前缀)的方式写出,如 #prefix: pca_ objective和team则不必须加上前缀 (但仍然建议加上前缀或其他标识避免碰撞),需在 init.mcfunction里进行添加 ,以方便检查冲突,如 scoreboard objectives add abc dummy 对于 共用的objective(dummy) ,请写上 #common obj: (名称)

依赖

如果模组 需要使用别的模组提供的功能、名称 ,则需要标记该目标模组为 依赖项。 语法: #depends: (依赖项模组名称)。当依赖项名称更改时同时也会更改这模组里的指定名称。 容许多重依赖,也容许循环依赖。(如a->b->c->d->a, ->代表左依赖右) 模组 禁止与依赖项发生命名冲突

命名标准

模组名称(命名空间, namespace)

玩家/组织名-系统名称 玩家名可以使用昵称 全部必须小写, 并且以 _ 分割单词, 名称可用字符为 a-z0-9_ - 字符只能用作分隔作者和系统名称(只能出现一次)

文件夹及文件

全部必须小写, 并且以 _ 分割单词, 可用字符为 a-z0-9_

不建议使用拼音

Tag, Name, Team, Scoreboard objective

Tag及实体名称应加上前缀 ,如 pca_test 。这种情况下前缀为 pca_ Team及Objective名称建议加上前缀 ,但当长度不足的时候也可以不写前缀(因为长度限制为16个字符) 前缀 建议长度为3-5个字符 (不少于三个字符)
针对队伍名称及objective名称,建议使用 最少两个英文字的组合加上前缀 ,尽量 与一般字词分开 ,方便用户寻找并替换

整合方法

这是使用的时候如何整合那堆模组(放心,会有软件的,写ing)
  1. 先检查所有init.mcfunction查看是否有命名冲突,有则停止并要求用户自行整理
  2. 把文件放到相应路径,并且在system:init及system:main加入调用不同模块的init及main的命令
  3. 生成system/start.mcfunction,内容参见下方部分
  4. 生成system/start.json advancement,内容参见下方部分

system/start.mcfunction:

scoreboard objectives add sys_start dummy
scoreboard players set @s sys_start 0
stats entity @s set QueryResult @s sys_start
gamerule sys_start
function system:init if @s[score_sys_start=0]
gamerule sys_start 1

system/start.json (advancement):

{
    "criteria":{
        "a":{
            "trigger":"minecraft:tick"
        }
    },
    "rewards":{
        "function":"system:start"
    }
}

例子

感谢SYL写的例子: http://pan.baidu.com/s/1ge6Y9ft

最后

感谢SYL、玄素、秋一、花叔、野子以及新手群内的诸位对此标准提供意见 希望各位做模组的时候能跟从本标准,方便同时使用多个模组以及排除冲突。 如果大家有任何意见/疑问,欢迎回复一起讨论