前言

注:如果要搬运此教程,请取得作者联系后并标出来源即可。

整合包内使用本教程代码无需声明作者。

在编写的时候若是出现了问题,可将进入世界时在聊天栏显示的错误报告发送至短评区,作者会帮你解决问题。

在错误时会显示scripts文件夹中文件的第几行出现了问题,最好一同发送你编写的脚本。

你要是想制作用crt为魔改核心的整合包,可通过QQ联系作者进行合作。

联系方式请看短评区置顶。

介绍

crt(全称crafttweaker)是一个于1.12.2版本流行于MC的主流魔改模组。

模组基于ZenScript编写。

装入此模组后,在.minecraft目录下会生成scripts文件夹和crafttweaker.log。

在scripts文件夹内,你可以直接添加.zs文件或添加文件夹进行文件分类。

在crafttweaker.log文件中,你将会收到在游戏中导出的代码。

由于未知原因,crt1.12.2版本不能热重载脚本。

强烈推荐使用VScode编写脚本!

本教程适用于1.12.2v4.1.20.648的crt。

教程情况

编辑日期编辑进度
2023/6/2完成游戏阶段

常用指令

crt的指令使用/ct /crafttweaker /mt /minetweaker这四种指令作为前缀。

常用代码如下:

/ct hand获取手上物品的id。

/ct inventory将会把你的物品栏的所有数据输出到craftweaker.log。

/ct syntax可以在游戏中检查语法。

常用脚本

物品表示

单个数据表示

在crt中,单个物品的表示方法如下:

<命名空间:id>
//如,铁锭的表示如下:
<minecraft:iron_ingot>

矿辞表示如下:

<ore:id>
//如铁锭的表示(矿辞)
<ore:ingotIron>

多个数据表示

表示输入组或输出组如下:

[<id>,<id>]
//如表示一个泥土和一个钻石
[<minecraft:dirt>,<minecraft:diamond>]

表示众多物品如下:

<id> * n

//如表示16个泥土

<minecraft:dirt> * 16

变量

var xxx = id;

输入此代码,在脚本的编写中,可以用xxx来代表此物品id。

举个例子:

var iron = <minecraft:iron_ingot>;

在以后的脚本中,就可以用"iron"来表示物品"<minecraft:iron_ingot>"。

数组

物品数组

此数组需要导包。

import crafttweaker.item.IItemStack;
var xxx as IItemStack[]=[
id1,
id2,
id3
];

这个数组在编写与物品阶段有关的脚本时有帮助。

其中,xxx表示数组名,id1、2、3表示物品的id。

除了最后一个物品,其余id的末尾都要加逗号。

字符串数组

val xxx = [
"文本1",
"文本2",
"文本3"
] as srting[];

xxx代表数组名,每一个文本都要打上引号。

除了最后的文本,其余文本都要加上逗号。

支持所有语言。

标准术语叫字符串

数字数组

val xxx = [
1,
2,
3
] as int[];

xxx代表数组名,1、2、3代表数字。

除了最后一个数字,其余数字都要在末尾加上逗号。

遍历

与物品数组一样,需要导包。

import crafttweaker.item.IItemStack;
for a in b {
recipes.remove(item);
}

这里的a表示次循环名(及变量名称)。

b表示需要遍历的数组。

(仅能使用物品数组。)

在花括号中的是遍历代码,有多种。

(如添加游戏阶段,删除配方,增加标签,增加注释等。)

此处为删除此数组每一个物品的配方。

配方

删除配方

常用删除配方的代码如下:

recipes.remove(id);//删除此物品的所有配方
recipes.removeByMod(modid);//删除此mod内的所有配方
recipes.removeAll();//删除所有配方

原版配方

工作台配方

有序配方

recipes.addShaped(输出, 输入组);
//配方展开解析
recipes.addShaped(<id>, 
[[xxx,xxx,xxx],
[xxx,xxx,xxx],
[xxx,xxx,xxx]]);
//如增加草方块配方由一块泥土加一棵草合成:
recipes.addShaped(<minecraft:grass_block>,
[[null,<minecraft:grass>,null],
[null,<minecraft:dirt>,null],
[null,null,null]]);

可以通过“null”来表示空格。

无序配方

recipes.addShapeless(输出, 输入组);
//配方展开解析
recipes.addShapeless(<id>,[xxx,xxx......]);
/*其中,id表示输出物品,后面的中括号表示输入组,最多可添加九个输入。
(因为工作台只有九个格子)。
在输入中必须使用[]。
就算只有一个输入。
而且不建议在输入中使用<id> * n。
因为这样会导致需要n个物品放置在工作台上才能合成。
且只消耗一个物品。
所以如果输入多个相同物品,建议多写几遍。
如用两个铁块合成钻石。
*/
recipes.addShapeless(<minecraft:diamond> ,[<minecraft:iron_block>,<minecraft:iron_block>]);

熔炉配方

添加配方

furnace.addRecipe(输出, 输入, 经验(可用小数));

添加燃料(将物品设置为燃料)

furnace.setFuel(<id>, Tick);

此处再添加一下tick的概念。

tick(游戏刻)是MC中的时间单位,1秒=20tick。

烧一个物品为10秒,200tick。

与游戏刻相类似的时间还有红石刻。

1秒=10红石刻=20游戏刻。

1红石刻=2游戏刻。

在设置燃烧时间时,时间单位是游戏刻。

请根据自己的物品设置相应的时间。

打草掉落物

vanilla.seeds.addSeed(<minecraft:iron_ingot> % 0.1);
//添加打草获得铁锭,概率为百分之0.1。
vanilla.seeds.removeSeed(<minecraft:wheat_seeds>);
//删除打草配方,如删除小麦种子的配方。

生物掉落物

添加生物掉落:

(entity:id中的id代表实体id,如minecraft:sheep表示为<entity:minecraft:sheep>)

<entity:id>.addDrop(<minecraft:apple> % 10);

//添加一个苹果掉落,几率%10

添加只有玩家杀死生物才能掉落的掉落物:

<entity:id>.addPlayerOnlyDrop(<minecraft:apple> % 10);

删除一个生物的特定掉落物:

<entity:id>.removeDrop(<minecraft:apple>);
//删除该实体掉落的苹果掉落物

删除该实体的所有掉落物:

<entity:id>.clearDrops();

药水配方

药水配方如下

brewing.addBrew(输入组(类似水瓶),材料id(单个),输出组(药水);

示例:

brewing.addBrew(<minecraft:potion>,<minecraft:dirt>,<minecraft:potion>);

效果:一瓶水与一泥土酿造,获得一瓶水。

游戏阶段
介绍

游戏阶段是一个整合包中必备的模组。

他可以让你在游戏中添加阶段,在特定的阶段才能解锁什么。

获取阶段可以通过指令。

/gamestage @p add xxx

也可以通过FTB任务书获取阶段。

这个模组用途十分广泛,详见下列例举。
物品阶段

需要安装物品阶段

注:此处为1.12.2,故此不用编写添加游戏阶段的代码。

首先第一步,还是导入相同的物品包。

import crafttweaker.item.IItemStack;

锁定物品

我们先来看单个物品添加阶段。

mods.ItemStages.addItemStage("阶段名称", <id>);
//例举,将铁锭锁到stone阶段
mods.ItemStages.addItemStage("stone",<minecraft:iron_ingot>)
//同样可以调用矿物词典

如果没有相应的阶段,则会自动创建。

如果有,就会直接调用。


接着来看多个物品的添加阶段。

首先,你需要一个物品数组,这里再写一遍格式。

具体细节请往上翻。

var xxx as IItemStack[]=[
id1,
id2,
id3
];
//如在这里设立数组名为one的数组,包含铁锭与金锭。
var one as IItemStack[]=[
<minecraft:iron_ingot>,
<minecraft:gold_ingot>
];

然后,通过遍历循环次数组内的所有物品,添加阶段。

但是,阶段添加有特殊的格式。

for i in xxx{
addItemStage("阶段名",i);
}
//xxx就是数组名
如将one数组内的所有物品都锁定到stone阶段
for i in one{
addItemStage("stone",i);
}

结合起来,完整代码如下:

import crafttweaker.item.IItemStack;

var one as IItemStack[]=[
<minecraft:iron_ingot>,
<minecraft:gold_ingot>
];

for i in one{
addItemStage("stone",i);
}

效果为:将铁锭与金锭设置为只有获得了stone阶段才能解锁。

隐藏流体

这个功能很鸡肋,只能隐藏JEI中的流体。

如果要实现流体替换,请看矿石阶段。

mods.ItemStages.stageLiquid("xxx", <liquid:id>);

/ct liquids命令可以把流体ID全部输入到日志里。

如隐藏水在stone阶段:

mods.ItemStages.stageLiquid("stone",<liquid:water>);

禁用附魔

mods.ItemStages.stageEnchant(xxx", <enchantment:id>);
//针对类似于经验修补的附魔,无等级
//如有等级附魔使用此代码,则锁定所有等级
mods.ItemStages.stageEnchantByLevel("xxx", <enchantment:id>.makeEnchantment(level));
//针对类似于锋利的附魔,有等级

/ct enchants可以打附魔ID导入到日志里。

维度阶段

导包

import crafttweaker.item.IItemStack;
 //阶段必须包
import mods.DimensionStages.addDimensionStage
//添加维度阶段包

代码如下:

mods.DimensionStages.addDimensionStage("xxx", id);

xxx是游戏阶段,ID指维度注册的ID(数字)。

包含正与负。

/forge dimensions输入ID到日志中。

例举锁定下界到iron阶段。

mods.DimensionStages.addDimensionStage("iron", -1);

效果为:建立传送门后,进入无法传送。

此模组只对通过“传送门”方式进入的维度有效。

通过右键的可以用配方修改来达到效果。

生物阶段

导包

import crafttweaker.item.IItemStack;

代码如下

mods.MobStages.addStage("xxx", "id");//生物在这个阶段前无法生成。一个生物只能绑定一个阶段。
mods.MobStages.addReplacement("id代替", "id被代替");//如果它生成了,就用一种生物代替他。
mods.MobStages.addRange("id", 格数);//如果在这个格数中有未到达阶段的玩家则无法生成(默认:512m(512格))
mods.MobStages.toggleSpawner("id",布尔值));//生物是否可以用刷怪笼生成(默认:false)
mods.MobStages.toggleSpawner("id",布尔值,id维度);//生物是否可以在特定维度内用刷怪笼生成。

矿石阶段

在你没有达到这个阶段前,矿石阶段能把这个矿石幻化成其他方块,并且掉落其他方块。

导包

import crafttweaker.item.IItemStack;
import crafttweaker.block.IBlock;

代码十分简单

mods.orestages.OreStages.addReplacement("xxx","id被替换","id替换");

例子,将泥土在获得one阶段前变成铁块。

mods.orestages.OreStages.addReplacement("one","<minecraft:dirt>","<minecraft:iron_block>");

旅行地图阶段

//旅行地图阶段的curseforge官方中给出了四种脚本。

//路径点
//设置后将无法创建新的路径点或访问路径点管理器,除非解锁了所需的阶段。
mods.jmapstages.jmapstages.setWaypointStage("xxx");
//死亡点
//设置后在死亡时将无法创建死亡点,直到解锁所需阶段。
mods.jmapstages.jmapstages.setDeathpointStage("xxx");
//解锁地图
//设置后在解锁所需阶段之前将无法看到小地图。
mods.jmapstages.jmapstages.setMinimapStage("xxx");
//全屏地图
//设置后将无法打开全屏地图,直到有了所需的阶段。
mods.jmapstages.jmapstages.setFullscreenStage("xxx");

注册

注:此部分需要使用contenttweaker

请使用单独脚本,并在脚本最上方写入:

#loader contenttweaker

又称原版加工厂。

物品注册

导入以下包

import mods.contenttweaker.VanillaFactory;
import mods.contenttweaker.Item;

物品创建

创建一个简单物品代码如下:

val xxx as Item = VanillaFactory.createItem(ID);
\\xxx表示变量名,不可重复。

进阶方法

接下来,你可以使用一些进阶方法。

代码均如下

xxx.方法 = string/int/float;

所有的方法如下:

名称类型默认值描述
beaconPaymentboolfalse是否可以丢进信标里(不是指信标基座)
creativeTabICreativeTab杂项创造标签设置物品在哪一个创造标签栏中,记得/ct creativetab指令
glowingboolfalse是否有附魔效果光芒
maxDamageint-1设置物品耐久,小于0则为普通物品,大于0将会被当作工具
maxStackSizeint64设置物品最大堆叠数
rarityEnumRarityCOMMON设置物品稀有度,会影响物品显示名称的颜色,可以使用(“COMMON”, “UNCOMMON”, “RARE”, “EPIC”)以下某一个
toolClassstringnull设置这是什么工具(pickaxe镐 axe斧等等)貌似sword剑不能
toolLevelint-1设置工具挖掘等级(默认为空手)

最后要加上

xxx.register();

完成注册。

示例脚本:

#loader contenttweakerimport mods.contenttweaker.VanillaFactory;
import mods.contenttweaker.Item;

val xxx as Item = VanillaFactory.createItem("xxx");\\注册idxxx物品
xxx.maxDamage = 22;\\最大堆叠22
xxx.rarity = "rare";\\稀有度设置
xxx.creativeTab = <creativetab:tools>;\\在工具标签栏
xxx.toolClass = "pickaxe";\\镐子
xxx.toolLevel = 2;\\二级挖掘(铁等级)
xxx.beaconPayment = true;\\可以进入信标
xxx.register();\\注册完毕

本地化与材质

进入游戏后,你会发现物品已经创建,但是没有贴图与名字,所以要添加。

本地化键名

进入以下路径

.minecraft\resources\contenttweaker\lang\zh_cn

添加一行:

item.contenttweaker.xxx.name=中文名
\\xxx是id

材质

材质请放在.minecraft\resources\contenttweaker\textures\items

名称为id.png

注意!只支持png文件!