本篇教程由作者设定使用 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;) |
ILiquidStack | MC流体(可能需要import crafttweaker.liquid.ILiquidStack;) |
IOreDictEntry | MC矿物词典(可能需要import crafttweaker.oredict.IOreDictEntry;) |
IIngredient | 材料,见上文关于IIngredient的介绍(可能需要import crafttweaker.item.IIngredient;) |