本篇教程由作者设定使用 CC BY-NC-SA 协议。
声明
1. 完整内容请参阅官方wik/其他同志翻译的wiki/其他CoT教程/其他CrT教程等。
Trait Builder - CraftTweaker Documentation (blamejared.com)
2. 本教程适用于1.12.2,如果您希望用于其他版本,请参阅wiki或自行尝试。
3. 因本人技术有限,该教程必定存在不足之处,尽请谅解.如果您有更好的建议,请在评论区指出。
4. 本教程需要的模组:CraftTweaker、ContentTweaker、匠魂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群内提供的消除仇恨的方法