第一条 本协议适用于所有参与Create: Mechanism and Innovation(以下简称CMI)项目的开发人员及贡献者
第二条 项目主理人(Maintainer)Re_Construction拥有版本迭代的最终决策权和协议解释权
-
CMI版本号码由大中小版本号组成 -
CMI大、中版本号码由主创Re_Construction进行规定 -
版本号须在Global.js的
global.modPackVersion显示声明
-
GitHub每次进行修改上传(即
push origin)需要输入该次修改的注释, 包含summary与description -
技术人员在上传的
commits message中需使用中文(不限简繁体)或英语概述该次修改的内容 -
开发人员上传之前请确保Debug后并且没有问题, 确保没有问题后才能上传到GitHub, 如果自己解决不了请先全部注释掉并在开发群里或
commits message内说明有什么错误, 卡在哪里, 什么解决不了
第四条 命名规则:
- 类名采用大驼峰式(PascalCase), 例:
RecipeSchema - 函数/变量采用小驼峰式(camelCase), 例:
getMaterialList - 常量采用全大写蛇形命名(SNAKE_CASE), 例:
GET_TAGS_ITEM - 严格禁止使用
var来声明变量与常量, 只能使用let或const
第五条 脚本开发规范:
- 配方脚本必须进行结构解构
ServerEvents.recipes((event) => {
let { create, kubejs, minecraft } = event.recipes
})- 有序配方必须使用标准模板
kubejs.shaped("minecraft:stone", [
"AAA",
"BBB",
"CCC"
], {
A: "minecraft:sand",
B: "#forge:gravel",
C: "#forge:ingots/iron"
})- 无序配方或Create和Thermal等Mod的配方必须使用标准模板, 以下提供的几个模板请任选一个(但是无序合成请严格遵守前两个)
// 无序
kubejs.shapeless("minecraft:stone", [
"minecraft:sand"
])
kubejs.shapeless("minecraft:stone", [
"minecraft:sand",
"#forge:ingots/iron"
])
// Create
create.mixing("minecraft:stone", [
"minecraft:sand"
])
create.mixing("minecraft:stone", [
"minecraft:sand",
Fluid.of("minecraft:water", 1000)
])
create.mixing([
"2x minecraft:stone",
Item.of("minecraft:sand", 2).withChance(0.5)
], [
"minecraft:sand",
Fluid.of("minecraft:water", 1000)
]).heated()
create.mixing([
"2x minecraft:stone",
Item.of("minecraft:sand", 2).withChance(0.5)
], "minecraft:sand").superheated()
// Thermal
thermal.centrifuge("minecraft:stone", [
"minecraft:sand"
])
thermal.centrifuge("minecraft:stone", [
"minecraft:sand",
Fluid.of("minecraft:water", 1000)
])
thermal.centrifuge([
"2x minecraft:stone",
Item.of("minecraft:sand", 2).withChance(0.5)
], [
"minecraft:sand",
Fluid.of("minecraft:water", 1000)
]).energy(1000)
thermal.centrifuge([
"2x minecraft:stone",
Item.of("minecraft:sand", 2).withChance(0.5)
], "minecraft:sand").energy(1000)- Create序列合成规范
- TransitionalItem必须为
不涉及其他配方的create:sequenced_assembly物品类
create.sequenced_assembly([
Item.of("create:sturdy_sheet").withChance(0.7),
Item.of("create:powdered_obsidian").withChance(0.15),
Item.of("minecraft:gravel").withChance(0.15)
], "#forge:dusts/obsidian", [
create.pressing("#forge:dusts/obsidian", [
"#forge:dusts/obsidian",
"#forge:dusts/obsidian"
])
]).transitionalItem("create:unprocessed_obsidian_sheet").loops(10)
create.sequenced_assembly(Item.of("create:sturdy_sheet").withChance(0.7), [
"#forge:dusts/obsidian"
], [
create.pressing("#forge:dusts/obsidian", [
"#forge:dusts/obsidian",
"#forge:dusts/obsidian"
])
]).transitionalItem("create:unprocessed_obsidian_sheet").loops(10)-
在非必要时刻禁止写分号
;在代码行末 -
if或else语句禁止单行结束, 或者单行return
if (a === b) return // X
if (a === b) {
return
} // √-
若无特殊情况, 所有条件判断只能使用三等号强等于判断
===, 禁止使用双等号弱等于判断== -
KubeJS的各种event中的handler必须使用event这个单词
ServerEvents.recipes((event) => {})- 所有的lambda(箭头函数)必须加上小括号
(), 不管是forEach还是event
xxx.forEach((value) => {})
ServerEvents.recipes((event) => {})-
所有的lambda(箭头函数)括号必须在末尾加上大括号(花括号)
{}, 不能直接传参 -
所有的对象
{}和数组[]内必须换行(数组内的数组随意)
{
"key": "value",
"key1": "value1"
},
[
"value",
"value1"
],
[
["value", "value1"],
["value", "value1"]
],
[
[
"value",
"value1"
],
[
"value",
"value1"
]
]-
禁止使用单引号
'', 只能使用反引号``或双引号"" -
撰写物品逻辑时必须注释逻辑实现的功能并分步注释该步骤实现的内容
let $BlockHitResult = Java.loadClass("net.minecraft.world.phys.BlockHitResult")
let $UseOnContext = Java.loadClass("net.minecraft.world.item.context.UseOnContext")
// 自然构件右键运行骨粉逻辑
BlockEvents.rightClicked((event) => {
let { level, item, player, facing, block, hand } = event
// 取消无效右键事件
if (level.clientSide) {
return
}
// 判断玩家手持物品为自然构件
if (item === "cmi:nature_mechanism") {
// 获取所点击的方块位置并调用MC原版骨粉逻辑
let blockHitResult = new $BlockHitResult(player.pos, facing, block.pos, false)
let useOnContext = new $UseOnContext(level, player, hand, "minecraft:bone_meal", blockHitResult)
let boneMeal = Items.BONE_MEAL
// 在指定方块上运行骨粉的逻辑
boneMeal.useOn(useOnContext)
// 玩家挥动手持的自然构件
player.swing()
}
})- 导入 Java 包
在脚本中导入 Java 类时, 应统一使用Java.loadClass("package.ClassName"), 并遵循以下规范:
- 必须用
let定义变量 - 变量名统一采用
$+类名 的形式 - 若为内部类(子类), 在变量名中使用
$连接, 例如:
let $BlockItem = Java.loadClass("net.minecraft.world.item.BlockItem")
let $Item$Properties = Java.loadClass("net.minecraft.world.item.Item$Properties")- 方法或构造函数参数列表
当长度过长的时候想要使用换行那就必须每个参数都换行, 要么就是一路到低 包括调用方法或构造函数时也一样
function name(a, b, c, d, e, f) {}
function name(
a,
b,
c,
d,
e,
f
) {}
name(a, b, c, d, e, f)
name(
a,
b,
c,
d,
e,
f
)第六条 注册规范:
在调用链式方法时必须换行
严格禁止使用.displayName()方法对其进行命名, 请前往lang文件夹下的语言文件内进行命名与修改
event.create(`${global.namespace}:smart_gear`)
.texture(`${global.namespace}:item/smart_gear`)
.burnTime(400)第七条 知识产权条款:
-
贡献者保留其提交代码的著作权
-
项目核心团队拥有代码架构的最终优化权
第八条 Pull Request要求:
-
必须包含至少1张有效运行截图
-
必须通过基础测试套件验证
-
禁止包含以下内容:
- 二进制文件(
.jar/.zip)
- 二进制文件(
第九条 Issues管理:
- BUG报告必须包含:
- 环境配置详情
- 复现步骤
- 错误日志片段
- 确保没有加入任何影响到游戏性能与内容的Mod
第十条 更新日志规范:
每次做出一个修改(看情况区分)需要在UpdateLogs.md中写上记录, 格式如下(每一行的-前后请记得空一个空格):
## Beta 1.1.0
### 删除内容
- 删除了XXX的Tags
### 添加内容
- 新增钛合金冶炼配方体系
- 实现自动化产线验证模块
### 修改(调整)内容
- 修复多方块结构能量溢出问题
- 解决合成表NBT校验异常
- 优化机械臂碰撞体积计算