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

注意:

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

            https://docs.blamejared.com/1.12/zh/

            https://crafttweaker.readthedocs.io/zh_CN/latest/

            https://youyi580.gitbook.io/zentutorial/

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

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

        4. 本教程需要的模组:CraftTweakerContentTweaker匠魂2魔法匠魂(可选)、匠魂调整(可选)

        5. 教程中可能涉及到的名词不会进行解释,比如“父类”。

代码区

// 以下为创建特性的脚本

#loader contenttweaker

#priority 10


import crafttweaker.item.IItemDefinition;

import crafttweaker.events.IEventManager;

import crafttweaker.event.PlayerAttackEntityEvent;

import crafttweaker.player.IPlayer;

import crafttweaker.item.IItemStack;

import crafttweaker.world.IWorld;

import mods.contenttweaker.tconstruct.TraitBuilder;


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

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

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

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

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


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

val trait_moonlight = mods.contenttweaker.tconstruct.TraitBuilder.create("trait_moonlight");


// 设定颜色

trait_moonlight.color = 0x99FFFF;

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

trait_moonlight.localizedName = ("月光");

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

trait_moonlight.localizedDescription = ("根据月相得到伤害加成");

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

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

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

trait_moonlight.addItem(<item:skyresources:alchemyitemcomponent:10>);




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

// 事件列表请参阅wiki:https://docs.blamejared.com/1.12/zh/Mods/ContentTweaker/Tinkers_Construct/TraitBuilder/#ontoolheal

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

// 如果无法理解,请参阅下方的事件解释。

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

     //创建一个变量来保存月相整型。

     //attacker是一个IEntityLivingBase类型,所以可以根据他的父类获取到月相信息或者其他世界信息,比如是不是白天。

     var nowMoonPhase as int = attacker.world.getMoonPhase();


    // 判断月相变量是否为空,不为空则返回加成伤害。为空则返回原本伤害。

    // 大于等于3判断可以避免除2后变成负面buff的情况,比如我伤害怎么变0了。

    // 判断现在是否是夜晚。

    // 月相最大为7倍,除以2可以限制伤害最高为3.5倍,可能会因为参与运算的类型不是浮点数或返回的数值必须是整型而达不到3.5倍。

    if (nowMoonPhase >= 3 & !attacker.world.isDayTime()){


         return newDamage *(nowMoonPhase /2);


    }else{

        // 不满足条件则返回原本伤害。

         return newDamage;

    }

};

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

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

trait_moonlight.register();

代码结果

使用CoT为匠魂添加自定义特性简单示例-第1张图片使用CoT为匠魂添加自定义特性简单示例-第2张图片


事件解释

- 事件列表请参阅wiki:https://docs.blamejared.com/1.12/zh/Mods/ContentTweaker/Tinkers_Construct/TraitBuilder/#ontoolheal

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

- 什么是事件:事件是表示“某件事情是否发生了”的情况。比如玩家合成、玩家攻击、实体收到伤害等情况。

- 如何使用事件列表提供的事件:

  1. 调用一个事件,方式是你创建的对象加事件方法,比如我在该教程中创建了名为“trait_moonlight”的对象,然后希望修改攻击造成的伤害,调用方式就是:“trait_moonlight.calcDamage = function(......) { // CODE }”

- 如何知道调用这个事件时,玩家使用的工具或所处世界等信息:

  1. 当我们调用事件时,等号后面的“function(trait, tool, attacker, target, originalDamage, newDamage, isCritical)”就带有这些信息。程序会自动填入这些参数,我们只需要了解这些参数的含义。

  2. 比如trait表示当前特性,tool表示当前工具的ItemStack,target表示攻击目标等。

  3. 如果参数列表中没有我们想要的信息,可以通过参数对象提供的方法来找到。如果该类没有提供,也可以看看他的父类有没有提供对应的方法。

  4. 比如:attacker是攻击者,它的父类“IEntity”会提供一个“world”方法表示获取该实体所在世界的信息。我们就可以用“attacker.world.getMoonPhase();”来知道该实体所在世界的月相信息。或者通过这个“world”代表的“IWorld”类型了解当前维度(attacker.world.getDimension())。

示例分析

以事件列表中的耐久下降前事件为例:myTrait.onToolDamage = function(trait, tool, unmodifiedAmount, newAmount, holder) {    //CODE    return newAmount; //Or your modified value};

工具耐久降低前调用。
参数:

  • trait:表示当前使用的特性。

  • tool:表示当前使用的工具。

  • unmodifiedAmount:表示修改前的耐久。

  • newAmount:表示要降低的耐久。

  • holder:它是一个IEntityLivingBase对象,我们可以通过这个对象修改或了解工具持有者的信息。比如每次耐久降低,生命值降低1点()。或者持有者生命值低于10点()时耐久消耗翻倍。

返回一个int 代表要降低的耐久。 否则返回 newAmount。


简单的例子:

- 每次耐久降低,生命值降低1点():

    function(......){

        holder.health= holder.health- 1.0;

    };

- 持有者生命值低于10点()时耐久消耗翻倍:

    function(......){

        if(holder.health <= 10){

            return newAmount * 2;

        }else{

            return newAmount;

        };

    };

感谢:

        // 抄了他的github

        友谊hj:飞翔之路3

        // 翻译的wiki

        酒石酸的汉化CrT的wiki

        youyihj的GitBook

        官方wiki