本篇教程由作者设定使用 CC BY-NC 协议。
前言
该教程适用于1.12.2、1.18.2,该脚本并未在其他版本进行过测试。
因本人技术有限,该教程必定存在不足之处,敬请谅解。如果您有更好的建议,请在评论区或私信指出。
教程中可能涉及到的名词不会进行解释,比如“对象”。
这个脚本的作用是使用钻石剑和末影水晶进行无序合成,合成出来的钻石剑保持原有耐久、附魔等数据并添加亡灵杀手5附魔。
示例代码
import crafttweaker.enchantments.IEnchantment;
import crafttweaker.item.IItemStack;
import crafttweaker.data.IData;
// import导入相关包,没有导入对应的包会使脚本找不到我们创建的类型
// 建立了两个变量指向合成材料,一个是钻石剑,一个是末影水晶。
// 最好声明变量来指向想要修改的物品,我们要知道,两个<minecraft:diamond_sword>指向的钻石剑不是同一把。
// “*”号是用来表示匹配所有耐久的。
var sword = <minecraft:diamond_sword:*>;
var end_crystal = <minecraft:end_crystal>;
// 一个无序合成注册脚本,我们需要对想要操作的材料进行标记(调用“marked”方法),比如我给sword标记了“mark”。
// 这个可以随意标记(比如填入“end”也可以),标记后调用方式为“ins.end”来表示标记的ItemStack。
// recipes.addShapeless(name,output,inputs,function,action)
// 如果function作为第三个被添加的参数,你可以使用函数以判定产物。
// 如果action函数作为第四个被添加的参数,你还可以决定当物品被合成时触发的事件。(引用自CraftTweaker简体中文文档)
recipes.addShapeless("test_sword",sword, [sword.marked("mark"),end_crystal],
// 添加一个函数作为第三个参数。建议参考:配方函数
function(out, ins, cInfo){
// 创建了一个enchTag来保存读取到的NBT数据。虽然现在是空的。
var enchTag as IData = {};
// 创建一个enchSmite来保存亡灵杀手附魔
var enchSmite = <enchantment:minecraft:smite>;
// isEnchantable当没有附魔时返回true,所以在前面加了感叹号表示取反。
if (!ins.mark.isEnchantable){
// 如果这把钻石剑本身有附魔,则遍历所有附魔
// 这里循环的是被“marked”方法标记为“mark”的输入材料,通过“enchantments”方法获取附魔列表。
for ench in ins.mark.enchantments{
// 判断一下遍历到的附魔是不是亡灵杀手,如果不是就记录到enchTag里。
if(ench.definition.id != enchSmite.id){
enchTag += ench.makeTag();
}
}
}
// 循环结束后,再给enchTag添加上亡灵杀手5附魔。
// makeEnchantment(5)表示这个附魔等级是5,makeTag是表示返回这个附魔的nbt数据。
enchTag += enchSmite.makeEnchantment(5).makeTag();
// 这里应该返回配方输出的ItemStack,也可以返回“null”来使配方无效。
// 因为我们要保持这把钻石剑的耐久和合成前一样,所以返回输入的钻石剑。
return ins.mark.withTag(enchTag);
},
// 在这里用不上合成事件,所以需要设为空
null);
// 以下是1.18.2版本的示例
import crafttweaker.api.item.IItemStack;
import crafttweaker.api.item.enchantment.Enchantment;
// 表示钻石剑支持任意耐久
var sword = <item:minecraft:diamond_sword>.anyDamage();
var end_crystal = <item:minecraft:end_crystal>;
var enchSmite = <enchantment:minecraft:smite>;
craftingTable.addShapeless("test_sword", <item:minecraft:diamond_sword>, [sword,end_crystal], (output as IItemStack,inputs as IItemStack[]) => {
// 删除亡灵杀手附魔, 方法返回删除亡灵杀手后其他数据都一样的物品, 原本输入的物品保持不变
var returnItem = inputs[0].removeEnchantment(enchSmite);
// 返回一个写入亡灵杀手5的物品, 和上面一样, with方法调用后返回一个写入亡灵杀手的物品, 和之前的变量指向的物品并不是同一个
return returnItem.withEnchantment(enchSmite,5);
});
代码结果
1.18.2实例结果:
感谢: