前言
注:如果要搬运此教程,请取得作者联系后并标出来源即可。
整合包内使用本教程代码无需声明作者。
在编写的时候若是出现了问题,可将进入世界时在聊天栏显示的错误报告发送至短评区,作者会帮你解决问题。
在错误时会显示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;
所有的方法如下:
名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
beaconPayment | bool | false | 是否可以丢进信标里(不是指信标基座) |
creativeTab | ICreativeTab | 杂项创造标签 | 设置物品在哪一个创造标签栏中,记得/ct creativetab指令 |
glowing | bool | false | 是否有附魔效果光芒 |
maxDamage | int | -1 | 设置物品耐久,小于0则为普通物品,大于0将会被当作工具 |
maxStackSize | int | 64 | 设置物品最大堆叠数 |
rarity | EnumRarity | COMMON | 设置物品稀有度,会影响物品显示名称的颜色,可以使用(“COMMON”, “UNCOMMON”, “RARE”, “EPIC”)以下某一个 |
toolClass | string | null | 设置这是什么工具(pickaxe镐 axe斧等等)貌似sword剑不能 |
toolLevel | int | -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文件!