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

声明

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

            Trait Builder - CraftTweaker Documentation (blamejared.com)

            高级运用 · GitBook (imc.wiki)

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

        3. 本文认定阅读这已熟练使用crt及附属

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

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


事例V1


特性设计V1


天界之力

描述:它由四种不属于此世的力量融合而成,而你的工具似乎也继承到了这些力量

实际作用:攻击时随机造成日耀烈焰/星云奥秘/星尘护佑/星旋强袭四种之一的效果,概率回血。

    日耀烈焰:此次伤害提高20%,使敌人灼烧,并且获得能作用一次的10%的减伤,多次获得可叠加,至多能叠加至30%

    星云奥秘:此次攻击转换为魔法伤害并且伤害提高10%

    星尘护佑:此次攻击追加2-6次武器攻击力10%的伤害

    星旋强袭:此次攻击召唤4支箭矢向目标飞行,伤害随机,命中率随机。


特性代码V1


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

heavenofpower.color = 0x002dcf;

heavenofpower.maxLevel = 1;

heavenofpower.localizedName = "天界之力";

heavenofpower.localizedDescription = "它由四种不属于此世的力量融合而成,而你的工具似乎也继承到了这些力量";

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

    if(!attacker.world.remote){

        if(attacker instanceof IPlayer){

            var player as IPlayer = attacker;

            var world as IWorld = player.world;

            var pos as IBlockPos = player.position;

            var random2 as int = player.world.random.nextInt(0, 100) + 1;

            if(!isNull(player.data.PlayerPersisted.heavenofpower)){

                var data as int = player.data.PlayerPersisted.heavenofpower.asInt(); //内置2.5s冷却

                if(data >= 50){

                    var random as int = world.random.nextInt(0, 4) + 1; //取1~4的随机数

                    if(random == 1){ //日耀烈焰

                        target.setFire(4);

                        if(!isNull(player.data.PlayerPersisted.heavenofpower_0)){

                            var data as int = player.data.PlayerPersisted.heavenofpower_0.asInt();

                            if(data < 3){

                                player.update({PlayerPersisted: {heavenofpower_0  : (data + 1) as int}});

                            }

                        }else{

                            player.update({PlayerPersisted: {heavenofpower_0  : 1 as int}});

                        }

                        return newDamage * 1.2f;

                    }

                    if(random == 2){ //星云奥秘

                        target.attackEntityFrom(IDamageSource.MAGIC() , newDamage * 1.1f);

                        return 0.1f;

                    }

                    if(random == 3){ //星尘护佑

                        var attack as float = tool.tag.Stats.Attack.asFloat() * 0.1;

                        var random1 as int = world.random.nextInt(1, 6) + 1;

                        for i in 0 to random1{

                            world.catenation()

                            .sleep(5 + i * 5)

                            .run(function(world, context) {

                                target.attackEntityFrom(IDamageSource.GENERIC(), attack);

                            })

                            .start(); //利用zu的延时做出追加攻击

                        }

                    }

                    if(random == 4){ //星旋强袭

                        for i in 0 to 4{

                            world.catenation()

                            .sleep(5 + i * 5)

                            .run(function(world, context) {

                                var random1 as int = world.random.nextInt(0, 6);

                                var arrow as IEntityArrow = <entity:minecraft:arrow>.createEntity(world);

                                arrow.shoot(player, player.rotationPitch, player.rotationYaw, 0.0f, 2.0f, 1.0f);

                                arrow.setPosition(player.position.up(2));

                                arrow.damage = random1;

                                arrow.shooter = player;

                                world.spawnEntity(arrow); //召唤箭矢

                            })

                            .start();

                        }

                    }

                    player.update({PlayerPersisted: {heavenofpower  : 0 as int}});

                }

            }

            if(random2 <= 20){ //概率回血

                player.heal(1);

            }

        }

    }

    return newDamage;

};

heavenofpower.onUpdate = function(thisTrait, tool, world, entity, itemSlot, isSelected) { //冷却的保存与计算

        if(!world.remote){

            if(entity instanceof IPlayer){

                var player as IPlayer = entity;

                if(!isNull(player.data.PlayerPersisted.heavenofpower)){

                    var data as int = player.data.PlayerPersisted.heavenofpower.asInt();

                    player.update({PlayerPersisted: {heavenofpower : (data + 1) as int}}); //当然你也可以保存在工具的nbt

                    if(data < 50){

                        data += 1;

                    }

                }else{

                    player.update({PlayerPersisted: {heavenofpower  : 0 as int}});

                }

            }

        }

};

heavenofpower.register();


事例V2


特性设计V1


虚空之力

描述:它的力量似乎没有达到极限,你感觉你需要找到某种力量与之融合才能见证到那究极之力......

实际作用:攻击时,会附加4点伤害,此伤害无法防御。检测到生命合金后转变成虚空之力+


虚空之力+

描述:它的力量似乎没有达到极限,你感觉你需要找到某种力量与之融合才能见证到那究极之力......

实际作用:攻击时,会附加6点伤害,此伤害无法防御。


特性代码V1


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

voidforce.color = 0x002dcf;

voidforce.maxLevel = 1;

voidforce.localizedName = "虚空之力";

voidforce.localizedDescription = "它来到这个世界之后似乎发生了一些奇妙的变化…它开始附带虚空的力量了。";

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

    if(!world.remote){

        if(CotTicLib.getTicMaterial(tool) has "life_alloy"){ //检测材料是否拥有【生命合金】(很好这里引入了CotTicLib,具体在下面介绍)

            CotTicTraitLib.addTicTrait(tool, "voidforce_plus", 0x002dcf, 1); //添加特性[虚空之力+]

            world.catenation()

            .sleep(2)

            .run(function(world, context) {

                CotTicTraitLib.removeTicTrait(tool, "voidforce"); //必须等一会(2t)才能删除自身[虚空之力]

            })

            .start();

        }

    }

};

voidforce.afterHit = function(trait, tool, attacker, target, damageDealt, wasCritical, wasHit) {

    if(!target.world.remote){

        target.attackEntityFrom(IDamageSource.OUT_OF_WORLD(), 4);

    }

};

voidforce.register();



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

voidforce_plus.color = 0x002dcf;

voidforce_plus.maxLevel = 1;

voidforce_plus.localizedName = "虚空之力+";

voidforce_plus.localizedDescription = "它来到这个世界之后似乎发生了一些奇妙的变化…它开始附带虚空的力量了。";

voidforce_plus.afterHit = function(trait, tool, attacker, target, damageDealt, wasCritical, wasHit) {

    if(!target.world.remote){

        target.attackEntityFrom(IDamageSource.OUT_OF_WORLD(), 6);

    }

};

voidforce_plus.register();


TicLib


下载地址: https://wwf.lanzouq.com/iisdf1tt76sb


使用介绍


cot加载器的要用CotTicTraitLib与CotTicLib,其余用法相同


TicTraitLib

(这个当中的函数主要是跟特性相关):


TicTraitLib.removeTicTrait(itemStack as IItemStack, traitid as string)

返回bool,可确定是否成功移除特性.


TicTraitLib.addTicTrait(itemStack as IItemStack, traitid as string, traitcolor as int, traitlevel as int)

返回bool,可确定是否成功添加特性.


TicTraitLib.getTicTrait(itemStack as IItemStack)

获取该物品的特性(若不是匠魂物品则返回空[])


TicTraitLib.getPlayerTicBootsTrait(player as IPlayer)

获取这个玩家鞋子的特性(若不是匠魂物品则返回空[])


TicTraitLib.getPlayerTicLeggingsTrait(player as IPlayer)

获取这个玩家裤子的特性(若不是匠魂物品则返回空[])


TicTraitLib.getPlayerTicChestplateTrait(player as IPlayer)

获取这个玩家胸甲的特性(若不是匠魂物品则返回空[])


TicTraitLib.getPlayerTicHelmetTrait(player as IPlayer)

获取这个玩家头盔的特性(若不是匠魂物品则返回空[])


TicTraitLib.getPlayerTicArmorTrait(player as IPlayer)

获取这个玩家盔甲(鞋子,裤子,胸甲,头盔)的特性(若不是匠魂物品则返回空[])


提示:若有两个重复的特性那么在数组中就会有两个.



TicLib

(这个当中的函数主要是不跟特性相关的):


TicLib.getTicMaterial(itemStack as IItemStack)

获取该物品的材料(若不是匠魂物品则返回空[])


TicLib.setTicBroken(itemStack as IItemStack, isBroken as bool)

设置是否损坏,返回bool,可确定是否成功设置.


TicLib.addTicMiningSpeed(itemStack as IItemStack, level as float, uuid as string)

增加挖掘速度,返回bool,可确定是否成功增加.


TicLib.addTicAttack(itemStack as IItemStack, level as float, uuid as string)

增加攻击伤害,返回bool,可确定是否成功增加.


TicLib.addTicFreeModifiers(itemStack as IItemStack, level as int, uuid as string)

增加挖掘速度,返回bool,可确定是否成功增加.


TicLib.addTicHarvestLevel(itemStack as IItemStack, level as int, uuid as string)

增加挖掘等级,返回bool,可确定是否成功增加.


TicLib.addTicMiningSpeed(itemStack as IItemStack, level as float, uuid as string)

增加挖掘速度,返回bool,可确定是否成功增加.


TicLib.addTicToughness(itemStack as IItemStack, level as float, uuid as string)

增加盔甲韧性,返回bool,可确定是否成功增加.


TicLib.addTicDefense(itemStack as IItemStack, level as float, uuid as string)

增加盔甲,返回bool,可确定是否成功增加.


提示:为了保证只增加一次,所以填入的uuid请不要重复!