本篇教程由作者设定使用 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);
});

代码结果

CrT合成魔改:配方函数应用-第1张图片

1.18.2实例结果: CrT合成魔改:配方函数应用-第2张图片

感谢: