本篇教程由作者设定使用 CC BY-NC-SA 协议。

声明

        1. 完整内容请参阅官方wik/其他同志翻译的wiki/其他CoT教程/其他CrT教程等。

            Trait Builder - CraftTweaker Documentation (blamejared.com)

            高级运用 · GitBook (imc.wiki)

        2. 本教程适用于1.12.2,如果您希望用于其他版本,请参阅wiki或自行尝试。

        3. 因本人技术有限,该教程必定存在不足之处,尽请谅解.如果您有更好的建议,请在评论区指出。

        4. 本教程需要的模组:CraftTweakerContentTweaker匠魂2

        5.本教程的两个事例均出自我的整合包没错快去玩我整合包!


事例代码V1

#loader contenttweaker

#priority 999

#modloaded tconstruct


import mods.contenttweaker.tconstruct.TraitBuilder;

import crafttweaker.world.IFacing;

// 上方的信息从#loader开始 

// 第一行表示这个脚本由CoT来加载这个脚本,没有这一行是默认CrT加载

// 如果嫌脚本警告/报错的信息太碍眼,可以在“#loader contenttweaker”下添加一行“#ikwid”。作用是表示警告/报错信息将只在日志中打印出来,不会在游戏中显示。

// 第二行表示加载优先级,优先级是从大到小,以a-z来看谁先加载这个脚本。

//第三行表示当匠魂被加载时,此脚本才会被加载

// import xxx等表示导入某某包


var facing as string[string] ={

    "up" : "down",

    "down" : "up",

    "north" : "south",

    "south" : "north",

    "east" : "west",

    "west" : "east"

};

//此为关联数组,若需教程请前往关联数组(映射) · GitBook (imc.wiki)


// 创建一个名为XXX的对象。

var assassinated = TraitBuilder.create("assassinated");

// 设定颜色(十六进制颜色代码)

assassinated.color = 0xEE0000;

//设定特性等级上限

assassinated.maxLevel = 1;

// 指定的材料可以将这个特性强化到工具上。像使用红石给镐子加伤急速特性一样,在匠魂锻造台进行强化。

// 如果希望给不是自己写的自定义物品添加自己写的特性,应该使用匠魂调整模组,在该模组的配置文件中进行配置。

// 只有在锻造台为工具强化才会显示我在上面的color = 0xEE0000设定的颜色,在如果工具不需要强化就自带这个特性的话,字体颜色是由材料决定的。

assassinated.addItem(<item:minecraft:red_flower>);//人家拿着小发发(花花)一刀捅死你~~

// 设定特性名称,显示在具备该特性的物品中。

assassinated.localizedName = "刺客永不打正面!";

// 设定特性注释,显示在匠魂书中。

assassinated.localizedDescription = "背后攻击伤害增加20,正面攻击伤害降低10,侧面伤害降低7.5";

// 改变玩家攻击实体时计算的伤害。

// 事件列表请参阅wiki:Trait Builder - CraftTweaker Documentation (blamejared.com)

// myTrait.calcDamage = function(......) { // CODE } 表示捕捉实体被攻击时事件。想要了解更多事件请参阅wiki页面,每个事件下面都有说明。

assassinated.calcDamage = function(trait, tool, attacker, target, originalDamage, newDamage, isCritical) {

    if(!target.world.remote){

    //确保事件在服务端上运行

        var facingA as IFacing = IFacing.getDirectionFromEntityLiving(attacker.position, attacker);

        var facingT as IFacing = IFacing.getDirectionFromEntityLiving(target.position, target);

        //获取攻击者和目标看的方位

        //共有东南西北上下六个方位

        //关于IFacing的更多请前往IFacing - CraftTweaker Documentation (blamejared.com)

        if(faceingA == faceingT){

            //比如攻击者和目标都看北,那攻击者攻击的就肯定是目标的背面

            //如果看的方位相同,则伤害增加20

            return newDamage + 20;

        }else{

            //如果攻击者和目标看的不是同一个方位就进入此处判断

            //因为特性描述中"正面攻击伤害降低10,侧面伤害降低7.5"

            //所以我们还要判断是否为正面或侧面

            //此时我们上面的关联数组就起到作用了

            //若需关联数组教程请前往关联数组(映射) · GitBook (imc.wiki)

            for aa, bb in facing{

                //关联数组冒号左边的就代表aa

                //关联数组冒号右边的就代表bb

                if(faceingA.getName().toLowerCase() == aa){

                    //如果攻击者看的方位与aa相同

                    //注意!getName()方法返回的均为大写,比如NORTH,UP,DOWN

                    //toLowerCase()是JAVA本身自带的方法,作用是将字符串转为小写,因为我们关联数组中的都是小写

                    //更多详情前往Basic Variable Functions - CraftTweaker Documentation (blamejared.com)

                    if(faceingT.getName().toLowerCase() == bb){

                        //再如果目标看的方位与bb相同

                        //为上面两个if举一个例子:

                        //如果攻击者看向北(north),目标看向南(south)

                        //那么会先判断攻击者看的方位

                        //让我们看向关联数组,当aa为北(nurth)时,bb为南(south)

                        //接着判断目标的方位,目标看向南!好的和bb对上了

                        //那么可以确定攻击者和目标是处于对视的状态,也就是正面

                        //于是执行伤害降低10的操作

                        break;

                        //此操作是退出循环,减少不必要的性能损耗

                        //循环有关知识请前往循环与遍历 · GitBook (imc.wiki)

                        return newDamage - 10;

                    }else{

                        //好的如果目标看向的方位不是南,就会进入此处

                        //由于不是南,那么就可以断定是东或西,那么攻击者攻击的就肯定是目标的侧面

                        //所以攻击减7.5

                        break;

                        return newDamage - 7.5;

                    }

                }

            }

        }

    }

    return newDamage;

};

// 向游戏注册这个特性。

// 也就是告诉游戏我这段特性写完了

// 当特性写完之后,就可以使用CoT/Pewter向材料添加这个特性了,需要注意优先级。

assassinated.register();


游戏中的效果V1

[图片]

[图片]

[图片]

[图片]

[好吧,这里没有图片...]


事例代码V2

//v2仅进行对代码逻辑的讲解(如果你直接复制走去用,出报错不要找我)

//魔改更重要的是魔改的思路与逻辑

var peacefully = TraitBuilder.create("peacefully");

peacefully.color = 0xEE0000;

peacefully.maxLevel = 1;

peacefully.localizedName = "双脚一蹬与世无争";

peacefully.localizedDescription = "在干草块上方蹲下时消除周围9*9范围生物仇恨(以玩家为中心)";

peacefully.onUpdate = function(thisTrait, tool, world, entity, itemSlot, isSelected) {

    // 当有这个特性的匠魂工具在玩家身上时,每t都会触发此函数

    // 事件列表请参阅wiki:Trait Builder - CraftTweaker Documentation (blamejared.com)

    // 想要了解更多事件请参阅wiki页面,每个事件下面都有说明。

    var pos as IBlockPos = entity.position;

    if(!world.remote){

        //服务端运行

        if(entity instanceof IPlayer){

            //判断这个实体是否为IPlayer类型

            //毕竟僵尸什么的也能拿起匠魂工具

            var player as IPlayer = entity;

            if(player.isSneaking && world.getBlock(pos.down()).definition.id == "minecraft:hay_block"){

                //判断玩家是否蹲着和判断脚下方块

                player.removePotionEffect(<potion:minecraft:invisibility>);

                //这个是为了制衡我整合包的另一个特性,可删除

                player.addPotionEffect(<potion:minecraft:weakness>.makePotionEffect(1, 3, true, false));

                //如果能一直消除那就太超标了,所以给予虚弱减少伤害

                var s = pos.getOffset(IFacing.up(), 5).getOffset(IFacing.west(), 4).getOffset(IFacing.north(), 4) as IBlockPos;

                var e = pos.getOffset(IFacing.down(), 5).getOffset(IFacing.east(), 4).getOffset(IFacing.south(), 4) as IBlockPos;

                //圈定一个范围

                var entities = world.getEntitiesInArea(s.asPosition3f(), e.asPosition3f()) as IEntity[];

                //把这个范围的实体都记录到这个数组里面

                for entity in entities {

                    //遍历数组

                    if (!(entity instanceof IPlayer)){

                        //如果不属于IPlayer类型

                        //因为玩家哪来的仇恨呢

                        if (entity instanceof IEntityLiving){

                            //判断是否属于IEntityLiving

                            var EntityLiving as IEntityLiving = entity;

                            EntityLiving.attackTarget = null;

                            //将仇恨设置为空,也就是没有仇恨

                        }

                    }

                }

            }

        }

    }

           

};

peacefully.register();


游戏中的效果V2

[图片]

[图片]

[图片]

[图片]

[放心,这里也没有图片~~~]


感谢

友谊妈在q群内提供的消除仇恨的方法

Nishiki的教程

官方wiki