本篇教程由作者设定使用 CC BY-NC-SA 协议。

该教程适用于CraftTweaker,未知API是否向下兼容

在这里推荐个工具 Notepad++的ZenScript语句高亮


当你熟悉了基本魔改之后,秉着搞事的目标,你准备了施行大规模魔改,但大规模魔改会有许多机械化的步骤,运用简单的循环可以解决一部分问题,可这就满足了吗?

运算

无论你是玩红石的还是编程的,对基本的逻辑运算都有一定了解,在CT中运算这样表示

运算表示
加 减 乘 除+ - * /
取余数%
赋值=
非(NOT)
!
不等于!=
等于
==
大于
>
大于等于>=
小于<
小于等于<=
与(AND)&
或(OR)|
异或(XOR)
^

if

if语句基本格式如下:

if (条件) {

    语句1  //当条件为真时执行语句1

else {

    语句2 //反之执行语句2

}

橙色部分可省略,自然你也可以用else if

条件部分除了上面的基本逻辑运算外,还可以用in/has表条件

如:loadedMods in "thermalexpansion"  已加载mod安装了热力膨胀 <ore:ingotIron> in <minecraft:iron_ingot> ingotIron矿辞包含MC原版的铁锭

IIngredient

在循环中你需要设置数组变量。比如:

var mclogs = [<minecraft:log>, <minecraft:log:1>, <minecraft:log:2>, <minecraft:log:3>, <minecraft:log2>, <minecraft:log2:1>] as IItemStack[];

后面的as IItemStack[]就是把mclogs数组变量定义为IItemStack类型的对象数组

然而IItemStack的限制很大,他不能用矿辞、不能使用带NBT的物品,这个时候你就可以使用限制较小的IIngredient了。

Meta值的灵活运用

羊毛有16种,每种颜色的羊毛以不同的Meta值区分。假设你需要删除Meta值3到12的羊毛的合成,你会怎么干呢?

recipes.remove(<minecraft:wool:*>);  //这样?

这样会删除所有羊毛的合成,可我们只需要3到12的,显然不行。

recipes.remove(<minecraft:wool:3>);

recipes.remove(<minecraft:wool:4>);

...

这样一直到12?

这样可以,但这很累的。

也可以

var banwools = [<minecraft:wool:3>,<minecraft:wool:4>,...] as IItemStack[];

再用一个循环一次删除,但这还是不够简洁。

既然ID相同,只是Meta值不同,还复制N个相同的物品ID显然有点冗余,那么该怎么办呢?

val wool = <minecraft:wool>.definition; //使用IItemDefinitions来定义所有的该ID的物品

val meta = [3,4,5,6,7,8,9,10,11,12] as int[] //定义所有需要的Meta值

for i in meta{

    recipes.remove(wool.makeStack(i)); //使用makeStack调用特定Meta值的物品

}

特殊的,这个栗子所需Meta值是连续的,你也可以这么干

for i in 3 to 13{  //区间为[3,13),这个右限不包括,你需要用3到12,你要写的是3 to 13,要注意

    recipes.remove(wool.makeStack(i));

}

有几个空也可以的

//3到12,但刨去5和9

for i in 3 to 13{

    if(i != 5 & i != 9){

        itemDef.makeStack(i).addShiftTooltip("Help me!");

    } 

}

利用这些你可以写一个机智的树苗转换脚本,如下

val sapling = <minecraft:sapling>.definition;

for i in 0 to 6{

    if (i != 5){

        recipes.addShapeless(sapling.makeStack(i+1),[sapling.makeStack(i),sapling.makeStack(i),sapling.makeStack(i)]);

    } else {

        recipes.addShapeless(sapling.makeStack(0),[sapling.makeStack(i),sapling.makeStack(i),sapling.makeStack(i)]);

    }

自定义函数    

ZenScript实际上和JavaScript差不多

基本格式 function 函数名(输入变量) 输出变量类型 {

    语句

    return 函数返回值;

}

橙色部分可省略

在zs中主要是修改合成,一般构建的是不返回数值的函数 即Void Function,这样的函数不需要return

栗子

构造一个函数,在log中打印小于等于n的正数

function real(n as int){

    for i in 1 to (n+1){

        print(i);

    }

}

有返回值的函数需要return,但不一定需要语句。

比如构造一个函数,返回两个输出相加

function add(a as int,b as int) as int{

    return a+b;

}

下面是ZenScript主要的数据类型

名称作用
int整数(范围为-2147483648至2147483647)
float单精度浮点数(允许小数)
double
双精度浮点数(允许小数)
byte字节整数(范围为-128至127)
short短整数(范围为-32768至32767)
bool
布朗值(true/false)
string
字符串(双引号内的东西)
void
IItemStack
MC物品(可能需要import crafttweaker.item.IItemStack;)
ILiquidStackMC流体(可能需要import crafttweaker.liquid.ILiquidStack;)

IOreDictEntry

MC矿物词典(可能需要import crafttweaker.oredict.IOreDictEntry;)
IIngredient材料,见上文关于IIngredient的介绍(可能需要import crafttweaker.item.IIngredient;)